diff -Naur ns-3.18.1/AUTHORS ns-3.19/AUTHORS
--- ns-3.18.1/AUTHORS	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/AUTHORS	2013-12-20 09:44:50.000000000 -0800
@@ -54,10 +54,13 @@
 Blake Hurd (naimorai@gmail.com)
 ishan (ishan.chhabra@gmail.com)
 Mohamed Amine Ismail (amine.ismail@inria.fr, iamine@udcast.com)
+Jared Ivey (j.ivey@gatech.edu)
 Atishay Jain (atishayjain25@gmail.com)
 Sascha Alexander Jopen (jopen@informatik.uni-bonn.de)
 Sam Jansen (sam.jansen@gmail.com)
 Liu Jian (liujatp@gmail.com)
+Piotr Jurkiewicz (piotr.jerzy.jurkiewicz@gmail.com)
+Evgeny Kalishenko (ydginster@gmail.com)
 Konstantinos Katsaros <dinos.katsaros@gmail.com>
 Joe Kopena (tjkopena@cs.drexel.edu)
 Flavio Kobuta (flaviokubota@gmail.com)
@@ -81,6 +84,7 @@
 Faker Moatamri (faker.moatamri@inria.fr)
 Edvin Močibob <edvin.mocibob@gmail.com>
 Mike Moreton (mjvm_ns@hotmail.com)
+Michele Muccio <michelemuccio@virgilio.it>
 Sidharth Nabar (snabar@uw.edu)
 Hemanth Narra (hemanth@ittc.ku.edu)
 Andreas Nilsson <andrnils@gmail.com>
diff -Naur ns-3.18.1/bindings/python/ns3modulegen_core_customizations.py ns-3.19/bindings/python/ns3modulegen_core_customizations.py
--- ns-3.18.1/bindings/python/ns3modulegen_core_customizations.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/bindings/python/ns3modulegen_core_customizations.py	2013-12-20 09:44:50.000000000 -0800
@@ -5,6 +5,7 @@
 from pybindgen.cppmethod import CustomCppMethodWrapper, CustomCppConstructorWrapper
 from pybindgen.typehandlers.codesink import MemoryCodeSink
 from pybindgen.typehandlers import ctypeparser
+from pybindgen.typehandlers.base import ForwardWrapperBase
 from pybindgen import cppclass
 import warnings
 
@@ -425,11 +426,24 @@
     add_std_ios_openmode(module)
 
 
-def add_std_ios_openmode(module):
-    import pybindgen.typehandlers.base
-    for alias in "std::_Ios_Openmode", "std::ios::openmode":
-        pybindgen.typehandlers.base.param_type_matcher.add_type_alias(alias, "int")
+class IosOpenmodeParam(Parameter):
+
+    DIRECTIONS = [Parameter.DIRECTION_IN]
+    CTYPES = ['std::ios::openmode', 'std::_Ios_Openmode']
 
+    def convert_c_to_python(self, wrapper):
+        assert isinstance(wrapper, ReverseWrapperBase)
+        wrapper.build_params.add_parameter('i', [self.value])
+
+    def convert_python_to_c(self, wrapper):
+        assert isinstance(wrapper, ForwardWrapperBase)
+        name = wrapper.declarations.declare_variable("std::ios::openmode", self.name, self.default_value)
+        wrapper.parse_params.add_parameter('i', ['&'+name], self.name, optional=bool(self.default_value))
+        wrapper.call_params.append(name)
+
+
+
+def add_std_ios_openmode(module):
     for flag in 'in', 'out', 'ate', 'app', 'trunc', 'binary':
         module.after_init.write_code('PyModule_AddIntConstant(m, (char *) "STD_IOS_%s", std::ios::%s);'
                                      % (flag.upper(), flag))
diff -Naur ns-3.18.1/bindings/python/wscript ns-3.19/bindings/python/wscript
--- ns-3.18.1/bindings/python/wscript	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/bindings/python/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -16,7 +16,7 @@
 REQUIRED_PYBINDGEN_VERSION = (0, 16, 0, 834)
 REQUIRED_PYGCCXML_VERSION = (0, 9, 5)
 
-
+RUN_ME=-3
 
 def add_to_python_path(path):
     if os.environ.get('PYTHONPATH', ''):
@@ -370,7 +370,7 @@
         # the build has not changed.  We want this task to always run if
         # invoked by the user, particularly since --apiscan=all will require
         # invoking this task many times, once per module.
-        return Task.RUN_ME
+        return RUN_ME
 
 def get_modules_and_headers(bld):
     """
diff -Naur ns-3.18.1/CHANGES.html ns-3.19/CHANGES.html
--- ns-3.18.1/CHANGES.html	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/CHANGES.html	2013-12-20 09:44:50.000000000 -0800
@@ -51,6 +51,118 @@
 us a note on ns-developers mailing list.</p>
 
 <hr>
+<h1>Changes from ns-3.18.1 to ns-3.19</h1>
+
+<h2>New API:</h2>
+<ul>
+  <li> A new wifi extension for vehicular simulation support is available in the
+    src/wave directory.  The current code represents an interim capability to 
+    realize an IEEE 802.11p-compliant device, but without the WAVE extensions 
+    (which are planned for a later patch).  The WaveNetDevice modelled herein 
+    enforces that a WAVE-compliant physical layer (at 5.9 GHz) is selected, and 
+    does not require any association between devices (similar to an adhoc WiFi 
+    MAC), but is otherwise similar (at this time) to a WifiNetDevice.  WAVE 
+    capabililties of switching between control and service channels, or using 
+    multiple radios, are not yet modelled.
+  </li>
+  <li>New SixLowPanNetDevice class providing a shim between 
+    IPv6 and real NetDevices. The new module implements 6LoWPAN:
+    "Transmission of IPv6 Packets over IEEE 802.15.4 Networks" (see
+    <a href="http://www.ietf.org/rfc/rfc4944.txt">RFC 4944</a> and
+    <a href="http://www.ietf.org/rfc/rfc6262.txt">RFC 6262</a>), 
+    resulting in a heavy header compression for IPv6 packets.
+    The module is intended to be used on 802.15.4 NetDevices, but
+    it can be used over other NetDevices. See the manual for
+    further discussion.
+  </li>
+  <li> LteHelper has been updated with some new APIs:
+    <ul>
+      <li>new overloaded Attach methods to enable UE to automatically determine
+          the eNodeB to attach to (using initial cell selection);</li>
+      <li>new methods related to handover algorithm: SetHandoverAlgorithmType
+          and SetHandoverAlgorithmAttribute;</li>
+      <li>a new attribute AnrEnabled to activate/deactivate Automatic Neighbour
+          Relation (ANR) function; and</li>
+      <li>a new method SetUeDeviceAttribute for configuring LteUeNetDevice.</li>
+    </ul>
+  </li>
+  <li> The GSoC 2013 project in the LTE module has brought some additional APIs:
+    <ul>
+      <li>a new abstract class LteHandoverAlgorithm, which every future
+          implementation of automatic handover trigger should inherit from;</li>
+      <li>new classes LteHandoverAlgorithm and LteAnr as sub-modules of
+          LteEnbNetDevice class; both interfacing with the LteEnbRrc sub-module
+          through Handover Management SAP and ANR SAP;</li>
+      <li>new attributes in LteEnbNetDevice and LteUeNetDevice classes related
+          to Closed Subscriber Group (CSG) functionality in initial cell
+          selection;</li>
+      <li>new attributes in LteEnbRrc for configuring UE measurements' filtering
+          coefficient (i.e., quantity configuration);</li>
+      <li>a new public method AddUeMeasReportConfig in LteEnbRrc for setting up
+          custom UE measurements' reporting configuration; measurement reports
+          can then be captured from the RecvMeasurementReport trace source;
+          and</li>
+      <li>new trace sources in LteUeRrc to capture more events, such as System
+          Information messages (MIB, SIB1, SIB2), initial cell selection, random
+          access, and handover.</li>
+    </ul>
+  </li>
+  <li>A new parallel scheduling algorithm based on null messages, a common 
+  parallel DES scheduling algorithm, has been added.  The null message 
+  scheduler has better scaling properties when running on some scenarios
+  with large numbers of nodes since it does not require a global 
+  communication.
+  </li>
+</ul>
+
+<h2>Changes to existing API:</h2>
+<ul>
+    <li> It is now possible to use Ipv6PacketInfoTag from UDP applications in the
+      same way as with Ipv4PacketInfoTag. See Doxygen for current limitations in
+  	  using Ipv[4,6]PacketInfoTag to set IP properties.</li>
+    <li>A change is introduced for the usage of the EpcHelper
+      class. Previously, the EpcHelper class included both the API
+      definition and its (only) implementation; as such, users would
+      instantiate and use the EpcHelper class directly in their
+      simulation programs. From now on,
+      EpcHelper is just the base class defining the API, and the
+      implementation has been moved to derived classes; as such,
+      users are now expected to use one of the derived classes in
+      their simulation program. The implementation previously
+      provided by the EpcHelper class has been moved to the new
+      derived class PointToPointEpcHelper.</li>
+  <li> The automatic handover trigger and ANR functions in LTE module have been
+    moved from LteEnbRrc class to separate classes. As a result, the related
+    attributes, e.g., ServingCellHandoverThreshold, NeighbourCellHandoverOffset,
+    EventA2Threshold, and EventA4Threshold have been removed from LteEnbRrc
+    class. The equivalent attributes are now in A2A4RsrqHandoverAlgorithm and
+    LteAnr classes.</li>
+  <li> Master Information Block (MIB) and System Information Block Type 1 (SIB1)
+    are now transmitted as LTE control messages, so they are no longer part of
+    RRC protocol.</li>
+  <li> UE RRC state model in LTE module has been considerably modified and is
+    not backward compatible with the previous state model.</li>
+  <li> Additional time units (Year, Day, Hour, Minute) were added to the time
+  value class that represents simulation time; the largest unit prior to 
+  this addition was Second.
+  </li>
+</ul>
+
+<h2>Changes to build system:</h2>
+
+<h2>Changed behavior:</h2>
+<ul>
+  <li> For the TapBridge device, in UseLocal mode there is a MAC learning function. TapBridge has been waiting for the first packet received from tap interface to set the address of the bridged device to the source address of the first packet. This has caused problems with WiFi.  The new behavior is that after connection to the tap interface, ns-3 learns the MAC address of that interface with a system call and immediately sets the address of the bridged device to the learned one.  See <a href="https://www.nsnam.org/bugzilla/show_bug.cgi?id=1777">bug 1777</a> for more details.</li>
+  <li> TapBridge device now correctly implements IsLinkUp() method.</li>
+  <li> IPv6 addresses and routing tables are printed like in Linux "route -A inet6" command.</li>
+  <li> A change in Ipv[4,6]Interface enforces the correct behaviour of IP 
+    when a device do not support the minimum MTU requirements.
+    This is set to 68 and 1280 octects respectively.  IP simulations that
+    may have run over devices with smaller MTUs than 68 or 1280, respectively,
+    will no longer be able to use such devices.</li>
+</ul>
+
+<hr>
 <h1>Changes from ns-3.18 to ns-3.18.1</h1>
 <h2>New API:</h2>
 <ul>
diff -Naur ns-3.18.1/doc/doxygen.conf ns-3.19/doc/doxygen.conf
--- ns-3.18.1/doc/doxygen.conf	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/doxygen.conf	2013-12-20 09:44:50.000000000 -0800
@@ -151,7 +151,7 @@
 # comments will behave just like regular Qt-style comments
 # (thus requiring an explicit @brief command for a brief description.)
 
-JAVADOC_AUTOBRIEF      = NO
+JAVADOC_AUTOBRIEF      = YES
 
 # If the QT_AUTOBRIEF tag is set to YES then Doxygen will
 # interpret the first line (until the first dot) of a Qt-style
@@ -159,7 +159,7 @@
 # will behave just like regular Qt-style comments (thus requiring
 # an explicit \brief command for a brief description.)
 
-QT_AUTOBRIEF           = NO
+QT_AUTOBRIEF           = YES
 
 # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
 # treat a multi-line C++ special comment block (i.e. a block of //! or ///
diff -Naur ns-3.18.1/doc/doxygen.warnings.report.sh ns-3.19/doc/doxygen.warnings.report.sh
--- ns-3.18.1/doc/doxygen.warnings.report.sh	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/doxygen.warnings.report.sh	2013-12-20 09:44:50.000000000 -0800
@@ -1,62 +1,221 @@
 #!/bin/bash
 
-# Process doxygen.warnings.log to generate sorted list of top offenders
-
-# Flag to skip the build and running doxygen, and just analyze the log
-skipdoxy=${1:-""}
-
-DIR=`dirname $0`
-ROOT=`hg root`
-# Final resting place for the log file
-log=$DIR/doxygen.warnings.log
+# Process doxygen log to generate sorted list of top offenders.
+#
 
+me=$(basename $0)
+DIR="$(dirname $0)"
+ROOT="$(hg root)"
+
+# Known log files
+STANDARDLOGFILE=doxygen.log
+WARNINGSLOGFILE=doxygen.warnings.log
+# Default choice:  generate it
+LOG="$DIR/$WARNINGSLOGFILE"
+
+
+# Options ------------------------------
+#
+
+function usage
+{
+    cat <<-EOF
+	
+	Usage: $me [-eth] [-f <log-file> | -l | -s] [-m <module> | -F <regex>]
+	
+	Run doxygen to generate all errors; report error counts
+	by module and file.
+	
+	The default behavior is to modify doxygen.conf temporarily to
+	report all undocumented elements, and to reduce the run time.
+	The output of this special run is kept in doc/$WARNINGSLOGFILE.
+
+	The -e and -t options exclude examples and test directories
+	from the counts.  The -m option only includes a specific module.
+	The -F option only includes files (or warnings) matching the <regex>.
+	The -m and -F options append the relevant warnings after the
+	numerical report.  These can be used in any combination.
+	
+	-e  Filter out warnings from */examples/*
+	-t  Filter out warnings from */test/*
+	-m  Only include files matching src/<module>
+	-F  Only include files matching the <regex> 
+
+	The -f, -l, and -s options skip the doxygen run altogether.
+	The first two use a specified or the standard log file;
+	the -s option uses the warnings log from a prior run.
+	Only the first of -f <log-file>, -s, or -l will have effect.
+		
+	-f  Skip doxygen run; use existing <log-file>.
+	-s  Skip doxygen run; use existing warnings log doc/$WARNINGSLOGFILE
+	-l  Skip doxygen run; use the normal doxygen log doc/$STANDARDLOGFILE
+		
+	-h  Print this usage message
+	    
+EOF
+    exit 1
+}
+
+# Argument processing ------------------
+#
+
+# -f argument
+usefilearg=0
+logfilearg=
+# -l
+usestandard=0
+# skip doxygen run; using existing log file
+SKIPDOXY=0
+
+# Filtering flags
+filter_examples=0
+filter_test=0
+filter_module=""
+filter_regex=""
+
+while getopts :etm:F:lF:sh option ; do
+
+    case $option in
+	
+	(e)  filter_examples=1        ;;
+	
+	(t)  filter_test=1            ;;
+
+	(m)  filter_module="$OPTARG"  ;;
+
+	(F)  filter_regex="$OPTARG"   ;;
+
+	(l)  usestandard=1            ;;
+
+	(f)  usefilearg=1
+	     logfilearg="$OPTARG"
+	     ;;
+
+	(s)  usefilearg=1
+	     logfilearg="$DIR/$WARNINGSLOGFILE"
+	     ;;
+
+	(h)  usage ;;
+	(:)  echo "$me: Missing argument to -$OPTARG" ; usage ;;
+	(\?) echo "$me: Invalid option: -$OPTARG"     ; usage ;;
+    esac
+done
+
+function checklogfile
+{
+    if [ -e "$1" ] ; then
+	SKIPDOXY=1
+	LOG="$1"
+    else
+	echo "$me: log file $1 does not exist."
+	exit 1
+    fi
+}
+    
+# Which log file
+if [[ $usefilearg -eq 1 && "${logfilearg:-}" != "" ]] ; then
+    checklogfile "$logfilearg"
+elif [ $usestandard -eq 1 ]; then
+    checklogfile "$DIR/$STANDARDLOGFILE"
+fi
 
-# First, we have to modify doxygen.conf to generate all the warnings
-# (We also suppress dot graphs, so shorten the run time.)
+#  Run doxygen -------------------------
+#
 
-if [ "$skipdoxy" == "" ]; then
+if [ $SKIPDOXY -eq 1 ]; then
+    echo
+    echo "Skipping doxygen run, using existing log file $LOG"
+else
 
     # Run introspection, which may require a build
-    cd $(hg root) && ./waf --run print-introspected-doxygen >doc/introspected-doxygen.h
+    (cd "$ROOT" && ./waf --run print-introspected-doxygen >doc/introspected-doxygen.h)
+
+    # Modify doxygen.conf to generate all the warnings
+    # (We also suppress dot graphs, so shorten the run time.)
 
     conf=$DIR/doxygen.conf
 
     sed -i.bak -E '/^EXTRACT_ALL |^HAVE_DOT |^WARNINGS /s/YES/no/' $conf
     rm -f $conf.bak
 
+    echo
     echo -n "Rebuilding doxygen docs with full errors..."
-    (cd $ROOT && ./waf --doxygen >/dev/null 2>&1)
+    (cd "$ROOT" && ./waf --doxygen >/dev/null 2>&1)
     status=$?
 
     hg revert $conf
 
-    if [ "$status" = "0" ]; then
+    if [ $status -eq 0 ]; then
 	echo "Done."
     else
 	echo "FAILED."
 	exit 1
     fi
 
-    mv $DIR/doxygen.log $log
+    cp -f "$DIR/$STANDARDLOGFILE" "$DIR/$WARNINGSLOGFILE"
 
-else
-    echo "Skipping doxygen run, using existing log file $log"
 fi
 
+# Log filters --------------------------
+#
+
+# Filter regular expression for -m and -F
+filter_inRE=""
+if [ "$filter_module" != "" ] ; then
+    filter_inRE="src/$filter_module"
+fi
+if [ "$filter_regex" != "" ] ; then
+    filter_inRE="${filter_inRE:-}${filter_inRE:+\\|}$filter_regex"
+fi
+
+# Filter regular expression for -e and -t
+filter_outRE=""
+if [ $filter_examples -eq 1 ]; then
+    filter_outRE="/examples/"
+fi
+if [ $filter_test -eq 1 ]; then
+    filter_outRE="${filter_outRE:-}${filter_outRE:+\\|}/test/"
+fi
+
+if [ "${filter_inRE:-}" != "" ] ; then
+    echo "Filtering in \"$filter_inRE\""
+fi
+if [ "${filter_outRE:-}" != "" ] ; then
+    echo "Filtering out \"$filter_outRE\""
+fi
+echo
+
+# Filter log file
+function filter_log
+{
+    local flog;
+    flog=$( cat "$LOG" | grep "^$ROOT" )
+
+    if [ "${filter_inRE:-}" != "" ] ; then
+	flog=$( echo "$flog" | grep "$filter_inRE" )
+    fi
+
+    if [ "${filter_outRE:-}" != "" ] ; then
+	flog=$( echo "$flog" | grep -v "$filter_outRE" )
+    fi
+
+    echo "$flog"
+}
+    
 
-# Analyze the log
+# Analyze the log ----------------------
+#
 
 # List of module directories (e.g, "src/core/model")
 undocmods=$(                \
-    grep "^$ROOT" "$log"  | \
+    filter_log            | \
     cut -d ':' -f 1       | \
-    sed "s|$ROOT||g"      | \
-    cut -d '/' -f 2-4     | \
+    sed "s|$ROOT/||g"     | \
+    cut -d '/' -f 1-3     | \
     sort                  | \
     uniq -c               | \
     sort -nr                \
     )
-    
 
 # Number of directories
 modcount=$(                         \
@@ -68,24 +227,24 @@
 # For a function with multiple undocumented parameters,
 # Doxygen prints the additional parameters on separate lines,
 # so they don't show up in the totals above.
-# Rather than work too hard to get the exact number,
+# Rather than work too hard to get the exact number for each file,
 # we just list the total here. 
 addlparam=$(                                  \
-    grep -v "^$ROOT" $log                   | \
-    grep -v "not generated, too many nodes" | \
-    grep "^  parameter '" $log              | \
+    grep "^  parameter '" "$LOG"            | \
     wc -l                                   | \
     sed 's/^[ \t]*//;s/[ \t]*$//'             \
     )
 
 # Total number of warnings
-warncount=$(echo "$undocmods" | \
-    awk '{total += $1}; END {print total}' )
+warncount=$(                                  \
+    echo "$undocmods"                       | \
+    awk '{total += $1}; END {print total}'    \
+    )
 warncount=$((warncount + addlparam))
 
 # List of files appearing in the log
-undocfiles=$( \
-    grep "^$ROOT" "$log"  | \
+undocfiles=$(               \
+    filter_log            | \
     cut -d ':' -f 1       | \
     sed "s|$ROOT||g"      | \
     cut -d '/' -f 2-      | \
@@ -95,7 +254,7 @@
     )
 
 # Sorted by number, decreasing
-undocsort=$(echo "$undocfiles" | sort -r )
+undocsort=$(echo "$undocfiles" | sort -k1nr,2 )
 
 # Total number of files
 filecount=$(                        \
@@ -104,7 +263,19 @@
     sed 's/^[ \t]*//;s/[ \t]*$//'   \
     )
 
-# Now we're ready to summarize the log
+# Filtered in warnings
+filterin=
+if [ "${filter_inRE:-}" != "" ] ; then
+    filterin=$(                 \
+	filter_log            | \
+	sed "s|$ROOT/||g"       \
+	)
+fi
+
+
+
+# Summarize the log --------------------
+#
 
 echo
 echo "Report of Doxygen warnings"
@@ -147,4 +318,10 @@
 printf "%6d files\n" $filecount
 printf "%6d warnings\n" $warncount
 
-
+if [ "$filterin" != "" ] ; then
+    echo
+    echo
+    echo "Filtered Warnings"
+    echo "========================================"
+    echo "$filterin"
+fi
diff -Naur ns-3.18.1/doc/manual/Makefile ns-3.19/doc/manual/Makefile
--- ns-3.18.1/doc/manual/Makefile	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/manual/Makefile	2013-12-20 09:44:50.000000000 -0800
@@ -16,6 +16,7 @@
 	source/replace.txt \
 	source/attributes.rst \
 	source/callbacks.rst \
+	source/documentation.rst \
 	source/enable-modules.rst \
 	source/enable-tests.rst \
 	source/events.rst \
diff -Naur ns-3.18.1/doc/manual/source/attributes.rst ns-3.19/doc/manual/source/attributes.rst
--- ns-3.18.1/doc/manual/source/attributes.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/manual/source/attributes.rst	2013-12-20 09:44:50.000000000 -0800
@@ -53,7 +53,7 @@
 
 Smart pointers are used extensively in the |ns3| APIs, to avoid passing
 references to heap-allocated objects that may cause memory leaks.  
-For most basic usage (syntax), treat a smart pointer like a regular pointer:::
+For most basic usage (syntax), treat a smart pointer like a regular pointer::
 
   Ptr<WifiNetDevice> nd = ...;
   nd->CallSomeFunction ();
@@ -67,11 +67,11 @@
 using ``operator new`` as usual but instead by a templated function called
 :cpp:func:`CreateObject()`.
 
-A typical way to create such an object is as follows:::
+A typical way to create such an object is as follows::
 
   Ptr<WifiNetDevice> nd = CreateObject<WifiNetDevice> ();
 
-You can think of this as being functionally equivalent to:::
+You can think of this as being functionally equivalent to::
 
   WifiNetDevice* nd = new WifiNetDevice ();
 
@@ -102,7 +102,7 @@
 example: class :cpp:class:`ns3::Node`.
 
 The public header file node.h has a declaration that includes a static GetTypeId
-function call:::
+function call::
 
     class Node : public Object
     {
@@ -110,7 +110,7 @@
       static TypeId GetTypeId (void);
       ...
 
-This is defined in the ``node.cc`` file as follows:::
+This is defined in the ``node.cc`` file as follows::
 
     TypeId 
     Node::GetTypeId (void)
@@ -210,7 +210,7 @@
 unsigned integer ``m_maxPackets``; this member variable controls the depth of
 the queue.  
 
-If we look at the declaration of DropTailQueue, we see the following:::
+If we look at the declaration of DropTailQueue, we see the following::
 
     class DropTailQueue : public Queue {
     public:
@@ -233,7 +233,7 @@
 type of global default value.
 
 In the |ns3| attribute system, these value definitions and accessor functions
-are moved into the TypeId class; e.g.:::
+are moved into the TypeId class; e.g.::
 
     NS_OBJECT_ENSURE_REGISTERED (DropTailQueue);
 
@@ -424,11 +424,11 @@
 +++++++++++++++++++++++++++++++++++++++++++
 
 Arbitrary combinations of attributes can be set and fetched from
-the helper and low-level APIs; either from the constructors themselves:::
+the helper and low-level APIs; either from the constructors themselves::
 
     Ptr<Object> p = CreateObject<MyNewObject> ("n1", v1, "n2", v2, ...);
 
-or from the higher-level helper APIs, such as:::
+or from the higher-level helper APIs, such as::
 
     mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
                                    "MinX", DoubleValue (-100.0),
@@ -451,7 +451,7 @@
 with a single generic type. Conversions to this type can either be done using an
 intermediate class (IntegerValue, DoubleValue for "floating point") or via
 strings. Direct implicit conversion of types to Value is not really practical.
-So in the above, users have a choice of using strings or values:::
+So in the above, users have a choice of using strings or values::
 
     p->Set ("cwnd", StringValue ("100")); // string-based setter
     p->Set ("cwnd", IntegerValue (100)); // integer-based setter
@@ -488,7 +488,7 @@
 values assigned before the constructor body executes, because you need them in
 the logic of the constructor? There is a way to do this, used for example in the
 class :cpp:class:`ns3::ConfigStore`: call ``ObjectBase::ConstructSelf ()`` as
-follows:::
+follows::
 
     ConfigStore::ConfigStore ()
     {
@@ -510,14 +510,14 @@
 Adding an existing internal variable to the metadata system 
 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
-Consider this variable in class TcpSocket:::
+Consider this variable in class TcpSocket::
 
     uint32_t m_cWnd;   // Congestion window
 
 Suppose that someone working with TCP wanted to get or set the value of that
 variable using the metadata system. If it were not already provided by |ns3|,
 the user could declare the following addition in the runtime metadata system (to
-the TypeId declaration for TcpSocket):::
+the TypeId declaration for TcpSocket)::
 
     .AddAttribute ("Congestion window", 
                    "Tcp congestion window (bytes)",
@@ -537,7 +537,7 @@
 Here, we discuss the impact on a user who wants to add a new class to |ns3|;
 what additional things must be done to hook it into this system.
 
-We've already introduced what a TypeId definition looks like:::
+We've already introduced what a TypeId definition looks like::
 
     TypeId
     RandomWalk2dMobilityModel::GetTypeId (void)
@@ -562,7 +562,7 @@
     }
 
 The declaration for this in the class declaration is one-line public member
-method:::
+method::
 
     public:
       static TypeId GetTypeId (void);
@@ -606,7 +606,7 @@
     };
  
 One macro call and two operators, must be added below the class declaration in
-order to turn a Rectangle into a value usable by the ``Attribute`` system:::
+order to turn a Rectangle into a value usable by the ``Attribute`` system::
 
     std::ostream &operator << (std::ostream &os, const Rectangle &rectangle);
     std::istream &operator >> (std::istream &is, Rectangle &rectangle);
@@ -616,7 +616,7 @@
 Implementation file
 +++++++++++++++++++
 
-In the class definition (``.cc`` file), the code looks like this:::
+In the class definition (``.cc`` file), the code looks like this::
 
     ATTRIBUTE_HELPER_CPP (Rectangle);
 
@@ -660,12 +660,12 @@
 |ns3| ConfigStore.  We can explore this system by using an example from
 ``src/config-store/examples/config-store-save.cc``.
 
-First, all users must include the following statement:::
+First, all users must include the following statement::
 
     #include "ns3/config-store-module.h"
 
 Next, this program adds a sample object A to show how the system
-is extended:::
+is extended::
 
     class A : public Object
     {
@@ -686,7 +686,7 @@
     NS_OBJECT_ENSURE_REGISTERED (A);
 
 Next, we use the Config subsystem to override the defaults in a couple of
-ways:::
+ways::
      
       Config::SetDefault ("ns3::A::TestInt16", IntegerValue (-5));
     
@@ -703,7 +703,7 @@
 created is rooted in the configuration namespace as an object instance.
 This normally happens when you aggregate objects to ns3::Node or ns3::Channel
 but here, since we are working at the core level, we need to create a
-new root namespace object:::
+new root namespace object::
 
       Config::RegisterRootNamespaceObject (a2_obj);
 
@@ -720,7 +720,7 @@
 (default "RawText") governs whether the ConfigStore format is Xml or RawText
 format.
 
-The example shows:::
+The example shows::
 
       Config::SetDefault ("ns3::ConfigStore::Filename", StringValue ("output-attributes.xml"));
       Config::SetDefault ("ns3::ConfigStore::FileFormat", StringValue ("Xml"));
@@ -895,7 +895,7 @@
 is rerun.
 
 Usage is almost the same as the non-GTK-based version, but there
-are no ConfigStore attributes involved:::
+are no ConfigStore attributes involved::
 
   // Invoke just before entering Simulator::Run ()
   GtkConfigStore config;
diff -Naur ns-3.18.1/doc/manual/source/conf.py ns-3.19/doc/manual/source/conf.py
--- ns-3.18.1/doc/manual/source/conf.py	2013-11-15 15:33:07.000000000 -0800
+++ ns-3.19/doc/manual/source/conf.py	2013-12-20 09:44:50.000000000 -0800
@@ -41,16 +41,16 @@
 
 # General information about the project.
 project = u'ns-3'
-copyright = u'2010, ns-3 project'
+copyright = u'2008-13, ns-3 project'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.18.1'
+version = 'ns-3.19'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.18.1'
+release = 'ns-3.19'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.18.1/doc/manual/source/documentation.rst ns-3.19/doc/manual/source/documentation.rst
--- ns-3.18.1/doc/manual/source/documentation.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/doc/manual/source/documentation.rst	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,569 @@
+.. include:: replace.txt
+.. highlight:: cpp
+
+Creating Documentation
+----------------------
+
+|ns3| supplies two kinds of documentation:  expository "user-guide"-style
+chapters, and source code API documentation.
+
+The "user-guide" chapters are written by hand in reStructuredText_
+format (``.rst``), which is processed by the Python documentation
+system Sphinx_ to generate web pages and pdf files.
+The API documentation is generated from the source code itself,
+using Doxygen_, to generate cross-linked web pages.
+Both of these are important:  the Sphinx chapters explain the *why*
+and overview of using a model; the API documentation explains the
+*how* details.  
+
+This chapter gives a quick overview of these
+tools, emphasizing preferred usage and customizations for |ns3|.
+
+To build all the standard documentation:
+
+.. sourcecode:: bash
+
+   $ ./waf docs
+
+For more specialized options, read on.
+
+.. _reStructuredText:  http://sphinx-doc.org/rest.html
+.. _sphinx:            http://sphinx-doc.org/
+.. _doxygen:           http://www.doxygen.org/
+
+
+Documenting with Sphinx
+***********************
+
+We use Sphinx_ to generate expository chapters describing
+the design and usage of each module.  Right now you are reading the
+:doc:`Documentation <documentation>` Chapter.
+The `Show Source <_sources/documentation.txt>`_ link in the sidebar
+will show you the reStructuredText source for this chapter.
+
+Adding New Chapters
+===================
+
+Adding a new chapter takes three steps (described in more detail below):
+
+#. Choose `Where?`_ the documentation file(s) will live.
+#. `Link`_ from an existing page to the new documentation.
+#. Add the new file to the `Makefile`_.
+
+Where?
+######
+
+Documentation for a specific module, ``foo``, should normally go in
+``src/foo/doc/``.  For example ``src/foo/doc/foo.rst`` would be the
+top-level document for the module.  The ``src/create-module.py`` script
+will create this file for you.
+
+Some models require several ``.rst`` files, and figures; these should
+all go in the ``src/foo/doc/`` directory.  The docs are actually build
+by a Sphinx Makefile.  For especially involved
+documentation, it may be helpful to have a local ``Makefile``
+in the ``src/foo/doc/`` directory to
+simplify building the documentation for this module 
+(`Antenna`_ is an example).  Setting this up
+is not particularly hard, but is beyond the scope of this chapter.
+
+In some cases, documentation spans multiple models; the
+`Network`_ chapter is an example.  In these cases
+adding the ``.rst`` files directly to ``doc/models/source/`` might
+be appropriate.
+
+.. _antenna:  http://www.nsnam.org/docs/models/html/antenna.html
+.. _network:  http://www.nsnam.org/docs/models/html/network.html
+
+Link
+####
+
+Sphinx has to know *where* your new chapter should appear.  In most
+cases, a new model chapter should appear the in `Models` book.
+To add your chapter there, edit ``doc/models/source/index.rst``
+
+.. sourcecode:: rest
+
+   .. toctree::
+      :maxdepth: 1
+ 
+     organization
+     animation
+     antenna
+     aodv
+     applications
+     ...
+
+Add the name of your document (without the ``.rst`` extension) to
+this list.  Please keep the Model chapters in alphabetical order,
+to ease visual scanning for specific chapters.
+
+Makefile
+########
+
+You also have to add your document to the appropriate ``Makefile``,
+so ``make`` knows to check it for updates.  The Models book Makefile
+is ``doc/models/Makefile``, the Manual book Makefile is
+``doc/manual/Makefile``.
+
+.. sourcecode:: make
+
+   # list all model library .rst files that need to be copied to $SOURCETEMP
+   SOURCES = \
+           source/conf.py \
+           source/_static \
+           source/index.rst \
+           source/replace.txt \
+           source/organization.rst \
+           ...
+           $(SRC)/antenna/doc/source/antenna.rst \
+           ...
+
+You add your ``.rst`` files to the ``SOURCES`` variable.  To add figures,
+read the comments in the ``Makefile`` to see which variable should contain
+your image files.  Again, please keep these in alphabetical order.
+
+Building Sphinx Docs
+====================
+
+Building the Sphinx documentation is pretty simple.  
+To build all the Sphinx documentation:
+
+.. sourcecode:: bash
+
+   $ ./waf sphinx
+
+To build just the Models documentation:
+
+.. sourcecode:: bash
+
+   $ make -C doc/models
+
+To see the generated documentation point your browser at
+``doc/models/build/html``.
+
+As you can see, Sphinx uses Make to guide the process.
+The default target builds all enabled output forms, which in
+|ns3| are the multi-page ``html``, single-page ``singlehtml``, and pdf
+(``latex``).  To build just the multi-page html, you add the ``html`` target:
+
+.. sourcecode:: bash
+
+   $ make -C doc/models html
+
+This can be helpful to reduce the build time (and the size of the
+build chatter) as you are writing your chapter.
+
+Before committing your documentation to the repo, please check
+that it builds without errors or warnings.  The build process
+generates lots of output (mostly normal chatter from LaTeX),
+which can make it difficult to see if there are any Sphinx
+warnings or errors.  To find important warnings and errors
+build just the ``html`` version, then search the build log
+for ``warning`` or ``error``.
+
+
+|ns3| Specifics
+===============
+
+The Sphinx documentation_ and tutorial_ are pretty good.  We won't duplicate
+the basics here, instead focusing on preferred usage for |ns3|.
+
+.. _documentation:  http://sphinx-doc.org/contents.html
+.. _tutorial:       http://sphinx-doc.org/tutorial.html
+
+
+* Start documents with these two lines:
+   
+  .. sourcecode:: rest
+     
+     .. include:: replace.txt
+     .. highlight:: cpp
+   
+  The first line enables some simple replacements.  For example,
+  typing ``|ns3|`` renders as |ns3|.
+  The second sets the default source code highlighting language explicitly
+  for the file, since the parser guess isn't always accurate.
+  (It's also possible to set the language explicitly for a single code block,
+  see below.)
+
+* Sections:
+  
+  Sphinx is pretty liberal about marking section headings.  By convention,
+  we prefer this hierarchy:
+  
+  .. sourcecode:: rest
+      
+     .. heading hierarchy:
+        ------------- Chapter
+        ************* Section (#.#)
+        ============= Subsection (#.#.#)
+        ############# Sub-subsection
+
+* Syntax Highlighting:
+  
+  To use the default syntax highlighter, simply start a sourcecode block:
+
+  +--------------------------------------+------------------------------------+
+  | Sphinx Source                        | Rendered Output                    |
+  +======================================+====================================+
+  | .. sourcecode:: rest                 |                                    |
+  |                                      |                                    |
+  |   The ``Frobnitz`` is accessed by::  | The ``Frobnitz`` is accessed by::  |
+  |                                      |                                    |
+  |     Foo::Frobnitz frob;              |   Foo::Frobnitz frob;              |
+  |     frob.Set (...);                  |   frob.Set (...);                  |
+  +--------------------------------------+------------------------------------+
+
+  To use a specific syntax highlighter, for example, ``bash`` shell commands:
+
+  +--------------------------------------+------------------------------------+
+  | Sphinx Source                        | Rendered Output                    |
+  +======================================+====================================+
+  | .. sourcecode:: rest                 |                                    |
+  |                                      |                                    |
+  |   .. sourcecode:: bash               | .. sourcecode:: bash               |
+  |                                      |                                    |
+  |      $ ls                            |    $ ls		              |
+  +--------------------------------------+------------------------------------+
+  
+* Shorthand Notations:
+
+  These shorthands are defined:
+
+  +--------------------------------------+------------------------------------+
+  | Sphinx Source                        | Rendered Output                    |
+  +======================================+====================================+
+  | .. sourcecode:: rest                 |                                    |
+  |                                      |                                    |
+  |    |ns3|                             |  |ns3|                             |
+  +--------------------------------------+------------------------------------+
+  | .. sourcecode:: rest                 |                                    |
+  |                                      |                                    |
+  |    |ns2|                             |  |ns2|                             |
+  +--------------------------------------+------------------------------------+
+  | .. sourcecode:: rest                 |                                    |
+  |                                      |                                    |
+  |    |check|                           |  |check|                           |
+  +--------------------------------------+------------------------------------+
+  | .. sourcecode:: rest                 |                                    |
+  |                                      |                                    |
+  |    :rfc:`6282`                       |  :rfc:`6282`                       |
+  +--------------------------------------+------------------------------------+
+
+
+Documenting with Doxygen
+************************
+
+We use Doxygen_ to generate browsable_ API documentation.  Doxygen
+provides a number of useful features:
+
+  * Summary table of all class members.
+  * Graphs of inheritance and collaboration for all classes.
+  * Links to the source code imlementing each function.
+  * Links to every place a member is used.
+  * Links to every object used in implementing a function.
+  * Grouping of related classes, such as all the classes related to
+    a specific protocol.
+
+In addition, we use the ``TypeId`` system to add to the documentation
+for every class
+
+  * The ``Config`` paths by which such objects can be reached.
+  * Documentation for any ``Attributes``, including ``Attributes``
+    defined in parent classes.
+  * Documentation for any ``Trace`` sources defined by the class.
+
+Doxygen operates by scaning the source code, looking for
+specially marked comments.  It also creates a cross reference,
+indicating *where* each file, class, method, and variable is used.
+
+.. _browsable: https://www.nsnam.org/docs/doxygen
+
+
+Preferred Style
+===============
+
+The preferred style for Doxygen comments is the JavaDoc style::
+
+  /**
+   *  Brief description of this class or method.
+   *  Adjacent lines become a single paragraph.
+   *
+   *  Longer description, with lots of details.
+   *
+   *  Blank lines separate paragraphs.
+   *
+   *  Explain what the class or method does, using what algorithm.
+   *  Explain the units of arguments and return values.
+   *
+   *  \note Note any limitations or gotchas.
+   *
+   *  (For functions with arguments or return valued:)
+   *  \param foo Brief noun phrase describing this argument.
+   *  \param bar Note Sentence case, and terminating period.
+   *  \return Brief noun phrase describing the value.
+   *
+   *  \internal
+   *
+   *  You can also discuss internal implementation details.
+   *  Understanding this material shouldn't be necessary to using
+   *  the class or method.
+   */
+   class Example
+
+In this style the Doxygen comment block begins with two \`*' characters:
+``/**``, and precedes the item being documented.
+
+For items needing only a brief description, either of these short forms
+is appropriate::
+
+  /** Destructor implementation. */
+  void DoDispose ();
+
+  int m_count;  //!< Count of ...
+
+Note the special form of the end of line comment, ``//!<``, indicating
+that it refers to the *preceding* item.
+
+Some items to note:
+
+  * Use sentence case, including the initial capital.
+  * Use punctuation, especially \`.'s at the end of sentences or phrases.
+  * The ``\brief`` tag is not needed; the first sentence will be
+    used as the brief description.
+
+Every class, method, typedef, member variable, function argument
+and return value should be documented in all source code files
+which form the formal API and implementation for |ns3|, such as
+``src/<module>/model/*``, ``src/<module>/helper/*`` and
+``src/<module>/utils/*``.  Documentation for items in ``src/<module>/test/*``
+and ``src/<module>/examples/*`` is preferred, but not required.
+
+Useful Features
+===============
+
+* Inherited members will automatically inherit docs from the parent,
+  (but can be replaced by local documentation).
+
+  #. Document the base class.
+  #. In the sub class mark inherited functions with an ordinary comment::
+
+       // Inherited methods
+       virtual void FooBar (void);
+       virtual int BarFoo (double baz);
+
+     Note that the signatures have to match exactly, so include the formal
+     argument ``(void)``
+
+     This doesn't work for static functions; see ``GetTypeId``, below, for an
+     example.
+
+Building Doxygen Docs
+=====================
+
+Building the Doxygen documentation is pretty simple:
+
+.. sourcecode:: bash
+
+   $ ./waf doxygen
+
+This builds using the default configuration, which generates documentation
+sections for *all* items, even if they do not have explicit comment
+documentation blocks.  This has the effect of suppressing warnings for
+undocumented items, but makes sure everything appears in the generated
+output.
+
+When writing documentation, it's often more useful to see which items
+are generating warnings, typically about missing documentation.
+To see the full warnings list, use the ``doc/doxygen.warnings.report.sh``
+script:
+
+.. sourcecode:: bash
+
+   $ doc/doxygen.warnings.report.sh
+   Waf: Entering directory `build'
+   ...
+   Waf: Leaving directory `build'
+   'build' finished successfully (3m24.094s)
+
+   Rebuilding doxygen docs with full errors...Done.
+
+
+   Report of Doxygen warnings
+   ----------------------------------------
+
+   (All counts are lower bounds.)
+
+   Warnings by module/directory:
+
+   Count Directory
+   ----- ----------------------------------
+   3844 src/lte/model
+   1718 src/wimax/model
+   1423 src/core/model
+   ....
+    138 additional undocumented parameters.
+   ----------------------------------------
+    15765 total warnings
+      126 directories with warnings
+
+
+   Warnings by file (alphabetical)
+
+   Count File
+   ----- ----------------------------------
+     17 doc/introspected-doxygen.h
+     15 examples/routing/manet-routing-compare.cc
+     26 examples/stats/wifi-example-apps.h
+   ....
+   ----------------------------------------
+      967 files with warnings
+
+
+   Warnings by file (numerical)
+
+   Count File
+   ----- ----------------------------------
+    374 src/lte/model/lte-asn1-header.h
+    280 src/lte/model/lte-rrc-sap.h
+    262 src/lte/model/lte-rrc-header.h
+   ....
+   ----------------------------------------
+      967 files with warnings
+
+
+   Doxygen Warnings Summary
+   ----------------------------------------
+      126 directories
+      967 files
+    15765 warnings
+
+The script modifies the configuration to show all warnings, and
+to shorten the run time.  As you can see, at this writing we have
+*a lot* of undocumented items.  The report summarizes warnings
+by module ``src/*/*``, and by file, in alphabetically and numerical
+order.
+
+The script has a few options to pare things down and make this more
+manageable.  For help, use the ``-h`` option.  Having run it once
+to do the Doxygen build and generate the full warnings log,
+you can reprocess the log file with various "filters,"
+without having to do the full Doxygen build by,
+again using the ``-s`` option.  You can exclude warnings
+from ``*/examples/*`` files (``-e`` option), and/or ``*/test/*`` files
+(``-t``).
+
+Perhaps the most useful option when writing documentation comments
+is ``-m <module>``, which will limit the report to just files matching
+``src/<module>/*``, and follow the report with the actual warning lines.
+Combine with ``-et`` and you can focus on the warnings that are most
+urgent in a single module:
+
+.. sourcecode:: bash
+
+   $ doc/doxygen.warnings.report.sh -m mesh/helper
+   ...
+   Doxygen Warnings Summary
+   ----------------------------------------
+     1 directories
+     3 files
+   149 warnings
+
+
+   Filtered Warnings
+   ========================================
+   src/mesh/helper/dot11s/dot11s-installer.h:72: warning: Member m_root (variable) of class ns3::Dot11sStack is not documented.
+   src/mesh/helper/dot11s/dot11s-installer.h:35: warning: return type of member ns3::Dot11sStack::GetTypeId is not documented
+   src/mesh/helper/dot11s/dot11s-installer.h:56: warning: return type of member ns3::Dot11sStack::InstallStack is not documented
+   src/mesh/helper/flame/flame-installer.h:40: warning: Member GetTypeId() (function) of class ns3::FlameStack is not documented.
+   src/mesh/helper/flame/flame-installer.h:60: warning: return type of member ns3::FlameStack::InstallStack is not documented
+   src/mesh/helper/mesh-helper.h:213: warning: Member m_nInterfaces (variable) of class ns3::MeshHelper is not documented.
+   src/mesh/helper/mesh-helper.h:214: warning: Member m_spreadChannelPolicy (variable) of class ns3::MeshHelper is not documented.
+   src/mesh/helper/mesh-helper.h:215: warning: Member m_stack (variable) of class ns3::MeshHelper is not documented.
+   src/mesh/helper/mesh-helper.h:216: warning: Member m_stackFactory (variable) of class ns3::MeshHelper is not documented.
+   src/mesh/helper/mesh-helper.h:209: warning: parameters of member ns3::MeshHelper::CreateInterface are not (all) documented
+   src/mesh/helper/mesh-helper.h:119: warning: parameters of member ns3::MeshHelper::SetStandard are not (all) documented
+
+
+Now it's just a matter of understanding the code, and writing some
+docs!
+
+
+
+|ns3| Specifics
+===============
+
+As for Sphinx, the Doxygen docs_ and reference_ are pretty good.
+We won't duplicate the basics here, instead focusing on preferred
+usage for |ns3|.
+
+.. _docs:       http://www.stack.nl/~dimitri/doxygen/index.html
+.. _reference:  http://www.stack.nl/~dimitri/doxygen/manual/commands.html
+
+
+* Use Doxygen ``Modules`` to group related items.
+
+  In the main header for a module, create a Doxgyen group::
+
+    /**
+     *  \defgroup foo Foo protocol.
+     */
+
+  Mark each associated class as belonging to the group::
+
+    /**
+     *  \ingroup foo
+     *
+     *  Foo packet type.
+    */
+    class Foo
+
+* Copy the ``Attribute`` help strings from the ``GetTypeId`` method to use
+  as the brief descriptions of associated members.
+
+* ``\bugid{298}`` will create a link to bug 298 in our Bugzilla.
+
+* ``\pname{foo}`` in a description will format ``foo``
+  as a ``\param foo`` parameter, making it clear that you
+  are referring to an actual argument.
+
+* ``\RFC{301}`` will create a link to RFC 301.
+
+* ``\internal`` should be used only to set off a discussion of implementation
+  details, not to mark ``private`` functions (they are already marked,
+  as ``private``!)
+
+* Don't create classes with trivial names, such as ``class A``,
+  even in test suites.  These cause all instances of the class name
+  literal \`A' to be rendered as links.
+
+
+As noted above, static functions don't inherit the documentation
+of the same functions in the parent class.  |ns3| uses a few static
+functions ubiquitously; the suggested documentation block for these
+cases is:
+
+  * Default constructor/destructor::
+
+      MyClass ();   //!< Default constructor
+      ~MyClass ();  //!< Destructor
+
+  * Dummy destructor and DoDispose::
+
+      /** Dummy destructor, see DoDispose. */
+      ~MyClass ();
+
+      /** Destructor implementation */
+      virtual void DoDispose ();
+
+  * GetTypeId::
+
+      /**
+       *  Register this type.
+       *  \return The object TypeId.
+       */
+      static TypeId GetTypeId (void);
+
+
+
diff -Naur ns-3.18.1/doc/manual/source/logging.rst ns-3.19/doc/manual/source/logging.rst
--- ns-3.18.1/doc/manual/source/logging.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/manual/source/logging.rst	2013-12-20 09:44:50.000000000 -0800
@@ -22,16 +22,14 @@
 frameworks on top of logging code, as the output and the way the output
 is enabled may change over time. 
 
-Logging overview
-****************
+Overview
+********
 
 |ns3| logging statements are typically used to log various program
 execution events, such as the occurrence of simulation events or the
 use of a particular function.
 
-For example, this code snippet is from ``Ipv4L3Protocol::IsDestinationAddress()``:
-
-::
+For example, this code snippet is from ``Ipv4L3Protocol::IsDestinationAddress()``::
 
   if (address == iaddr.GetBroadcast ())
     {
@@ -39,121 +37,393 @@
       return true;
      }
 
-If logging has been enabled for the ``Ipv4L3Protocol`` component at a level
-of ``LOGIC`` or above (see below about logging levels), the statement
+If logging has been enabled for the ``Ipv4L3Protocol`` component at a severity
+of ``LOGIC`` or above (see below about log severity), the statement
 will be printed out; otherwise, it will be suppressed.
 
-Logging levels
-==============
+Enabling Output
+===============
 
-The following levels are defined; each level will enable the levels above
-it, with the ``ALL`` level being most verbose:
+There are two ways that users typically control log output.  The
+first is by setting the ``NS_LOG`` environment variable; e.g.:
 
-#. ``LOG_NONE``:  the default, no logging
-#. ``LOG_ERROR``:  serious error messages only
-#. ``LOG_WARN``:  warning messages
-#. ``LOG_DEBUG``:  for use in debugging
-#. ``LOG_FUNCTION``: function tracing
-#. ``LOG_LOGIC``:  control flow tracing within functions
-#. ``LOG_ALL``:  print everything
+.. sourcecode:: bash
 
-A special logging level will cause logging output to unconditionally
-appear on ``std::clog``, regardless of whether the user has explicitly enabled 
-logging.
-This macro, ``NS_LOG_UNCOND()``, can be used like a kind of ``printf()`` in
-your code.  An example can be found in ``scratch/scratch-simulator.cc``:
+   $ NS_LOG="*" ./waf --run first
 
-::
+will run the ``first`` tutorial program with all logging output.  (The
+specifics of the ``NS_LOG`` format will be discussed below.)
 
-   NS_LOG_UNCOND ("Scratch Simulator");
+This can be made more granular by selecting individual components:
 
-Logging prefixes
-================
+.. sourcecode:: bash
 
-This section still needs documentation; bug 1496 is open on this:
+   $ NS_LOG="Ipv4L3Protocol" ./waf --run first
 
-.. sourcecode:: bash
+The output can be further tailored with prefix options.
+  
+The second way to enable logging is to use explicit statements in your
+program, such as in the ``first`` tutorial program::
+   
+   int
+   main (int argc, char *argv[])
+   {
+     LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
+     LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
+     ...
 
-   $ NS_LOG="*=all|prefix_all" ./waf --run scratch-simulator
-   Scratch Simulator
-   ScratchSimulator:main(): [ERROR] error message
-   ScratchSimulator:main(): [WARN] warn message
-   ScratchSimulator:main(): [DEBUG] debug message
-   ScratchSimulator:main(): [INFO] info message
-   ScratchSimulator:main(function)
-   ScratchSimulator:main(): [LOGIC] logic message
+(The meaning of ``LOG_LEVEL_INFO``, and other possible values,
+will be discussed below.)
 
-Enabling logging output
-=======================
+``NS_LOG`` Syntax
+=================
 
-There are two ways that users typically control logging output.  The
-first is by setting an ``NS_LOG`` environment variable; e.g.:
+The ``NS_LOG`` environment variable contains a list of log components
+and options.  Log components are separated by \`:' characters:
 
 .. sourcecode:: bash
 
-   $ NS_LOG="*" ./waf --run first
+   $ NS_LOG="<log-component>:<log-component>..."
 
-will run the first tutorial program with all logging output.  This can
-be made more granular by selecting individual components:
+Options for each log component are given as flags after
+each log component:
 
 .. sourcecode:: bash
 
-   $ NS_LOG="Ipv4L3Protocol" ./waf --run first
-  
-The second way to enable this is to use explicit statements in your
-program, such as in the first tutorial program:
+   $ NS_LOG="<log-component>=<option>|<option>...:<log-component>..."
 
-::
-   
-   int
-   main (int argc, char *argv[])
-   {
-     LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
-     LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
-     ...
+Options control the severity and level for that component,
+and whether optional information should be included, such as the
+simulation time, simulation node, function name, and the symbolic severity.
 
-Some helpers have special methods to enable the logging of all components
-in a module (across different compilation units, but logically grouped
-together such as the |ns3| wifi code:
+Log Components
+==============
 
-::
+Generally a log component refers to a single source code ``.cc`` file,
+and encompasses the entire file.
+
+Some helpers have special methods to enable the logging of all components
+in a module, spanning different compilation units, but logically grouped
+together, such as the |ns3| wifi code::
 
    WifiHelper wifiHelper;
    wifiHelper.EnableLogComponents (); 
 
+The ``NS_LOG`` log component wildcard \`*' will enable all components.
+
+To see what log components are defined, any of these will work:
+
+.. sourcecode:: bash
+
+   $ NS_LOG="print-list" ./waf --run ...
+
+   $ NS_LOG="foo"  # a token not matching any log-component
+
+The first form will print the name and enabled flags for all log components
+which are linked in; try it with ``scratch-simulator``.
+The second form prints all registered log components,
+then exit with an error.
+
+
+Severity and Level Options
+==========================
+
+Individual messages belong to a single "severity class," set by the macro
+creating the message.  In the example above,
+``NS_LOG_LOGIC(..)`` creates the message in the ``LOG_LOGIC`` severity class.
+
+The following severity classes are defined as ``enum`` constants:
+
+================  =====================================
+Severity Class    Meaning
+================  =====================================
+``LOG_NONE``      The default, no logging
+``LOG_ERROR``     Serious error messages only
+``LOG_WARN``      Warning messages
+``LOG_DEBUG``     For use in debugging
+``LOG_INFO``      Informational
+``LOG_FUNCTION``  Function tracing
+``LOG_LOGIC``     Control flow tracing within functions
+================  =====================================
+
+Typically one wants to see messages at a given severity class *and higher*.
+This is done by defining inclusive logging "levels":
+
+======================  ===========================================
+Level                   Meaning
+======================  ===========================================
+``LOG_LEVEL_ERROR``     Only ``LOG_ERROR`` severity class messages.
+``LOG_LEVEL_WARN``      ``LOG_WARN`` and above.
+``LOG_LEVEL_DEBUG``     ``LOG_DEBUG`` and above.
+``LOG_LEVEL_INFO``      ``LOG_INFO`` and above.
+``LOG_LEVEL_FUNCTION``  ``LOG_FUNCTION`` and above.
+``LOG_LEVEL_LOGIC``     ``LOG_LOGIC`` and above.
+``LOG_LEVEL_ALL``       All severity classes.
+``LOG_ALL``             Synonym for ``LOG_LEVEL_ALL``
+======================  ===========================================
+
+The severity class and level options can be given in the ``NS_LOG``
+environment variable by these tokens:
+
+============  =================
+Class         Level
+============  =================
+``error``     ``level_error``
+``warn``      ``level_warn``
+``debug``     ``level_debug``
+``info``      ``level_info``
+``function``  ``level_function``
+``logic``     ``level_logic``
+..            | ``level_all``
+              | ``all``
+              | ``*``
+============  =================
+
+Using a severity class token enables log messages at that severity only.
+For example, ``NS_LOG="*=warn"`` won't output messages with severity ``error``.
+``NS_LOG="*=level_debug"`` will output messages at severity levels
+``debug`` and above.
+
+Severity classes and levels can be combined with the \`|' operator:
+``NS_LOG="*=level_warn|logic"`` will output messages at severity levels
+``error``, ``warn`` and ``logic``.
+
+The ``NS_LOG`` severity level wildcard \`*' and ``all``
+are synonyms for ``level_all``.
+
+For log components merely mentioned in ``NS_LOG``
+
+.. sourcecode:: bash
+
+   $ NS_LOG="<log-component>:..."
+
+the default severity is ``LOG_LEVEL_ALL``.
+
+
+Prefix Options
+==============
+
+A number of prefixes can help identify
+where and when a message originated, and at what severity.
+
+The available prefix options (as ``enum`` constants) are
+
+======================  ===========================================
+Prefix Symbol           Meaning
+======================  ===========================================
+``LOG_PREFIX_FUNC``     Prefix the name of the calling function.
+``LOG_PREFIX_TIME``     Prefix the simulation time.
+``LOG_PREFIX_NODE``     Prefix the node id.
+``LOG_PREFIX_LEVEL``    Prefix the severity level.
+``LOG_PREFIX_ALL``      Enable all prefixes.
+======================  ===========================================
+
+The prefix options are described briefly below.
+
+The options can be given in the ``NS_LOG``
+environment variable by these tokens:
+
+================  =========
+Token             Alternate
+================  =========
+``prefix_func``   ``func``
+``prefix_time``   ``time``
+``prefix_node``   ``node``
+``prefix_level``  ``level``
+``prefix_all``    | ``all``
+                  | ``*``
+================  =========
+
+For log components merely mentioned in ``NS_LOG``
+
+.. sourcecode:: bash
+
+   $ NS_LOG="<log-component>:..."
+
+the default prefix options are ``LOG_PREFIX_ALL``.
+
+Severity Prefix
+###############
+
+The severity class of a message can be included with the options
+``prefix_level`` or ``level``.  For example, this value of ``NS_LOG``
+enables logging for all log components (\`*') and all severity
+classes (``=all``), and prefixes the message with the severity
+class (``|prefix_level``).
+
+.. sourcecode:: bash
+
+   $ NS_LOG="*=all|prefix_level" ./waf --run scratch-simulator
+   Scratch Simulator
+   [ERROR] error message
+   [WARN] warn message
+   [DEBUG] debug message
+   [INFO] info message
+   [FUNCT] function message
+   [LOGIC] logic message
+
+Time Prefix
+###########
+
+The simulation time can be included with the options
+``prefix_time`` or ``time``.  This prints the simulation time in seconds.
+
+Node Prefix
+###########
+
+The simulation node id can be included with the options
+``prefix_node`` or ``node``.
+
+Function Prefix
+###############
+
+The name of the calling function can be included with the options
+``prefix_func`` or ``func``.
+
+
+``NS_LOG`` Wildcards
+####################
+
+The log component wildcard \`*' will enable all components.  To
+enable all components at a specific severity level
+use ``*=<severity>``.
+
+The severity level option wildcard \`*' is a synonym for ``all``.
+This must occur before any \`|' characters separating options.
+To enable all severity classes, use ``<log-component>=*``,
+or ``<log-component>=*|<options>``.
+
+The option wildcard \`*' or token ``all`` enables all prefix options,
+but must occur *after* a \`|' character.  To enable a specific
+severity class or level, and all prefixes, use
+``<log-component>=<severity>|*``.
+
+The combined option wildcard ``**`` enables all severities and all prefixes;
+for example, ``<log-component>=**``.
+
+The uber-wildcard ``***`` enables all severities and all prefixes
+for all log components.  These are all equivalent:
+
+.. sourcecode:: bash
+
+   $ NS_LOG="***" ...      $ NS_LOG="*=all|*" ...        $ NS_LOG="*=*|all" ...	      
+   $ NS_LOG="*=**" ...     $ NS_LOG="*=level_all|*" ...  $ NS_LOG="*=*|prefix_all" ...
+   $ NS_LOG="*=*|*" ...
+                       
+Be advised:  even the trivial ``scratch-simulator`` produces over
+46K lines of output with ``NS_LOG="***"``!
+
 
 How to add logging to your code
 *******************************
 
-To add logging to your code, please follow the below steps:
+Adding logging to your code is very simple:
+
+1. Invoke the ``NS_LOG_COMPONENT_DEFINE (...);`` macro
+   outside of ``namespace ns3``.
+
+  Create a unique string identifier (usually based on the name of the file
+  and/or class defined within the file) and register it with a macro call
+  such as follows:
+
+  ::
+
+    NS_LOG_COMPONENT_DEFINE ("Ipv4L3Protocol");
+
+    namespace ns3 {
+    ...
+
+  This registers ``Ipv4L3Protocol`` as a log component.
+
+  (The macro was carefully written to permit inclusion either within or
+  outside of namespace ``ns3``, and usage will vary across the codebase, but
+  the original intent was to register this *outside* of namespace ``ns3``
+  at file global scope.)
+
+2. Add logging statements (macro calls) to your functions and function bodies.
+
+Logging Macros
+==============
+
+  The logging macros and associated severity levels are
+
+  ================  ==========================
+  Severity Class    Macro
+  ================  ==========================
+  ``LOG_NONE``      (none needed)
+  ``LOG_ERROR``     ``NS_LOG_ERROR (...);``
+  ``LOG_WARN``      ``NS_LOG_WARN (...);``
+  ``LOG_DEBUG``     ``NS_LOG_DEBUG (...);``
+  ``LOG_INFO``      ``NS_LOG_INFO (...);``
+  ``LOG_FUNCTION``  ``NS_LOG_FUNCTION (...);``
+  ``LOG_LOGIC``     ``NS_LOG_LOGIC (...);``
+  ================  ==========================
+
+  The macros function as output streamers, so anything you can send to
+  ``std::cout``, joined by ``<<`` operators, is allowed::
+
+    void MyClass::Check (int value, char * item)
+    {
+      NS_LOG_FUNCTION (this << arg << item);
+      if (arg > 10)
+        {
+          NS_LOG_ERROR ("encountered bad value " << value <<
+                        " while checking " << name << "!");
+        }
+      ...
+    }
+
+  Note that ``NS_LOG_FUNCTION`` automatically inserts a \`\ :literal:`,\ `'
+  (comma-space) separator between each of its arguments.
+  This simplifies logging of function arguments;
+  just concatenate them with ``<<`` as in the example above.
+
+Unconditional Logging
+=====================
+
+As a convenience, the ``NS_LOG_UNCOND (...);`` macro will always log its
+arguments, even if the associated log-component is not enabled at any
+severity.  This macro does not use any of the prefix options.  Note that
+logging is only enabled in debug builds; this macro won't produce
+output in optimized builds.
+
+
+Guidelines
+==========
+
+* Start every class method with ``NS_LOG_FUNCTION (this << args...);``
+  This enables easy function call tracing.
+
+  * Except:  don't log operators or explicit copy constructors, 
+    since these will cause infinite recursion and stack overflow.
+
+  * For methods without arguments use the same form:
+    ``NS_LOG_FUNCTION (this);``
+
+  * For static functions:
+
+    * With arguments use ``NS_LOG_FUNCTION (...);`` as normal.
+    * Without arguments use ``NS_LOG_FUNCTION_NOARGS ();``
 
-1) Put ``NS_LOG_COMPONENT_DEFINE`` macro outside of namespace ns3
+* Use ``NS_LOG_ERROR`` for serious error conditions that probably
+  invalidate the simulation execution.
 
-Create a unique string identifier (usually based on the name of the file
-and/or class defined within the file) and register it with a macro call
-such as follows:
+* Use ``NS_LOG_WARN`` for unusual conditions that may be correctable.
+  Please give some hints as to the nature of the problem and how
+  it might be corrected.
 
-::
+* ``NS_LOG_DEBUG`` is usually used in an *ad hoc* way to understand
+  the execution of a model.
 
-   NS_LOG_COMPONENT_DEFINE ("Ipv4L3Protocol");
+* Use ``NS_LOG_INFO`` for additional information about the execution,
+  such as the size of a data structure when adding/removing from it.
 
-   namespace ns3 {
-   ...
+* Use ``NS_LOG_LOGIC`` to trace important logic branches within a function.
 
-The macro was carefully written to permit inclusion either within or
-outside of namespace ``ns3``, and usage will vary across the codebase, but
-the original intent was to register this *outside* of namespace ``ns3``.
+* Test that your logging changes do not break the code.  
+  Run some example programs with all log components turned on (e.g. 
+  ``NS_LOG="***"``).
 
-2) Add logging statements to your functions and function bodies.
 
-There are a couple of guidelines on this:
 
-* Do *not* add function logging in operators or explicit copy constructors, 
-  since these will cause infinite recursion and stack overflow.
-* Use the ``NS_LOG_FUNCTION_NOARGS()`` variant for static methods *only*. When 
-  a non-static member function has no arguments, it should be logged by 
-  ``NS_LOG_FUNCTION (this)`` macro.
-* Make sure that you test that your logging changes do not break the code; 
-  running some example programs with all log components turned on (e.g. 
-  ``NS_LOG="*"``) is one way to test this.
 
diff -Naur ns-3.18.1/doc/manual/source/new-models.rst ns-3.19/doc/manual/source/new-models.rst
--- ns-3.18.1/doc/manual/source/new-models.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/manual/source/new-models.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,8 +1,8 @@
 .. include:: replace.txt
 .. highlight:: cpp
 
-Creating a new ns-3 model
--------------------------
+Creating a new |ns3| model
+--------------------------
 
 This chapter walks through the design process of an |ns3| model.  In many
 research cases, users will not be satisfied to merely adapt existing models, but
@@ -11,7 +11,16 @@
 of how one might approach this problem and proceed through a design and
 implementation.
 
-Design-approach
+.. note:: Documentation
+
+   Here we focus on the process of creating new models
+   and new modules, and some of the design choices involved.
+   For the sake of clarity, we defer discussion of the
+   *mechanics* of documenting models and source code to the
+   :doc:`Documentation <documentation>` chapter.
+
+
+Design Approach
 ***************
 
 Consider how you want it to work; what should it do. Think about these things:
@@ -26,13 +35,13 @@
   should I avoid any dependence on IPv4 if I want it to also be used by IPv6?
   Should I avoid any dependency on IP at all?
 
-Do not be hesitant to contact the ns-3-users or ns-developers list if you have
+Do not be hesitant to contact the `ns-3-users` or `ns-developers` list if you have
 questions. In particular, it is important to think about the public API of your
 new model and ask for feedback. It also helps to let others know of your work in
 case you are interested in collaborators.
 
-Example: ErrorModel
-+++++++++++++++++++
+Example: `ErrorModel`
++++++++++++++++++++++
 
 An error model exists in |ns2|. It allows packets to be passed to a stateful
 object that determines, based on a random variable, whether the packet is
@@ -44,7 +53,7 @@
 corruption occurred.  Note that depending on the error model, the packet data
 buffer may or may not be corrupted.  Let's call this function "IsCorrupt()".
 
-So far, in our design, we have:::
+So far, in our design, we have::
 
     class ErrorModel
     {
@@ -95,7 +104,7 @@
 NetDevice level.
 
 After some thinking and looking at existing |ns2| code, here is a sample API of
-a base class and first subclass that could be posted for initial review:::
+a base class and first subclass that could be posted for initial review::
 
     class ErrorModel 
     {
@@ -158,16 +167,16 @@
 will collide with the existing error model. The below is just an outline of how
 ErrorModel was built that you can adapt to other models.
 
-Review the ns-3 coding style document
-+++++++++++++++++++++++++++++++++++++
+Review the |ns3| Coding Style Document
+++++++++++++++++++++++++++++++++++++++
 
 At this point, you may want to pause and read the |ns3| coding style document,
 especially if you are considering to contribute your code back to the project.
 The coding style document is linked off the main project page: `ns-3 coding
 style <http://www.nsnam.org/developers/contributing-code/coding-style/>`_.
 
-Decide where in the source tree the model will reside in
-++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+Decide Where in the Source Tree the Model Should Reside
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 All of the |ns3| model source code is in the directory ``src/``.  You will need
 to choose which subdirectory it resides in. If it is new model code of some
@@ -178,8 +187,8 @@
 makes sense to implement this in the ``src/network/`` module where |ns3|
 packets are implemented.  
 
-waf and wscript
-+++++++++++++++
+`waf` and `wscript`
++++++++++++++++++++
 
 |ns3| uses the `Waf <http://www.freehackers.org/~tnagy/waf.html>`_ build system.
 You will want to integrate your new |ns3| uses the Waf build system. You will
@@ -193,7 +202,7 @@
 Now, pop up to the top level directory and type "./test.py".  You
 shouldn't have broken anything by this operation.
 
-include guards
+Include Guards
 ++++++++++++++
 
 Next, let's add some `include guards
@@ -204,8 +213,8 @@
     ...
     #endif
 
-namespace ns3
-+++++++++++++
+`namespace ns3`
++++++++++++++++
 
 |ns3| uses the |ns3| `namespace
 <http://en.wikipedia.org/wiki/Namespace_(computer_science)#Use_in_common_languages>`_
@@ -217,7 +226,7 @@
     }
 
 At this point, we have some skeletal files in which we can start defining
-our new classes. The header file looks like this:::
+our new classes. The header file looks like this::
 
     #ifndef ERROR_MODEL_H
     #define ERROR_MODEL_H
@@ -227,7 +236,7 @@
     } // namespace ns3
     #endif
 
-while the ``error-model.cc`` file simply looks like this:::
+while the ``error-model.cc`` file simply looks like this::
 
     #include "error-model.h"
 
@@ -244,8 +253,8 @@
 At this point, we're still working on some scaffolding, but we can begin to
 define our classes, with the functionality to be added later.
 
-use of class Object?
-++++++++++++++++++++
+Inherit from the `Object` Class?
+++++++++++++++++++++++++++++++++
 
 This is an important design step; whether to use class :cpp:class:`Object` as a
 base class for your new classes.
@@ -268,7 +277,7 @@
 instances of this object across the |ns3| public API, so class
 :cpp:class:`Object` is appropriate for us.
 
-initial classes
+Initial Classes
 +++++++++++++++
 
 One way to proceed is to start by defining the bare minimum functions and see if
@@ -374,28 +383,28 @@
 registration of the class into the system.  The :ref:`Object-model` chapter
 discusses this in more detail.
 
-how to include files from elsewhere
-+++++++++++++++++++++++++++++++++++
+Including External Files
+++++++++++++++++++++++++
 
-log component 
-+++++++++++++
+Logging Support
++++++++++++++++
 
 *Here, write a bit about adding |ns3| logging macros. Note that
 LOG_COMPONENT_DEFINE is done outside the namespace ns3*
 
-constructor, empty function prototypes
+Constructor, Empty Function Prototypes
 ++++++++++++++++++++++++++++++++++++++
 
-key variables (default values, attributes)
+Key Variables (Default Values, Attributes)
 ++++++++++++++++++++++++++++++++++++++++++
 
-test program 1
+Test Program 1
 ++++++++++++++
 
 Object Framework
 ++++++++++++++++
 
-Adding-a-sample-script
+Adding a Sample Script
 **********************
 
 At this point, one may want to try to take the basic scaffolding defined above
@@ -404,7 +413,7 @@
 API modifications need to be made. Once this is done, we will return to building
 out the functionality of the ErrorModels themselves.
 
-Add basic support in the class
+Add Basic Support in the Class
 ++++++++++++++++++++++++++++++
 
 ::
@@ -435,7 +444,7 @@
                        MakePointerAccessor (&PointToPointNetDevice::m_receiveErrorModel),
                        MakePointerChecker<ErrorModel> ())
 
-Plumb into the system
+Plumb Into the System
 +++++++++++++++++++++
 
 ::
@@ -469,7 +478,7 @@
         }
     }
 
-Create null functional script
+Create Null Functional Script
 +++++++++++++++++++++++++++++
 
 ::
@@ -499,8 +508,8 @@
 "Corrupt!" for each packet received at node n3. Next, we return to the error
 model to add in a subclass that performs more interesting error modeling.
 
-Add subclass
-************
+Add a Subclass
+**************
 
 The trivial base class ErrorModel does not do anything interesting, but it
 provides a useful base class interface (Corrupt () and Reset ()), forwarded to
@@ -523,7 +532,7 @@
   of granularity.
 * Ability to enable/disable (default is enabled)
 
-How to subclass
+How to Subclass
 +++++++++++++++
 
 We declare BasicErrorModel to be a subclass of ErrorModel as follows,::
@@ -541,7 +550,7 @@
     }
 
 and configure the subclass GetTypeId function by setting a unique TypeId string
-and setting the Parent to ErrorModel:::
+and setting the Parent to ErrorModel::
 
     TypeId RateErrorModel::GetTypeId (void)
     {
@@ -550,12 +559,12 @@
         .AddConstructor<RateErrorModel> ()
       ...
 
-Build-core-functions-and-unit-tests
+Build Core Functions and Unit Tests
 ***********************************
 
-assert macros
+Assert Macros
 +++++++++++++
 
-Writing unit tests
+Writing Unit Tests
 ++++++++++++++++++
 
diff -Naur ns-3.18.1/doc/manual/source/object-model.rst ns-3.19/doc/manual/source/object-model.rst
--- ns-3.18.1/doc/manual/source/object-model.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/manual/source/object-model.rst	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,7 @@
 C++ objects, in general, provide common object-oriented capabilities 
 (abstraction, encapsulation, inheritance, and polymorphism) that are part 
 of classic object-oriented design. |ns3| objects make use of these 
-properties; for instance:::
+properties; for instance::
 
     class Address
     {
@@ -130,7 +130,7 @@
 frameworks available. Specifically, reference counted objects are usually
 allocated using a templated Create or CreateObject method, as follows.
 
-For objects deriving from class :cpp:class:`Object`:::
+For objects deriving from class :cpp:class:`Object`::
 
     Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
 
@@ -139,7 +139,7 @@
 
 For objects deriving from class :cpp:class:`SimpleRefCount`, or other objects
 that support usage of the smart pointer class, a templated helper function is
-available and recommended to be used:::
+available and recommended to be used::
 
     Ptr<B> b = Create<B> ();
 
@@ -218,7 +218,7 @@
 implementation of IPv4 previously aggregated to it. The client code wishes to
 configure a default route. To do so, it must access an object within the node
 that has an interface to the IP forwarding configuration. It performs the
-following:::
+following::
 
     Ptr<Ipv4> ipv4 = m_node->GetObject<Ipv4> ();
 
@@ -281,7 +281,7 @@
 
 The answer to this is that in many situations, both techniques will work.
 |ns3| provides a templated function for making the syntax of Object
-dynamic casting much more user friendly:::
+dynamic casting much more user friendly::
 
     template <typename T1, typename T2>
     Ptr<T1>
diff -Naur ns-3.18.1/doc/manual/source/support.rst ns-3.19/doc/manual/source/support.rst
--- ns-3.18.1/doc/manual/source/support.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/manual/source/support.rst	2013-12-20 09:44:50.000000000 -0800
@@ -5,6 +5,7 @@
 
    new-models
    new-modules
+   documentation
    enable-modules
    enable-tests
    troubleshoot
diff -Naur ns-3.18.1/doc/manual/source/tracing.rst ns-3.19/doc/manual/source/tracing.rst
--- ns-3.18.1/doc/manual/source/tracing.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/manual/source/tracing.rst	2013-12-20 09:44:50.000000000 -0800
@@ -244,7 +244,7 @@
 The first thing to do is to read the path backward. The last segment of the path
 must be an ``Attribute`` of an ``Object``. In fact, if you had a pointer to the
 ``Object`` that has the "CongestionWindow" ``Attribute`` handy (call it
-``theObject``), you could write this just like the previous example:::
+``theObject``), you could write this just like the previous example::
 
   void CwndTracer (uint32_t oldval, uint32_t newval) {}
 
@@ -314,7 +314,7 @@
 primarily "Building Topologies," we have seen several varieties of the trace
 helper methods designed for use inside other (device) helpers.
 
-Perhaps you will recall seeing some of these variations:::
+Perhaps you will recall seeing some of these variations::
 
   pointToPoint.EnablePcapAll ("second");
   pointToPoint.EnablePcap ("second", p2pNodes.Get (0)->GetId (), 0);
@@ -509,7 +509,7 @@
 
 For example, in order to arrange for a device helper to create a single
 promiscuous pcap capture file of a specific name (``my-pcap-file.pcap``) on a
-given device, one could:::
+given device, one could::
 
   Ptr<NetDevice> nd;
   ...
@@ -600,7 +600,7 @@
 
 If you want to enable ascii tracing on more than one net device and have all
 traces sent to a single file, you can do that as well by using an object to
-refer to a single file:::
+refer to a single file::
 
   Ptr<NetDevice> nd1;
   Ptr<NetDevice> nd2;
@@ -632,7 +632,7 @@
 This would result in two files named ``prefix-client-eth0.tr`` and
 ``prefix-server-eth0.tr`` with traces for each device in the respective trace
 file. Since all of the EnableAscii functions are overloaded to take a stream
-wrapper, you can use that form as well:::
+wrapper, you can use that form as well::
 
   Names::Add ("client" ...);
   Names::Add ("client/eth0" ...);
@@ -660,7 +660,7 @@
 
 This would result in a number of ascii trace files being created, each of which
 follows the <prefix>-<node id>-<device id>.tr convention. Combining all of the
-traces into a single file is accomplished similarly to the examples above:::
+traces into a single file is accomplished similarly to the examples above::
 
   NetDeviceContainer d = ...;
   ...
@@ -768,7 +768,7 @@
 ``Node`` and ``NetDevice`` pair constraints, we use protocol and interface
 constraints.
 
-Note that just like in the device version, there are six methods:::
+Note that just like in the device version, there are six methods::
 
   void EnablePcapIpv4 (std::string prefix, Ptr<Ipv4> ipv4, uint32_t interface);
   void EnablePcapIpv4 (std::string prefix, std::string ipv4Name, uint32_t interface);
@@ -948,7 +948,7 @@
 If you want to enable ascii tracing on more than one interface and have all
 traces sent to a single file, you can do that as well by using an object to
 refer to a single file. We have already something similar to this in the "cwnd"
-example above:::
+example above::
 
   Ptr<Ipv4> protocol1 = node1->GetObject<Ipv4> ();
   Ptr<Ipv4> protocol2 = node2->GetObject<Ipv4> ();
@@ -978,7 +978,7 @@
 This would result in two files named "prefix-nnode1Ipv4-i1.tr" and 
 "prefix-nnode2Ipv4-i1.tr" with traces for each interface in the respective 
 trace file. Since all of the EnableAscii functions are overloaded to take a 
-stream wrapper, you can use that form as well:::
+stream wrapper, you can use that form as well::
 
   Names::Add ("node1Ipv4" ...);
   Names::Add ("node2Ipv4" ...);
@@ -1011,7 +1011,7 @@
 
 This would result in a number of ascii trace files being created, each of which
 follows the <prefix>-n<node id>-i<interface>.tr convention. Combining all of the
-traces into a single file is accomplished similarly to the examples above:::
+traces into a single file is accomplished similarly to the examples above::
 
   NodeContainer nodes;
   ...
diff -Naur ns-3.18.1/doc/manual/source/troubleshoot.rst ns-3.19/doc/manual/source/troubleshoot.rst
--- ns-3.18.1/doc/manual/source/troubleshoot.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/manual/source/troubleshoot.rst	2013-12-20 09:44:50.000000000 -0800
@@ -21,7 +21,7 @@
 run-time errors, and can commonly occur when memory is corrupted or pointer
 values are unexpectedly null.
 
-Here is an example of what might occur:::
+Here is an example of what might occur::
 
     $ ./waf --run tcp-point-to-point
     Entering directory '/home/tomh/ns-3-nsc/build'
diff -Naur ns-3.18.1/doc/models/Makefile ns-3.19/doc/models/Makefile
--- ns-3.18.1/doc/models/Makefile	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/models/Makefile	2013-12-20 09:44:50.000000000 -0800
@@ -34,6 +34,7 @@
 	$(SRC)/csma/doc/csma.rst \
 	$(SRC)/dsdv/doc/dsdv.rst \
 	$(SRC)/dsr/doc/dsr.rst \
+	$(SRC)/emu/doc/emu.rst \
 	$(SRC)/mpi/doc/distributed.rst \
 	$(SRC)/energy/doc/energy.rst \
 	$(SRC)/fd-net-device/doc/fd-net-device.rst \
@@ -66,9 +67,19 @@
 	$(SRC)/uan/doc/uan.rst \
 	$(SRC)/topology-read/doc/topology.rst \
 	$(SRC)/spectrum/doc/spectrum.rst \
+	$(SRC)/stats/doc/adaptor.rst \
+	$(SRC)/stats/doc/aggregator.rst \
+	$(SRC)/stats/doc/collector.rst \
+	$(SRC)/stats/doc/data-collection-helpers.rst \
+	$(SRC)/stats/doc/data-collection-overview.rst \
+	$(SRC)/stats/doc/data-collection.rst \
+	$(SRC)/stats/doc/probe.rst \
+	$(SRC)/stats/doc/scope-and-limitations.rst \
 	$(SRC)/stats/doc/statistics.rst \
 	$(SRC)/netanim/doc/animation.rst \
 	$(SRC)/flow-monitor/doc/flow-monitor.rst \
+	$(SRC)/wave/doc/wave.rst \
+	$(SRC)/sixlowpan/doc/sixlowpan.rst \
 
 # list all model library figure files that need to be copied to 
 # $SOURCETEMP/figures.  For each figure to be included in all
@@ -106,12 +117,20 @@
 	$(SRC)/lte/doc/source/figures/lte-arch-ue-ctrl.dia \
 	$(SRC)/lte/doc/source/figures/lte-enb-phy.dia \
 	$(SRC)/lte/doc/source/figures/lte-ue-phy.dia \
+	$(SRC)/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.dia \
 	$(SRC)/lte/doc/source/figures/lte-epc-e2e-data-protocol-stack.dia \
 	$(SRC)/lte/doc/source/figures/lte-interference-test-scenario.dia \
 	$(SRC)/lte/doc/source/figures/lte-subframe-structure.dia \
 	$(SRC)/lte/doc/source/figures/lte-epc-x2-interface.dia \
 	$(SRC)/lte/doc/source/figures/lte-harq-architecture.dia \
 	$(SRC)/lte/doc/source/figures/lte-harq-processes-scheme.dia \
+	$(SRC)/lte/doc/source/figures/ue-meas-consumer.dia \
+	$(SRC)/lte/doc/source/figures/ue-meas-piecewise-motion.dia \
+	$(SRC)/lte/doc/source/figures/ue-meas-piecewise-a1.dia \
+	$(SRC)/lte/doc/source/figures/ue-meas-piecewise-a1-hys.dia \
+	$(SRC)/lte/doc/source/figures/lte-cell-selection-timeline.dia \
+	$(SRC)/lte/doc/source/figures/lte-cell-selection-scenario.dia \
+	$(SRC)/lte/doc/source/figures/lte-handover-target-scenario.dia \
 	$(SRC)/lte/doc/source/figures/lena-dual-stripe.eps \
 	$(SRC)/lte/doc/source/figures/lte-mcs-index.eps \
 	$(SRC)/lte/doc/source/figures/lenaThrTestCase1.eps \
@@ -128,8 +147,8 @@
 	$(SRC)/lte/doc/source/figures/lte-rlc-data-retx-dl.eps \
 	$(SRC)/lte/doc/source/figures/lte-rlc-data-txon-ul.eps \
 	$(SRC)/lte/doc/source/figures/lte-rlc-data-retx-ul.eps \
-	$(SRC)/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.eps \
 	$(SRC)/lte/doc/source/figures/lte-epc-x2-entity-saps.eps \
+	$(SRC)/lte/doc/source/figures/lte-strongest-cell-handover-algorithm.eps \
 	$(SRC)/lte/doc/source/figures/lte-phy-interference.pdf \
 	$(SRC)/lte/doc/source/figures/lte-phy-interference.png \
 	$(SRC)/lte/doc/source/figures/helpers.pdf \
@@ -150,8 +169,6 @@
 	$(SRC)/lte/doc/source/figures/lte-enb-rrc-states.png \
 	$(SRC)/lte/doc/source/figures/lte-ue-rrc-states.pdf \
 	$(SRC)/lte/doc/source/figures/lte-ue-rrc-states.png \
-	$(SRC)/lte/doc/source/figures/lte-handover-algorithm.pdf \
-	$(SRC)/lte/doc/source/figures/lte-handover-algorithm.png \
 	$(SRC)/lte/doc/source/figures/fading_pedestrian.pdf \
 	$(SRC)/lte/doc/source/figures/fading_pedestrian.png \
 	$(SRC)/lte/doc/source/figures/fading_vehicular.pdf \
@@ -182,9 +199,20 @@
 	$(SRC)/lte/doc/source/figures/MCS_16_test.pdf \
 	$(SRC)/lte/doc/source/figures/miesm_scheme.pdf \
 	$(SRC)/lte/doc/source/figures/miesm_scheme.png \
+	$(SRC)/lte/doc/source/figures/lte-handover-campaign-rem.pdf \
+	$(SRC)/lte/doc/source/figures/lte-handover-campaign-rem.png \
+	$(SRC)/lte/doc/source/figures/lte-legacy-handover-algorithm.pdf \
+	$(SRC)/lte/doc/source/figures/lte-legacy-handover-algorithm.png \
 	$(SRC)/uan/doc/auvmobility-classes.dia \
 	$(SRC)/stats/doc/Stat-framework-arch.png \
 	$(SRC)/stats/doc/Wifi-default.png \
+	$(SRC)/stats/doc/dcf-overview.dia \
+	$(SRC)/stats/doc/dcf-overview-with-aggregation.dia \
+	$(SRC)/stats/doc/file-example.png \
+	$(SRC)/stats/doc/gnuplot-aggregator.png \
+	$(SRC)/stats/doc/gnuplot-example.png \
+	$(SRC)/stats/doc/gnuplot-helper-example.png \
+	$(SRC)/stats/doc/seventh-packet-byte-count.png \
 	$(SRC)/netanim/doc/figures/Dumbbell.png \
 	$(SRC)/netanim/doc/figures/Dumbbell.pdf \
 	$(SRC)/netanim/doc/figures/PacketStatistics.png \
@@ -225,6 +253,8 @@
 	$(FIGURES)/WifiArchitecture.eps \
 	$(FIGURES)/snir.eps \
 	$(FIGURES)/WimaxArchitecture.eps \
+	$(FIGURES)/dcf-overview.eps \
+	$(FIGURES)/dcf-overview-with-aggregation.eps \
 	$(FIGURES)/epc-ctrl-arch.eps \
 	$(FIGURES)/epc-data-flow-dl.eps \
 	$(FIGURES)/epc-data-flow-ul.eps \
@@ -246,6 +276,13 @@
 	$(FIGURES)/lte-epc-x2-interface.eps \
 	$(FIGURES)/lte-harq-architecture.eps \
 	$(FIGURES)/lte-harq-processes-scheme.eps \
+	$(FIGURES)/ue-meas-consumer.eps \
+	$(FIGURES)/ue-meas-piecewise-motion.eps \
+	$(FIGURES)/ue-meas-piecewise-a1.eps \
+	$(FIGURES)/ue-meas-piecewise-a1-hys.eps \
+	$(FIGURES)/lte-cell-selection-timeline.eps \
+	$(FIGURES)/lte-cell-selection-scenario.eps \
+	$(FIGURES)/lte-handover-target-scenario.eps \
 	$(FIGURES)/lena-dual-stripe.eps \
 	$(FIGURES)/lte-mcs-index.eps \
 	$(FIGURES)/lenaThrTestCase1.eps \
@@ -264,6 +301,7 @@
 	$(FIGURES)/lte-rlc-data-retx-ul.eps \
 	$(FIGURES)/lte-epc-x2-handover-seq-diagram.eps \
 	$(FIGURES)/lte-epc-x2-entity-saps.eps \
+	$(FIGURES)/lte-strongest-cell-handover-algorithm.eps \
 	$(FIGURES)/auvmobility-classes.eps \
 
 # rescale pdf figures as necessary
@@ -299,8 +337,6 @@
 $(FIGURES)/lte-subframe-structure.pdf_width = 2in
 $(FIGURES)/mac-random-access-contention.pdf_width = 10cm
 $(FIGURES)/mac-random-access-noncontention.pdf_width = 15cm
-$(FIGURES)/lte-ue-rrc-states.pdf_width = 7cm
-$(FIGURES)/lte-handover-algorithm.pdf_width = 10cm
 $(FIGURES)/helpers.pdf_width = 8cm
 $(FIGURES)/auvmobility-classes.pdf_width = 10cm
 
diff -Naur ns-3.18.1/doc/models/source/conf.py ns-3.19/doc/models/source/conf.py
--- ns-3.18.1/doc/models/source/conf.py	2013-11-15 15:33:25.000000000 -0800
+++ ns-3.19/doc/models/source/conf.py	2013-12-20 09:44:50.000000000 -0800
@@ -41,16 +41,16 @@
 
 # General information about the project.
 project = u'ns-3'
-copyright = u'2011, ns-3 project'
+copyright = u'2008-13, ns-3 project'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.18.1'
+version = 'ns-3.19'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.18.1'
+release = 'ns-3.19'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.18.1/doc/models/source/emulation-overview.rst ns-3.19/doc/models/source/emulation-overview.rst
--- ns-3.18.1/doc/models/source/emulation-overview.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/models/source/emulation-overview.rst	2013-12-20 09:44:50.000000000 -0800
@@ -83,5 +83,6 @@
 
 .. toctree::
 
+  emu
   fd-net-device
   tap
diff -Naur ns-3.18.1/doc/models/source/index.rst ns-3.19/doc/models/source/index.rst
--- ns-3.18.1/doc/models/source/index.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/models/source/index.rst	2013-12-20 09:44:50.000000000 -0800
@@ -14,7 +14,7 @@
 ``doc/models`` directory of ns-3's source code.
 
 .. toctree::
-   :maxdepth: 2
+   :maxdepth: 1
 
    organization
    animation
@@ -26,6 +26,7 @@
    buildings
    click
    csma
+   data-collection
    dsdv
    dsr
    emulation-overview
@@ -41,8 +42,10 @@
    openflow-switch
    point-to-point
    propagation
-   statistics
+   spectrum
+   sixlowpan
    topology
    uan
+   wave
    wifi
    wimax
diff -Naur ns-3.18.1/doc/models/source/organization.rst ns-3.19/doc/models/source/organization.rst
--- ns-3.18.1/doc/models/source/organization.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/models/source/organization.rst	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,13 @@
 exist on the `project wiki <http://www.nsnam.org/wiki>`_.
 
 A sample outline of how to write model library documentation can be
-found in :mod:`src/template/doc`.
+found by executing the ``create-module.py`` program and looking at the
+template created in the file ``new-module/doc/new-module.rst``. 
+
+.. sourcecode:: bash
+
+  $ cd src
+  $ ./create-module.py new-module
 
 The remainder of this document is organized alphabetically by module name.
 
diff -Naur ns-3.18.1/doc/ns3_html_theme/get_version.sh ns-3.19/doc/ns3_html_theme/get_version.sh
--- ns-3.18.1/doc/ns3_html_theme/get_version.sh	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/doc/ns3_html_theme/get_version.sh	2013-12-20 09:44:50.000000000 -0800
@@ -21,7 +21,7 @@
 # to force us into the public case.)
 #
 # The approach to identify cases 1 & 2 is to test:
-# a.  We're on nsnam.org (actually, nsnam.ece.gatech.edu), and
+# a.  We're on nsnam.org (actually, nsnam-www.coe-hosted.gatech.edu), and
 # b.  We're in the tmp build directory, /tmp/daily-nsnam/
 #     (This is the directory used by the update-* scripts
 #     run by cron jobs.)
@@ -91,9 +91,9 @@
     esac
 done
 
-# Hostname, fully qualified, e.g. nsnam.ece.gatech.edu
+# Hostname, fully qualified, e.g. nsnam-www.coe-hosted.gatech.edu
 HOST=`hostname`
-NSNAM="nsnam.ece.gatech.edu"
+NSNAM="nsnam-www.coe-hosted.gatech.edu"
 
 # Build directory
 DAILY="^/tmp/daily-nsnam/"
@@ -212,4 +212,4 @@
 say
 say "outf = $outf:"
 cat -n $outf
-say Done.
\ No newline at end of file
+say Done.
diff -Naur ns-3.18.1/doc/tutorial/source/conf.py ns-3.19/doc/tutorial/source/conf.py
--- ns-3.18.1/doc/tutorial/source/conf.py	2013-11-15 15:33:45.000000000 -0800
+++ ns-3.19/doc/tutorial/source/conf.py	2013-12-20 09:44:50.000000000 -0800
@@ -41,16 +41,16 @@
 
 # General information about the project.
 project = u'ns-3'
-copyright = u'2010, ns-3 project'
+copyright = u'2008-13, ns-3 project'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.18.1'
+version = 'ns-3.19'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.18.1'
+release = 'ns-3.19'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -Naur ns-3.18.1/doc/tutorial-pt-br/source/conf.py ns-3.19/doc/tutorial-pt-br/source/conf.py
--- ns-3.18.1/doc/tutorial-pt-br/source/conf.py	2013-11-15 15:34:04.000000000 -0800
+++ ns-3.19/doc/tutorial-pt-br/source/conf.py	2013-12-20 09:44:50.000000000 -0800
@@ -42,7 +42,7 @@
 
 # General information about the project.
 project = u'ns-3'
-copyright = u'2008-11, ns-3 project'
+copyright = u'2008-13, ns-3 project'
 
 
 # The version info for the project you're documenting, acts as replacement for
@@ -50,9 +50,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = 'ns-3.18.1'
+version = 'ns-3.19'
 # The full version, including alpha/beta/rc tags.
-release = 'ns-3.18.1'
+release = 'ns-3.19'
 
 # The language for content autogenerated by . Refer to babel documentation
 # for a list of supported languages.
diff -Naur ns-3.18.1/examples/stats/wifi-example-db.sh ns-3.19/examples/stats/wifi-example-db.sh
--- ns-3.18.1/examples/stats/wifi-example-db.sh	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/examples/stats/wifi-example-db.sh	2013-12-20 09:44:50.000000000 -0800
@@ -70,7 +70,8 @@
     order by abs(exp.input) ASC;"
 
 sqlite3 -noheader data.db "$CMD" > wifi-default.data
-sed -i "s/|/   /" wifi-default.data
+sed -i.bak "s/|/   /" wifi-default.data
+rm wifi-default.data.bak
 gnuplot wifi-example.gnuplot
 
 echo "Done; data in wifi-default.data, plot in wifi-default.eps"
diff -Naur ns-3.18.1/examples/tcp/tcp-nsc-comparison.cc ns-3.19/examples/tcp/tcp-nsc-comparison.cc
--- ns-3.18.1/examples/tcp/tcp-nsc-comparison.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/examples/tcp/tcp-nsc-comparison.cc	2013-12-20 09:44:50.000000000 -0800
@@ -1,180 +1,180 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012 NICT
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Hajime Tazaki <tazaki@nict.go.jp>
- *
- * This code is a modified version of the code used for the the experiments in the paper
- * "DCE Cradle: Simulate Network Protocols with Real Stacks for Better Realism"
- * by Hajime Tazaki, Frederic Urbani and Thierry Turlett presented at WNS3 2013
- *
- */
-
-#include "ns3/log.h"
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/internet-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/applications-module.h"
-#include "ns3/flow-monitor-module.h"
-
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("TcpNscComparison");
-
-std::string m_stack = "nsc-linux";
-std::string sock_factory;
-int m_seed = 1;
-double startTime = 4.0;
-double stopTime = 20.0;
-uint32_t m_nNodes = 2;
-bool enablePcap = false;
-
-int
-main (int argc, char *argv[])
-{
-
-  //ensure the ns3 TCP default values match what nsc is using
-  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1448));
-  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
-
-  CommandLine cmd;
-  cmd.AddValue ("stack", "choose network stack", m_stack);
-  cmd.AddValue ("seed", "randomize seed", m_seed);
-  cmd.AddValue ("nNodes", "the number of nodes in left side", m_nNodes);
-  cmd.AddValue ("stopTime", "duration", stopTime);
-  cmd.AddValue ("enablePcap", "pcap", enablePcap);
-  cmd.Parse (argc, argv);
-
-  SeedManager::SetSeed (m_seed);
-
-  NodeContainer lefts, routers, rights, nodes;
-  lefts.Create (m_nNodes);
-  routers.Create (2);
-  rights.Create (m_nNodes);
-  nodes = NodeContainer (lefts, routers, rights);
-
-  InternetStackHelper internetStack;
-
-  GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
-  if (m_stack == "ns3")
-    {
-      sock_factory = "ns3::TcpSocketFactory";
-      internetStack.Install (nodes);
-    }
-  else if (m_stack == "nsc-linux")
-    {
-      internetStack.Install (routers);
-      sock_factory = "ns3::TcpSocketFactory";
-      internetStack.SetTcp ("ns3::NscTcpL4Protocol",
-                            "Library", StringValue ("liblinux2.6.26.so"));
-      internetStack.Install (lefts);
-      internetStack.Install (rights);
-
-      //these are not implemented in ns3 tcp so disable for comparison
-      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_sack", StringValue ("0"));
-      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", StringValue ("0"));
-      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_window_scaling", StringValue ("0"));
-    }
-
-  PointToPointHelper pointToPoint;
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
-
-  Ipv4AddressHelper address;
-  Ipv4InterfaceContainer interfaces;
-
-  NetDeviceContainer dev0, dev1, dev2;
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.0." << i << ".0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      dev0 = pointToPoint.Install (NodeContainer (lefts.Get (i), routers.Get (0)));
-      address.Assign (dev0);
-    }
-
-  // bottle neck link
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("2Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("100ms"));
-  dev1 = pointToPoint.Install (NodeContainer (routers.Get (0), routers.Get (1)));
-
-  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
-  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
-  // for right links
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.2." << i << ".0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      dev2 = pointToPoint.Install (NodeContainer (routers.Get (1), rights.Get (i)));
-      address.Assign (dev2);
-    }
-
-  // bottle neck link
-  Ptr<RateErrorModel> em1 =
-    CreateObjectWithAttributes<RateErrorModel> (
-      "ErrorRate", DoubleValue (0.05),
-      "ErrorUnit", EnumValue (RateErrorModel::ERROR_UNIT_PACKET)
-      );
-  dev1.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em1));
-
-  address.SetBase ("10.1.0.0", "255.255.255.0");
-  address.Assign (dev1);
-  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
-
-  ApplicationContainer apps;
-
-  OnOffHelper onoff = OnOffHelper (sock_factory,
-                                   InetSocketAddress (Ipv4Address ("10.2.0.2"), 2000));
-  onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
-  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
-
-  // Flow 1 - n
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      std::ostringstream oss;
-      oss << "10.2." << i << ".2";
-      onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (Ipv4Address (oss.str ().c_str ()), 2000)));
-      onoff.SetAttribute ("PacketSize", StringValue ("1024"));
-      onoff.SetAttribute ("DataRate", StringValue ("1Mbps"));
-      onoff.SetAttribute ("StartTime", TimeValue (Seconds (startTime)));
-      apps = onoff.Install (lefts.Get (i));
-    }
-
-  PacketSinkHelper sink = PacketSinkHelper (sock_factory,
-                                            InetSocketAddress (Ipv4Address::GetAny (), 2000));
-  apps = sink.Install (rights);
-  apps.Start (Seconds (3.9999));
-
-  pointToPoint.EnablePcapAll ("nsc.pcap");
-
-  Simulator::Stop (Seconds (stopTime));
-  Simulator::Run ();
-
-  Ptr<PacketSink> pktsink;
-  std::cout << "Total ";
-  for (uint32_t i = 0; i < m_nNodes; i++)
-    {
-      pktsink = apps.Get (i)->GetObject<PacketSink> ();
-      std::cout << "Rx(" << i << ") = " << pktsink->GetTotalRx () <<
-      " bytes (" << pktsink->GetTotalRx () * 8 / (stopTime - startTime) << " bps), ";
-    }
-  std::cout << std::endl;
-
-  Simulator::Destroy ();
-  return 0;
-}
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 NICT
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Hajime Tazaki <tazaki@nict.go.jp>
+ *
+ * This code is a modified version of the code used for the the experiments in the paper
+ * "DCE Cradle: Simulate Network Protocols with Real Stacks for Better Realism"
+ * by Hajime Tazaki, Frederic Urbani and Thierry Turlett presented at WNS3 2013
+ *
+ */
+
+#include "ns3/log.h"
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/flow-monitor-module.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("TcpNscComparison");
+
+std::string m_stack = "nsc-linux";
+std::string sock_factory;
+int m_seed = 1;
+double startTime = 4.0;
+double stopTime = 20.0;
+uint32_t m_nNodes = 2;
+bool enablePcap = false;
+
+int
+main (int argc, char *argv[])
+{
+
+  //ensure the ns3 TCP default values match what nsc is using
+  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1448));
+  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
+
+  CommandLine cmd;
+  cmd.AddValue ("stack", "choose network stack", m_stack);
+  cmd.AddValue ("seed", "randomize seed", m_seed);
+  cmd.AddValue ("nNodes", "the number of nodes in left side", m_nNodes);
+  cmd.AddValue ("stopTime", "duration", stopTime);
+  cmd.AddValue ("enablePcap", "pcap", enablePcap);
+  cmd.Parse (argc, argv);
+
+  SeedManager::SetSeed (m_seed);
+
+  NodeContainer lefts, routers, rights, nodes;
+  lefts.Create (m_nNodes);
+  routers.Create (2);
+  rights.Create (m_nNodes);
+  nodes = NodeContainer (lefts, routers, rights);
+
+  InternetStackHelper internetStack;
+
+  GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
+  if (m_stack == "ns3")
+    {
+      sock_factory = "ns3::TcpSocketFactory";
+      internetStack.Install (nodes);
+    }
+  else if (m_stack == "nsc-linux")
+    {
+      internetStack.Install (routers);
+      sock_factory = "ns3::TcpSocketFactory";
+      internetStack.SetTcp ("ns3::NscTcpL4Protocol",
+                            "Library", StringValue ("liblinux2.6.26.so"));
+      internetStack.Install (lefts);
+      internetStack.Install (rights);
+
+      //these are not implemented in ns3 tcp so disable for comparison
+      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_sack", StringValue ("0"));
+      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_timestamps", StringValue ("0"));
+      Config::Set ("/NodeList/*/$ns3::Ns3NscStack<linux2.6.26>/net.ipv4.tcp_window_scaling", StringValue ("0"));
+    }
+
+  PointToPointHelper pointToPoint;
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
+
+  Ipv4AddressHelper address;
+  Ipv4InterfaceContainer interfaces;
+
+  NetDeviceContainer dev0, dev1, dev2;
+  for (uint32_t i = 0; i < m_nNodes; i++)
+    {
+      std::ostringstream oss;
+      oss << "10.0." << i << ".0";
+      address.SetBase (oss.str ().c_str (), "255.255.255.0");
+      dev0 = pointToPoint.Install (NodeContainer (lefts.Get (i), routers.Get (0)));
+      address.Assign (dev0);
+    }
+
+  // bottle neck link
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("2Mbps"));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("100ms"));
+  dev1 = pointToPoint.Install (NodeContainer (routers.Get (0), routers.Get (1)));
+
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("1ns"));
+  // for right links
+  for (uint32_t i = 0; i < m_nNodes; i++)
+    {
+      std::ostringstream oss;
+      oss << "10.2." << i << ".0";
+      address.SetBase (oss.str ().c_str (), "255.255.255.0");
+      dev2 = pointToPoint.Install (NodeContainer (routers.Get (1), rights.Get (i)));
+      address.Assign (dev2);
+    }
+
+  // bottle neck link
+  Ptr<RateErrorModel> em1 =
+    CreateObjectWithAttributes<RateErrorModel> (
+      "ErrorRate", DoubleValue (0.05),
+      "ErrorUnit", EnumValue (RateErrorModel::ERROR_UNIT_PACKET)
+      );
+  dev1.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (em1));
+
+  address.SetBase ("10.1.0.0", "255.255.255.0");
+  address.Assign (dev1);
+  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+
+  ApplicationContainer apps;
+
+  OnOffHelper onoff = OnOffHelper (sock_factory,
+                                   InetSocketAddress (Ipv4Address ("10.2.0.2"), 2000));
+  onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
+  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
+
+  // Flow 1 - n
+  for (uint32_t i = 0; i < m_nNodes; i++)
+    {
+      std::ostringstream oss;
+      oss << "10.2." << i << ".2";
+      onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (Ipv4Address (oss.str ().c_str ()), 2000)));
+      onoff.SetAttribute ("PacketSize", StringValue ("1024"));
+      onoff.SetAttribute ("DataRate", StringValue ("1Mbps"));
+      onoff.SetAttribute ("StartTime", TimeValue (Seconds (startTime)));
+      apps = onoff.Install (lefts.Get (i));
+    }
+
+  PacketSinkHelper sink = PacketSinkHelper (sock_factory,
+                                            InetSocketAddress (Ipv4Address::GetAny (), 2000));
+  apps = sink.Install (rights);
+  apps.Start (Seconds (3.9999));
+
+  pointToPoint.EnablePcapAll ("nsc.pcap");
+
+  Simulator::Stop (Seconds (stopTime));
+  Simulator::Run ();
+
+  Ptr<PacketSink> pktsink;
+  std::cout << "Total ";
+  for (uint32_t i = 0; i < m_nNodes; i++)
+    {
+      pktsink = apps.Get (i)->GetObject<PacketSink> ();
+      std::cout << "Rx(" << i << ") = " << pktsink->GetTotalRx () <<
+      " bytes (" << pktsink->GetTotalRx () * 8 / (stopTime - startTime) << " bps), ";
+    }
+  std::cout << std::endl;
+
+  Simulator::Destroy ();
+  return 0;
+}
diff -Naur ns-3.18.1/RELEASE_NOTES ns-3.19/RELEASE_NOTES
--- ns-3.18.1/RELEASE_NOTES	2013-11-15 16:03:50.000000000 -0800
+++ ns-3.19/RELEASE_NOTES	2013-12-20 09:44:50.000000000 -0800
@@ -9,6 +9,120 @@
 Consult the file CHANGES.html for more detailed information about changed
 API and behavior across ns-3 releases.
 
+Release 3.19
+=============
+
+Availability
+------------
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.19.tar.bz2
+
+Supported platforms
+-------------------
+These platforms have been tested; others may work also:
+- Fedora Core 20 (32 bit) with g++-4.8.2
+- Fedora Core 19 (32/64 bit) with g++-4.8.1
+- Ubuntu 13.10 (64 bit) with g++-4.8.1
+- Ubuntu 12.04.3 (32/64 bit) with g++-4.6.3
+- Ubuntu 10.04.4 LTS (64 bit) with g++-4.4.3
+- OS X Mavericks 10.9 with Xcode 5.0.1 and clang-500.2.79
+- OS X Mountain Lion 10.8.5 with Xcode 5 and g++-4.2.1
+- FreeBSD 9.2-RELEASE (64 bit) with clang-3.3
+
+New user-visible features
+-------------------------
+- Extension to UE measurements and improved handover algorithm models in LTE
+  module, as the outcome of GSoC 2013 project. The project also includes several
+  sub-features, such as:
+   - implementation of System Information Block Type 1 (SIB1);
+   - a new option for automatic UE attachment using Idle mode cell selection
+     procedure;
+   - improved configurability of UE measurements; and
+   - two options of handover algorithms for enabling automatic handover trigger
+     in LTE simulation: A2-A4-RSRQ and strongest cell (A3-RSRP).
+
+- A new FixedRoomPositionAllocator has been added to the buildings
+  module. It allows one to generate a random position uniformly
+  distributed in the volume of a chosen room inside a chosen building.  
+
+- A new attribute ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough
+  allows to overcome the lack for re-segmentation in the RLC AM
+  implementation by assuming that the size of a TxOpportunity is
+  always big enough for the RLC AM PDU to be retransmitted.
+
+- After some profiling, the code of LteMiErrorModel has been optimized
+  for speed, resulting in a significantly lower execution time of the
+  LTE model when used with the error model enabled.
+
+- A new WiFi extension for vehicular simulation support is available in 
+  the src/wave directory.  The current code represents an interim capability 
+  to realize an IEEE 802.11p-compliant device, but without the WAVE 
+  extensions (which are planned for a later patch).  The WaveNetDevice 
+  modelled herein enforces that a WAVE-compliant physical layer (at 5.9 GHz)
+  is selected, and does not require any association between devices (similar 
+  to an adhoc WiFi MAC), but is otherwise similar (at this time) to a 
+  WifiNetDevice.  WAVE capabililties of switching between control and 
+  service channels, or using multiple radios, are not yet modelled.
+
+- A new IPv6 over Low power Wireless Personal Area Networks (6LoWPAN) model
+  is available.  Using ns-3's naming convention, the acronym is expanded
+  to SixLowPanNetDevice.   The SixLowPanNetDevice is able to act as a 
+  shim between IPv6 and a NetDevice, compressing IPv6 headers according 
+  to RFCs 4944 and 6262.  The SixLowPanNetDevice is meant to be used over 
+  IEEE 802.15.4 NetDevices, but it can be used on other NetDevices as 
+  well (see the manual for full details).  This model precedes the
+  general availability of an 802.15.4 model, so must be run in conjunction
+  with a wired NetDevice model for now, or with experimental versions of
+  802.15.4 models.
+
+- It is now possible to use Ipv6PacketInfoTag from UDP applications in the
+  same way as with Ipv4PacketInfoTag. See Doxygen for current limitations in
+  using Ipv[4,6]PacketInfoTag to set IP properties.
+  
+- Ipv[4,6]Interfaces not respecting the minimum MTU requirements (68 octects
+  for IPv4 and 1280 octects for IPv6) will be automatically set as Down.
+  
+- IPv6 addresses and routing tables are printed in a more conventional way,
+  closely matching the Linux "route -A inet6" command.
+
+- Additional time units (Year, Day, Hour, Minute) were added to the time
+  value class that represents simulation time; the largest unit prior to 
+  this addition was Second.
+
+- A new parallel scheduling algorithm based on null messages, a common 
+  parallel DES scheduling algorithm, has been added.  The null message 
+  scheduler has better scaling properties when running on some scenarios
+  with large numbers of nodes since it does not require a global 
+  communication.
+  
+Bugs fixed
+----------
+- Bug 1496 - Option to print log level in NS_LOG messages, and documentation.
+- Bug 1592 - Parsing bug in FlowMonitor example script
+- Bug 1756 - RLC AM Mode State Variable Bug
+- Bug 1763 - Message 3 should be sent using the UL GRANT in the RAR
+- Bug 1778 - Implement TapBridge::IsLinkUp() function
+- Bug 1777 - Implement the more direct way of "using" configuration of existing tap interface
+- Bug 1776 - Improve CRC performance for CsmaNetDevice in emulation modes
+- Bug 1788 - unused private field warning
+- Bug 1789 - missing test condition for sigma in buildings-shadowing-test
+- Bug 1796 - Ipv6PacketInfoTag is not filled by UdpSocketImpl::ForwardUp6
+- Bug 1798 - Changing the rate of onOffApplication might stop transmission
+- Bug 1802 - FlowMon header deserialization problem with IPv4 fragments
+- Bug 1803 - Lookup /NodeList/4/DeviceList/0/LteEnbRrc/UeMap/0 got no matches
+- Bug 1807 - Multiple bugs in Ipv4L3Protocol::LocalDeliver
+- Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements
+- Bug 1814 - IPv6 Packet with length not multiple of 8 bytes are fragmented incorrectly.
+- Bug 1815 - Python bindings compilation with clang compiler toolchain
+- Bug 1816 - IPv4 fragmentation loses Packet tags
+
+Release 3.18.2
+==============
+
+ns-allinone-3.18.2 was released to include a bake configuration file update
+for Direct Code Execution.  The ns-3 code in this release was unchanged
+from that of ns-3.18.1.
+
 Release 3.18.1
 ==============
 
diff -Naur ns-3.18.1/scratch/scratch-simulator.cc ns-3.19/scratch/scratch-simulator.cc
--- ns-3.18.1/scratch/scratch-simulator.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/scratch/scratch-simulator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,4 +24,7 @@
 main (int argc, char *argv[])
 {
   NS_LOG_UNCOND ("Scratch Simulator");
+
+  Simulator::Run ();
+  Simulator::Destroy ();
 }
diff -Naur ns-3.18.1/src/antenna/model/antenna-model.cc ns-3.19/src/antenna/model/antenna-model.cc
--- ns-3.18.1/src/antenna/model/antenna-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/antenna/model/antenna-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (AntennaModel);
+NS_OBJECT_ENSURE_REGISTERED (AntennaModel)
+  ;
 
 
 AntennaModel::AntennaModel ()
@@ -39,7 +40,7 @@
 {
 }
 
-TypeId 
+TypeId
 AntennaModel::GetTypeId ()
 {
   static TypeId tid = TypeId ("ns3::AntennaModel")
diff -Naur ns-3.18.1/src/antenna/model/cosine-antenna-model.cc ns-3.19/src/antenna/model/cosine-antenna-model.cc
--- ns-3.18.1/src/antenna/model/cosine-antenna-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/antenna/model/cosine-antenna-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (CosineAntennaModel);
+NS_OBJECT_ENSURE_REGISTERED (CosineAntennaModel)
+  ;
 
 
 TypeId 
diff -Naur ns-3.18.1/src/antenna/model/isotropic-antenna-model.cc ns-3.19/src/antenna/model/isotropic-antenna-model.cc
--- ns-3.18.1/src/antenna/model/isotropic-antenna-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/antenna/model/isotropic-antenna-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (IsotropicAntennaModel);
+NS_OBJECT_ENSURE_REGISTERED (IsotropicAntennaModel)
+  ;
 
 
 TypeId 
diff -Naur ns-3.18.1/src/antenna/model/parabolic-antenna-model.cc ns-3.19/src/antenna/model/parabolic-antenna-model.cc
--- ns-3.18.1/src/antenna/model/parabolic-antenna-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/antenna/model/parabolic-antenna-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ParabolicAntennaModel);
+NS_OBJECT_ENSURE_REGISTERED (ParabolicAntennaModel)
+  ;
 
 
 TypeId 
diff -Naur ns-3.18.1/src/aodv/bindings/modulegen__gcc_ILP32.py ns-3.19/src/aodv/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/aodv/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/aodv/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -237,7 +237,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1686,10 +1686,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4218,6 +4219,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4228,6 +4234,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4243,6 +4254,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4268,6 +4284,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -4879,10 +4900,10 @@
     cls.add_method('SetProbeResp', 
                    'void', 
                    [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy arg0) [member function]
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
     cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'arg0')])
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
     cls.add_method('SetQosAmsdu', 
                    'void', 
@@ -5968,10 +5989,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
     cls.add_method('SetArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
     ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
diff -Naur ns-3.18.1/src/aodv/bindings/modulegen__gcc_LP64.py ns-3.19/src/aodv/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/aodv/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/aodv/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -237,7 +237,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1686,10 +1686,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4218,6 +4219,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4228,6 +4234,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4243,6 +4254,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4268,6 +4284,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -4879,10 +4900,10 @@
     cls.add_method('SetProbeResp', 
                    'void', 
                    [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy arg0) [member function]
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
     cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'arg0')])
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
     cls.add_method('SetQosAmsdu', 
                    'void', 
@@ -5968,10 +5989,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
     cls.add_method('SetArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
     ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
diff -Naur ns-3.18.1/src/aodv/doc/aodv.rst ns-3.19/src/aodv/doc/aodv.rst
--- ns-3.18.1/src/aodv/doc/aodv.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/aodv/doc/aodv.rst	2013-12-20 09:44:50.000000000 -0800
@@ -5,7 +5,7 @@
 
 This model implements the base specification of the Ad Hoc On-Demand 
 Distance Vector (AODV) protocol. The implementation is based on 
-[rfc3561]_.
+:rfc:`3561`.
 
 The model was written by Elena Buchatskaia and Pavel Boyko of ITTP RAS,
 and is based on the ns-2 AODV model developed by the CMU/MONARCH group
@@ -97,7 +97,6 @@
 References
 ++++++++++
 
-.. [rfc3561] RFC 3561 *Ad hoc On-Demand Distance Vector (AODV) Routing*
 
 Usage
 *****
diff -Naur ns-3.18.1/src/aodv/model/aodv-packet.cc ns-3.19/src/aodv/model/aodv-packet.cc
--- ns-3.18.1/src/aodv/model/aodv-packet.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/aodv/model/aodv-packet.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 namespace aodv
 {
 
-NS_OBJECT_ENSURE_REGISTERED (TypeHeader);
+NS_OBJECT_ENSURE_REGISTERED (TypeHeader)
+  ;
 
 TypeHeader::TypeHeader (MessageType t) :
   m_type (t), m_valid (true)
@@ -146,7 +147,8 @@
 {
 }
 
-NS_OBJECT_ENSURE_REGISTERED (RreqHeader);
+NS_OBJECT_ENSURE_REGISTERED (RreqHeader)
+  ;
 
 TypeId
 RreqHeader::GetTypeId ()
@@ -285,7 +287,8 @@
   m_lifeTime = uint32_t (lifeTime.GetMilliSeconds ());
 }
 
-NS_OBJECT_ENSURE_REGISTERED (RrepHeader);
+NS_OBJECT_ENSURE_REGISTERED (RrepHeader)
+  ;
 
 TypeId
 RrepHeader::GetTypeId ()
@@ -427,7 +430,9 @@
 {
 }
 
-NS_OBJECT_ENSURE_REGISTERED (RrepAckHeader);
+NS_OBJECT_ENSURE_REGISTERED (RrepAckHeader)
+  ;
+  
 TypeId
 RrepAckHeader::GetTypeId ()
 {
@@ -492,7 +497,8 @@
 {
 }
 
-NS_OBJECT_ENSURE_REGISTERED (RerrHeader);
+NS_OBJECT_ENSURE_REGISTERED (RerrHeader)
+  ;
 
 TypeId
 RerrHeader::GetTypeId ()
diff -Naur ns-3.18.1/src/aodv/model/aodv-routing-protocol.cc ns-3.19/src/aodv/model/aodv-routing-protocol.cc
--- ns-3.18.1/src/aodv/model/aodv-routing-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/aodv/model/aodv-routing-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -48,7 +48,8 @@
 {
 namespace aodv
 {
-NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol);
+NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol)
+  ;
 
 /// UDP Port for AODV control traffic
 const uint32_t RoutingProtocol::AODV_PORT = 654;
@@ -111,7 +112,8 @@
   int32_t m_oif;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (DeferredRouteOutputTag);
+NS_OBJECT_ENSURE_REGISTERED (DeferredRouteOutputTag)
+  ;
 
 
 //-----------------------------------------------------------------------------
diff -Naur ns-3.18.1/src/applications/bindings/modulegen__gcc_ILP32.py ns-3.19/src/applications/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/applications/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -295,7 +295,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -2166,10 +2166,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4951,11 +4952,26 @@
     cls.add_constructor([param('ns3::SeqTsHeader const &', 'arg0')])
     ## seq-ts-header.h (module 'applications'): ns3::SeqTsHeader::SeqTsHeader() [constructor]
     cls.add_constructor([])
+    ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## seq-ts-header.h (module 'applications'): ns3::TypeId ns3::SeqTsHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::GetSeq() const [member function]
     cls.add_method('GetSeq', 
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## seq-ts-header.h (module 'applications'): ns3::Time ns3::SeqTsHeader::GetTs() const [member function]
     cls.add_method('GetTs', 
                    'ns3::Time', 
@@ -4966,35 +4982,20 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## seq-ts-header.h (module 'applications'): void ns3::SeqTsHeader::SetSeq(uint32_t seq) [member function]
-    cls.add_method('SetSeq', 
-                   'void', 
-                   [param('uint32_t', 'seq')])
-    ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   visibility='private', is_virtual=True)
-    ## seq-ts-header.h (module 'applications'): ns3::TypeId ns3::SeqTsHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, visibility='private', is_virtual=True)
-    ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='private', is_virtual=True)
     ## seq-ts-header.h (module 'applications'): void ns3::SeqTsHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, visibility='private', is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## seq-ts-header.h (module 'applications'): void ns3::SeqTsHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, visibility='private', is_virtual=True)
+                   is_const=True, is_virtual=True)
+    ## seq-ts-header.h (module 'applications'): void ns3::SeqTsHeader::SetSeq(uint32_t seq) [member function]
+    cls.add_method('SetSeq', 
+                   'void', 
+                   [param('uint32_t', 'seq')])
     return
 
 def register_Ns3SequentialRandomVariable_methods(root_module, cls):
@@ -5916,6 +5917,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5926,6 +5932,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5941,6 +5952,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5966,6 +5982,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -10115,7 +10136,8 @@
     ## simple-channel.h (module 'network'): void ns3::SimpleChannel::Add(ns3::Ptr<ns3::SimpleNetDevice> device) [member function]
     cls.add_method('Add', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')])
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')], 
+                   is_virtual=True)
     ## simple-channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::SimpleChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -10134,7 +10156,8 @@
     ## simple-channel.h (module 'network'): void ns3::SimpleChannel::Send(ns3::Ptr<ns3::Packet> p, uint16_t protocol, ns3::Mac48Address to, ns3::Mac48Address from, ns3::Ptr<ns3::SimpleNetDevice> sender) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')])
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')], 
+                   is_virtual=True)
     return
 
 def register_Ns3SimpleNetDevice_methods(root_module, cls):
@@ -10429,10 +10452,6 @@
     cls.add_method('SetFill', 
                    'void', 
                    [param('uint8_t *', 'fill'), param('uint32_t', 'fillSize'), param('uint32_t', 'dataSize')])
-    ## udp-echo-client.h (module 'applications'): void ns3::UdpEchoClient::SetRemote(ns3::Address ip, uint16_t port) [member function]
-    cls.add_method('SetRemote', 
-                   'void', 
-                   [param('ns3::Address', 'ip'), param('uint16_t', 'port')])
     ## udp-echo-client.h (module 'applications'): void ns3::UdpEchoClient::SetRemote(ns3::Ipv4Address ip, uint16_t port) [member function]
     cls.add_method('SetRemote', 
                    'void', 
@@ -10441,6 +10460,10 @@
     cls.add_method('SetRemote', 
                    'void', 
                    [param('ns3::Ipv6Address', 'ip'), param('uint16_t', 'port')])
+    ## udp-echo-client.h (module 'applications'): void ns3::UdpEchoClient::SetRemote(ns3::Address ip, uint16_t port) [member function]
+    cls.add_method('SetRemote', 
+                   'void', 
+                   [param('ns3::Address', 'ip'), param('uint16_t', 'port')])
     ## udp-echo-client.h (module 'applications'): void ns3::UdpEchoClient::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -10551,10 +10574,6 @@
     cls.add_method('SetMaxPacketSize', 
                    'void', 
                    [param('uint16_t', 'maxPacketSize')])
-    ## udp-trace-client.h (module 'applications'): void ns3::UdpTraceClient::SetRemote(ns3::Address ip, uint16_t port) [member function]
-    cls.add_method('SetRemote', 
-                   'void', 
-                   [param('ns3::Address', 'ip'), param('uint16_t', 'port')])
     ## udp-trace-client.h (module 'applications'): void ns3::UdpTraceClient::SetRemote(ns3::Ipv4Address ip, uint16_t port) [member function]
     cls.add_method('SetRemote', 
                    'void', 
@@ -10563,6 +10582,10 @@
     cls.add_method('SetRemote', 
                    'void', 
                    [param('ns3::Ipv6Address', 'ip'), param('uint16_t', 'port')])
+    ## udp-trace-client.h (module 'applications'): void ns3::UdpTraceClient::SetRemote(ns3::Address ip, uint16_t port) [member function]
+    cls.add_method('SetRemote', 
+                   'void', 
+                   [param('ns3::Address', 'ip'), param('uint16_t', 'port')])
     ## udp-trace-client.h (module 'applications'): void ns3::UdpTraceClient::SetTraceFile(std::string filename) [member function]
     cls.add_method('SetTraceFile', 
                    'void', 
@@ -10738,14 +10761,14 @@
     cls.add_method('SetBurstRate', 
                    'void', 
                    [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
     cls.add_method('SetRandomBurstSize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
     cls.add_method('SetRandomVariable', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
     ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoCorrupt', 
                    'bool', 
diff -Naur ns-3.18.1/src/applications/bindings/modulegen__gcc_LP64.py ns-3.19/src/applications/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/applications/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -295,7 +295,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -2166,10 +2166,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4951,11 +4952,26 @@
     cls.add_constructor([param('ns3::SeqTsHeader const &', 'arg0')])
     ## seq-ts-header.h (module 'applications'): ns3::SeqTsHeader::SeqTsHeader() [constructor]
     cls.add_constructor([])
+    ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## seq-ts-header.h (module 'applications'): ns3::TypeId ns3::SeqTsHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::GetSeq() const [member function]
     cls.add_method('GetSeq', 
                    'uint32_t', 
                    [], 
                    is_const=True)
+    ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## seq-ts-header.h (module 'applications'): ns3::Time ns3::SeqTsHeader::GetTs() const [member function]
     cls.add_method('GetTs', 
                    'ns3::Time', 
@@ -4966,35 +4982,20 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## seq-ts-header.h (module 'applications'): void ns3::SeqTsHeader::SetSeq(uint32_t seq) [member function]
-    cls.add_method('SetSeq', 
-                   'void', 
-                   [param('uint32_t', 'seq')])
-    ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
-    cls.add_method('Deserialize', 
-                   'uint32_t', 
-                   [param('ns3::Buffer::Iterator', 'start')], 
-                   visibility='private', is_virtual=True)
-    ## seq-ts-header.h (module 'applications'): ns3::TypeId ns3::SeqTsHeader::GetInstanceTypeId() const [member function]
-    cls.add_method('GetInstanceTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True, visibility='private', is_virtual=True)
-    ## seq-ts-header.h (module 'applications'): uint32_t ns3::SeqTsHeader::GetSerializedSize() const [member function]
-    cls.add_method('GetSerializedSize', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, visibility='private', is_virtual=True)
     ## seq-ts-header.h (module 'applications'): void ns3::SeqTsHeader::Print(std::ostream & os) const [member function]
     cls.add_method('Print', 
                    'void', 
                    [param('std::ostream &', 'os')], 
-                   is_const=True, visibility='private', is_virtual=True)
+                   is_const=True, is_virtual=True)
     ## seq-ts-header.h (module 'applications'): void ns3::SeqTsHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
     cls.add_method('Serialize', 
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
-                   is_const=True, visibility='private', is_virtual=True)
+                   is_const=True, is_virtual=True)
+    ## seq-ts-header.h (module 'applications'): void ns3::SeqTsHeader::SetSeq(uint32_t seq) [member function]
+    cls.add_method('SetSeq', 
+                   'void', 
+                   [param('uint32_t', 'seq')])
     return
 
 def register_Ns3SequentialRandomVariable_methods(root_module, cls):
@@ -5916,6 +5917,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5926,6 +5932,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5941,6 +5952,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5966,6 +5982,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -10115,7 +10136,8 @@
     ## simple-channel.h (module 'network'): void ns3::SimpleChannel::Add(ns3::Ptr<ns3::SimpleNetDevice> device) [member function]
     cls.add_method('Add', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')])
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')], 
+                   is_virtual=True)
     ## simple-channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::SimpleChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -10134,7 +10156,8 @@
     ## simple-channel.h (module 'network'): void ns3::SimpleChannel::Send(ns3::Ptr<ns3::Packet> p, uint16_t protocol, ns3::Mac48Address to, ns3::Mac48Address from, ns3::Ptr<ns3::SimpleNetDevice> sender) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')])
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')], 
+                   is_virtual=True)
     return
 
 def register_Ns3SimpleNetDevice_methods(root_module, cls):
@@ -10429,10 +10452,6 @@
     cls.add_method('SetFill', 
                    'void', 
                    [param('uint8_t *', 'fill'), param('uint32_t', 'fillSize'), param('uint32_t', 'dataSize')])
-    ## udp-echo-client.h (module 'applications'): void ns3::UdpEchoClient::SetRemote(ns3::Address ip, uint16_t port) [member function]
-    cls.add_method('SetRemote', 
-                   'void', 
-                   [param('ns3::Address', 'ip'), param('uint16_t', 'port')])
     ## udp-echo-client.h (module 'applications'): void ns3::UdpEchoClient::SetRemote(ns3::Ipv4Address ip, uint16_t port) [member function]
     cls.add_method('SetRemote', 
                    'void', 
@@ -10441,6 +10460,10 @@
     cls.add_method('SetRemote', 
                    'void', 
                    [param('ns3::Ipv6Address', 'ip'), param('uint16_t', 'port')])
+    ## udp-echo-client.h (module 'applications'): void ns3::UdpEchoClient::SetRemote(ns3::Address ip, uint16_t port) [member function]
+    cls.add_method('SetRemote', 
+                   'void', 
+                   [param('ns3::Address', 'ip'), param('uint16_t', 'port')])
     ## udp-echo-client.h (module 'applications'): void ns3::UdpEchoClient::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -10551,10 +10574,6 @@
     cls.add_method('SetMaxPacketSize', 
                    'void', 
                    [param('uint16_t', 'maxPacketSize')])
-    ## udp-trace-client.h (module 'applications'): void ns3::UdpTraceClient::SetRemote(ns3::Address ip, uint16_t port) [member function]
-    cls.add_method('SetRemote', 
-                   'void', 
-                   [param('ns3::Address', 'ip'), param('uint16_t', 'port')])
     ## udp-trace-client.h (module 'applications'): void ns3::UdpTraceClient::SetRemote(ns3::Ipv4Address ip, uint16_t port) [member function]
     cls.add_method('SetRemote', 
                    'void', 
@@ -10563,6 +10582,10 @@
     cls.add_method('SetRemote', 
                    'void', 
                    [param('ns3::Ipv6Address', 'ip'), param('uint16_t', 'port')])
+    ## udp-trace-client.h (module 'applications'): void ns3::UdpTraceClient::SetRemote(ns3::Address ip, uint16_t port) [member function]
+    cls.add_method('SetRemote', 
+                   'void', 
+                   [param('ns3::Address', 'ip'), param('uint16_t', 'port')])
     ## udp-trace-client.h (module 'applications'): void ns3::UdpTraceClient::SetTraceFile(std::string filename) [member function]
     cls.add_method('SetTraceFile', 
                    'void', 
@@ -10738,14 +10761,14 @@
     cls.add_method('SetBurstRate', 
                    'void', 
                    [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
     cls.add_method('SetRandomBurstSize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
     cls.add_method('SetRandomVariable', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
     ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoCorrupt', 
                    'bool', 
diff -Naur ns-3.18.1/src/applications/helper/bulk-send-helper.h ns-3.19/src/applications/helper/bulk-send-helper.h
--- ns-3.18.1/src/applications/helper/bulk-send-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/helper/bulk-send-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -35,6 +35,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup bulksend
  * \brief A helper to make it easier to instantiate an ns3::BulkSendApplication
  * on a set of nodes.
  */
@@ -92,7 +93,6 @@
 
 private:
   /**
-   * \internal
    * Install an ns3::BulkSendApplication on the node configured with all the
    * attributes set with SetAttribute.
    *
@@ -100,9 +100,8 @@
    * \returns Ptr to the application installed.
    */
   Ptr<Application> InstallPriv (Ptr<Node> node) const;
-  std::string m_protocol;
-  Address m_remote;
-  ObjectFactory m_factory;
+
+  ObjectFactory m_factory; //!< Object factory.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/helper/on-off-helper.h ns-3.19/src/applications/helper/on-off-helper.h
--- ns-3.18.1/src/applications/helper/on-off-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/helper/on-off-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -35,6 +35,7 @@
 class DataRate;
 
 /**
+ * \ingroup onoff
  * \brief A helper to make it easier to instantiate an ns3::OnOffApplication 
  * on a set of nodes.
  */
@@ -114,7 +115,6 @@
 
 private:
   /**
-   * \internal
    * Install an ns3::OnOffApplication on the node configured with all the 
    * attributes set with SetAttribute.
    *
@@ -122,9 +122,8 @@
    * \returns Ptr to the application installed.
    */
   Ptr<Application> InstallPriv (Ptr<Node> node) const;
-  std::string m_protocol;
-  Address m_remote;
-  ObjectFactory m_factory;
+
+  ObjectFactory m_factory; //!< Object factory.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/helper/packet-sink-helper.h ns-3.19/src/applications/helper/packet-sink-helper.h
--- ns-3.18.1/src/applications/helper/packet-sink-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/helper/packet-sink-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,6 +28,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup packetsink
  * \brief A helper to make it easier to instantiate an ns3::PacketSinkApplication
  * on a set of nodes.
  */
@@ -60,6 +61,7 @@
    *
    * \param c NodeContainer of the set of nodes on which a PacketSinkApplication 
    * will be installed.
+   * \returns Container of Ptr to the applications installed.
    */
   ApplicationContainer Install (NodeContainer c) const;
 
@@ -68,6 +70,7 @@
    * configured with all the attributes set with SetAttribute.
    *
    * \param node The node on which a PacketSinkApplication will be installed.
+   * \returns Container of Ptr to the applications installed.
    */
   ApplicationContainer Install (Ptr<Node> node) const;
 
@@ -76,15 +79,20 @@
    * configured with all the attributes set with SetAttribute.
    *
    * \param nodeName The name of the node on which a PacketSinkApplication will be installed.
+   * \returns Container of Ptr to the applications installed.
    */
   ApplicationContainer Install (std::string nodeName) const;
 
 private:
   /**
-   * \internal
+   * Install an ns3::PacketSink on the node configured with all the
+   * attributes set with SetAttribute.
+   *
+   * \param node The node on which an PacketSink will be installed.
+   * \returns Ptr to the application installed.
    */
   Ptr<Application> InstallPriv (Ptr<Node> node) const;
-  ObjectFactory m_factory;
+  ObjectFactory m_factory; //!< Object factory.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/helper/ping6-helper.h ns-3.19/src/applications/helper/ping6-helper.h
--- ns-3.18.1/src/applications/helper/ping6-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/helper/ping6-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup ping6
  * \class Ping6Helper
  * \brief Ping6 application helper.
  */
diff -Naur ns-3.18.1/src/applications/helper/radvd-helper.h ns-3.19/src/applications/helper/radvd-helper.h
--- ns-3.18.1/src/applications/helper/radvd-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/helper/radvd-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -35,6 +35,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup radvd
  * \class RadvdHelper
  * \brief Radvd application helper.
  */
@@ -69,9 +70,10 @@
   void DisableDefaultRouterForInterface (uint32_t interface);
 
   /**
-   * \brief Get the low-level radvdInterface specification for an interface.
+   * \brief Get the low-level RadvdInterface specification for an interface.
    * This method is provided to enable fine-grain parameter setup.
    * \param interface outgoing interface
+   * \returns the RadvdInterface
    */
   Ptr<RadvdInterface> GetRadvdInterface (uint32_t interface);
 
@@ -100,10 +102,12 @@
    */
   ObjectFactory m_factory;
 
+  /// Container: interface index, RadvdInterface
   typedef std::map<uint32_t, Ptr<RadvdInterface> > RadvdInterfaceMap;
+  /// Container Iterator: interface index, RadvdInterface
   typedef std::map<uint32_t, Ptr<RadvdInterface> >::iterator RadvdInterfaceMapI;
 
-  RadvdInterfaceMap m_radvdInterfaces;
+  RadvdInterfaceMap m_radvdInterfaces; //!< RadvdInterface(s)
 };
 
 } /* namespace ns3 */
diff -Naur ns-3.18.1/src/applications/helper/udp-client-server-helper.h ns-3.19/src/applications/helper/udp-client-server-helper.h
--- ns-3.18.1/src/applications/helper/udp-client-server-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/helper/udp-client-server-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 #include "ns3/udp-client.h"
 namespace ns3 {
 /**
- * \brief Create a server application which waits for input udp packets
+ * \ingroup udpclientserver
+ * \brief Create a server application which waits for input UDP packets
  *        and uses the information carried into their payload to compute
  *        delay and to determine if some packets are lost.
  */
@@ -60,7 +61,7 @@
   void SetAttribute (std::string name, const AttributeValue &value);
 
   /**
-   * Create one udp server application on each of the Nodes in the
+   * Create one UDP server application on each of the Nodes in the
    * NodeContainer.
    *
    * \param c The nodes on which to create the Applications.  The nodes
@@ -69,14 +70,23 @@
    *          NodeContainer.
    */
   ApplicationContainer Install (NodeContainer c);
+
+  /**
+   * \brief Return the last created server.
+   *
+   * This function is mainly used for testing.
+   *
+   * \returns a Ptr to the last created server application
+   */
   Ptr<UdpServer> GetServer (void);
 private:
-  ObjectFactory m_factory;
-  Ptr<UdpServer> m_server;
+  ObjectFactory m_factory; //!< Object factory.
+  Ptr<UdpServer> m_server; //!< The last created server application
 };
 
 /**
- * \brief Create a client application which sends udp packets carrying
+ * \ingroup udpclientserver
+ * \brief Create a client application which sends UDP packets carrying
  *  a 32bit sequence number and a 64 bit time stamp.
  *
  */
@@ -95,12 +105,28 @@
    *  Create UdpClientHelper which will make life easier for people trying
    * to set up simulations with udp-client-server.
    *
-   * \param ip The IP address of the remote udp server
-   * \param port The port number of the remote udp server
+   * \param ip The IPv4 address of the remote UDP server
+   * \param port The port number of the remote UDP server
    */
 
   UdpClientHelper (Ipv4Address ip, uint16_t port);
+  /**
+   *  Create UdpClientHelper which will make life easier for people trying
+   * to set up simulations with udp-client-server.
+   *
+   * \param ip The IPv6 address of the remote UDP server
+   * \param port The port number of the remote UDP server
+   */
+
   UdpClientHelper (Ipv6Address ip, uint16_t port);
+  /**
+   *  Create UdpClientHelper which will make life easier for people trying
+   * to set up simulations with udp-client-server.
+   *
+   * \param ip The IP address of the remote UDP server
+   * \param port The port number of the remote UDP server
+   */
+
   UdpClientHelper (Address ip, uint16_t port);
 
   /**
@@ -114,25 +140,26 @@
   /**
      * \param c the nodes
      *
-     * Create one udp client application on each of the input nodes
+     * Create one UDP client application on each of the input nodes
      *
      * \returns the applications created, one application per input node.
      */
   ApplicationContainer Install (NodeContainer c);
 
 private:
-  ObjectFactory m_factory;
+  ObjectFactory m_factory; //!< Object factory.
 };
 /**
- * Create udpTraceClient application which sends udp packets based on a trace
+ * \ingroup udpclientserver
+ * Create UdpTraceClient application which sends UDP packets based on a trace
  * file of an MPEG4 stream. Trace files could be downloaded form :
- * http://www.tkn.tu-berlin.de/research/trace/ltvt.html (the 2 first lines of
+ * http://www2.tkn.tu-berlin.de/research/trace/ltvt.html (the 2 first lines of
  * the file should be removed)
  * A valid trace file is a file with 4 columns:
- * -1- the first one represents the frame index
- * -2- the second one indicates the type of the frame: I, P or B
- * -3- the third one indicates the time on which the frame was generated by the encoder
- * -4- the fourth one indicates the frame size in byte
+ * \li -1- the first one represents the frame index
+ * \li -2- the second one indicates the type of the frame: I, P or B
+ * \li -3- the third one indicates the time on which the frame was generated by the encoder
+ * \li -4- the fourth one indicates the frame size in byte
 */
 class UdpTraceClientHelper
 {
@@ -148,12 +175,28 @@
    * Create UdpTraceClientHelper which will make life easier for people trying
    * to set up simulations with udp-client-server.
    *
-   * \param ip The IP address of the remote udp server
-   * \param port The port number of the remote udp server
+   * \param ip The IP address of the remote UDP server
+   * \param port The port number of the remote UDP server
    * \param filename the file from which packet traces will be loaded
    */
   UdpTraceClientHelper (Address ip, uint16_t port, std::string filename);
+  /**
+   * Create UdpTraceClientHelper which will make life easier for people trying
+   * to set up simulations with udp-client-server.
+   *
+   * \param ip The IPv4 address of the remote UDP server
+   * \param port The port number of the remote UDP server
+   * \param filename the file from which packet traces will be loaded
+   */
   UdpTraceClientHelper (Ipv4Address ip, uint16_t port, std::string filename);
+  /**
+   * Create UdpTraceClientHelper which will make life easier for people trying
+   * to set up simulations with udp-client-server.
+   *
+   * \param ip The IPv6 address of the remote UDP server
+   * \param port The port number of the remote UDP server
+   * \param filename the file from which packet traces will be loaded
+   */
   UdpTraceClientHelper (Ipv6Address ip, uint16_t port, std::string filename);
 
   /**
@@ -167,14 +210,14 @@
   /**
     * \param c the nodes
     *
-    * Create one udp trace client application on each of the input nodes
+    * Create one UDP trace client application on each of the input nodes
     *
     * \returns the applications created, one application per input node.
     */
   ApplicationContainer Install (NodeContainer c);
 
 private:
-  ObjectFactory m_factory;
+  ObjectFactory m_factory; //!< Object factory.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/helper/udp-echo-helper.h ns-3.19/src/applications/helper/udp-echo-helper.h
--- ns-3.18.1/src/applications/helper/udp-echo-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/helper/udp-echo-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 namespace ns3 {
 
 /**
- * \brief Create a server application which waits for input udp packets
+ * \ingroup udpecho
+ * \brief Create a server application which waits for input UDP packets
  *        and sends them back to the original sender.
  */
 class UdpEchoServerHelper
@@ -87,15 +88,20 @@
 
 private:
   /**
-   * \internal
+   * Install an ns3::UdpEchoServer on the node configured with all the
+   * attributes set with SetAttribute.
+   *
+   * \param node The node on which an UdpEchoServer will be installed.
+   * \returns Ptr to the application installed.
    */
   Ptr<Application> InstallPriv (Ptr<Node> node) const;
 
-  ObjectFactory m_factory;
+  ObjectFactory m_factory; //!< Object factory.
 };
 
 /**
- * \brief create an application which sends a udp packet and waits for an echo of this packet
+ * \ingroup udpecho
+ * \brief Create an application which sends a UDP packet and waits for an echo of this packet
  */
 class UdpEchoClientHelper
 {
@@ -108,7 +114,21 @@
    * \param port The port number of the remote udp echo server
    */
   UdpEchoClientHelper (Address ip, uint16_t port);
+  /**
+   * Create UdpEchoClientHelper which will make life easier for people trying
+   * to set up simulations with echos.
+   *
+   * \param ip The IPv4 address of the remote udp echo server
+   * \param port The port number of the remote udp echo server
+   */
   UdpEchoClientHelper (Ipv4Address ip, uint16_t port);
+  /**
+   * Create UdpEchoClientHelper which will make life easier for people trying
+   * to set up simulations with echos.
+   *
+   * \param ip The IPv6 address of the remote udp echo server
+   * \param port The port number of the remote udp echo server
+   */
   UdpEchoClientHelper (Ipv6Address ip, uint16_t port);
 
   /**
@@ -203,8 +223,15 @@
   ApplicationContainer Install (NodeContainer c) const;
 
 private:
+  /**
+   * Install an ns3::UdpEchoClient on the node configured with all the
+   * attributes set with SetAttribute.
+   *
+   * \param node The node on which an UdpEchoClient will be installed.
+   * \returns Ptr to the application installed.
+   */
   Ptr<Application> InstallPriv (Ptr<Node> node) const;
-  ObjectFactory m_factory;
+  ObjectFactory m_factory; //!< Object factory.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/helper/v4ping-helper.h ns-3.19/src/applications/helper/v4ping-helper.h
--- ns-3.18.1/src/applications/helper/v4ping-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/helper/v4ping-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -1,3 +1,23 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
 #ifndef V4PING_HELPER_H
 #define V4PING_HELPER_H
 
@@ -8,7 +28,8 @@
 namespace ns3 {
 
 /**
- * \brief create a pinger application and associate it to a node
+ * \ingroup v4ping
+ * \brief Create a IPv5 ping application and associate it to a node
  *
  * This class creates one or multiple instances of ns3::V4Ping and associates
  * it/them to one/multiple node(s).
@@ -25,33 +46,33 @@
   V4PingHelper (Ipv4Address remote);
 
   /**
-   * Install a pinger application on each Node in the provided NodeContainer.
+   * Install a Ping application on each Node in the provided NodeContainer.
    *
    * \param nodes The NodeContainer containing all of the nodes to get a V4Ping
    *              application.
    *
-   * \returns A list of pinger applications, one for each input node
+   * \returns A list of Ping applications, one for each input node
    */
   ApplicationContainer Install (NodeContainer nodes) const;
 
   /**
-   * Install a pinger application on the provided Node.  The Node is specified
+   * Install a Ping application on the provided Node.  The Node is specified
    * directly by a Ptr<Node>
    *
    * \param node The node to install the V4PingApplication on.
    *
-   * \returns An ApplicationContainer holding the pinger application created.
+   * \returns An ApplicationContainer holding the Ping application created.
    */
   ApplicationContainer Install (Ptr<Node> node) const;
 
   /**
-   * Install a pinger application on the provided Node.  The Node is specified
+   * Install a Ping application on the provided Node.  The Node is specified
    * by a string that must have previously been associated with a Node using the
    * Object Name Service.
    *
    * \param nodeName The node to install the V4PingApplication on.
    *
-   * \returns An ApplicationContainer holding the pinger application created.
+   * \returns An ApplicationContainer holding the Ping application created.
    */
   ApplicationContainer Install (std::string nodeName) const;
 
@@ -63,9 +84,12 @@
   void SetAttribute (std::string name, const AttributeValue &value);
 private:
   /**
-   * \internal
+   * \brief Do the actual application installation in the node
+   * \param node the node
+   * \returns a Smart pointer to the installed application
    */
   Ptr<Application> InstallPriv (Ptr<Node> node) const;
+  /// Object factory
   ObjectFactory m_factory;
 };
 
diff -Naur ns-3.18.1/src/applications/model/application-packet-probe.cc ns-3.19/src/applications/model/application-packet-probe.cc
--- ns-3.18.1/src/applications/model/application-packet-probe.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/application-packet-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ApplicationPacketProbe);
+NS_OBJECT_ENSURE_REGISTERED (ApplicationPacketProbe)
+  ;
 
 TypeId
 ApplicationPacketProbe::GetTypeId ()
diff -Naur ns-3.18.1/src/applications/model/application-packet-probe.h ns-3.19/src/applications/model/application-packet-probe.h
--- ns-3.18.1/src/applications/model/application-packet-probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/application-packet-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -37,6 +37,8 @@
 namespace ns3 {
 
 /**
+ * \brief Probe to translate from a TraceSource to two more easily parsed TraceSources.
+ *
  * This class is designed to probe an underlying ns3 TraceSource
  * exporting a packet and a socket address.  This probe exports a
  * trace source "Output" with arguments of type Ptr<const Packet> and
@@ -49,6 +51,10 @@
 class ApplicationPacketProbe : public Probe
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   ApplicationPacketProbe ();
   virtual ~ApplicationPacketProbe ();
@@ -97,11 +103,12 @@
    * \param packet the traced packet
    * \param address the socket address for the traced packet
    *
-   * \internal
    */
   void TraceSink (Ptr<const Packet> packet, const Address& address);
 
+  /// Output trace, packet and source address
   TracedCallback<Ptr<const Packet>, const Address&> m_output;
+  /// Output trace, previous packet size and current packet size
   TracedCallback<uint32_t, uint32_t> m_outputBytes;
 
   /// The traced packet.
diff -Naur ns-3.18.1/src/applications/model/bulk-send-application.cc ns-3.19/src/applications/model/bulk-send-application.cc
--- ns-3.18.1/src/applications/model/bulk-send-application.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/bulk-send-application.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BulkSendApplication);
+NS_OBJECT_ENSURE_REGISTERED (BulkSendApplication)
+  ;
 
 TypeId
 BulkSendApplication::GetTypeId (void)
diff -Naur ns-3.18.1/src/applications/model/bulk-send-application.h ns-3.19/src/applications/model/bulk-send-application.h
--- ns-3.18.1/src/applications/model/bulk-send-application.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/bulk-send-application.h	2013-12-20 09:44:50.000000000 -0800
@@ -38,8 +38,8 @@
  *
  * This traffic generator simply sends data
  * as fast as possible up to MaxBytes or until
- * the appplication is stopped if MaxBytes is
- * zero. Once the lower layer send buffer is
+ * the application is stopped (if MaxBytes is
+ * zero). Once the lower layer send buffer is
  * filled, it waits until space is free to
  * send more data, essentially keeping a
  * constant flow of data. Only SOCK_STREAM 
@@ -47,9 +47,31 @@
  * For example, TCP sockets can be used, but 
  * UDP sockets can not be used.
  */
+
+/**
+ * \ingroup bulksend
+ *
+ * \brief Send as much traffic as possible, trying to fill the bandwidth.
+ *
+ * This traffic generator simply sends data
+ * as fast as possible up to MaxBytes or until
+ * the application is stopped (if MaxBytes is
+ * zero). Once the lower layer send buffer is
+ * filled, it waits until space is free to
+ * send more data, essentially keeping a
+ * constant flow of data. Only SOCK_STREAM
+ * and SOCK_SEQPACKET sockets are supported.
+ * For example, TCP sockets can be used, but
+ * UDP sockets can not be used.
+ *
+ */
 class BulkSendApplication : public Application
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   BulkSendApplication ();
@@ -57,20 +79,22 @@
   virtual ~BulkSendApplication ();
 
   /**
-   * \param maxBytes the upper bound of bytes to send
+   * \brief Set the upper bound for the total number of bytes to send.
    *
-   * Set the upper bound for the total number of bytes to send. Once 
-   * this bound is reached, no more application bytes are sent. If the 
+   * Once this bound is reached, no more application bytes are sent. If the
    * application is stopped during the simulation and restarted, the 
    * total number of bytes sent is not reset; however, the maxBytes 
    * bound is still effective and the application will continue sending 
    * up to maxBytes. The value zero for maxBytes means that 
    * there is no upper bound; i.e. data is sent until the application 
    * or simulation is stopped.
+   *
+   * \param maxBytes the upper bound of bytes to send
    */
   void SetMaxBytes (uint32_t maxBytes);
 
   /**
+   * \brief Get the socket this application is attached to.
    * \return pointer to associated socket
    */
   Ptr<Socket> GetSocket (void) const;
@@ -82,22 +106,37 @@
   virtual void StartApplication (void);    // Called at time specified by Start
   virtual void StopApplication (void);     // Called at time specified by Stop
 
+  /**
+   * \brief Send data until the L4 transmission buffer is full.
+   */
   void SendData ();
 
-  Ptr<Socket>     m_socket;       // Associated socket
-  Address         m_peer;         // Peer address
-  bool            m_connected;    // True if connected
-  uint32_t        m_sendSize;     // Size of data to send each time
-  uint32_t        m_maxBytes;     // Limit total number of bytes sent
-  uint32_t        m_totBytes;     // Total bytes sent so far
-  TypeId          m_tid;
+  Ptr<Socket>     m_socket;       //!< Associated socket
+  Address         m_peer;         //!< Peer address
+  bool            m_connected;    //!< True if connected
+  uint32_t        m_sendSize;     //!< Size of data to send each time
+  uint32_t        m_maxBytes;     //!< Limit total number of bytes sent
+  uint32_t        m_totBytes;     //!< Total bytes sent so far
+  TypeId          m_tid;          //!< The type of protocol to use.
+
+  /// Traced Callback: sent packets
   TracedCallback<Ptr<const Packet> > m_txTrace;
 
 private:
+  /**
+   * \brief Connection Succeeded (called by Socket through a callback)
+   * \param socket the connected socket
+   */
   void ConnectionSucceeded (Ptr<Socket> socket);
+  /**
+   * \brief Connection Failed (called by Socket through a callback)
+   * \param socket the connected socket
+   */
   void ConnectionFailed (Ptr<Socket> socket);
+  /**
+   * \brief Send more data as soon as some has been transmitted.
+   */
   void DataSend (Ptr<Socket>, uint32_t); // for socket's SetSendCallback
-  void Ignore (Ptr<Socket> socket);
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/model/onoff-application.cc ns-3.19/src/applications/model/onoff-application.cc
--- ns-3.18.1/src/applications/model/onoff-application.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/onoff-application.cc	2013-12-20 09:44:50.000000000 -0800
@@ -46,7 +46,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (OnOffApplication);
+NS_OBJECT_ENSURE_REGISTERED (OnOffApplication)
+  ;
 
 TypeId
 OnOffApplication::GetTypeId (void)
@@ -166,6 +167,8 @@
         MakeCallback (&OnOffApplication::ConnectionSucceeded, this),
         MakeCallback (&OnOffApplication::ConnectionFailed, this));
     }
+  m_cbrRateFailSafe = m_cbrRate;
+
   // Insure no pending event
   CancelEvents ();
   // If we are not yet connected, there is nothing to do here
@@ -193,13 +196,14 @@
 {
   NS_LOG_FUNCTION (this);
 
-  if (m_sendEvent.IsRunning ())
+  if (m_sendEvent.IsRunning () && m_cbrRateFailSafe == m_cbrRate )
     { // Cancel the pending send packet event
       // Calculate residual bits since last packet sent
       Time delta (Simulator::Now () - m_lastStartTime);
       int64x64_t bits = delta.To (Time::S) * m_cbrRate.GetBitRate ();
       m_residualBits += bits.GetHigh ();
     }
+  m_cbrRateFailSafe = m_cbrRate;
   Simulator::Cancel (m_sendEvent);
   Simulator::Cancel (m_startStopEvent);
 }
diff -Naur ns-3.18.1/src/applications/model/onoff-application.h ns-3.19/src/applications/model/onoff-application.h
--- ns-3.18.1/src/applications/model/onoff-application.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/onoff-application.h	2013-12-20 09:44:50.000000000 -0800
@@ -86,6 +86,10 @@
 class OnOffApplication : public Application 
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   OnOffApplication ();
@@ -93,23 +97,24 @@
   virtual ~OnOffApplication();
 
   /**
-   * \param maxBytes the total number of bytes to send
+   * \brief Set the total number of bytes to send.
+   *
+   * Once these bytes are sent, no packet is sent again, even in on state.
+   * The value zero means that there is no limit.
    *
-   * Set the total number of bytes to send. Once these bytes are sent, no packet 
-   * is sent again, even in on state. The value zero means that there is no 
-   * limit.
+   * \param maxBytes the total number of bytes to send
    */
   void SetMaxBytes (uint32_t maxBytes);
 
   /**
+   * \brief Return a pointer to associated socket.
    * \return pointer to associated socket
    */
   Ptr<Socket> GetSocket (void) const;
 
  /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
+  * \brief Assign a fixed random variable stream number to the random variables
+  * used by this model.
   *
   * \param stream first stream index to use
   * \return the number of stream indices assigned by this model
@@ -124,43 +129,66 @@
   virtual void StopApplication (void);     // Called at time specified by Stop
 
   //helpers
+  /**
+   * \brief Cancel all pending events.
+   */
   void CancelEvents ();
 
-  void Construct (Ptr<Node> n,
-                  const Address &remote,
-                  std::string tid,
-                  const RandomVariable& ontime,
-                  const RandomVariable& offtime,
-                  uint32_t size);
-
-
   // Event handlers
+  /**
+   * \brief Start an On period
+   */
   void StartSending ();
+  /**
+   * \brief Start an Off period
+   */
   void StopSending ();
+  /**
+   * \brief Send a packet
+   */
   void SendPacket ();
 
-  Ptr<Socket>     m_socket;       // Associated socket
-  Address         m_peer;         // Peer address
-  bool            m_connected;    // True if connected
-  Ptr<RandomVariableStream>  m_onTime;       // rng for On Time
-  Ptr<RandomVariableStream>  m_offTime;      // rng for Off Time
-  DataRate        m_cbrRate;      // Rate that data is generated
-  uint32_t        m_pktSize;      // Size of packets
-  uint32_t        m_residualBits; // Number of generated, but not sent, bits
-  Time            m_lastStartTime; // Time last packet sent
-  uint32_t        m_maxBytes;     // Limit total number of bytes sent
-  uint32_t        m_totBytes;     // Total bytes sent so far
-  EventId         m_startStopEvent;     // Event id for next start or stop event
-  EventId         m_sendEvent;    // Eventid of pending "send packet" event
-  bool            m_sending;      // True if currently in sending state
-  TypeId          m_tid;
+  Ptr<Socket>     m_socket;       //!< Associated socket
+  Address         m_peer;         //!< Peer address
+  bool            m_connected;    //!< True if connected
+  Ptr<RandomVariableStream>  m_onTime;       //!< rng for On Time
+  Ptr<RandomVariableStream>  m_offTime;      //!< rng for Off Time
+  DataRate        m_cbrRate;      //!< Rate that data is generated
+  DataRate        m_cbrRateFailSafe;      //!< Rate that data is generated (check copy)
+  uint32_t        m_pktSize;      //!< Size of packets
+  uint32_t        m_residualBits; //!< Number of generated, but not sent, bits
+  Time            m_lastStartTime; //!< Time last packet sent
+  uint32_t        m_maxBytes;     //!< Limit total number of bytes sent
+  uint32_t        m_totBytes;     //!< Total bytes sent so far
+  EventId         m_startStopEvent;     //!< Event id for next start or stop event
+  EventId         m_sendEvent;    //!< Event id of pending "send packet" event
+  TypeId          m_tid;          //!< Type of the socket used
+
+  /// Traced Callback: transmitted packets.
   TracedCallback<Ptr<const Packet> > m_txTrace;
 
 private:
+  /**
+   * \brief Schedule the next packet transmission
+   */
   void ScheduleNextTx ();
+  /**
+   * \brief Schedule the next On period start
+   */
   void ScheduleStartEvent ();
+  /**
+   * \brief Schedule the next Off period start
+   */
   void ScheduleStopEvent ();
+  /**
+   * \brief Handle a Connection Succeed event
+   * \param socket the connected socket
+   */
   void ConnectionSucceeded (Ptr<Socket> socket);
+  /**
+   * \brief Handle a Connection Failed event
+   * \param socket the not connected socket
+   */
   void ConnectionFailed (Ptr<Socket> socket);
 };
 
diff -Naur ns-3.18.1/src/applications/model/packet-loss-counter.cc ns-3.19/src/applications/model/packet-loss-counter.cc
--- ns-3.18.1/src/applications/model/packet-loss-counter.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/packet-loss-counter.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("PacketLossCounter");
+NS_LOG_COMPONENT_DEFINE ("PacketLossCounter")
+  ;
 
 
 PacketLossCounter::PacketLossCounter (uint8_t bitmapSize)
diff -Naur ns-3.18.1/src/applications/model/packet-loss-counter.h ns-3.19/src/applications/model/packet-loss-counter.h
--- ns-3.18.1/src/applications/model/packet-loss-counter.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/packet-loss-counter.h	2013-12-20 09:44:50.000000000 -0800
@@ -33,23 +33,63 @@
 class Socket;
 class Packet;
 
+/**
+ * \ingroup udpclientserver
+ * \class PacketLossCounter
+ * \brief A class to count the number of lost packets.
+ *
+ * This class records the packet lost in a client/server transmission
+ * leveraging a sequence number. All the packets outside a given window
+ * (i.e., too old wit respect to the last sequence number seen) are considered lost,
+ */
 class PacketLossCounter
 {
 public:
+  /**
+   * \brief Constructor
+   * \param bitmapSize The window size. Must be a multiple of 8.
+   */
   PacketLossCounter (uint8_t bitmapSize);
   ~PacketLossCounter ();
+  /**
+   * \brief Record a successfully received packet
+   * \param seq the packet sequence number
+   */
   void NotifyReceived (uint32_t seq);
+  /**
+   * \brief Get the number of lost packets.
+   * \returns the number of lost packets.
+   */
   uint32_t GetLost (void) const;
+  /**
+   * \brief Return the size of the window used to compute the packet loss.
+   * \return the window size.
+   */
   uint16_t GetBitMapSize (void) const;
+  /**
+   * \brief Set the size of the window used to compute the packet loss.
+   *
+   * \param size The window size. Must be a multiple of 8.
+   */
   void SetBitMapSize (uint16_t size);
 private:
+  /**
+   * \brief Check if a sequence number in the window has been received.
+   * \param seqNum the sequence number.
+   * \returns false if the packet has not been received.
+   */
   bool GetBit (uint32_t seqNum);
+  /**
+   * \brief Set a sequence number to a given state.
+   * \param seqNum the sequence number.
+   * \param val false if the packet has not been received.
+   */
   void SetBit (uint32_t seqNum, bool val);
 
-  uint32_t m_lost;
-  uint16_t m_bitMapSize;
-  uint32_t m_lastMaxSeqNum;
-  uint8_t * m_receiveBitMap;
+  uint32_t m_lost; //!< Lost packets counter.
+  uint16_t m_bitMapSize; //!< Window size.
+  uint32_t m_lastMaxSeqNum; //!< Last sequence number seen.
+  uint8_t * m_receiveBitMap; //!< Received packets in the window size.
 };
 }
 
diff -Naur ns-3.18.1/src/applications/model/packet-sink.cc ns-3.19/src/applications/model/packet-sink.cc
--- ns-3.18.1/src/applications/model/packet-sink.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/packet-sink.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,8 +34,10 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("PacketSink");
-NS_OBJECT_ENSURE_REGISTERED (PacketSink);
+NS_LOG_COMPONENT_DEFINE ("PacketSink")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (PacketSink)
+  ;
 
 TypeId 
 PacketSink::GetTypeId (void)
diff -Naur ns-3.18.1/src/applications/model/packet-sink.h ns-3.19/src/applications/model/packet-sink.h
--- ns-3.18.1/src/applications/model/packet-sink.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/packet-sink.h	2013-12-20 09:44:50.000000000 -0800
@@ -62,12 +62,16 @@
  * The constructor specifies the Address (IP address and port) and the 
  * transport protocol to use.   A virtual Receive () method is installed 
  * as a callback on the receiving socket.  By default, when logging is
- * enabled, it prints out the size of packets and their address, but
- * we intend to also add a tracing source to Receive() at a later date.
+ * enabled, it prints out the size of packets and their address.
+ * A tracing source to Receive() is also available.
  */
 class PacketSink : public Application 
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   PacketSink ();
 
@@ -95,19 +99,38 @@
   virtual void StartApplication (void);    // Called at time specified by Start
   virtual void StopApplication (void);     // Called at time specified by Stop
 
-  void HandleRead (Ptr<Socket>);
-  void HandleAccept (Ptr<Socket>, const Address& from);
-  void HandlePeerClose (Ptr<Socket>);
-  void HandlePeerError (Ptr<Socket>);
+  /**
+   * \brief Handle a packet received by the application
+   * \param socket the receiving socket
+   */
+  void HandleRead (Ptr<Socket> socket);
+  /**
+   * \brief Handle an incoming connection
+   * \param socket the incoming connection socket
+   * \param from the address the connection is from
+   */
+  void HandleAccept (Ptr<Socket> socket, const Address& from);
+  /**
+   * \brief Handle an connection close
+   * \param socket the connected socket
+   */
+  void HandlePeerClose (Ptr<Socket> socket);
+  /**
+   * \brief Handle an connection error
+   * \param socket the connected socket
+   */
+  void HandlePeerError (Ptr<Socket> socket);
 
   // In the case of TCP, each socket accept returns a new socket, so the 
-  // listening socket is stored seperately from the accepted sockets
-  Ptr<Socket>     m_socket;       // Listening socket
-  std::list<Ptr<Socket> > m_socketList; //the accepted sockets
-
-  Address         m_local;        // Local address to bind to
-  uint32_t        m_totalRx;      // Total bytes received
-  TypeId          m_tid;          // Protocol TypeId
+  // listening socket is stored separately from the accepted sockets
+  Ptr<Socket>     m_socket;       //!< Listening socket
+  std::list<Ptr<Socket> > m_socketList; //!< the accepted sockets
+
+  Address         m_local;        //!< Local address to bind to
+  uint32_t        m_totalRx;      //!< Total bytes received
+  TypeId          m_tid;          //!< Protocol TypeId
+
+  /// Traced Callback: received packets, source address.
   TracedCallback<Ptr<const Packet>, const Address &> m_rxTrace;
 
 };
diff -Naur ns-3.18.1/src/applications/model/ping6.cc ns-3.19/src/applications/model/ping6.cc
--- ns-3.18.1/src/applications/model/ping6.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/ping6.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,9 +38,11 @@
 namespace ns3 
 {
 
-NS_LOG_COMPONENT_DEFINE ("Ping6Application");
+NS_LOG_COMPONENT_DEFINE ("Ping6Application")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (Ping6);
+NS_OBJECT_ENSURE_REGISTERED (Ping6)
+  ;
 
 TypeId Ping6::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/applications/model/radvd.cc ns-3.19/src/applications/model/radvd.cc
--- ns-3.18.1/src/applications/model/radvd.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/radvd.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,9 +40,11 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("RadvdApplication");
+NS_LOG_COMPONENT_DEFINE ("RadvdApplication")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (Radvd);
+NS_OBJECT_ENSURE_REGISTERED (Radvd)
+  ;
 
 TypeId Radvd::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/applications/model/radvd.h ns-3.19/src/applications/model/radvd.h
--- ns-3.18.1/src/applications/model/radvd.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/radvd.h	2013-12-20 09:44:50.000000000 -0800
@@ -91,12 +91,18 @@
   virtual void DoDispose ();
 
 private:
+  /// Container: Ptr to RadvdInterface
   typedef std::list<Ptr<RadvdInterface> > RadvdInterfaceList;
+  /// Container Iterator: Ptr to RadvdInterface
   typedef std::list<Ptr<RadvdInterface> >::iterator RadvdInterfaceListI;
+  /// Container Const Iterator: Ptr to RadvdInterface
   typedef std::list<Ptr<RadvdInterface> >::const_iterator RadvdInterfaceListCI;
 
+  /// Container: interface number, EventId
   typedef std::map<uint32_t, EventId> EventIdMap;
+  /// Container Iterator: interface number, EventId
   typedef std::map<uint32_t, EventId>::iterator EventIdMapI;
+  /// Container Const Iterator: interface number, EventId
   typedef std::map<uint32_t, EventId>::const_iterator EventIdMapCI;
 
   /**
diff -Naur ns-3.18.1/src/applications/model/radvd-interface.cc ns-3.19/src/applications/model/radvd-interface.cc
--- ns-3.18.1/src/applications/model/radvd-interface.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/radvd-interface.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 namespace ns3 
 {
 
-NS_LOG_COMPONENT_DEFINE ("RadvdInterface");
+NS_LOG_COMPONENT_DEFINE ("RadvdInterface")
+  ;
 
 RadvdInterface::RadvdInterface (uint32_t interface)
   : m_interface (interface)
diff -Naur ns-3.18.1/src/applications/model/radvd-interface.h ns-3.19/src/applications/model/radvd-interface.h
--- ns-3.18.1/src/applications/model/radvd-interface.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/radvd-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -36,8 +36,11 @@
 class RadvdInterface : public SimpleRefCount<RadvdInterface>
 {
 public:
+  /// Container: Ptr to RadvdPrefix
   typedef std::list<Ptr<RadvdPrefix> > RadvdPrefixList;
+  /// Container Iterator: Ptr to RadvdPrefix
   typedef std::list<Ptr<RadvdPrefix> >::iterator RadvdPrefixListI;
+  /// Container Const Iterator: Ptr to RadvdPrefix
   typedef std::list<Ptr<RadvdPrefix> >::const_iterator RadvdPrefixListCI;
 
   /**
diff -Naur ns-3.18.1/src/applications/model/radvd-prefix.cc ns-3.19/src/applications/model/radvd-prefix.cc
--- ns-3.18.1/src/applications/model/radvd-prefix.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/radvd-prefix.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("RadvdPrefix");
+NS_LOG_COMPONENT_DEFINE ("RadvdPrefix")
+  ;
 
 RadvdPrefix::RadvdPrefix (Ipv6Address network, uint8_t prefixLength, uint32_t preferredLifeTime, uint32_t validLifeTime, bool onLinkFlag, bool autonomousFlag, bool routerAddrFlag)
   : m_network (network),
diff -Naur ns-3.18.1/src/applications/model/seq-ts-header.cc ns-3.19/src/applications/model/seq-ts-header.cc
--- ns-3.18.1/src/applications/model/seq-ts-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/seq-ts-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SeqTsHeader);
+NS_OBJECT_ENSURE_REGISTERED (SeqTsHeader)
+  ;
 
 SeqTsHeader::SeqTsHeader ()
   : m_seq (0),
diff -Naur ns-3.18.1/src/applications/model/seq-ts-header.h ns-3.19/src/applications/model/seq-ts-header.h
--- ns-3.18.1/src/applications/model/seq-ts-header.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/seq-ts-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 /**
  * \ingroup udpclientserver
  * \class SeqTsHeader
- * \brief Packet header for Udp client/server application
+ * \brief Packet header for UDP client/server application.
+ *
  * The header is made of a 32bits sequence number followed by
  * a 64bits time stamp.
  */
@@ -50,16 +51,21 @@
    */
   Time GetTs (void) const;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
-private:
+
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
   virtual uint32_t GetSerializedSize (void) const;
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
-  uint32_t m_seq;
-  uint64_t m_ts;
+private:
+  uint32_t m_seq; //!< Sequence number
+  uint64_t m_ts; //!< Timestamp
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/model/udp-client.cc ns-3.19/src/applications/model/udp-client.cc
--- ns-3.18.1/src/applications/model/udp-client.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-client.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,8 +35,10 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("UdpClient");
-NS_OBJECT_ENSURE_REGISTERED (UdpClient);
+NS_LOG_COMPONENT_DEFINE ("UdpClient")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UdpClient)
+  ;
 
 TypeId
 UdpClient::GetTypeId (void)
@@ -53,12 +55,11 @@
                    "The time to wait between packets", TimeValue (Seconds (1.0)),
                    MakeTimeAccessor (&UdpClient::m_interval),
                    MakeTimeChecker ())
-    .AddAttribute (
-      "RemoteAddress",
-      "The destination Address of the outbound packets",
-      AddressValue (),
-      MakeAddressAccessor (&UdpClient::m_peerAddress),
-      MakeAddressChecker ())
+    .AddAttribute ("RemoteAddress",
+                   "The destination Address of the outbound packets",
+                   AddressValue (),
+                   MakeAddressAccessor (&UdpClient::m_peerAddress),
+                   MakeAddressChecker ())
     .AddAttribute ("RemotePort", "The destination port of the outbound packets",
                    UintegerValue (100),
                    MakeUintegerAccessor (&UdpClient::m_peerPort),
diff -Naur ns-3.18.1/src/applications/model/udp-client.h ns-3.19/src/applications/model/udp-client.h
--- ns-3.18.1/src/applications/model/udp-client.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-client.h	2013-12-20 09:44:50.000000000 -0800
@@ -43,8 +43,11 @@
 class UdpClient : public Application
 {
 public:
-  static TypeId
-  GetTypeId (void);
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
 
   UdpClient ();
 
@@ -52,11 +55,21 @@
 
   /**
    * \brief set the remote address and port
-   * \param ip remote IP address
+   * \param ip remote IPv4 address
    * \param port remote port
    */
   void SetRemote (Ipv4Address ip, uint16_t port);
+  /**
+   * \brief set the remote address and port
+   * \param ip remote IPv6 address
+   * \param port remote port
+   */
   void SetRemote (Ipv6Address ip, uint16_t port);
+  /**
+   * \brief set the remote address and port
+   * \param ip remote IP address
+   * \param port remote port
+   */
   void SetRemote (Address ip, uint16_t port);
 
 protected:
@@ -67,18 +80,20 @@
   virtual void StartApplication (void);
   virtual void StopApplication (void);
 
-  void ScheduleTransmit (Time dt);
+  /**
+   * \brief Send a packet
+   */
   void Send (void);
 
-  uint32_t m_count;
-  Time m_interval;
-  uint32_t m_size;
-
-  uint32_t m_sent;
-  Ptr<Socket> m_socket;
-  Address m_peerAddress;
-  uint16_t m_peerPort;
-  EventId m_sendEvent;
+  uint32_t m_count; //!< Maximum number of packets the application will send
+  Time m_interval; //!< Packet inter-send time
+  uint32_t m_size; //!< Size of the sent packet (including the SeqTsHeader)
+
+  uint32_t m_sent; //!< Counter for sent packets
+  Ptr<Socket> m_socket; //!< Socket
+  Address m_peerAddress; //!< Remote peer address
+  uint16_t m_peerPort; //!< Remote peer port
+  EventId m_sendEvent; //!< Event to send the next packet
 
 };
 
diff -Naur ns-3.18.1/src/applications/model/udp-echo-client.cc ns-3.19/src/applications/model/udp-echo-client.cc
--- ns-3.18.1/src/applications/model/udp-echo-client.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-echo-client.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,8 +31,10 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("UdpEchoClientApplication");
-NS_OBJECT_ENSURE_REGISTERED (UdpEchoClient);
+NS_LOG_COMPONENT_DEFINE ("UdpEchoClientApplication")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UdpEchoClient)
+  ;
 
 TypeId
 UdpEchoClient::GetTypeId (void)
@@ -296,9 +298,9 @@
   else
     {
       //
-      // If m_dataSize is zero, the client has indicated that she doesn't care 
+      // If m_dataSize is zero, the client has indicated that it doesn't care
       // about the data itself either by specifying the data size by setting
-      // the corresponding atribute or by not calling a SetFill function.  In 
+      // the corresponding attribute or by not calling a SetFill function.  In
       // this case, we don't worry about it either.  But we do allow m_size
       // to have a value different from the (zero) m_dataSize.
       //
diff -Naur ns-3.18.1/src/applications/model/udp-echo-client.h ns-3.19/src/applications/model/udp-echo-client.h
--- ns-3.18.1/src/applications/model/udp-echo-client.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-echo-client.h	2013-12-20 09:44:50.000000000 -0800
@@ -39,6 +39,10 @@
 class UdpEchoClient : public Application 
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   UdpEchoClient ();
@@ -46,12 +50,23 @@
   virtual ~UdpEchoClient ();
 
   /**
-   * \param ip destination ipv4 address
-   * \param port destination port
+   * \brief set the remote address and port
+   * \param ip remote IPv4 address
+   * \param port remote port
    */
-  void SetRemote (Address ip, uint16_t port);
   void SetRemote (Ipv4Address ip, uint16_t port);
+  /**
+   * \brief set the remote address and port
+   * \param ip remote IPv6 address
+   * \param port remote port
+   */
   void SetRemote (Ipv6Address ip, uint16_t port);
+  /**
+   * \brief set the remote address and port
+   * \param ip remote IP address
+   * \param port remote port
+   */
+  void SetRemote (Address ip, uint16_t port);
 
   /**
    * Set the data size of the packet (the number of bytes that are sent as data
@@ -130,23 +145,38 @@
   virtual void StartApplication (void);
   virtual void StopApplication (void);
 
+  /**
+   * \brief Schedule the next packet transmission
+   * \param dt time interval between packets.
+   */
   void ScheduleTransmit (Time dt);
+  /**
+   * \brief Send a packet
+   */
   void Send (void);
 
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
   void HandleRead (Ptr<Socket> socket);
 
-  uint32_t m_count;
-  Time m_interval;
-  uint32_t m_size;
-
-  uint32_t m_dataSize;
-  uint8_t *m_data;
-
-  uint32_t m_sent;
-  Ptr<Socket> m_socket;
-  Address m_peerAddress;
-  uint16_t m_peerPort;
-  EventId m_sendEvent;
+  uint32_t m_count; //!< Maximum number of packets the application will send
+  Time m_interval; //!< Packet inter-send time
+  uint32_t m_size; //!< Size of the sent packet
+
+  uint32_t m_dataSize; //!< packet payload size (must be equal to m_size)
+  uint8_t *m_data; //!< packet payload data
+
+  uint32_t m_sent; //!< Counter for sent packets
+  Ptr<Socket> m_socket; //!< Socket
+  Address m_peerAddress; //!< Remote peer address
+  uint16_t m_peerPort; //!< Remote peer port
+  EventId m_sendEvent; //!< Event to send the next packet
+
   /// Callbacks for tracing the packet Tx events
   TracedCallback<Ptr<const Packet> > m_txTrace;
 };
diff -Naur ns-3.18.1/src/applications/model/udp-echo-server.cc ns-3.19/src/applications/model/udp-echo-server.cc
--- ns-3.18.1/src/applications/model/udp-echo-server.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-echo-server.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,8 +34,10 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("UdpEchoServerApplication");
-NS_OBJECT_ENSURE_REGISTERED (UdpEchoServer);
+NS_LOG_COMPONENT_DEFINE ("UdpEchoServerApplication")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UdpEchoServer)
+  ;
 
 TypeId
 UdpEchoServer::GetTypeId (void)
diff -Naur ns-3.18.1/src/applications/model/udp-echo-server.h ns-3.19/src/applications/model/udp-echo-server.h
--- ns-3.18.1/src/applications/model/udp-echo-server.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-echo-server.h	2013-12-20 09:44:50.000000000 -0800
@@ -43,6 +43,10 @@
 class UdpEchoServer : public Application 
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   UdpEchoServer ();
   virtual ~UdpEchoServer ();
@@ -55,12 +59,19 @@
   virtual void StartApplication (void);
   virtual void StopApplication (void);
 
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
   void HandleRead (Ptr<Socket> socket);
 
-  uint16_t m_port;
-  Ptr<Socket> m_socket;
-  Ptr<Socket> m_socket6;
-  Address m_local;
+  uint16_t m_port; //!< Port on which we listen for incoming packets.
+  Ptr<Socket> m_socket; //!< IPv4 Socket
+  Ptr<Socket> m_socket6; //!< IPv6 Socket
+  Address m_local; //!< local multicast address
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/model/udp-server.cc ns-3.19/src/applications/model/udp-server.cc
--- ns-3.18.1/src/applications/model/udp-server.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-server.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,8 +36,10 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("UdpServer");
-NS_OBJECT_ENSURE_REGISTERED (UdpServer);
+NS_LOG_COMPONENT_DEFINE ("UdpServer")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UdpServer)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/applications/model/udp-server.h ns-3.19/src/applications/model/udp-server.h
--- ns-3.18.1/src/applications/model/udp-server.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-server.h	2013-12-20 09:44:50.000000000 -0800
@@ -37,30 +37,36 @@
 /**
  * \ingroup udpclientserver
  * \class UdpServer
- * \brief A Udp server. Receives UDP packets from a remote host. UDP packets
- * carry a 32bits sequence number followed by a 64bits time stamp in their
- * payloads. The application uses, the sequence number to determine if a packet
- * is lost, and the time stamp to compute the delay
+ * \brief A UDP server, receives UDP packets from a remote host.
+ *
+ * UDP packets carry a 32bits sequence number followed by a 64bits time
+ * stamp in their payloads. The application uses the sequence number
+ * to determine if a packet is lost, and the time stamp to compute the delay.
  */
 class UdpServer : public Application
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   UdpServer ();
   virtual ~UdpServer ();
   /**
-   * returns the number of lost packets
+   * \brief Returns the number of lost packets
    * \return the number of lost packets
    */
   uint32_t GetLost (void) const;
 
   /**
-   * \brief returns the number of received packets
+   * \brief Returns the number of received packets
    * \return the number of received packets
    */
   uint32_t GetReceived (void) const;
 
   /**
+   * \brief Returns the size of the window used for checking loss.
    * \return the size of the window used for checking loss.
    */
   uint16_t GetPacketWindowSize () const;
@@ -80,14 +86,20 @@
   virtual void StartApplication (void);
   virtual void StopApplication (void);
 
+  /**
+   * \brief Handle a packet reception.
+   *
+   * This function is called by lower layers.
+   *
+   * \param socket the socket the packet was received to.
+   */
   void HandleRead (Ptr<Socket> socket);
 
-  uint16_t m_port;
-  Ptr<Socket> m_socket;
-  Ptr<Socket> m_socket6;
-  Address m_local;
-  uint32_t m_received;
-  PacketLossCounter m_lossCounter;
+  uint16_t m_port; //!< Port on which we listen for incoming packets.
+  Ptr<Socket> m_socket; //!< IPv4 Socket
+  Ptr<Socket> m_socket6; //!< IPv6 Socket
+  uint32_t m_received; //!< Number of received packets
+  PacketLossCounter m_lossCounter; //!< Lost packet counter
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/model/udp-trace-client.cc ns-3.19/src/applications/model/udp-trace-client.cc
--- ns-3.18.1/src/applications/model/udp-trace-client.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-trace-client.cc	2013-12-20 09:44:50.000000000 -0800
@@ -37,9 +37,14 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("UdpTraceClient");
-NS_OBJECT_ENSURE_REGISTERED (UdpTraceClient);
+NS_LOG_COMPONENT_DEFINE ("UdpTraceClient")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UdpTraceClient)
+  ;
 
+/**
+ * \brief Default trace to send
+ */
 struct UdpTraceClient::TraceEntry UdpTraceClient::g_defaultEntries[] = {
   { 0, 534, 'I'},
   { 40, 1542, 'P'},
@@ -70,7 +75,7 @@
                    MakeUintegerAccessor (&UdpTraceClient::m_peerPort),
                    MakeUintegerChecker<uint16_t> ())
     .AddAttribute ("MaxPacketSize",
-                   "The maximum size of a packet.",
+                   "The maximum size of a packet (including the SeqTsHeader, 12 bytes).",
                    UintegerValue (1024),
                    MakeUintegerAccessor (&UdpTraceClient::m_maxPacketSize),
                    MakeUintegerChecker<uint32_t> ())
diff -Naur ns-3.18.1/src/applications/model/udp-trace-client.h ns-3.19/src/applications/model/udp-trace-client.h
--- ns-3.18.1/src/applications/model/udp-trace-client.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/udp-trace-client.h	2013-12-20 09:44:50.000000000 -0800
@@ -38,30 +38,32 @@
  * \class UdpTraceClient
  * \brief A trace based streamer
  *
- * sends udp packets based on a trace file of an MPEG4 stream
- * trace files could be downloaded form :
- * http://www.tkn.tu-berlin.de/research/trace/ltvt.html (the 2 first lines of
+ * Sends UDP packets based on a trace file of an MPEG4 stream
+ * trace files could be downloaded form:
+ * http://www2.tkn.tu-berlin.de/research/trace/ltvt.html (the 2 first lines of
  * the file should be removed)
  * A valid trace file is a file with 4 columns:
- * -1- the first one represents the frame index
- * -2- the second one indicates the type of the frame: I, P or B
- * -3- the third one indicates the time on which the frame was generated by the encoder
- * -4- the fourth one indicates the frame size in byte
- * if no valid MPEG4 trace file is provided to the application the trace from
+ * \li -1- the first one represents the frame index
+ * \li -2- the second one indicates the type of the frame: I, P or B
+ * \li -3- the third one indicates the time on which the frame was generated by the encoder
+ * \li -4- the fourth one indicates the frame size in byte
+ *
+ * If no valid MPEG4 trace file is provided to the application the trace from
  * g_defaultEntries array will be loaded.
  */
 class UdpTraceClient : public Application
 {
 public:
-  static TypeId
-  GetTypeId (void);
   /**
-   * \brief creates a traceBasedStreamer application
+   * \brief Get the type ID.
+   * \return the object TypeId
    */
+  static TypeId GetTypeId (void);
+
   UdpTraceClient ();
 
   /**
-   * \brief creates a traceBasedStreamer application
+   * \brief Creates a traceBasedStreamer application
    * \param ip the destination ip address to which the stream will be sent
    * \param port the destination udp port to which the stream will be sent
    * \param traceFile a path to an MPEG4 trace file formatted as follows:
@@ -71,21 +73,30 @@
    *
    *
    */
-
   UdpTraceClient (Ipv4Address ip, uint16_t port, char *traceFile);
   ~UdpTraceClient ();
 
   /**
-   * \brief set the destination IP address and port
-   * \param ip the destination ip address to which the stream will be sent
-   * \param port the destination udp port to which the stream will be sent
+   * \brief set the remote address and port
+   * \param ip remote IPv4 address
+   * \param port remote port
    */
-  void SetRemote (Address ip, uint16_t port);
   void SetRemote (Ipv4Address ip, uint16_t port);
+  /**
+   * \brief set the remote address and port
+   * \param ip remote IPv6 address
+   * \param port remote port
+   */
   void SetRemote (Ipv6Address ip, uint16_t port);
+  /**
+   * \brief set the remote address and port
+   * \param ip remote IP address
+   * \param port remote port
+   */
+  void SetRemote (Address ip, uint16_t port);
 
   /**
-   * \brief set the trace file to be used by the application
+   * \brief Set the trace file to be used by the application
    * \param filename a path to an MPEG4 trace file formatted as follows:
    *  Frame No Frametype   Time[ms]    Length [byte]
    *  Frame No Frametype   Time[ms]    Length [byte]
@@ -94,11 +105,13 @@
   void SetTraceFile (std::string filename);
 
   /**
+   * \brief Return the maximum packet size
    * \return the maximum packet size
    */
   uint16_t GetMaxPacketSize (void);
 
   /**
+   * \brief Set the maximum packet size
    * \param maxPacketSize The maximum packet size
    */
   void SetMaxPacketSize (uint16_t maxPacketSize);
@@ -107,30 +120,50 @@
   virtual void DoDispose (void);
 
 private:
+  /**
+   * \brief Load a trace file
+   * \param filename the trace file path
+   */
   void LoadTrace (std::string filename);
+  /**
+   * \brief Load the default trace
+   */
   void LoadDefaultTrace (void);
   virtual void StartApplication (void);
   virtual void StopApplication (void);
-  void ScheduleTransmit (Time dt);
+
+  /**
+   * \brief Send a packet
+   */
   void Send (void);
+  /**
+   * \brief Send a packet of a given size
+   * \param size the packet size
+   */
   void SendPacket (uint32_t size);
 
-
+  /**
+   * \brief Entry to send.
+   *
+   * Each entry represents an MPEG frame
+   */
   struct TraceEntry
   {
-    uint32_t timeToSend;
-    uint16_t packetSize;
-    char frameType;
+    uint32_t timeToSend; //!< Time to send the frame
+    uint16_t packetSize; //!< Size of the frame
+    char frameType; //!< Frame type (I, P or B)
   };
-  uint32_t m_sent;
-  Ptr<Socket> m_socket;
-  Address m_peerAddress;
-  uint16_t m_peerPort;
-  EventId m_sendEvent;
-  std::vector<struct TraceEntry> m_entries;
-  uint32_t m_currentEntry;
-  static struct TraceEntry g_defaultEntries[];
-  uint16_t m_maxPacketSize;
+
+  uint32_t m_sent; //!< Counter for sent packets
+  Ptr<Socket> m_socket; //!< Socket
+  Address m_peerAddress; //!< Remote peer address
+  uint16_t m_peerPort; //!< Remote peer port
+  EventId m_sendEvent; //!< Event to send the next packet
+
+  std::vector<struct TraceEntry> m_entries; //!< Entries in the trace to send
+  uint32_t m_currentEntry; //!< Current entry index
+  static struct TraceEntry g_defaultEntries[]; //!< Default trace to send
+  uint16_t m_maxPacketSize; //!< Maximum packet size to send (including the SeqTsHeader)
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/applications/model/v4ping.cc ns-3.19/src/applications/model/v4ping.cc
--- ns-3.18.1/src/applications/model/v4ping.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/v4ping.cc	2013-12-20 09:44:50.000000000 -0800
@@ -13,6 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
+
 #include "v4ping.h"
 #include "ns3/icmpv4.h"
 #include "ns3/assert.h"
@@ -27,8 +28,10 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("V4Ping");
-NS_OBJECT_ENSURE_REGISTERED (V4Ping);
+NS_LOG_COMPONENT_DEFINE ("V4Ping")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (V4Ping)
+  ;
 
 TypeId 
 V4Ping::GetTypeId (void)
diff -Naur ns-3.18.1/src/applications/model/v4ping.h ns-3.19/src/applications/model/v4ping.h
--- ns-3.18.1/src/applications/model/v4ping.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/applications/model/v4ping.h	2013-12-20 09:44:50.000000000 -0800
@@ -13,6 +13,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
+
 #ifndef V4PING_H
 #define V4PING_H
 
@@ -28,6 +29,12 @@
 class Socket;
 
 /**
+ * \ingroup applications
+ * \defgroup v4ping V4Ping
+ */
+
+/**
+ * \ingroup v4ping
  * \brief an application which sends one ICMP ECHO request, waits for a REPLYs
  *        and reports the calculated RTT.
  *
@@ -36,6 +43,10 @@
 class V4Ping : public Application
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   /**
@@ -45,15 +56,42 @@
   virtual ~V4Ping ();
 
 private:
+  /**
+   * \brief Writes data to buffer in little-endian format.
+   *
+   * Least significant byte of data is at lowest buffer address
+   *
+   * \param buffer the buffer to write to
+   * \param data the data to write
+   */
   void Write32 (uint8_t *buffer, const uint32_t data);
+  /**
+   * \brief Writes data from a little-endian formatted buffer to data.
+   *
+   * \param buffer the buffer to read from
+   * \param data the read data
+   */
   void Read32 (const uint8_t *buffer, uint32_t &data);
 
   // inherited from Application base class.
   virtual void StartApplication (void);
   virtual void StopApplication (void);
   virtual void DoDispose (void);
+  /**
+   * \brief Return the application ID in the node.
+   * \returns the application id
+   */
   uint32_t GetApplicationId (void) const;
+  /**
+   * \brief Receive an ICMP Echo
+   * \param socket the receiving socket
+   *
+   * This function is called by lower layers through a callback.
+   */
   void Receive (Ptr<Socket> socket);
+  /**
+   * \brief Send one Ping (ICMP ECHO) to the destination
+   */
   void Send ();
 
   /// Remote address
@@ -65,8 +103,11 @@
    * The default is 56, which translates into 64 ICMP data bytes when combined with the 8 bytes of ICMP header data.
    */
   uint32_t m_size;
+  /// The socket we send packets from
   Ptr<Socket> m_socket;
+  /// ICMP ECHO sequence number
   uint16_t m_seq;
+  /// TracedCallback for RTT measured by ICMP ECHOs
   TracedCallback<Time> m_traceRtt;
   /// produce ping-style output if true
   bool m_verbose;
diff -Naur ns-3.18.1/src/bridge/bindings/modulegen__gcc_ILP32.py ns-3.19/src/bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/bridge/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/bridge/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -93,7 +93,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -723,10 +723,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -1676,6 +1677,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -1686,6 +1692,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -1701,6 +1712,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -1726,6 +1742,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/bridge/bindings/modulegen__gcc_LP64.py ns-3.19/src/bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/bridge/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/bridge/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -93,7 +93,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -723,10 +723,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -1676,6 +1677,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -1686,6 +1692,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -1701,6 +1712,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -1726,6 +1742,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/bridge/model/bridge-channel.cc ns-3.19/src/bridge/model/bridge-channel.cc
--- ns-3.18.1/src/bridge/model/bridge-channel.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/bridge/model/bridge-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BridgeChannel);
+NS_OBJECT_ENSURE_REGISTERED (BridgeChannel)
+  ;
 
 TypeId 
 BridgeChannel::GetTypeId (void)
diff -Naur ns-3.18.1/src/bridge/model/bridge-net-device.cc ns-3.19/src/bridge/model/bridge-net-device.cc
--- ns-3.18.1/src/bridge/model/bridge-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/bridge/model/bridge-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BridgeNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (BridgeNetDevice)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/bridge/model/bridge-net-device.h ns-3.19/src/bridge/model/bridge-net-device.h
--- ns-3.18.1/src/bridge/model/bridge-net-device.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/bridge/model/bridge-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,7 @@
 class Node;
 
 /**
- * \defgroup bridge Bridge Device
+ * \defgroup bridge Bridge Network Device
  * 
  * \brief a virtual net device that bridges multiple LAN segments
  *
diff -Naur ns-3.18.1/src/brite/doc/brite.rst ns-3.19/src/brite/doc/brite.rst
--- ns-3.18.1/src/brite/doc/brite.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/brite/doc/brite.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: bash
 
 BRITE Integration
 ------------------
@@ -30,9 +31,7 @@
 router topologies as specified by the AS level topology.  Once the hierarchical 
 topology is constructed, it is flattened into a large router level topology.
 
-Further information can be found in the BRITE user manual:::
-
-	http://www.cs.bu.edu/brite/publications/usermanual.pdf
+Further information can be found in the BRITE user manual: http://www.cs.bu.edu/brite/publications/usermanual.pdf
 
 Model Description
 *****************
@@ -86,7 +85,7 @@
 Building BRITE Integration
 ==========================
 
-The first step is to download and build the ns-3 specific BRITE repository:::
+The first step is to download and build the ns-3 specific BRITE repository::
 
   $ hg clone http://code.nsnam.org/BRITE
   $ cd BRITE
@@ -96,7 +95,7 @@
 directory.
 
 Once BRITE has been built successfully, we proceed to configure ns-3 with 
-BRITE support. Change to your ns-3 directory:::
+BRITE support. Change to your ns-3 directory::
 
   $ ./waf configure --with-brite=/your/path/to/brite/source --enable-examples
 
@@ -104,14 +103,14 @@
 something has gone wrong. Either you have forgotten to build BRITE first 
 following the steps above, or ns-3 could not find your BRITE directory.
 
-Next, build ns-3:::
+Next, build ns-3::
 
   $ ./waf
 
 Examples
 ========
 For an example demonstrating BRITE integration
-run:::
+run::
 
   $ ./waf --run 'brite-generic-example'
 
@@ -119,25 +118,28 @@
 edge information in a similar format to standard BRITE output. There are 
 many other command-line parameters including confFile, tracing, and nix, described below:
    
-   confFile:    A BRITE configuration file. Many different BRITE configuration 
-                file examples exist in the src/brite/examples/conf_files directory, for 
-                example, RTBarabasi20.conf and RTWaxman.conf. Please refer to 
-                the conf_files directory for more examples.
+  confFile
+    A BRITE configuration file. Many different BRITE configuration 
+    file examples exist in the src/brite/examples/conf_files directory, for 
+    example, RTBarabasi20.conf and RTWaxman.conf. Please refer to 
+    the conf_files directory for more examples.
 
-   tracing:     Enables ascii tracing.
+  tracing
+    Enables ascii tracing.
 
-   nix:         Enables nix-vector routing. Global routing is used by default.
+  nix
+    Enables nix-vector routing. Global routing is used by default.
 
 The generic BRITE example also support visualization using pyviz, assuming
-python bindings in ns-3 are enabled:::
+python bindings in ns-3 are enabled::
 
   $ ./waf --run brite-generic-example --vis
   
 Simulations involving BRITE can also be used with MPI.  The total number of MPI instances is 
 passed to the BRITE topology helper where a modulo divide is used to assign the nodes for each 
-AS to a MPI instance.  An example can be found in src/brite/examples:::
+AS to a MPI instance.  An example can be found in src/brite/examples::
 
-	$ mpirun -np 2 ./waf --run brite-MPI-example
+  $ mpirun -np 2 ./waf --run brite-MPI-example
 	
 Please see the ns-3 MPI documentation for information on setting up MPI with ns-3.
 
diff -Naur ns-3.18.1/src/brite/helper/brite-topology-helper.cc ns-3.19/src/brite/helper/brite-topology-helper.cc
--- ns-3.18.1/src/brite/helper/brite-topology-helper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/brite/helper/brite-topology-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,13 +36,14 @@
 
 BriteTopologyHelper::BriteTopologyHelper (std::string confFile,
                                           std::string seedFile,
-                                          std::string newseedFile) : m_confFile (confFile),
-                                                                     m_seedFile (seedFile),
-                                                                     m_newSeedFile (newseedFile),
-                                                                     m_numAs (0),
-                                                                     m_topology (NULL),
-                                                                     m_numNodes (0),
-                                                                     m_numEdges (0)
+                                          std::string newseedFile)
+  : m_confFile (confFile),
+    m_seedFile (seedFile),
+    m_newSeedFile (newseedFile),
+    m_numAs (0),
+    m_topology (NULL),
+    m_numNodes (0),
+    m_numEdges (0)
 {
   NS_LOG_FUNCTION (this);
 
@@ -50,11 +51,12 @@
 
 }
 
-BriteTopologyHelper::BriteTopologyHelper (std::string confFile) : m_confFile (confFile),
-                                                                  m_numAs (0),
-                                                                  m_topology (NULL),
-                                                                  m_numNodes (0),
-                                                                  m_numEdges (0)
+BriteTopologyHelper::BriteTopologyHelper (std::string confFile)
+  : m_confFile (confFile),
+    m_numAs (0),
+    m_topology (NULL),
+    m_numNodes (0),
+    m_numEdges (0)
 {
   NS_LOG_FUNCTION (this);
 
diff -Naur ns-3.18.1/src/brite/helper/brite-topology-helper.h ns-3.19/src/brite/helper/brite-topology-helper.h
--- ns-3.18.1/src/brite/helper/brite-topology-helper.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/brite/helper/brite-topology-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,16 @@
 
 namespace ns3 {
 
+class PointToPointHelper;
+
 /**
+ * \defgroup brite BRITE Topology Generator
+ *
+ * Create topologies with BRITE.
+ */
+
+/**
+ * \ingroup brite
  * \brief Interface with BRITE, the Boston university Representative Internet
  *        Topology gEnerator
  *
@@ -47,12 +56,10 @@
  *
  */
 
-class PointToPointHelper;
-
 class BriteTopologyHelper
 {
 public:
-  /*
+  /**
    * Construct a BriteTopologyHelper
    *
    * \param confFile a BRITE configuration file
@@ -63,7 +70,7 @@
                        std::string seedFile,
                        std::string newseedFile);
 
-  /*
+  /**
    * Construct a BriteTopologyHelper using NS3 to generate seed values
    * need by BRITE
    *
@@ -72,7 +79,7 @@
 
   ~BriteTopologyHelper ();
 
-  /*
+  /**
    * Assigns stream number to UniformRandomVariable used to
    * generate brite seed file
    *
@@ -81,14 +88,14 @@
    */
   void AssignStreams (int64_t streamNumber);
 
-  /*
+  /**
    *  Create NS3 topology using information generated from BRITE.
    *
    *  \param stack Internet stack to assign to nodes in topology
    */
   void BuildBriteTopology (InternetStackHelper& stack);
 
-  /*
+  /**
    * Create NS3 topology using information generated from BRITE and configure topology for MPI use.
    *
    * \param stack Internet stack to assign to nodes in topology.
@@ -97,7 +104,7 @@
    */
   void BuildBriteTopology (InternetStackHelper& stack, const uint32_t systemCount);
 
-  /*
+  /**
    * Returns the number of router leaf nodes for a given AS
    *
    * \param asNum the AS number
@@ -106,7 +113,7 @@
    */
   uint32_t GetNLeafNodesForAs (uint32_t asNum);
 
-  /*
+  /**
    * Returns a given router leaf node from a given AS
    *
    * \param asNum the AS number
@@ -115,7 +122,7 @@
    */
   Ptr<Node> GetLeafNodeForAs (uint32_t asNum, uint32_t leafNum);
 
-  /*
+  /**
    * Returns the total number of nodes for a given AS
    *
    * \param asNum the AS number
@@ -123,7 +130,7 @@
    */
   uint32_t GetNNodesForAs (uint32_t asNum);
 
-  /*
+  /**
    * Returns a given router node for a given AS
    *
    * \param asNum the AS number
@@ -244,52 +251,56 @@
     */
   void GenerateBriteTopology (void);
 
-  //brite configuration file to use
+  /// brite configuration file to use
   std::string m_confFile;
 
-  //brite seed file to use
+  /// brite seed file to use
   std::string m_seedFile;
 
-  //brite seed file to generate for next run
+  /// brite seed file to generate for next run
   std::string m_newSeedFile;
 
-  //stores the number of AS in the BRITE generated topology
+  /// stores the number of AS in the BRITE generated topology
   uint32_t m_numAs;
 
-  //stores the netdevices created for each AS
+  /// stores the netdevices created for each AS
   std::vector<NetDeviceContainer*> m_netDevices;
 
-  //stores the leaf router nodes for each AS
+  /// stores the leaf router nodes for each AS
   std::vector<NodeContainer*> m_asLeafNodes;
 
-  //stores all of the nodes in the brite topology by AS number
+  /// stores all of the nodes in the brite topology by AS number
   std::vector<NodeContainer*> m_nodesByAs;
 
-  //stores the MPI system number each AS assigned to.  All assigned to 0 if MPI not used.
+  /// stores the MPI system number each AS assigned to.  All assigned to 0 if MPI not used.
   std::vector<int> m_systemForAs;
 
+  /// the Brite topology
   brite::Topology* m_topology;
 
-  //stores the number of nodes created in the BRITE topology
+  /// stores the number of nodes created in the BRITE topology
   uint32_t m_numNodes;
 
-  //stores the number of edges created in the BRITE topology
+  /// stores the number of edges created in the BRITE topology
   uint32_t m_numEdges;
 
   /**
    * The BRITE code generates multiple nodes and edges. Each
    * node and edge is stored in a BriteNodeInfo or BriteEdgeInfo
    * struct, and each instance is stored in a vector.
+   * @{
    */
   typedef std::vector<BriteNodeInfo> BriteNodeInfoList;
   typedef std::vector<BriteEdgeInfo> BriteEdgeInfoList;
 
   BriteNodeInfoList m_briteNodeInfoList;
   BriteEdgeInfoList m_briteEdgeInfoList;
+  /**@}*/
 
-  //used to create the links within the topology
+  /// used to create the links within the topology
   PointToPointHelper m_britePointToPointHelper;
 
+  /// random variable stream for brite seed file
   Ptr<UniformRandomVariable> m_uv;
 };
 
diff -Naur ns-3.18.1/src/buildings/bindings/modulegen__gcc_ILP32.py ns-3.19/src/buildings/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/buildings/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -133,7 +133,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1079,10 +1079,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -2381,6 +2382,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2391,6 +2397,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2406,6 +2417,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2431,6 +2447,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/buildings/bindings/modulegen__gcc_LP64.py ns-3.19/src/buildings/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/buildings/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -133,7 +133,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1079,10 +1079,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -2381,6 +2382,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2391,6 +2397,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2406,6 +2417,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2431,6 +2447,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/buildings/doc/source/buildings-design.rst ns-3.19/src/buildings/doc/source/buildings-design.rst
--- ns-3.18.1/src/buildings/doc/source/buildings-design.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/doc/source/buildings-design.rst	2013-12-20 09:44:50.000000000 -0800
@@ -145,7 +145,9 @@
 Shadowing Model
 ---------------
 
-The shadowing is modeled according to a log-normal distribution with variable standard deviation as function of the connection characteristics. In the implementation we considered three main possible scenarios which correspond to three standard deviations (i.e., the mean is always 0), in detail:
+The shadowing is modeled according to a log-normal distribution with variable standard deviation as function of the relative position (indoor or outdoor) of the MobilityModel instances involved. One random value is drawn for each pair of MobilityModels, and stays constant for that pair during the whole simulation. Thus, the model is appropriate for static nodes only. 
+
+The model considers that the mean of the shadowing loss in dB is always 0. For the variance, the model considers three possible values of standard deviation, in detail:
 
  * outdoor (``m_shadowingSigmaOutdoor``, defaul value of 7 dB) :math:`\rightarrow X_\mathrm{O} \sim N(\mu_\mathrm{O}, \sigma_\mathrm{O}^2)`.
  * indoor (``m_shadowingSigmaIndoor``, defaul value of 10 dB) :math:`\rightarrow X_\mathrm{I} \sim N(\mu_\mathrm{I}, \sigma_\mathrm{I}^2)`.
diff -Naur ns-3.18.1/src/buildings/doc/source/buildings-testing.rst ns-3.19/src/buildings/doc/source/buildings-testing.rst
--- ns-3.18.1/src/buildings/doc/source/buildings-testing.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/doc/source/buildings-testing.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,3 +1,5 @@
+.. highlight:: bash
+
 +++++++++++++++++++++++++++++++++++++
  Testing Documentation
 +++++++++++++++++++++++++++++++++++++
@@ -8,20 +10,20 @@
 
 To test and validate the ns-3 Building Pathloss module, some test suites is provided which are integrated with the ns-3 test framework. To run them, you need to have configured the build of the simulator in this way::
 
-    ./waf configure --enable-tests --enable-modules=buildings
-    ./test.py
+    $ ./waf configure --enable-tests --enable-modules=buildings
+    $ ./test.py
 
 The above will run not only the test suites belonging to the buildings module, but also those belonging to all the other ns-3 modules on which the buildings module depends. See the ns-3 manual for generic information on the testing framework.
 
 You can get a more detailed report in HTML format in this way::
 
-    ./test.py -w results.html
+    $ ./test.py -w results.html
 
 After the above command has run, you can view the detailed result for each test by opening the file ``results.html`` with a web browser. 
 
 You can run each test suite separately using this command::
 
-    ./test.py -s test-suite-name
+    $ ./test.py -s test-suite-name
 
 For more details about ``test.py`` and the ns-3 testing framework, please refer to the ns-3 manual.
 
@@ -105,6 +107,6 @@
 Buildings Shadowing Test
 ~~~~~~~~~~~~~~~~~~~~~~~~
 
-The test suite ``buildings-shadowing-test`` is a unit test intended to verify the statistics distribution characteristics of the shadowing are the one expected. The shadowing is modeled according to a normal distribution with mean :math:`\mu = 0` and variable standard deviation :math:`\sigma`, according to models commonly used in literature.
-The test generates 10,000 samples of shadowing by subtracting the deterministic component from the total loss returned by the ``BuildingPathlossModel``. The mean and variance of the shadowing samples are then used to verify whether the 99% confidence interval is respected by the sequence generated by the simulator.
+The test suite ``buildings-shadowing-test`` is a unit test intended to verify the statistical distribution of the shadowing model implemented by ``BuildingsPathlossModel``. The shadowing is modeled according to a normal distribution with mean :math:`\mu = 0` and variable standard deviation :math:`\sigma`, according to models commonly used in literature. Three test cases are provided, which cover the cases of indoor, outdoor and indoor-to-outdoor communications. 
+Each test case generates 1000 different samples of shadowing for different pairs of MobilityModel instances in a given scenario. Shadowing values are obtained by subtracting from the total loss value returned by ``HybridBuildingsPathlossModel`` the path loss component which is constant and pre-determined for each test case. The test verifies that the sample mean and sample variance of the shadowing values fall within the 99% confidence interval of the sample mean and sample variance. The test also verifies that the shadowing values returned at successive times for the same pair of MobilityModel instances is constant.
 
diff -Naur ns-3.18.1/src/buildings/examples/buildings-pathloss-profiler.cc ns-3.19/src/buildings/examples/buildings-pathloss-profiler.cc
--- ns-3.18.1/src/buildings/examples/buildings-pathloss-profiler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/examples/buildings-pathloss-profiler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -21,7 +21,6 @@
 #include "ns3/core-module.h"
 #include "ns3/network-module.h"
 #include "ns3/mobility-module.h"
-#include "ns3/lte-module.h"
 #include "ns3/config-store.h"
 #include <ns3/buildings-helper.h>
 #include <ns3/hybrid-buildings-propagation-loss-model.h>
diff -Naur ns-3.18.1/src/buildings/helper/building-allocator.cc ns-3.19/src/buildings/helper/building-allocator.cc
--- ns-3.18.1/src/buildings/helper/building-allocator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/helper/building-allocator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (GridBuildingAllocator);
+NS_OBJECT_ENSURE_REGISTERED (GridBuildingAllocator)
+  ;
 
 GridBuildingAllocator::GridBuildingAllocator ()
   : m_current (0)
diff -Naur ns-3.18.1/src/buildings/helper/building-position-allocator.cc ns-3.19/src/buildings/helper/building-position-allocator.cc
--- ns-3.18.1/src/buildings/helper/building-position-allocator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/helper/building-position-allocator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -37,7 +37,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RandomBuildingPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (RandomBuildingPositionAllocator)
+  ;
 
 
 RandomBuildingPositionAllocator::RandomBuildingPositionAllocator ()
@@ -104,7 +105,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (RandomRoomPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (RandomRoomPositionAllocator)
+  ;
 
 
 RandomRoomPositionAllocator::RandomRoomPositionAllocator ()
@@ -192,7 +194,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (SameRoomPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (SameRoomPositionAllocator)
+  ;
 
 SameRoomPositionAllocator::SameRoomPositionAllocator ()
 {
@@ -282,7 +285,8 @@
   return 1;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (FixedRoomPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (FixedRoomPositionAllocator)
+  ;
 
 
 FixedRoomPositionAllocator::FixedRoomPositionAllocator (
diff -Naur ns-3.18.1/src/buildings/model/building.cc ns-3.19/src/buildings/model/building.cc
--- ns-3.18.1/src/buildings/model/building.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/model/building.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (Building);
+NS_OBJECT_ENSURE_REGISTERED (Building)
+  ;
 
 TypeId
 Building::GetTypeId (void)
diff -Naur ns-3.18.1/src/buildings/model/building-list.cc ns-3.19/src/buildings/model/building-list.cc
--- ns-3.18.1/src/buildings/model/building-list.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/model/building-list.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("BuildingList");
+NS_LOG_COMPONENT_DEFINE ("BuildingList")
+  ;
 
 /**
  * \brief private implementation detail of the BuildingList API.
@@ -57,7 +58,8 @@
   std::vector<Ptr<Building> > m_buildings;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (BuildingListPriv);
+NS_OBJECT_ENSURE_REGISTERED (BuildingListPriv)
+  ;
 
 TypeId
 BuildingListPriv::GetTypeId (void)
diff -Naur ns-3.18.1/src/buildings/model/buildings-propagation-loss-model.cc ns-3.19/src/buildings/model/buildings-propagation-loss-model.cc
--- ns-3.18.1/src/buildings/model/buildings-propagation-loss-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/model/buildings-propagation-loss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BuildingsPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (BuildingsPropagationLossModel)
+  ;
 
 BuildingsPropagationLossModel::ShadowingLoss::ShadowingLoss ()
 {
diff -Naur ns-3.18.1/src/buildings/model/hybrid-buildings-propagation-loss-model.cc ns-3.19/src/buildings/model/hybrid-buildings-propagation-loss-model.cc
--- ns-3.18.1/src/buildings/model/hybrid-buildings-propagation-loss-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/model/hybrid-buildings-propagation-loss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -41,7 +41,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (HybridBuildingsPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (HybridBuildingsPropagationLossModel)
+  ;
 
 
 
diff -Naur ns-3.18.1/src/buildings/model/itu-r-1238-propagation-loss-model.cc ns-3.19/src/buildings/model/itu-r-1238-propagation-loss-model.cc
--- ns-3.18.1/src/buildings/model/itu-r-1238-propagation-loss-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/model/itu-r-1238-propagation-loss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ItuR1238PropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (ItuR1238PropagationLossModel)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/buildings/model/mobility-building-info.cc ns-3.19/src/buildings/model/mobility-building-info.cc
--- ns-3.18.1/src/buildings/model/mobility-building-info.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/model/mobility-building-info.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MobilityBuildingInfo);
+NS_OBJECT_ENSURE_REGISTERED (MobilityBuildingInfo)
+  ;
 
 TypeId
 MobilityBuildingInfo::GetTypeId (void)
diff -Naur ns-3.18.1/src/buildings/model/oh-buildings-propagation-loss-model.cc ns-3.19/src/buildings/model/oh-buildings-propagation-loss-model.cc
--- ns-3.18.1/src/buildings/model/oh-buildings-propagation-loss-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/model/oh-buildings-propagation-loss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (OhBuildingsPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (OhBuildingsPropagationLossModel)
+  ;
 
 
 
diff -Naur ns-3.18.1/src/buildings/test/buildings-shadowing-test.cc ns-3.19/src/buildings/test/buildings-shadowing-test.cc
--- ns-3.18.1/src/buildings/test/buildings-shadowing-test.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/buildings/test/buildings-shadowing-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -81,7 +81,6 @@
     m_lossRef (refValue),
     m_sigmaRef (sigmaRef)
 {
-  NS_UNUSED (m_sigmaRef); // suppress private field unused warning
 }
 
 BuildingsShadowingTestCase::~BuildingsShadowingTestCase ()
@@ -101,28 +100,43 @@
   building1->SetExtWallsType (Building::ConcreteWithWindows);
   building1->SetNFloors (3);
   
-  Ptr<MobilityModel> mma = CreateMobilityModel (m_mobilityModelIndex1);
-  Ptr<MobilityModel> mmb = CreateMobilityModel (m_mobilityModelIndex2);
-
+  Ptr<HybridBuildingsPropagationLossModel> propagationLossModel = CreateObject<HybridBuildingsPropagationLossModel> ();
+  
   std::vector<double> loss;
   double sum = 0.0;
   double sumSquared = 0.0;
-  int samples = 10000;
+  int samples = 1000;
   for (int i = 0; i < samples; i++)
     {
-      Ptr<HybridBuildingsPropagationLossModel> propagationLossModel = CreateObject<HybridBuildingsPropagationLossModel> ();
-      loss.push_back (propagationLossModel->DoCalcRxPower (0.0, mma, mmb) + m_lossRef);
-      sum += loss.at (loss.size () - 1);
-      sumSquared += (loss.at (loss.size () - 1) * loss.at (loss.size () - 1));
+      Ptr<MobilityModel> mma = CreateMobilityModel (m_mobilityModelIndex1);
+      Ptr<MobilityModel> mmb = CreateMobilityModel (m_mobilityModelIndex2);
+      double shadowingLoss = propagationLossModel->DoCalcRxPower (0.0, mma, mmb) + m_lossRef;
+      double shadowingLoss2 = propagationLossModel->DoCalcRxPower (0.0, mma, mmb) + m_lossRef;
+      NS_TEST_ASSERT_MSG_EQ_TOL (shadowingLoss, shadowingLoss2, 0.001, 
+                                 "Shadowing is not constant for the same mobility model pair!");
+      loss.push_back (shadowingLoss);
+      sum += shadowingLoss;
+      sumSquared += (shadowingLoss * shadowingLoss);
     }
-  double mean = sum / samples;
-  double sigma = std::sqrt (sumSquared / samples - (mean * mean));
-  // test whether the distribution falls in the 99% confidence interval, as expected with a nornal distribution
-  double ci = (2.575829303549 * sigma) / std::sqrt (samples);
-
-  NS_LOG_INFO ("Mean from simulation " << mean << ", sigma " << sigma << ", reference value " << m_sigmaRef << ", CI(99%) " << ci);
+  double sampleMean = sum / samples;
+  double sampleVariance = (sumSquared - (sum * sum / samples)) / (samples - 1);
+  double sampleStd = std::sqrt (sampleVariance);
+
+  // test whether the sample mean falls in the 99% confidence interval
+  const double zn995 = 2.575829303549; // 99.5 quantile of the normal distribution
+  double ci = (zn995 * sampleStd) / std::sqrt (samples);
+  NS_LOG_INFO ("SampleMean from simulation " << sampleMean << ", sampleStd " << sampleStd << ", reference value " << m_sigmaRef << ", CI(99%) " << ci);
+  NS_TEST_ASSERT_MSG_EQ_TOL (std::fabs (sampleMean), 0.0, ci, "Wrong shadowing distribution !");
+
+  // test whether the sample variance falls in the 99% confidence interval
+  // since the shadowing is gaussian, its sample variance follows the 
+  // chi2 distribution with samples-1 degrees of freedom
+  double chi2 = (samples - 1) *  sampleVariance / (m_sigmaRef*m_sigmaRef);
+  const double zchi2_005 = 887.621135217515;  //  0.5% quantile of the chi2 distribution 
+  const double zchi2_995 = 1117.89045267865;  // 99.5% quantile of the chi2 distribution
+  NS_TEST_ASSERT_MSG_GT (chi2, zchi2_005, "sample variance lesser than expected");
+  NS_TEST_ASSERT_MSG_LT (chi2, zchi2_995, "sample variance greater than expected");
 
-  NS_TEST_ASSERT_MSG_EQ_TOL (std::fabs (mean), 0.0, ci, "Wrong shadowing distribution !");
   Simulator::Destroy ();
 }
 
diff -Naur ns-3.18.1/src/click/doc/click.rst ns-3.19/src/click/doc/click.rst
--- ns-3.18.1/src/click/doc/click.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/click/doc/click.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,3 +1,5 @@
+.. highlight:: bash
+
 Click Modular Router Integration
 --------------------------------
 
@@ -78,10 +80,10 @@
 
 The first step is to clone Click from the github repository and build it::
 
-  $: git clone https://github.com/kohler/click
-  $: cd click/
-  $: ./configure --disable-linuxmodule --enable-nsclick --enable-wifi
-  $: make
+  $ git clone https://github.com/kohler/click
+  $ cd click/
+  $ ./configure --disable-linuxmodule --enable-nsclick --enable-wifi
+  $ make
 
 The --enable-wifi flag may be skipped if you don't intend on using Click with Wifi.
 * Note: You don't need to do a 'make install'. 
@@ -89,7 +91,7 @@
 Once Click has been built successfully, change into the ns-3 directory and 
 configure ns-3 with Click Integration support::
 
-  $: ./waf configure --enable-examples --enable-tests --with-nsclick=/path/to/click/source
+  $ ./waf configure --enable-examples --enable-tests --with-nsclick=/path/to/click/source
 
 Hint:  If you have click installed one directory above ns-3 (such as in the
 ns-3-allinone directory), and the name of the directory is 'click' (or
@@ -101,7 +103,7 @@
 
 Next, try running one of the examples::
 
-  $: ./waf --run nsclick-simple-lan
+  $ ./waf --run nsclick-simple-lan
 
 You may then view the resulting .pcap traces, which are named nsclick-simple-lan-0-0.pcap and nsclick-simple-lan-0-1.pcap.
 
@@ -120,7 +122,9 @@
 Debugging Packet Flows from Click
 =================================
 
-From any point within a Click graph, you may use the Print (http://read.cs.ucla.edu/click/elements/print) element and its variants for pretty printing of packet contents. Furthermore, you may generate pcap traces of packets flowing through a Click graph by using the ToDump (http://read.cs.ucla.edu/click/elements/todump) element as well. For instance::
+From any point within a Click graph, you may use the Print (http://read.cs.ucla.edu/click/elements/print) element and its variants for pretty printing of packet contents. Furthermore, you may generate pcap traces of packets flowing through a Click graph by using the ToDump (http://read.cs.ucla.edu/click/elements/todump) element as well. For instance:
+
+.. sourcecode:: cpp
 
   myarpquerier
    -> Print(fromarpquery,64)
@@ -133,7 +137,9 @@
 ======
 
 To have a node run Click, the easiest way would be to use the ClickInternetStackHelper
-class in your simulation script. For instance::
+class in your simulation script. For instance:
+
+.. sourcecode:: cpp
 
   ClickInternetStackHelper click;
   click.SetClickFile (myNodeContainer, "nsclick-simple-lan.click");
diff -Naur ns-3.18.1/src/click/model/ipv4-click-routing.cc ns-3.19/src/click/model/ipv4-click-routing.cc
--- ns-3.18.1/src/click/model/ipv4-click-routing.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/click/model/ipv4-click-routing.cc	2013-12-20 09:44:50.000000000 -0800
@@ -45,7 +45,8 @@
 #define INTERFACE_ID_FIRST 1
 #define INTERFACE_ID_FIRST_DROP 33
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4ClickRouting);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4ClickRouting)
+  ;
 
 std::map < simclick_node_t *, Ptr<Ipv4ClickRouting> > Ipv4ClickRouting::m_clickInstanceFromSimNode;
 
diff -Naur ns-3.18.1/src/click/model/ipv4-l3-click-protocol.cc ns-3.19/src/click/model/ipv4-l3-click-protocol.cc
--- ns-3.18.1/src/click/model/ipv4-l3-click-protocol.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/click/model/ipv4-l3-click-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -44,7 +44,8 @@
 const uint16_t Ipv4L3ClickProtocol::PROT_NUMBER = 0x0800;
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4L3ClickProtocol);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4L3ClickProtocol)
+  ;
 
 TypeId
 Ipv4L3ClickProtocol::GetTypeId (void)
diff -Naur ns-3.18.1/src/config-store/examples/config-store-save.cc ns-3.19/src/config-store/examples/config-store-save.cc
--- ns-3.18.1/src/config-store/examples/config-store-save.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/config-store/examples/config-store-save.cc	2013-12-20 09:44:50.000000000 -0800
@@ -6,15 +6,15 @@
 
 using namespace ns3;
 
-class A : public Object
+class ConfigExample : public Object
 {
 public:
   static TypeId GetTypeId (void) {
-    static TypeId tid = TypeId ("ns3::A")
+    static TypeId tid = TypeId ("ns3::ConfigExample")
       .SetParent<Object> ()
       .AddAttribute ("TestInt16", "help text",
                      IntegerValue (-2),
-                     MakeIntegerAccessor (&A::m_int16),
+                     MakeIntegerAccessor (&ConfigExample::m_int16),
                      MakeIntegerChecker<int16_t> ())
       ;
       return tid;
@@ -22,7 +22,8 @@
   int16_t m_int16;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (A);
+NS_OBJECT_ENSURE_REGISTERED (ConfigExample)
+  ;
 
 // Assign a new default value to A::TestInt16 (-5)
 // Configure a TestInt16 value for a special instance of A (to -3)
@@ -30,16 +31,16 @@
 // 
 int main (int argc, char *argv[])
 {
-  Config::SetDefault ("ns3::A::TestInt16", IntegerValue (-5));
+  Config::SetDefault ("ns3::ConfigExample::TestInt16", IntegerValue (-5));
 
-  Ptr<A> a_obj = CreateObject<A> ();
-  NS_ABORT_MSG_UNLESS (a_obj->m_int16 == -5, "Cannot set A's integer attribute via Config::SetDefault");
+  Ptr<ConfigExample> a_obj = CreateObject<ConfigExample> ();
+  NS_ABORT_MSG_UNLESS (a_obj->m_int16 == -5, "Cannot set ConfigExample's integer attribute via Config::SetDefault");
 
-  Ptr<A> a2_obj = CreateObject<A> ();
-  a2_obj->SetAttribute ("TestInt16", IntegerValue (-3));
+  Ptr<ConfigExample> b_obj = CreateObject<ConfigExample> ();
+  b_obj->SetAttribute ("TestInt16", IntegerValue (-3));
   IntegerValue iv;
-  a2_obj->GetAttribute ("TestInt16", iv);
-  NS_ABORT_MSG_UNLESS (iv.Get () == -3, "Cannot set A's integer attribute via SetAttribute");
+  b_obj->GetAttribute ("TestInt16", iv);
+  NS_ABORT_MSG_UNLESS (iv.Get () == -3, "Cannot set ConfigExample's integer attribute via SetAttribute");
 
   // These test objects are not rooted in any ns-3 configuration namespace.
   // This is usually done automatically for ns3 nodes and channels, but
@@ -47,7 +48,7 @@
   // can't use two objects of the same type as roots).  Rooting one of these
   // is necessary for it to show up in the config namespace so that
   // ConfigureAttributes() will work below.
-  Config::RegisterRootNamespaceObject (a2_obj);
+  Config::RegisterRootNamespaceObject (b_obj);
   
 #ifdef HAVE_LIBXML2
   // Output config store to XML format
diff -Naur ns-3.18.1/src/config-store/model/config-store.cc ns-3.19/src/config-store/model/config-store.cc
--- ns-3.18.1/src/config-store/model/config-store.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/config-store/model/config-store.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (ConfigStore);
+NS_OBJECT_ENSURE_REGISTERED (ConfigStore)
+  ;
 
 TypeId 
 ConfigStore::GetTypeId (void)
diff -Naur ns-3.18.1/src/config-store/model/config-store.h ns-3.19/src/config-store/model/config-store.h
--- ns-3.18.1/src/config-store/model/config-store.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/config-store/model/config-store.h	2013-12-20 09:44:50.000000000 -0800
@@ -7,7 +7,7 @@
 namespace ns3 {
 
 /**
- * \defgroup configstore Config-Store
+ * \defgroup configstore Configuration Store/Load
  *
  * \brief Store and load simulation attribute configuration
  *
diff -Naur ns-3.18.1/src/config-store/model/gtk-config-store.cc ns-3.19/src/config-store/model/gtk-config-store.cc
--- ns-3.18.1/src/config-store/model/gtk-config-store.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/config-store/model/gtk-config-store.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("GtkconfigStore");
+NS_LOG_COMPONENT_DEFINE ("GtkconfigStore")
+  ;
 
 
 GtkConfigStore::GtkConfigStore ()
diff -Naur ns-3.18.1/src/core/bindings/modulegen__gcc_ILP32.py ns-3.19/src/core/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/core/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -197,7 +197,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'])
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'])
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -2559,6 +2559,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2569,6 +2574,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2584,6 +2594,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2609,6 +2624,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -4757,6 +4777,14 @@
                         'ns3::Ptr< ns3::PointerValue >', 
                         [], 
                         template_parameters=['ns3::PointerValue'])
+    ## nstime.h (module 'core'): ns3::Time ns3::Days(ns3::int64x64_t days) [free function]
+    module.add_function('Days', 
+                        'ns3::Time', 
+                        [param('ns3::int64x64_t', 'days')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Days(double days) [free function]
+    module.add_function('Days', 
+                        'ns3::Time', 
+                        [param('double', 'days')])
     ## nstime.h (module 'core'): ns3::Time ns3::FemtoSeconds(ns3::int64x64_t fs) [free function]
     module.add_function('FemtoSeconds', 
                         'ns3::Time', 
@@ -4781,6 +4809,14 @@
     module.add_function('Hash64', 
                         'uint64_t', 
                         [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Hours(ns3::int64x64_t hours) [free function]
+    module.add_function('Hours', 
+                        'ns3::Time', 
+                        [param('ns3::int64x64_t', 'hours')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Hours(double hours) [free function]
+    module.add_function('Hours', 
+                        'ns3::Time', 
+                        [param('double', 'hours')])
     ## log.h (module 'core'): extern void ns3::LogComponentDisable(char const * name, ns3::LogLevel level) [free function]
     module.add_function('LogComponentDisable', 
                         'void', 
@@ -4905,6 +4941,14 @@
     module.add_function('Min', 
                         'ns3::int64x64_t', 
                         [param('ns3::int64x64_t const &', 'a'), param('ns3::int64x64_t const &', 'b')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Minutes(ns3::int64x64_t minutes) [free function]
+    module.add_function('Minutes', 
+                        'ns3::Time', 
+                        [param('ns3::int64x64_t', 'minutes')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Minutes(double minutes) [free function]
+    module.add_function('Minutes', 
+                        'ns3::Time', 
+                        [param('double', 'minutes')])
     ## nstime.h (module 'core'): ns3::Time ns3::NanoSeconds(ns3::int64x64_t ns) [free function]
     module.add_function('NanoSeconds', 
                         'ns3::Time', 
@@ -4991,6 +5035,14 @@
                         'std::string', 
                         [], 
                         template_parameters=['unsigned char'])
+    ## nstime.h (module 'core'): ns3::Time ns3::Years(ns3::int64x64_t years) [free function]
+    module.add_function('Years', 
+                        'ns3::Time', 
+                        [param('ns3::int64x64_t', 'years')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Years(double years) [free function]
+    module.add_function('Years', 
+                        'ns3::Time', 
+                        [param('double', 'years')])
     register_functions_ns3_CommandLineHelper(module.get_submodule('CommandLineHelper'), root_module)
     register_functions_ns3_Config(module.get_submodule('Config'), root_module)
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
diff -Naur ns-3.18.1/src/core/bindings/modulegen__gcc_LP64.py ns-3.19/src/core/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/core/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -197,7 +197,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'])
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'])
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -2559,6 +2559,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2569,6 +2574,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2584,6 +2594,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2609,6 +2624,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -4757,6 +4777,14 @@
                         'ns3::Ptr< ns3::PointerValue >', 
                         [], 
                         template_parameters=['ns3::PointerValue'])
+    ## nstime.h (module 'core'): ns3::Time ns3::Days(ns3::int64x64_t days) [free function]
+    module.add_function('Days', 
+                        'ns3::Time', 
+                        [param('ns3::int64x64_t', 'days')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Days(double days) [free function]
+    module.add_function('Days', 
+                        'ns3::Time', 
+                        [param('double', 'days')])
     ## nstime.h (module 'core'): ns3::Time ns3::FemtoSeconds(ns3::int64x64_t fs) [free function]
     module.add_function('FemtoSeconds', 
                         'ns3::Time', 
@@ -4781,6 +4809,14 @@
     module.add_function('Hash64', 
                         'uint64_t', 
                         [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Hours(ns3::int64x64_t hours) [free function]
+    module.add_function('Hours', 
+                        'ns3::Time', 
+                        [param('ns3::int64x64_t', 'hours')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Hours(double hours) [free function]
+    module.add_function('Hours', 
+                        'ns3::Time', 
+                        [param('double', 'hours')])
     ## log.h (module 'core'): extern void ns3::LogComponentDisable(char const * name, ns3::LogLevel level) [free function]
     module.add_function('LogComponentDisable', 
                         'void', 
@@ -4905,6 +4941,14 @@
     module.add_function('Min', 
                         'ns3::int64x64_t', 
                         [param('ns3::int64x64_t const &', 'a'), param('ns3::int64x64_t const &', 'b')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Minutes(ns3::int64x64_t minutes) [free function]
+    module.add_function('Minutes', 
+                        'ns3::Time', 
+                        [param('ns3::int64x64_t', 'minutes')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Minutes(double minutes) [free function]
+    module.add_function('Minutes', 
+                        'ns3::Time', 
+                        [param('double', 'minutes')])
     ## nstime.h (module 'core'): ns3::Time ns3::NanoSeconds(ns3::int64x64_t ns) [free function]
     module.add_function('NanoSeconds', 
                         'ns3::Time', 
@@ -4991,6 +5035,14 @@
                         'std::string', 
                         [], 
                         template_parameters=['unsigned char'])
+    ## nstime.h (module 'core'): ns3::Time ns3::Years(ns3::int64x64_t years) [free function]
+    module.add_function('Years', 
+                        'ns3::Time', 
+                        [param('ns3::int64x64_t', 'years')])
+    ## nstime.h (module 'core'): ns3::Time ns3::Years(double years) [free function]
+    module.add_function('Years', 
+                        'ns3::Time', 
+                        [param('double', 'years')])
     register_functions_ns3_CommandLineHelper(module.get_submodule('CommandLineHelper'), root_module)
     register_functions_ns3_Config(module.get_submodule('Config'), root_module)
     register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
diff -Naur ns-3.18.1/src/core/examples/hash-example.cc ns-3.19/src/core/examples/hash-example.cc
--- ns-3.18.1/src/core/examples/hash-example.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/examples/hash-example.cc	2013-12-20 09:44:50.000000000 -0800
@@ -276,7 +276,7 @@
     //
     // Number of buckets = k = 2^bits
     long double k32 = 0xFFFFFFFF;
-    long double k64 = 0xFFFFFFFFFFFFFFFF;
+    long double k64 = 0xFFFFFFFFFFFFFFFFULL;
 
     long double n = m_nphrases;
     long double Ec32 = n * (n - 1) / ( 2 * k32) * (1 - (n - 2)/(3 * k32));
diff -Naur ns-3.18.1/src/core/examples/main-ptr.cc ns-3.19/src/core/examples/main-ptr.cc
--- ns-3.18.1/src/core/examples/main-ptr.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/examples/main-ptr.cc	2013-12-20 09:44:50.000000000 -0800
@@ -5,41 +5,41 @@
 
 using namespace ns3;
 
-class A : public Object
+class PtrExample : public Object
 {
 public:
-  A ();
-  ~A ();
+  PtrExample ();
+  ~PtrExample ();
   void Method (void);
 };
-A::A ()
+PtrExample::PtrExample ()
 {
-  std::cout << "A constructor" << std::endl;
+  std::cout << "PtrExample constructor" << std::endl;
 }
-A::~A()
+PtrExample::~PtrExample()
 {
-  std::cout << "A destructor" << std::endl;
+  std::cout << "PtrExample destructor" << std::endl;
 }
 void
-A::Method (void)
+PtrExample::Method (void)
 {
-  std::cout << "A method" << std::endl;
+  std::cout << "PtrExample method" << std::endl;
 }
 
-static Ptr<A> g_a = 0;
+static Ptr<PtrExample> g_ptr = 0;
 
-static Ptr<A>
-StoreA (Ptr<A> a)
+static Ptr<PtrExample>
+StorePtr (Ptr<PtrExample> p)
 {
-  Ptr<A> prev = g_a;
-  g_a = a;
+  Ptr<PtrExample> prev = g_ptr;
+  g_ptr = p;
   return prev;
 }
 
 static void
-ClearA (void)
+ClearPtr (void)
 {
-  g_a = 0;
+  g_ptr = 0;
 }
 
 
@@ -47,25 +47,25 @@
 int main (int argc, char *argv[])
 {
   {
-    // Create a new object of type A, store it in global 
-    // variable g_a
-    Ptr<A> a = CreateObject<A> ();
-    a->Method ();
-    Ptr<A> prev = StoreA (a);
+    // Create a new object of type PtrExample, store it in global 
+    // variable g_ptr
+    Ptr<PtrExample> p = CreateObject<PtrExample> ();
+    p->Method ();
+    Ptr<PtrExample> prev = StorePtr (p);
     NS_ASSERT (prev == 0);
   }
 
   {
-    // Create a new object of type A, store it in global 
-    // variable g_a, get a hold on the previous A object.
-    Ptr<A> a = CreateObject<A> ();
-    Ptr<A> prev = StoreA (a);
+    // Create a new object of type PtrExample, store it in global 
+    // variable g_ptr, get a hold on the previous PtrExample object.
+    Ptr<PtrExample> p = CreateObject<PtrExample> ();
+    Ptr<PtrExample> prev = StorePtr (p);
     // call method on object
     prev->Method ();
     // Clear the currently-stored object
-    ClearA ();
+    ClearPtr ();
     // get the raw pointer and release it.
-    A *raw = GetPointer (prev);
+    PtrExample *raw = GetPointer (prev);
     prev = 0;
     raw->Method ();
     raw->Unref ();
diff -Naur ns-3.18.1/src/core/helper/event-garbage-collector.h ns-3.19/src/core/helper/event-garbage-collector.h
--- ns-3.18.1/src/core/helper/event-garbage-collector.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/helper/event-garbage-collector.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,7 @@
 namespace ns3 {
 
 /**
- * \ingroup tools
+ * \ingroup events
  *
  * \brief An object that tracks scheduled events and automatically
  * cancels them when it is destroyed.  It is useful in situations
diff -Naur ns-3.18.1/src/core/model/attribute-construction-list.cc ns-3.19/src/core/model/attribute-construction-list.cc
--- ns-3.18.1/src/core/model/attribute-construction-list.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/attribute-construction-list.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE("AttributeConstructionList");
+NS_LOG_COMPONENT_DEFINE("AttributeConstructionList")
+  ;
 
 AttributeConstructionList::AttributeConstructionList ()
 {
diff -Naur ns-3.18.1/src/core/model/calendar-scheduler.cc ns-3.19/src/core/model/calendar-scheduler.cc
--- ns-3.18.1/src/core/model/calendar-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/calendar-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,9 +28,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("CalendarScheduler");
+NS_LOG_COMPONENT_DEFINE ("CalendarScheduler")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (CalendarScheduler);
+NS_OBJECT_ENSURE_REGISTERED (CalendarScheduler)
+  ;
 
 TypeId
 CalendarScheduler::GetTypeId (void)
diff -Naur ns-3.18.1/src/core/model/callback.h ns-3.19/src/core/model/callback.h
--- ns-3.18.1/src/core/model/callback.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/callback.h	2013-12-20 09:44:50.000000000 -0800
@@ -67,7 +67,7 @@
 
 /**
  * \ingroup callback
- * \defgroup callbackimpl CallbackImpl
+ * \defgroup callbackimpl Callback Implementation
  * CallbackImpl classes
  */
 /**
@@ -1378,7 +1378,7 @@
 
 /**
  * \ingroup callback
- * \defgroup makenullcallback MakeCallbacks with no arguments
+ * \defgroup makenullcallback MakeCallback with no arguments
  */
 /**
  * \ingroup makenullcallback
diff -Naur ns-3.18.1/src/core/model/default-simulator-impl.cc ns-3.19/src/core/model/default-simulator-impl.cc
--- ns-3.18.1/src/core/model/default-simulator-impl.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/default-simulator-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (DefaultSimulatorImpl);
+NS_OBJECT_ENSURE_REGISTERED (DefaultSimulatorImpl)
+  ;
 
 TypeId
 DefaultSimulatorImpl::GetTypeId (void)
diff -Naur ns-3.18.1/src/core/model/double.h ns-3.19/src/core/model/double.h
--- ns-3.18.1/src/core/model/double.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/double.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,7 @@
  * \ingroup attribute 
  *
  * \class ns3::DoubleValue
- * \brief Hold an floating point type
+ * \brief Hold a floating point type
  *
  * \anchor double
  * This class can be used to hold variables of floating point type
diff -Naur ns-3.18.1/src/core/model/global-value.cc ns-3.19/src/core/model/global-value.cc
--- ns-3.18.1/src/core/model/global-value.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/global-value.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("GlobalValue");
+NS_LOG_COMPONENT_DEFINE ("GlobalValue")
+  ;
 
 GlobalValue::GlobalValue (std::string name, std::string help,
                           const AttributeValue &initialValue,
diff -Naur ns-3.18.1/src/core/model/hash.cc ns-3.19/src/core/model/hash.cc
--- ns-3.18.1/src/core/model/hash.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/hash.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Hash");
+NS_LOG_COMPONENT_DEFINE ("Hash")
+  ;
 
 Hasher::Hasher ()
 {
diff -Naur ns-3.18.1/src/core/model/hash-fnv.cc ns-3.19/src/core/model/hash-fnv.cc
--- ns-3.18.1/src/core/model/hash-fnv.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/hash-fnv.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Hash-Fnv");
+NS_LOG_COMPONENT_DEFINE ("Hash-Fnv")
+  ;
 
 namespace Hash {
 
diff -Naur ns-3.18.1/src/core/model/hash-function.cc ns-3.19/src/core/model/hash-function.cc
--- ns-3.18.1/src/core/model/hash-function.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/hash-function.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("HashFunction");
+NS_LOG_COMPONENT_DEFINE ("HashFunction")
+  ;
 
 namespace Hash {
 
diff -Naur ns-3.18.1/src/core/model/hash-murmur3.cc ns-3.19/src/core/model/hash-murmur3.cc
--- ns-3.18.1/src/core/model/hash-murmur3.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/hash-murmur3.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Hash-Murmur3");
+NS_LOG_COMPONENT_DEFINE ("Hash-Murmur3")
+  ;
 
 namespace Hash {
 
diff -Naur ns-3.18.1/src/core/model/heap-scheduler.cc ns-3.19/src/core/model/heap-scheduler.cc
--- ns-3.18.1/src/core/model/heap-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/heap-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (HeapScheduler);
+NS_OBJECT_ENSURE_REGISTERED (HeapScheduler)
+  ;
 
 TypeId
 HeapScheduler::GetTypeId (void)
diff -Naur ns-3.18.1/src/core/model/list-scheduler.cc ns-3.19/src/core/model/list-scheduler.cc
--- ns-3.18.1/src/core/model/list-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/list-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (ListScheduler);
+NS_OBJECT_ENSURE_REGISTERED (ListScheduler)
+  ;
 
 TypeId
 ListScheduler::GetTypeId (void)
diff -Naur ns-3.18.1/src/core/model/log.h ns-3.19/src/core/model/log.h
--- ns-3.18.1/src/core/model/log.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/log.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,6 +28,43 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup debugging
+ * \defgroup logging Logging
+ * \brief Logging functions and macros
+ *
+ * LOG functionality: macros which allow developers to
+ * send information to the std::clog output stream. All logging messages 
+ * are disabled by default. To enable selected logging 
+ * messages, use the ns3::LogComponentEnable
+ * function or use the NS_LOG environment variable 
+ *
+ * Use the environment variable NS_LOG to define a ':'-separated list of
+ * logging components to enable. For example (using bash syntax), 
+ * NS_LOG="OlsrAgent" would enable one component at all log levels. 
+ * NS_LOG="OlsrAgent:Ipv4L3Protocol" would enable two components, 
+ * at all log levels, etc.
+ * NS_LOG="*" will enable all available log components at all levels.
+ *
+ * To control more selectively the log levels for each component, use
+ * this syntax: NS_LOG='Component1=func|warn:Component2=error|debug'
+ * This example would enable the 'func', and 'warn' log
+ * levels for 'Component1' and the 'error' and 'debug' log levels
+ * for 'Component2'.  The wildcard can be used here as well.  For example
+ * NS_LOG='*=level_all|prefix' would enable all log levels and prefix all
+ * prints with the component and function names.
+ *
+ * A note on NS_LOG_FUNCTION() and NS_LOG_FUNCTION_NOARGS():
+ * generally, use of (at least) NS_LOG_FUNCTION(this) is preferred.
+ * Use NS_LOG_FUNCTION_NOARGS() only in static functions.
+ */
+
+
+/**
+ *  \ingroup logging
+ *
+ *  Logging severity classes and levels.
+ */
 enum LogLevel {
   LOG_NONE           = 0x00000000, // no logging
 
@@ -111,46 +148,74 @@
  * \ingroup logging
  * \param name a string
  *
- * Define a Log component with a specific name. This macro
- * should be used at the top of every file in which you want 
+ * Define a Log component with a specific name.
+ *
+ * This macro should be used at the top of every file in which you want 
  * to use the NS_LOG macro. This macro defines a new
  * "log component" which can be later selectively enabled
  * or disabled with the ns3::LogComponentEnable and 
  * ns3::LogComponentDisable functions or with the NS_LOG
  * environment variable.
+ *
+ * To create a log component Foo, at the top of foo.cc:
+ *
+ * \code
+ *   NS_LOG_COMPONENT_DEFINE ("Foo")
+ *     ;
+ * \endcode
+ *
+ * Note the closing ';' is not on the same line;  this prevents 
+ * Doxygen from spuriously warning that the macro invocation is undocumented.
+ 
  */
 #define NS_LOG_COMPONENT_DEFINE(name)                           \
   static ns3::LogComponent g_log = ns3::LogComponent (name)
 
+/**
+ * \ingroup logging
+ * Append the simulation time to a log message.
+ */
 #define NS_LOG_APPEND_TIME_PREFIX                               \
   if (g_log.IsEnabled (ns3::LOG_PREFIX_TIME))                   \
     {                                                           \
       ns3::LogTimePrinter printer = ns3::LogGetTimePrinter ();  \
       if (printer != 0)                                         \
         {                                                       \
-          (*printer)(std::clog);                               \
+          (*printer)(std::clog);                                \
           std::clog << " ";                                     \
         }                                                       \
     }
 
+/**
+ * \ingroup logging
+ * Append the simulation node id to a log message.
+ */
 #define NS_LOG_APPEND_NODE_PREFIX                               \
   if (g_log.IsEnabled (ns3::LOG_PREFIX_NODE))                   \
     {                                                           \
       ns3::LogNodePrinter printer = ns3::LogGetNodePrinter ();  \
       if (printer != 0)                                         \
         {                                                       \
-          (*printer)(std::clog);                               \
+          (*printer)(std::clog);                                \
           std::clog << " ";                                     \
         }                                                       \
     }
 
+/**
+ * \ingroup logging
+ * Append the function name to a log message.
+ */
 #define NS_LOG_APPEND_FUNC_PREFIX                               \
   if (g_log.IsEnabled (ns3::LOG_PREFIX_FUNC))                   \
     {                                                           \
       std::clog << g_log.Name () << ":" <<                      \
-      __FUNCTION__ << "(): ";                                 \
+      __FUNCTION__ << "(): ";                                   \
     }                                                           \
 
+/**
+ * \ingroup logging
+ * Append the log severity level to a log message.
+ */
 #define NS_LOG_APPEND_LEVEL_PREFIX(level)                       \
   if (g_log.IsEnabled (ns3::LOG_PREFIX_LEVEL))                  \
     {                                                           \
@@ -167,37 +232,6 @@
 #ifdef NS3_LOG_ENABLE
 
 
-/**
- * \ingroup debugging
- * \defgroup logging Logging
- * \brief Logging functions and macros
- *
- * LOG functionality: macros which allow developers to
- * send information out on screen. All logging messages 
- * are disabled by default. To enable selected logging 
- * messages, use the ns3::LogComponentEnable
- * function or use the NS_LOG environment variable 
- *
- * Use the environment variable NS_LOG to define a ':'-separated list of
- * logging components to enable. For example (using bash syntax), 
- * NS_LOG="OlsrAgent" would enable one component at all log levels. 
- * NS_LOG="OlsrAgent:Ipv4L3Protocol" would enable two components, 
- * at all log levels, etc.
- * NS_LOG="*" will enable all available log components at all levels.
- *
- * To control more selectively the log levels for each component, use
- * this syntax: NS_LOG='Component1=func|warn:Component2=error|debug'
- * This example would enable the 'func', and 'warn' log
- * levels for 'Component1' and the 'error' and 'debug' log levels
- * for 'Component2'.  The wildcard can be used here as well.  For example
- * NS_LOG='*=level_all|prefix' would enable all log levels and prefix all
- * prints with the component and function names.
- *
- * A note on NS_LOG_FUNCTION() and NS_LOG_FUNCTION_NOARGS():
- * generally, use of (at least) NS_LOG_FUNCTION(this) is preferred.
- * Use NS_LOG_FUNCTION_NOARGS() only in static functions.
- */
-
 
 /**
  * \ingroup logging
@@ -318,7 +352,7 @@
           NS_LOG_APPEND_CONTEXT;                                \
           std::clog << g_log.Name () << ":"                     \
                     << __FUNCTION__ << "(";                     \
-          ns3::ParameterLogger (std::clog) << parameters;      \
+          ns3::ParameterLogger (std::clog) << parameters;       \
           std::clog << ")" << std::endl;                        \
         }                                                       \
     }                                                           \
diff -Naur ns-3.18.1/src/core/model/map-scheduler.cc ns-3.19/src/core/model/map-scheduler.cc
--- ns-3.18.1/src/core/model/map-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/map-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MapScheduler);
+NS_OBJECT_ENSURE_REGISTERED (MapScheduler)
+  ;
 
 TypeId
 MapScheduler::GetTypeId (void)
diff -Naur ns-3.18.1/src/core/model/names.cc ns-3.19/src/core/model/names.cc
--- ns-3.18.1/src/core/model/names.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/names.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Names");
+NS_LOG_COMPONENT_DEFINE ("Names")
+  ;
 
 class NameNode
 {
diff -Naur ns-3.18.1/src/core/model/nstime.h ns-3.19/src/core/model/nstime.h
--- ns-3.18.1/src/core/model/nstime.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/nstime.h	2013-12-20 09:44:50.000000000 -0800
@@ -86,13 +86,17 @@
    */
   enum Unit
   {
-    S  = 0,   //!< second
-    MS = 1,   //!< millisecond
-    US = 2,   //!< microsecond
-    NS = 3,   //!< nanosecond
-    PS = 4,   //!< picosecond
-    FS = 5,   //!< femtosecond
-    LAST = 6
+    Y   = 0,   //!< year, 365 days
+    D   = 1,   //!< day, 24 hours
+    H   = 2,   //!< hour, 60 minutes
+    MIN = 3,   //!< minute, 60 seconds
+    S   = 4,   //!< second
+    MS  = 5,   //!< millisecond
+    US  = 6,   //!< microsecond
+    NS  = 7,   //!< nanosecond
+    PS  = 8,   //!< picosecond
+    FS  = 9,   //!< femtosecond
+    LAST = 10
   };
 
   inline Time &operator = (const Time &o)
@@ -182,6 +186,10 @@
    * - `ns` (nanoseconds)
    * - `ps` (picoseconds)
    * - `fs` (femtoseconds)
+   * - `min`  (minutes)
+   * - `h`  (hours)
+   * - `d`  (days)
+   * - `y`  (years)
    *
    * There can be no white space between the numerical portion
    * and the units.  Any otherwise malformed string causes a fatal error to
@@ -308,6 +316,40 @@
   {
     return ToInteger (Time::FS);
   }
+
+  /**
+   * \returns an approximation in minutes of the time stored in this
+   *          instance.
+   */
+  inline double GetMinutes (void) const
+  {
+    return ToDouble (Time::MIN);
+  }
+  /**
+   * \returns an approximation in hours of the time stored in this
+   *          instance.
+   */
+  inline double GetHours (void) const
+  {
+    return ToDouble (Time::H);
+  }
+  /**
+   * \returns an approximation in days of the time stored in this
+   *          instance.
+   */
+  inline double GetDays (void) const
+  {
+    return ToDouble (Time::D);
+  }
+  /**
+   * \returns an approximation in years of the time stored in this
+   *          instance.
+   */
+  inline double GetYears (void) const
+  {
+    return ToDouble (Time::Y);
+  }
+
   /**
    * \returns the raw time value, in the current units
    */
@@ -762,7 +804,66 @@
 {
   return Time::FromInteger (fs, Time::FS);
 }
-
+/**
+ * \brief create ns3::Time instances in units of minutes (equal to 60 seconds).
+ *
+ * For example:
+ * \code
+ * Time t = Minutes (2.0);
+ * Simulator::Schedule (Minutes (5.0), ...);
+ * \endcode
+ * \param minutes mintues value
+ * \relates ns3::Time
+ */
+inline Time Minutes (double minutes)
+{
+  return Time::FromDouble (minutes, Time::MIN);
+}
+/**
+ * \brief create ns3::Time instances in units of hours (equal to 60 minutes).
+ *
+ * For example:
+ * \code
+ * Time t = Hours (2.0);
+ * Simulator::Schedule (Hours (5.0), ...);
+ * \endcode
+ * \param hours hours value
+ * \relates ns3::Time
+ */
+inline Time Hours (double hours)
+{
+  return Time::FromDouble (hours, Time::H);
+}
+/**
+ * \brief create ns3::Time instances in units of days (equal to 24 hours).
+ *
+ * For example:
+ * \code
+ * Time t = Days (2.0);
+ * Simulator::Schedule (Days (5.0), ...);
+ * \endcode
+ * \param days days value
+ * \relates ns3::Time
+ */
+inline Time Days (double days)
+{
+  return Time::FromDouble (days, Time::D);
+}
+/**
+ * \brief create ns3::Time instances in units of years (equal to 365 days).
+ *
+ * For example:
+ * \code
+ * Time t = Years (2.0);
+ * Simulator::Schedule (Years (5.0), ...);
+ * \endcode
+ * \param years years value
+ * \relates ns3::Time
+ */
+inline Time Years (double years)
+{
+  return Time::FromDouble (years, Time::Y);
+}
 
 /**
  * \see Seconds(double)
@@ -812,6 +913,38 @@
 {
   return Time::From (fs, Time::FS);
 }
+/**
+ * \see Minutes(uint64_t)
+ * \relates ns3::Time
+ */
+inline Time Minutes (int64x64_t minutes)
+{
+  return Time::From (minutes, Time::MIN);
+}
+/**
+ * \see Minutes(uint64_t)
+ * \relates ns3::Time
+ */
+inline Time Hours (int64x64_t hours)
+{
+  return Time::From (hours, Time::H);
+}
+/**
+ * \see Minutes(uint64_t)
+ * \relates ns3::Time
+ */
+inline Time Days (int64x64_t days)
+{
+  return Time::From (days, Time::D);
+}
+/**
+ * \see Minutes(uint64_t)
+ * \relates ns3::Time
+ */
+inline Time Years (int64x64_t years)
+{
+  return Time::From (years, Time::Y);
+}
 
 // internal function not publicly documented
 inline Time TimeStep (uint64_t ts)
diff -Naur ns-3.18.1/src/core/model/object-base.cc ns-3.19/src/core/model/object-base.cc
--- ns-3.18.1/src/core/model/object-base.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/object-base.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ObjectBase);
+NS_OBJECT_ENSURE_REGISTERED (ObjectBase)
+  ;
 
 static TypeId
 GetObjectIid (void)
diff -Naur ns-3.18.1/src/core/model/object-base.h ns-3.19/src/core/model/object-base.h
--- ns-3.18.1/src/core/model/object-base.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/object-base.h	2013-12-20 09:44:50.000000000 -0800
@@ -26,8 +26,23 @@
 #include <list>
 
 /**
+ * \brief Register the class in the ns-3 factory.
+ *
  * This macro should be invoked once for every class which
  * defines a new GetTypeId method.
+ *
+ * Given a class Foo, the .cc implementation should begin
+ *
+ * \code
+ *   NS_OBJECT_ENSURE_REGISTERED (Foo)
+ *     ;
+ * \endcode
+ *
+ * If the class is in a namespace, then the macro call should also be
+ * in the namespace.
+ *
+ * Note the closing ';' is not on the same line;  this prevents 
+ * Doxygen from spuriously warning that the macro invocation is undocumented.
  */
 #define NS_OBJECT_ENSURE_REGISTERED(type)       \
   static struct X ## type ## RegistrationClass      \
diff -Naur ns-3.18.1/src/core/model/object.cc ns-3.19/src/core/model/object.cc
--- ns-3.18.1/src/core/model/object.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/object.cc	2013-12-20 09:44:50.000000000 -0800
@@ -41,7 +41,8 @@
  *         The Object implementation
  *********************************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (Object);
+NS_OBJECT_ENSURE_REGISTERED (Object)
+  ;
 
 Object::AggregateIterator::AggregateIterator ()
   : m_object (0),
diff -Naur ns-3.18.1/src/core/model/object-factory.cc ns-3.19/src/core/model/object-factory.cc
--- ns-3.18.1/src/core/model/object-factory.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/object-factory.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE("ObjectFactory");
+NS_LOG_COMPONENT_DEFINE("ObjectFactory")
+  ;
 
 ObjectFactory::ObjectFactory ()
 {
diff -Naur ns-3.18.1/src/core/model/object.h ns-3.19/src/core/model/object.h
--- ns-3.18.1/src/core/model/object.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/object.h	2013-12-20 09:44:50.000000000 -0800
@@ -64,7 +64,8 @@
 {
 public:
   /**
-   * Get the type ID.
+   * \brief Register this type.
+   * \return The object TypeId.
    */
   static TypeId GetTypeId (void);
 
diff -Naur ns-3.18.1/src/core/model/random-variable.cc ns-3.19/src/core/model/random-variable.cc
--- ns-3.18.1/src/core/model/random-variable.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/random-variable.cc	2013-12-20 09:44:50.000000000 -0800
@@ -44,7 +44,8 @@
 // -----------------------------------------------------------------------------
 // RandomVariableBase methods
 
-NS_LOG_COMPONENT_DEFINE ("RandomVariable");
+NS_LOG_COMPONENT_DEFINE ("RandomVariable")
+  ;
 
 /** \ingroup legacyrandom */
 class RandomVariableBase
diff -Naur ns-3.18.1/src/core/model/random-variable-stream.cc ns-3.19/src/core/model/random-variable-stream.cc
--- ns-3.18.1/src/core/model/random-variable-stream.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/random-variable-stream.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RandomVariableStream);
+NS_OBJECT_ENSURE_REGISTERED (RandomVariableStream)
+  ;
 
 TypeId 
 RandomVariableStream::GetTypeId (void)
@@ -130,7 +131,8 @@
   return m_rng;
 }
 
-NS_OBJECT_ENSURE_REGISTERED(UniformRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(UniformRandomVariable)
+  ;
 
 TypeId 
 UniformRandomVariable::GetTypeId (void)
@@ -200,7 +202,8 @@
   return (uint32_t)GetValue (m_min, m_max + 1);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(ConstantRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(ConstantRandomVariable)
+  ;
 
 TypeId 
 ConstantRandomVariable::GetTypeId (void)
@@ -254,7 +257,8 @@
   return (uint32_t)GetValue (m_constant);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(SequentialRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(SequentialRandomVariable)
+  ;
 
 TypeId 
 SequentialRandomVariable::GetTypeId (void)
@@ -353,7 +357,8 @@
   return (uint32_t)GetValue ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED(ExponentialRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(ExponentialRandomVariable)
+  ;
 
 TypeId 
 ExponentialRandomVariable::GetTypeId (void)
@@ -434,7 +439,8 @@
   return (uint32_t)GetValue (m_mean, m_bound);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(ParetoRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(ParetoRandomVariable)
+  ;
 
 TypeId 
 ParetoRandomVariable::GetTypeId (void)
@@ -529,7 +535,8 @@
   return (uint32_t)GetValue (m_mean, m_shape, m_bound);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(WeibullRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(WeibullRandomVariable)
+  ;
 
 TypeId 
 WeibullRandomVariable::GetTypeId (void)
@@ -622,7 +629,8 @@
   return (uint32_t)GetValue (m_scale, m_shape, m_bound);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(NormalRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(NormalRandomVariable)
+  ;
 
 const double NormalRandomVariable::INFINITE_VALUE = 1e307;
 
@@ -741,7 +749,8 @@
   return (uint32_t)GetValue (m_mean, m_variance, m_bound);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(LogNormalRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(LogNormalRandomVariable)
+  ;
 
 TypeId 
 LogNormalRandomVariable::GetTypeId (void)
@@ -860,7 +869,8 @@
   return (uint32_t)GetValue (m_mu, m_sigma);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(GammaRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(GammaRandomVariable)
+  ;
 
 TypeId 
 GammaRandomVariable::GetTypeId (void)
@@ -1035,7 +1045,8 @@
     }
 }
 
-NS_OBJECT_ENSURE_REGISTERED(ErlangRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(ErlangRandomVariable)
+  ;
 
 TypeId 
 ErlangRandomVariable::GetTypeId (void)
@@ -1146,7 +1157,8 @@
     }
 }
 
-NS_OBJECT_ENSURE_REGISTERED(TriangularRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(TriangularRandomVariable)
+  ;
 
 TypeId 
 TriangularRandomVariable::GetTypeId (void)
@@ -1240,7 +1252,8 @@
   return (uint32_t)GetValue (m_mean, m_min, m_max);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(ZipfRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(ZipfRandomVariable)
+  ;
 
 TypeId 
 ZipfRandomVariable::GetTypeId (void)
@@ -1330,7 +1343,8 @@
   return (uint32_t)GetValue (m_n, m_alpha);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(ZetaRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(ZetaRandomVariable)
+  ;
 
 TypeId 
 ZetaRandomVariable::GetTypeId (void)
@@ -1413,7 +1427,8 @@
   return (uint32_t)GetValue (m_alpha);
 }
 
-NS_OBJECT_ENSURE_REGISTERED(DeterministicRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(DeterministicRandomVariable)
+  ;
 
 TypeId 
 DeterministicRandomVariable::GetTypeId (void)
@@ -1485,7 +1500,8 @@
   return (uint32_t)GetValue ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED(EmpiricalRandomVariable);
+NS_OBJECT_ENSURE_REGISTERED(EmpiricalRandomVariable)
+  ;
 
 // ValueCDF methods
 EmpiricalRandomVariable::ValueCDF::ValueCDF ()
diff -Naur ns-3.18.1/src/core/model/realtime-simulator-impl.cc ns-3.19/src/core/model/realtime-simulator-impl.cc
--- ns-3.18.1/src/core/model/realtime-simulator-impl.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/realtime-simulator-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,7 +43,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RealtimeSimulatorImpl);
+NS_OBJECT_ENSURE_REGISTERED (RealtimeSimulatorImpl)
+  ;
 
 TypeId
 RealtimeSimulatorImpl::GetTypeId (void)
diff -Naur ns-3.18.1/src/core/model/rng-stream.cc ns-3.19/src/core/model/rng-stream.cc
--- ns-3.18.1/src/core/model/rng-stream.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/rng-stream.cc	2013-12-20 09:44:50.000000000 -0800
@@ -45,19 +45,6 @@
 const double a23n =       1370589.0;
 const double two17 =      131072.0;
 const double two53 =      9007199254740992.0;
-const double fact =       5.9604644775390625e-8;     /* 1 / 2^24  */
-
-const Matrix InvA1 = {          // Inverse of A1p0
-  { 184888585.0,   0.0,  1945170933.0 },
-  {         1.0,   0.0,           0.0 },
-  {         0.0,   1.0,           0.0 }
-};
-
-const Matrix InvA2 = {          // Inverse of A2p0
-  {      0.0,  360363334.0,  4225571728.0 },
-  {      1.0,          0.0,           0.0 },
-  {      0.0,          1.0,           0.0 }
-};
 
 const Matrix A1p0 = {
   {       0.0,        1.0,       0.0 },
diff -Naur ns-3.18.1/src/core/model/scheduler.cc ns-3.19/src/core/model/scheduler.cc
--- ns-3.18.1/src/core/model/scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Scheduler);
+NS_OBJECT_ENSURE_REGISTERED (Scheduler)
+  ;
 
 Scheduler::~Scheduler ()
 {
diff -Naur ns-3.18.1/src/core/model/simulator.h ns-3.19/src/core/model/simulator.h
--- ns-3.18.1/src/core/model/simulator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/simulator.h	2013-12-20 09:44:50.000000000 -0800
@@ -109,8 +109,8 @@
   /**
    * Run the simulation until one of:
    *   - no events are present anymore
-   *   - the user called Simulator::stop
-   *   - the user called Simulator::stopAtUs and the
+   *   - the user called Simulator::Stop()
+   *   - the user called Simulator::Stop(Time const &time) and the
    *     expiration time of the next event to be processed
    *     is greater than or equal to the stop time.
    */
diff -Naur ns-3.18.1/src/core/model/synchronizer.cc ns-3.19/src/core/model/synchronizer.cc
--- ns-3.18.1/src/core/model/synchronizer.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/synchronizer.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Synchronizer);
+NS_OBJECT_ENSURE_REGISTERED (Synchronizer)
+  ;
 
 TypeId 
 Synchronizer::GetTypeId (void)
diff -Naur ns-3.18.1/src/core/model/test.cc ns-3.19/src/core/model/test.cc
--- ns-3.18.1/src/core/model/test.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Test");
+NS_LOG_COMPONENT_DEFINE ("Test")
+  ;
 
 bool
 TestDoubleIsEqual (const double x1, const double x2, const double epsilon)
diff -Naur ns-3.18.1/src/core/model/time.cc ns-3.19/src/core/model/time.cc
--- ns-3.18.1/src/core/model/time.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/time.cc	2013-12-20 09:44:50.000000000 -0800
@@ -123,6 +123,22 @@
         {
           *this = Time::FromDouble (r, Time::FS);
         }
+      else if (trailer == std::string ("min"))
+        {
+          *this = Time::FromDouble (r, Time::MIN);
+        }
+      else if (trailer == std::string ("h"))
+        {
+          *this = Time::FromDouble (r, Time::H);
+        }
+      else if (trailer == std::string ("d"))
+        {
+          *this = Time::FromDouble (r, Time::D);
+        }
+      else if (trailer == std::string ("y"))
+        {
+          *this = Time::FromDouble (r, Time::Y);
+        }
       else
         {
           NS_ABORT_MSG ("Can't Parse Time " << s);
@@ -176,21 +192,41 @@
       ConvertTimes (unit);
     }
 
-  int8_t power [LAST] = { 15, 12, 9, 6, 3, 0};
+  // Y, D, H, MIN, S, MS, US, NS, PS, FS
+  const int8_t power [LAST] = { 17, 17, 17, 16, 15, 12, 9, 6, 3, 0 };
+  const int32_t coefficient [LAST] = { 315360, 864, 36, 6, 1, 1, 1, 1, 1, 1 };
   for (int i = 0; i < Time::LAST; i++)
     {
       int shift = power[i] - power[(int)unit];
-      int64_t factor = (int64_t) std::pow (10, std::fabs (shift));
+      int quotient = 1;
+      if (coefficient[i] > coefficient[(int) unit])
+        {
+          quotient = coefficient[i] / coefficient[(int) unit];
+          NS_ASSERT (quotient * coefficient[(int) unit] == coefficient[i]);
+        }
+      else if (coefficient[i] < coefficient[(int) unit])
+        {
+          quotient = coefficient[(int) unit] / coefficient[i];
+          NS_ASSERT (quotient * coefficient[i] == coefficient[(int) unit]);
+        }
+      NS_LOG_DEBUG ("SetResolution for unit " << (int) unit << " loop iteration " << i
+    		    << " has shift " << shift << " has quotient " << quotient);
+      int64_t factor = static_cast<int64_t> (std::pow (10, std::fabs (shift)) * quotient);
+      double realFactor = std::pow (10, (double) shift)
+                        * static_cast<double> (coefficient[i]) / coefficient[(int) unit];
+      NS_LOG_DEBUG ("SetResolution factor " << factor << " real factor " << realFactor);
       struct Information *info = &resolution->info[i];
       info->factor = factor;
-      if (shift == 0)
+      // here we could equivalently check for realFactor == 1.0 but it's better
+      // to avoid checking equality of doubles
+      if (shift == 0 && quotient == 1)
         {
           info->timeFrom = int64x64_t (1);
           info->timeTo = int64x64_t (1);
           info->toMul = true;
           info->fromMul = true;
         }
-      else if (shift > 0)
+      else if (realFactor > 1)
         {
           info->timeFrom = int64x64_t (factor);
           info->timeTo = int64x64_t::Invert (factor);
@@ -199,7 +235,7 @@
         }
       else
         {
-          NS_ASSERT (shift < 0);
+          NS_ASSERT (realFactor < 1);
           info->timeFrom = int64x64_t::Invert (factor);
           info->timeTo = int64x64_t (factor);
           info->toMul = true;
@@ -368,6 +404,18 @@
     case Time::FS:
       unit = "fs";
       break;
+    case Time::MIN:
+      unit = "min";
+      break;
+    case Time::H:
+      unit = "h";
+      break;
+    case Time::D:
+      unit = "d";
+      break;
+    case Time::Y:
+      unit = "y";
+      break;
     case Time::LAST:
       NS_ABORT_MSG ("can't be reached");
       unit = "unreachable";
diff -Naur ns-3.18.1/src/core/model/type-id.cc ns-3.19/src/core/model/type-id.cc
--- ns-3.18.1/src/core/model/type-id.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/core/model/type-id.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("TypeId");
+NS_LOG_COMPONENT_DEFINE ("TypeId")
+  ;
 
 // IidManager needs to be in ns3 namespace for NS_ASSERT and NS_LOG
 // to find g_log
diff -Naur ns-3.18.1/src/core/test/attribute-test-suite.cc ns-3.19/src/core/test/attribute-test-suite.cc
--- ns-3.18.1/src/core/test/attribute-test-suite.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/core/test/attribute-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -72,7 +72,8 @@
   Derived () {}
 };
 
-NS_OBJECT_ENSURE_REGISTERED (Derived);
+NS_OBJECT_ENSURE_REGISTERED (Derived)
+  ;
 
 class AttributeObjectTest : public Object
 {
@@ -263,7 +264,8 @@
   Time m_timeWithBounds;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (AttributeObjectTest);
+NS_OBJECT_ENSURE_REGISTERED (AttributeObjectTest)
+  ;
 
 // ===========================================================================
 // Test case template used for generic Attribute Value types -- used to make 
diff -Naur ns-3.18.1/src/core/test/hash-test-suite.cc ns-3.19/src/core/test/hash-test-suite.cc
--- ns-3.18.1/src/core/test/hash-test-suite.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/core/test/hash-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -137,7 +137,7 @@
   hash32Reference = 0x463d70e2;  // murmur3(key)
   Check ( "default", Hash32 (key));
 
-  hash64Reference = 0xa750412079d53e04;
+  hash64Reference = 0xa750412079d53e04ULL;
   Check ( "default", Hash64 (key));
 }
 
@@ -170,7 +170,7 @@
   hash32Reference = 0xa3fc0d6d;  // Fnv1a(key)
   Check ("FNV1a", hasher.clear ().GetHash32 (key));
 
-  hash64Reference = 0x88f6cdbe0a31098d;
+  hash64Reference = 0x88f6cdbe0a31098dULL;
   Check ( "FNV1a", hasher.clear ().GetHash64 (key));
 }
 
@@ -204,7 +204,7 @@
   hash32Reference = 0x463d70e2;  // Murmur3(key)
   Check ( "murmur3", hasher.clear ().GetHash32 (key));
 
-  hash64Reference = 0xa750412079d53e04;
+  hash64Reference = 0xa750412079d53e04ULL;
   Check ( "murmur3", hasher.clear ().GetHash64 (key));
 }
 
@@ -303,7 +303,7 @@
 Hash64FunctionPtrTestCase::DoRun (void)
 {
   Hasher hasher = Hasher ( Create<Hash::Function::Hash64> (&gnu_sum64) );
-  hash64Reference = 0x4126412641264126;  // Hash64FunctionPtr(key)
+  hash64Reference = 0x4126412641264126ULL;  // Hash64FunctionPtr(key)
   Check ( "gnu_sum64", hasher.clear ().GetHash64 (key));
 }
 
diff -Naur ns-3.18.1/src/core/test/object-test-suite.cc ns-3.19/src/core/test/object-test-suite.cc
--- ns-3.18.1/src/core/test/object-test-suite.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/core/test/object-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -89,10 +89,14 @@
   }
 };
 
-NS_OBJECT_ENSURE_REGISTERED (BaseA);
-NS_OBJECT_ENSURE_REGISTERED (DerivedA);
-NS_OBJECT_ENSURE_REGISTERED (BaseB);
-NS_OBJECT_ENSURE_REGISTERED (DerivedB);
+NS_OBJECT_ENSURE_REGISTERED (BaseA)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (DerivedA)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (BaseB)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (DerivedB)
+  ;
 
 } // namespace anonymous
 
diff -Naur ns-3.18.1/src/core/test/time-test-suite.cc ns-3.19/src/core/test/time-test-suite.cc
--- ns-3.18.1/src/core/test/time-test-suite.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/core/test/time-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -47,6 +47,22 @@
 void
 TimeSimpleTestCase::DoRun (void)
 {
+  NS_TEST_ASSERT_MSG_EQ_TOL (Years (1.0).GetYears (), 1.0, Years (1).GetYears (),
+                             "is 1 really 1 ?");
+  NS_TEST_ASSERT_MSG_EQ_TOL (Years (10.0).GetYears (), 10.0, Years (1).GetYears (),
+                             "is 10 really 10 ?");
+  NS_TEST_ASSERT_MSG_EQ_TOL (Days (1.0).GetDays (), 1.0, Days (1).GetDays (),
+                             "is 1 really 1 ?");
+  NS_TEST_ASSERT_MSG_EQ_TOL (Days (10.0).GetDays (), 10.0, Days (1).GetDays (),
+                             "is 10 really 10 ?");
+  NS_TEST_ASSERT_MSG_EQ_TOL (Hours (1.0).GetHours (), 1.0, Hours (1).GetHours (),
+                             "is 1 really 1 ?");
+  NS_TEST_ASSERT_MSG_EQ_TOL (Hours (10.0).GetHours (), 10.0, Hours (1).GetHours (),
+                             "is 10 really 10 ?");
+  NS_TEST_ASSERT_MSG_EQ_TOL (Minutes (1.0).GetMinutes (), 1.0, Minutes (1).GetMinutes (),
+                             "is 1 really 1 ?");
+  NS_TEST_ASSERT_MSG_EQ_TOL (Minutes (10.0).GetMinutes (), 10.0, Minutes (1).GetMinutes (),
+                             "is 10 really 10 ?");
   NS_TEST_ASSERT_MSG_EQ_TOL (Seconds (1.0).GetSeconds (), 1.0, TimeStep (1).GetSeconds (), 
                              "is 1 really 1 ?");
   NS_TEST_ASSERT_MSG_EQ_TOL (Seconds (10.0).GetSeconds (), 10.0, TimeStep (1).GetSeconds (), 
diff -Naur ns-3.18.1/src/create-module.py ns-3.19/src/create-module.py
--- ns-3.18.1/src/create-module.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/create-module.py	2013-12-20 09:44:50.000000000 -0800
@@ -215,6 +215,7 @@
 ----------------------------
 
 .. include:: replace.txt
+.. highlight:: cpp
 
 .. heading hierarchy:
    ------------- Chapter
diff -Naur ns-3.18.1/src/csma/bindings/modulegen__gcc_ILP32.py ns-3.19/src/csma/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/csma/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/csma/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -175,7 +175,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1505,10 +1505,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3396,6 +3397,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3406,6 +3412,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3421,6 +3432,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3446,6 +3462,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5431,14 +5452,14 @@
     cls.add_method('SetBurstRate', 
                    'void', 
                    [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
     cls.add_method('SetRandomBurstSize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
     cls.add_method('SetRandomVariable', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
     ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoCorrupt', 
                    'bool', 
diff -Naur ns-3.18.1/src/csma/bindings/modulegen__gcc_LP64.py ns-3.19/src/csma/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/csma/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/csma/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -175,7 +175,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1505,10 +1505,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3396,6 +3397,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3406,6 +3412,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3421,6 +3432,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3446,6 +3462,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5431,14 +5452,14 @@
     cls.add_method('SetBurstRate', 
                    'void', 
                    [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
     cls.add_method('SetRandomBurstSize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
     cls.add_method('SetRandomVariable', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
     ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoCorrupt', 
                    'bool', 
diff -Naur ns-3.18.1/src/csma/doc/csma.rst ns-3.19/src/csma/doc/csma.rst
--- ns-3.18.1/src/csma/doc/csma.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/csma/doc/csma.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 CSMA NetDevice
 --------------
@@ -108,7 +109,7 @@
 serialized by the simulator. This provides a deterministic mechanism for
 contending for the channel. The channel is allocated (transitioned from state
 ``IDLE`` to state ``TRANSMITTING``) on a first-come first-served basis.
-The channel always goes through a three state process:::
+The channel always goes through a three state process::
 
   IDLE -> TRANSMITTING -> PROPAGATING -> IDLE
 
@@ -206,7 +207,7 @@
 The conceptual model of interest is that of a bare computer "husk" into which
 you plug net devices. The bare computers are created using a ``NodeContainer``
 helper. You just ask this helper to create as many computers (we call them
-``Nodes``) as you need on your network:::
+``Nodes``) as you need on your network::
 
   NodeContainer csmaNodes;
   csmaNodes.Create (nCsmaNodes);
diff -Naur ns-3.18.1/src/csma/model/csma-channel.cc ns-3.19/src/csma/model/csma-channel.cc
--- ns-3.18.1/src/csma/model/csma-channel.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/csma/model/csma-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (CsmaChannel);
+NS_OBJECT_ENSURE_REGISTERED (CsmaChannel)
+  ;
 
 TypeId
 CsmaChannel::GetTypeId (void)
diff -Naur ns-3.18.1/src/csma/model/csma-net-device.cc ns-3.19/src/csma/model/csma-net-device.cc
--- ns-3.18.1/src/csma/model/csma-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/csma/model/csma-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -37,7 +37,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (CsmaNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (CsmaNetDevice)
+  ;
 
 TypeId
 CsmaNetDevice::GetTypeId (void)
@@ -699,7 +700,6 @@
       trailer.EnableFcs (true);
     }
 
-  trailer.CheckFcs (packet);
   bool crcGood = trailer.CheckFcs (packet);
   if (!crcGood)
     {
diff -Naur ns-3.18.1/src/csma/model/csma-net-device.h ns-3.19/src/csma/model/csma-net-device.h
--- ns-3.18.1/src/csma/model/csma-net-device.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/csma/model/csma-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -41,7 +41,7 @@
 class ErrorModel;
 
 /** 
- * \defgroup csma CsmaNetDevice
+ * \defgroup csma CSMA Network Device
  *
  * This section documents the API of the ns-3 csma module. For a generic functional description, please refer to the ns-3 manual.
  */
diff -Naur ns-3.18.1/src/csma-layout/bindings/modulegen__gcc_ILP32.py ns-3.19/src/csma-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -269,7 +269,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -2014,10 +2014,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -5038,6 +5039,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5048,6 +5054,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5063,6 +5074,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5088,6 +5104,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -6668,10 +6689,10 @@
                    'bool', 
                    [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
                    is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interface, ns3::Ipv6Address address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, ns3::Ipv6Address address) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'address')], 
+                   [param('uint32_t', 'interfaceIndex'), param('ns3::Ipv6Address', 'address')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMetric(uint32_t i, uint16_t metric) [member function]
     cls.add_method('SetMetric', 
diff -Naur ns-3.18.1/src/csma-layout/bindings/modulegen__gcc_LP64.py ns-3.19/src/csma-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/csma-layout/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/csma-layout/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -269,7 +269,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -2014,10 +2014,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -5038,6 +5039,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5048,6 +5054,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5063,6 +5074,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5088,6 +5104,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -6668,10 +6689,10 @@
                    'bool', 
                    [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
                    is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interface, ns3::Ipv6Address address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, ns3::Ipv6Address address) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'address')], 
+                   [param('uint32_t', 'interfaceIndex'), param('ns3::Ipv6Address', 'address')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMetric(uint32_t i, uint16_t metric) [member function]
     cls.add_method('SetMetric', 
diff -Naur ns-3.18.1/src/dsdv/bindings/modulegen__gcc_ILP32.py ns-3.19/src/dsdv/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/dsdv/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsdv/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -231,7 +231,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1626,10 +1626,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4082,6 +4083,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4092,6 +4098,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4107,6 +4118,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4132,6 +4148,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5180,10 +5201,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
     cls.add_method('SetArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
     ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
diff -Naur ns-3.18.1/src/dsdv/bindings/modulegen__gcc_LP64.py ns-3.19/src/dsdv/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/dsdv/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsdv/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -231,7 +231,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1626,10 +1626,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4082,6 +4083,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4092,6 +4098,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4107,6 +4118,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4132,6 +4148,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5180,10 +5201,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
     cls.add_method('SetArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
     ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
diff -Naur ns-3.18.1/src/dsdv/model/dsdv-packet.cc ns-3.19/src/dsdv/model/dsdv-packet.cc
--- ns-3.18.1/src/dsdv/model/dsdv-packet.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsdv/model/dsdv-packet.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 namespace dsdv {
-NS_OBJECT_ENSURE_REGISTERED (DsdvHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsdvHeader)
+  ;
 DsdvHeader::DsdvHeader (Ipv4Address dst, uint32_t hopCount, uint32_t dstSeqNo)
   : m_dst (dst),
     m_hopCount (hopCount),
diff -Naur ns-3.18.1/src/dsdv/model/dsdv-routing-protocol.cc ns-3.19/src/dsdv/model/dsdv-routing-protocol.cc
--- ns-3.18.1/src/dsdv/model/dsdv-routing-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsdv/model/dsdv-routing-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -44,7 +44,8 @@
 
 namespace ns3 {
 namespace dsdv {
-NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol);
+NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol)
+  ;
 
 /// UDP Port for DSDV control traffic
 const uint32_t RoutingProtocol::DSDV_PORT = 269;
diff -Naur ns-3.18.1/src/dsr/bindings/modulegen__gcc_ILP32.py ns-3.19/src/dsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/dsr/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -283,7 +283,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1948,10 +1948,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3250,8 +3251,8 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'm'), param('uint8_t', 'l'), param('uint8_t', 'r'), param('bool', 'sg'), param('uint8_t', 'ns'), param('uint8_t', 'ne'), param('bool', 'Stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -3307,10 +3308,10 @@
     cls.add_method('SetShortGuardInterval', 
                    'void', 
                    [param('bool', 'guardinterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbcsatuts) [member function]
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
-                   [param('bool', 'stbcsatuts')])
+                   [param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
     cls.add_method('SetTxPowerLevel', 
                    'void', 
@@ -4980,6 +4981,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4990,6 +4996,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5005,6 +5016,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5030,6 +5046,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5913,10 +5934,10 @@
     cls.add_method('SetProbeResp', 
                    'void', 
                    [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy arg0) [member function]
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
     cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'arg0')])
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
     cls.add_method('SetQosAmsdu', 
                    'void', 
@@ -6592,15 +6613,15 @@
                    'void', 
                    [param('bool', 'greenfield')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool GuardInterval) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
     cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('bool', 'guardInterval')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool Ldpc) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('bool', 'ldpc')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
@@ -8303,10 +8324,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
     cls.add_method('SetArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
     ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
@@ -9797,10 +9818,10 @@
                    'ns3::IpL4Protocol::RxStatus', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> interface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'interface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::ReceiveIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, ns3::Ipv4Address payloadSource, ns3::Ipv4Address payloadDestination, uint8_t const * payload) [member function]
     cls.add_method('ReceiveIcmp', 
@@ -10486,8 +10507,8 @@
     cls.add_method('GetSize', 
                    'uint32_t', 
                    [])
-    ## dsr-network-queue.h (module 'dsr'): static ns3::TypeId ns3::dsr::DsrNetworkQueue::GetTypeID() [member function]
-    cls.add_method('GetTypeID', 
+    ## dsr-network-queue.h (module 'dsr'): static ns3::TypeId ns3::dsr::DsrNetworkQueue::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
diff -Naur ns-3.18.1/src/dsr/bindings/modulegen__gcc_LP64.py ns-3.19/src/dsr/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/dsr/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -283,7 +283,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1948,10 +1948,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3250,8 +3251,8 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'm'), param('uint8_t', 'l'), param('uint8_t', 'r'), param('bool', 'sg'), param('uint8_t', 'ns'), param('uint8_t', 'ne'), param('bool', 'Stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -3307,10 +3308,10 @@
     cls.add_method('SetShortGuardInterval', 
                    'void', 
                    [param('bool', 'guardinterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbcsatuts) [member function]
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
-                   [param('bool', 'stbcsatuts')])
+                   [param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
     cls.add_method('SetTxPowerLevel', 
                    'void', 
@@ -4980,6 +4981,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4990,6 +4996,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5005,6 +5016,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5030,6 +5046,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5913,10 +5934,10 @@
     cls.add_method('SetProbeResp', 
                    'void', 
                    [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy arg0) [member function]
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
     cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'arg0')])
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
     cls.add_method('SetQosAmsdu', 
                    'void', 
@@ -6592,15 +6613,15 @@
                    'void', 
                    [param('bool', 'greenfield')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool GuardInterval) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
     cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('bool', 'guardInterval')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool Ldpc) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('bool', 'ldpc')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
@@ -8303,10 +8324,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
     cls.add_method('SetArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
     ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
@@ -9797,10 +9818,10 @@
                    'ns3::IpL4Protocol::RxStatus', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> interface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'interface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::ReceiveIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, ns3::Ipv4Address payloadSource, ns3::Ipv4Address payloadDestination, uint8_t const * payload) [member function]
     cls.add_method('ReceiveIcmp', 
@@ -10486,8 +10507,8 @@
     cls.add_method('GetSize', 
                    'uint32_t', 
                    [])
-    ## dsr-network-queue.h (module 'dsr'): static ns3::TypeId ns3::dsr::DsrNetworkQueue::GetTypeID() [member function]
-    cls.add_method('GetTypeID', 
+    ## dsr-network-queue.h (module 'dsr'): static ns3::TypeId ns3::dsr::DsrNetworkQueue::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
diff -Naur ns-3.18.1/src/dsr/doc/dsr.rst ns-3.19/src/dsr/doc/dsr.rst
--- ns-3.18.1/src/dsr/doc/dsr.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/doc/dsr.rst	2013-12-20 09:44:50.000000000 -0800
@@ -14,7 +14,7 @@
 ********************
  
 This model implements the base specification of the Dynamic Source Routing 
-(DSR) protocol. Implementation is based on RFC4728.
+(DSR) protocol. Implementation is based on :rfc:`4728`.
 
 DSR operates on a on-demand behavior. Therefore, our DSR model buffers all 
 packets while a route request packet (RREQ) is disseminated. We implement 
@@ -127,7 +127,7 @@
 	1. Message type is used to identify the data packet from control packet
 	2. source id is used to identify the real source of the data packet since we have to deliver the packet hop-by-hop and the ipv4header is not carrying the real source and destination ip address as needed
 	3. destination id is for same reason of above
-* Route Reply header is not word-aligned in DSR rfc, change it to word-aligned in implementation
+* Route Reply header is not word-aligned in DSR RFC, change it to word-aligned in implementation
 * DSR works as a shim header between transport and network protocol, it needs its own forwarding mechanism, we are changing the packet transmission to hop-by-hop delivery, so we added two fields in dsr fixed header to notify packet delivery
 
 
@@ -155,7 +155,9 @@
 ******
 
 To have a node run DSR, the easiest way would be to use the DsrHelper
-and DsrMainHelpers in your simulation script. For instance::
+and DsrMainHelpers in your simulation script. For instance:
+
+.. sourcecode:: cpp
 
   DsrHelper dsr;
   DsrMainHelper dsrMain;
@@ -190,8 +192,8 @@
 References
 **********
 
-[1] Link for the `original paper: <http://www.monarch.cs.rice.edu/monarch-papers/dsr-chapter00.pdf>`_
+[1] Original paper: http://www.monarch.cs.rice.edu/monarch-papers/dsr-chapter00.pdf
 
-[2] Link for `RFC 4728: <http://www6.ietf.org/rfc/rfc4728.txt>`_
+[2] RFC 4728 http://www6.ietf.org/rfc/rfc4728.txt
 
-[3] Link for the `Broch's comparison paper: <http://www.monarch.cs.rice.edu/monarch-papers/mobicom98.ps>`_
+[3] Broch's comparison paper: http://www.monarch.cs.rice.edu/monarch-papers/mobicom98.ps
diff -Naur ns-3.18.1/src/dsr/model/dsr-errorbuff.h ns-3.19/src/dsr/model/dsr-errorbuff.h
--- ns-3.18.1/src/dsr/model/dsr-errorbuff.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-errorbuff.h	2013-12-20 09:44:50.000000000 -0800
@@ -45,7 +45,16 @@
 class ErrorBuffEntry
 {
 public:
-  // / c-tor
+  /**
+   * Create an ErrorBuffEntry with the given parameters.
+   *
+   * \param pa packet
+   * \param d IPv4 address of the destination
+   * \param s IPv4 address of the source
+   * \param n IPv4 address of the next hop
+   * \param exp expiration time
+   * \param p protocol number
+   */
   ErrorBuffEntry (Ptr<const Packet> pa = 0, Ipv4Address d = Ipv4Address (), Ipv4Address s = Ipv4Address (),
                   Ipv4Address n = Ipv4Address (), Time exp = Simulator::Now (), uint8_t p = 0)
     : m_packet (pa),
@@ -58,13 +67,14 @@
   }
   /**
    * Compare send buffer entries
+   * \param o another ErrorBuffEntry
    * \return true if equal
    */
   bool operator== (ErrorBuffEntry const & o) const
   {
     return ((m_packet == o.m_packet) && (m_source == o.m_source) && (m_nextHop == o.m_nextHop) && (m_dst == o.m_dst) && (m_expire == o.m_expire));
   }
-  // /\name Fields
+  ///\name Fields
   // \{
   Ptr<const Packet> GetPacket () const
   {
@@ -116,17 +126,17 @@
   }
   // \}
 private:
-  // / Data packet
+  /// Data packet
   Ptr<const Packet> m_packet;
-  // / Destination address
+  /// Destination address
   Ipv4Address m_dst;
-  // / Source address
+  /// Source address
   Ipv4Address m_source;
-  // / Nexthop address
+  /// Nexthop address
   Ipv4Address m_nextHop;
-  // / Expire time for queue entry
+  /// Expire time for queue entry
   Time m_expire;
-  // / The protocol number
+  /// The protocol number
   uint8_t m_protocol;
 };
 
@@ -138,21 +148,23 @@
 class ErrorBuffer
 {
 public:
-  // / Default c-tor
+  /**
+   * Default constructor
+   */
   ErrorBuffer ()
   {
   }
-  // / Push entry in queue, if there is no entry with the same packet and destination address in queue.
+  /// Push entry in queue, if there is no entry with the same packet and destination address in queue.
   bool Enqueue (ErrorBuffEntry & entry);
-  // / Return first found (the earliest) entry for given destination
+  /// Return first found (the earliest) entry for given destination
   bool Dequeue (Ipv4Address dst, ErrorBuffEntry & entry);
-  // / Remove all packets with the error link
+  /// Remove all packets with the error link
   void DropPacketForErrLink (Ipv4Address source, Ipv4Address nextHop);
-  // / Finds whether a packet with destination dst exists in the queue
+  /// Finds whether a packet with destination dst exists in the queue
   bool Find (Ipv4Address dst);
-  // / Number of entries
+  /// Number of entries
   uint32_t GetSize ();
-  // /\name Fields
+  ///\name Fields
   // \{
   uint32_t GetMaxQueueLen () const
   {
@@ -178,19 +190,19 @@
   }
 
 private:
-  // / The send buffer to cache unsent packet
+  /// The send buffer to cache unsent packet
   std::vector<ErrorBuffEntry> m_errorBuffer;
-  // / Remove all expired entries
+  /// Remove all expired entries
   void Purge ();
-  // / Notify that packet is dropped from queue by timeout
+  /// Notify that packet is dropped from queue by timeout
   void Drop (ErrorBuffEntry en, std::string reason);
-  // / Notify that packet is dropped from queue by timeout
+  /// Notify that packet is dropped from queue by timeout
   void DropLink (ErrorBuffEntry en, std::string reason);
-  // / The maximum number of packets that we allow a routing protocol to buffer.
+  /// The maximum number of packets that we allow a routing protocol to buffer.
   uint32_t m_maxLen;
-  // / The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
+  /// The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
   Time m_errorBufferTimeout;
-  // / Check if the send buffer entry is the same or not
+  /// Check if the send buffer entry is the same or not
   static bool LinkEqual (ErrorBuffEntry en, const std::vector<Ipv4Address> link)
   {
     return ((en.GetSource () == link[0]) && (en.GetNextHop () == link[1]));
diff -Naur ns-3.18.1/src/dsr/model/dsr-fs-header.cc ns-3.19/src/dsr/model/dsr-fs-header.cc
--- ns-3.18.1/src/dsr/model/dsr-fs-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-fs-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -39,7 +39,8 @@
 
 NS_LOG_COMPONENT_DEFINE ("DsrFsHeader");
 
-NS_OBJECT_ENSURE_REGISTERED (DsrFsHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrFsHeader)
+  ;
 
 TypeId DsrFsHeader::GetTypeId ()
 {
@@ -258,7 +259,8 @@
   return m_optionData;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrRoutingHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrRoutingHeader)
+  ;
 
 TypeId DsrRoutingHeader::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/dsr/model/dsr-fs-header.h ns-3.19/src/dsr/model/dsr-fs-header.h
--- ns-3.18.1/src/dsr/model/dsr-fs-header.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-fs-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -99,7 +99,7 @@
   virtual ~DsrFsHeader ();
   /**
    * \brief Set the "Next header" field.
-   * \param nextHeader the next header number
+   * \param protocol the next header number
    */
   void SetNextHeader (uint8_t protocol);
   /**
@@ -109,7 +109,7 @@
   uint8_t GetNextHeader () const;
   /**
    * brief Set the message type of the header.
-   * \param message type the message type of the header
+   * \param messageType the message type of the header
    */
   void SetMessageType (uint8_t messageType);
   /**
@@ -118,23 +118,23 @@
    */
   uint8_t GetMessageType () const;
   /**
-   * brief Set the source id of the header.
-   * \param source id the source id of the header
+   * brief Set the source ID of the header.
+   * \param sourceId the source ID of the header
    */
   void SetSourceId (uint16_t sourceId);
   /**
-   * brief Get the source id of the header.
-   * \return source id the source id of the header
+   * brief Get the source ID of the header.
+   * \return source ID the source ID of the header
    */
   uint16_t GetSourceId () const;
   /**
-   * brief Set the dest id of the header.
-   * \param dest id the dest id of the header
+   * brief Set the dest ID of the header.
+   * \param destId the destination ID of the header
    */
   void SetDestId (uint16_t destId);
   /**
-   * brief Get the dest id of the header.
-   * \return dest id the dest id of the header
+   * brief Get the dest ID of the header.
+   * \return dest ID the dest ID of the header
    */
   uint16_t GetDestId () const;
   /**
@@ -257,6 +257,7 @@
   /**
    * \brief Calculate padding.
    * \param alignment alignment
+   * \return the number of bytes required to pad
    */
   uint32_t CalculatePad (DsrOptionHeader::Alignment alignment) const;
   /**
diff -Naur ns-3.18.1/src/dsr/model/dsr-gratuitous-reply-table.cc ns-3.19/src/dsr/model/dsr-gratuitous-reply-table.cc
--- ns-3.18.1/src/dsr/model/dsr-gratuitous-reply-table.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-gratuitous-reply-table.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 namespace ns3 {
 namespace dsr {
 
-NS_OBJECT_ENSURE_REGISTERED (GraReply);
+NS_OBJECT_ENSURE_REGISTERED (GraReply)
+  ;
 
 TypeId GraReply::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/dsr/model/dsr-gratuitous-reply-table.h ns-3.19/src/dsr/model/dsr-gratuitous-reply-table.h
--- ns-3.18.1/src/dsr/model/dsr-gratuitous-reply-table.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-gratuitous-reply-table.h	2013-12-20 09:44:50.000000000 -0800
@@ -65,49 +65,41 @@
 class GraReply  : public Object
 {
 public:
-  // / c-tor
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
-  /**
-   * \brief Constructor.
-   */
+
   GraReply ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~GraReply ();
-  // / Set the gratuitous reply table size
+
+  /// Set the gratuitous reply table size
   void SetGraTableSize (uint32_t g)
   {
     GraReplyTableSize = g;
   }
-  // / Get the gratuitous reply table size
+  /// Get the gratuitous reply table size
   uint32_t GetGraTableSize () const
   {
     return GraReplyTableSize;
   }
-  // / Add a new gratuitous reply entry
+  /// Add a new gratuitous reply entry
   bool AddEntry (GraReplyEntry & graTableEntry);
-  // / Update the route entry if found, create a new one if not
+  /// Update the route entry if found, create a new one if not
   bool FindAndUpdate (Ipv4Address replyTo, Ipv4Address replyFrom, Time gratReplyHoldoff);
-  // / Remove all expired entries
+  /// Remove all expired entries
   void Purge ();
-  // / Remove all entries
+  /// Remove all entries
   void Clear ()
   {
     m_graReply.clear ();
   }
 
 private:
-  // / Vector of entries
+  /// Vector of entries
   std::vector<GraReplyEntry> m_graReply;
-  // / The max # of gratuitous reply entries to hold
+  /// The max # of gratuitous reply entries to hold
   uint32_t GraReplyTableSize;
 
-  // / Check if the entry is expired or not
+  /// Check if the entry is expired or not
   struct IsExpired
   {
     bool operator() (const struct GraReplyEntry & b) const
diff -Naur ns-3.18.1/src/dsr/model/dsr-maintain-buff.h ns-3.19/src/dsr/model/dsr-maintain-buff.h
--- ns-3.18.1/src/dsr/model/dsr-maintain-buff.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-maintain-buff.h	2013-12-20 09:44:50.000000000 -0800
@@ -53,6 +53,7 @@
 
   /**
    * Compare maintain Buffer entries
+   * \param o
    * \return true if equal
    */
   bool operator < (LinkKey const & o) const
@@ -73,6 +74,7 @@
 
   /**
    * Compare maintain Buffer entries
+   * \param o
    * \return true if equal
    */
   bool operator < (NetworkKey const & o) const
@@ -92,6 +94,7 @@
 
   /**
    * Compare maintain Buffer entries
+   * \param o
    * \return true if equal
    */
   bool operator < (PassiveKey const & o) const
@@ -109,7 +112,18 @@
 class MaintainBuffEntry
 {
 public:
-  // / c-tor
+  /**
+   * Construct a MaintainBuffEntry with the given parameters
+   *
+   * \param pa packet
+   * \param us our IPv4 address
+   * \param n next hop IPv4 address
+   * \param s IPv4 address of the source
+   * \param dst IPv4 address of the destination
+   * \param ackId ACK ID
+   * \param segs number of segments left
+   * \param exp expiration time
+   */
   MaintainBuffEntry (Ptr<const Packet> pa = 0, Ipv4Address us = Ipv4Address (),
                      Ipv4Address n = Ipv4Address (), Ipv4Address s = Ipv4Address (), Ipv4Address dst = Ipv4Address (),
                      uint16_t ackId = 0, uint8_t segs = 0, Time exp = Simulator::Now ())
@@ -124,7 +138,7 @@
   {
   }
 
-  // /\name Fields
+  ///\name Fields
   // \{
   Ptr<const Packet> GetPacket () const
   {
@@ -192,21 +206,21 @@
   }
   // \}
 private:
-  // / Data packet
+  /// Data packet
   Ptr<const Packet> m_packet;
-  // / Our own ip address
+  /// Our own ip address
   Ipv4Address m_ourAdd;
-  // / Next hop Ip address
+  /// Next hop Ip address
   Ipv4Address m_nextHop;
-  // / The source address
+  /// The source address
   Ipv4Address m_src;
-  // / The destination address
+  /// The destination address
   Ipv4Address m_dst;
-  // / The data ack id
+  /// The data ack id
   uint16_t m_ackId;
-  // / The segments left field
+  /// The segments left field
   uint8_t m_segsLeft;
-  // / Expire time for queue entry
+  /// Expire time for queue entry
   Time m_expire;
 };
 /**
@@ -217,21 +231,23 @@
 class MaintainBuffer
 {
 public:
-  // / Default c-tor
+  /**
+   * Default constructor
+   */
   MaintainBuffer ()
   {
   }
-  // / Push entry in queue, if there is no entry with the same packet and destination address in queue.
+  /// Push entry in queue, if there is no entry with the same packet and destination address in queue.
   bool Enqueue (MaintainBuffEntry & entry);
-  // / Return first found (the earliest) entry for given destination
+  /// Return first found (the earliest) entry for given destination
   bool Dequeue (Ipv4Address dst, MaintainBuffEntry & entry);
-  // / Remove all packets with destination IP address dst
+  /// Remove all packets with destination IP address dst
   void DropPacketWithNextHop (Ipv4Address nextHop);
-  // / Finds whether a packet with destination dst exists in the queue
+  /// Finds whether a packet with destination dst exists in the queue
   bool Find (Ipv4Address nextHop);
-  // / Number of entries
+  /// Number of entries
   uint32_t GetSize ();
-  // /\name Fields
+  ///\name Fields
   // \{
   uint32_t GetMaxQueueLen () const
   {
@@ -249,27 +265,27 @@
   {
     m_maintainBufferTimeout = t;
   }
-  // / Verify if all the elements in the maintainence buffer entry is the same
+  /// Verify if all the elements in the maintainence buffer entry is the same
   bool AllEqual (MaintainBuffEntry & entry);
-  // / Verify if the maintain buffer entry is the same in every field for link ack
+  /// Verify if the maintain buffer entry is the same in every field for link ack
   bool LinkEqual (MaintainBuffEntry & entry);
-  // / Verify if the maintain buffer entry is the same in every field for network ack
+  /// Verify if the maintain buffer entry is the same in every field for network ack
   bool NetworkEqual (MaintainBuffEntry & entry);
-  // / Verify if the maintain buffer entry is the same in every field for promiscuous ack
+  /// Verify if the maintain buffer entry is the same in every field for promiscuous ack
   bool PromiscEqual (MaintainBuffEntry & entry);
   // \}
 
 private:
-  // / The vector of maintain buffer entries
+  /// The vector of maintain buffer entries
   std::vector<MaintainBuffEntry> m_maintainBuffer;
   std::vector<NetworkKey> m_allNetworkKey;
-  // / Remove all expired entries
+  /// Remove all expired entries
   void Purge ();
-  // / The maximum number of packets that we allow a routing protocol to buffer.
+  /// The maximum number of packets that we allow a routing protocol to buffer.
   uint32_t m_maxLen;
-  // / The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
+  /// The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
   Time m_maintainBufferTimeout;
-  // / Verify if the maintain buffer is equal or not
+  /// Verify if the maintain buffer is equal or not
   static bool IsEqual (MaintainBuffEntry en, const Ipv4Address nextHop)
   {
     return (en.GetNextHop () == nextHop);
diff -Naur ns-3.18.1/src/dsr/model/dsr-network-queue.cc ns-3.19/src/dsr/model/dsr-network-queue.cc
--- ns-3.18.1/src/dsr/model/dsr-network-queue.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-network-queue.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,10 +43,11 @@
 namespace ns3 {
 namespace dsr {
 
-NS_OBJECT_ENSURE_REGISTERED (DsrNetworkQueue);
+NS_OBJECT_ENSURE_REGISTERED (DsrNetworkQueue)
+  ;
 
 TypeId
-DsrNetworkQueue::GetTypeID (void)
+DsrNetworkQueue::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::dsr::DsrNetworkQueue")
     .SetParent<Object> ()
diff -Naur ns-3.18.1/src/dsr/model/dsr-network-queue.h ns-3.19/src/dsr/model/dsr-network-queue.h
--- ns-3.18.1/src/dsr/model/dsr-network-queue.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-network-queue.h	2013-12-20 09:44:50.000000000 -0800
@@ -53,7 +53,15 @@
 class DsrNetworkQueueEntry
 {
 public:
-  /// c-tor
+  /**
+   * Construct a DsrNetworkQueueEntry with the given parameters
+   *
+   * \param pa packet
+   * \param s IPv4 address of the source
+   * \param n IPv4 address of the next hop node
+   * \param exp expiration time
+   * \param r Route
+   */
   DsrNetworkQueueEntry (Ptr<const Packet> pa = 0, Ipv4Address s = Ipv4Address (), Ipv4Address n = Ipv4Address (),
                         Time exp = Simulator::Now (), Ptr<Ipv4Route> r = 0)
     : m_packet (pa),
@@ -65,6 +73,7 @@
   }
   /**
    * Compare send buffer entries
+   * \param o
    * \return true if equal
    */
   bool operator== (DsrNetworkQueueEntry const & o) const
@@ -129,22 +138,70 @@
 class DsrNetworkQueue : public Object
 {
 public:
-  static TypeId GetTypeID (void);
-  /// Default c-tor
+  static TypeId GetTypeId (void);
+  
   DsrNetworkQueue ();
+  /**
+   * Construct a DsrNetworkQueue with the given
+   * maximum length and maximum delay.
+   *
+   * \param maxLen Maximum queue size
+   * \param maxDelay Maximum entry lifetime in the queue
+   */
   DsrNetworkQueue (uint32_t maxLen, Time maxDelay);
   ~DsrNetworkQueue ();
-  /// Push entry in queue, if there is no entry with the same packet and destination address in queue.
+
+  /**
+   * Push entry in queue, if there is no entry with the same
+   * packet and destination address in queue.
+   *
+   * \param entry packet entry
+   * \return true if the given entry was put in the queue,
+   *         false otherwise
+   */
   bool Enqueue (DsrNetworkQueueEntry & entry);
-  /// Return first found (the earliest) entry for given destination
+  /**
+   * Return first found (the earliest) entry for given destination
+   *
+   * \param entry pointer to the return entry
+   * \return true if an entry is returned,
+   *         false otherwise
+   */
   bool Dequeue (DsrNetworkQueueEntry & entry);
-  /// Number of entries
+  /**
+   * Number of entries
+   *
+   * \return the current queue size/length
+   */
   uint32_t GetSize ();
 
+  /**
+   * Set the maximum queue size
+   *
+   * \param maxSize the maximum queue size
+   */
   void SetMaxNetworkSize (uint32_t maxSize);
+  /**
+   * Set the maximum entry lifetime in the queue
+   *
+   * \param delay the maximum entry lifetime
+   */
   void SetMaxNetworkDelay (Time delay);
+  /**
+   * Return the maximum queue size
+   *
+   * \return the maximum queue size
+   */
   uint32_t GetMaxNetworkSize (void) const;
+  /**
+   * Return the maximum entry lifetime for this queue
+   *
+   * \return the maximum entry lifetime for this queue
+   */
   Time GetMaxNetworkDelay (void) const;
+  /**
+   * Clear the queue
+   */
   void Flush (void);
 
   std::vector<DsrNetworkQueueEntry> & GetQueue ()
@@ -153,11 +210,14 @@
   }
 
 private:
+  /**
+   * Clean the queue by removing entries that exceeded lifetime.
+   */
   void Cleanup (void);
-  std::vector<DsrNetworkQueueEntry> m_dsrNetworkQueue;
-  uint32_t m_size;
-  uint32_t m_maxSize;
-  Time m_maxDelay;
+  std::vector<DsrNetworkQueueEntry> m_dsrNetworkQueue; //!< Queue (vector) of entries
+  uint32_t m_size; //!< Current queue size
+  uint32_t m_maxSize; //!< Maximum queue size
+  Time m_maxDelay; //!< Maximum entry lifetime
 };
 
 } // namespace dsr
diff -Naur ns-3.18.1/src/dsr/model/dsr-option-header.cc ns-3.19/src/dsr/model/dsr-option-header.cc
--- ns-3.18.1/src/dsr/model/dsr-option-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-option-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -42,7 +42,8 @@
 namespace dsr {
 NS_LOG_COMPONENT_DEFINE ("DsrOptionHeader");
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionHeader)
+  ;
 
 TypeId DsrOptionHeader::GetTypeId ()
 {
@@ -130,7 +131,8 @@
   return retVal;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionPad1Header);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionPad1Header)
+  ;
 
 TypeId DsrOptionPad1Header::GetTypeId ()
 {
@@ -181,7 +183,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionPadnHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionPadnHeader)
+  ;
 
 TypeId DsrOptionPadnHeader::GetTypeId ()
 {
@@ -241,7 +244,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionRreqHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionRreqHeader)
+  ;
 
 TypeId DsrOptionRreqHeader::GetTypeId ()
 {
@@ -388,7 +392,8 @@
   return retVal;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionRrepHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionRrepHeader)
+  ;
 
 TypeId DsrOptionRrepHeader::GetTypeId ()
 {
@@ -509,7 +514,8 @@
   return retVal;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionSRHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionSRHeader)
+  ;
 
 TypeId DsrOptionSRHeader::GetTypeId ()
 {
@@ -651,7 +657,8 @@
   return retVal;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerrHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerrHeader)
+  ;
 
 TypeId DsrOptionRerrHeader::GetTypeId ()
 {
@@ -779,7 +786,8 @@
   return retVal;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerrUnreachHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerrUnreachHeader)
+  ;
 
 TypeId DsrOptionRerrUnreachHeader::GetTypeId ()
 {
@@ -907,7 +915,8 @@
   return retVal;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerrUnsupportHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerrUnsupportHeader)
+  ;
 
 TypeId DsrOptionRerrUnsupportHeader::GetTypeId ()
 {
@@ -1025,7 +1034,8 @@
   return retVal;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionAckReqHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionAckReqHeader)
+  ;
 
 TypeId DsrOptionAckReqHeader::GetTypeId ()
 {
@@ -1100,7 +1110,8 @@
   return retVal;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionAckHeader);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionAckHeader)
+  ;
 
 TypeId DsrOptionAckHeader::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/dsr/model/dsr-option-header.h ns-3.19/src/dsr/model/dsr-option-header.h
--- ns-3.18.1/src/dsr/model/dsr-option-header.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-option-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -339,7 +339,7 @@
   Ipv4Address GetNodeAddress (uint8_t index) const;
   /**
    * \brief Set the request id number.
-   * \param the identification number
+   * \param identification the identification number
    */
   void SetId (uint16_t identification);
   /**
@@ -589,7 +589,7 @@
   virtual ~DsrOptionSRHeader ();
   /*
    * \brief Set the number of segments left to send
-   * \param The segments left
+   * \param segmentsLeft The segments left
    */
   void SetSegmentsLeft (uint8_t segmentsLeft);
   /*
@@ -631,7 +631,7 @@
   Ipv4Address GetNodeAddress (uint8_t index) const;
   /*
    * \brief Set the salvage value for a packet
-   * \param The salvage value of the packet
+   * \param salvage The salvage value of the packet
    */
   void SetSalvage (uint8_t salvage);
   /*
@@ -715,7 +715,7 @@
   \endverbatim
 */
 
-// / Error type
+/// Error type
 enum ErrorType
 {
   NODE_UNREACHABLE  = 1,   // !< NODE_UNREACHABLE
@@ -746,7 +746,7 @@
   virtual ~DsrOptionRerrHeader ();
   /**
    * \brief Set the route error type
-   * \param The error type
+   * \param errorType The error type
    */
   void SetErrorType (uint8_t errorType);
   /**
@@ -756,7 +756,7 @@
   uint8_t GetErrorType () const;
   /**
    * \brief Set the route error source address
-   * \param The error source address
+   * \param errorSrcAddress The error source address
    */
   virtual void SetErrorSrc (Ipv4Address errorSrcAddress);
   /**
@@ -770,12 +770,12 @@
   virtual void SetSalvage (uint8_t salvage);
   /**
    * \brief Get the salvage value of the packet
-   * \param The salvage value of the packet
+   * \return The salvage value of the packet
    */
   virtual uint8_t GetSalvage () const;
   /**
    * \brief Set the error destination ip address
-   * \param The error destination address
+   * \param errorDstAddress The error destination address
    */
   virtual void SetErrorDst (Ipv4Address errorDstAddress);
   /**
@@ -891,7 +891,7 @@
   virtual ~DsrOptionRerrUnreachHeader ();
   /**
    * \brief Set the route error source address
-   * \param The error source address
+   * \param errorSrcAddress The error source address
    */
   virtual void SetErrorSrc (Ipv4Address errorSrcAddress);
   /**
@@ -905,12 +905,12 @@
   virtual void SetSalvage (uint8_t salvage);
   /**
    * \brief Get the salvage value of the packet
-   * \param The salvage value of the packet
+   * \return The salvage value of the packet
    */
   virtual uint8_t GetSalvage () const;
   /**
    * \brief Set the error destination ip address
-   * \param The error destination address
+   * \param errorDstAddress The error destination address
    */
   virtual void SetErrorDst (Ipv4Address errorDstAddress);
   /**
@@ -920,7 +920,7 @@
   virtual Ipv4Address GetErrorDst () const;
   /**
    * \brief Set the unreachable node ip address
-   * \param The unreachable ip address
+   * \param unreachNode The unreachable ip address
    */
   void SetUnreachNode (Ipv4Address unreachNode);
   /**
@@ -930,7 +930,7 @@
   Ipv4Address GetUnreachNode () const;
   /**
    * \brief Set the unreachable node ip address
-   * \param The unreachable ip address
+   * \param originalDst The unreachable ip address
    */
   void SetOriginalDst (Ipv4Address originalDst);
   /**
@@ -1047,7 +1047,7 @@
   virtual ~DsrOptionRerrUnsupportHeader ();
   /**
    * \brief Set the route error source address
-   * \param The error source address
+   * \param errorSrcAddress The error source address
    */
   virtual void SetErrorSrc (Ipv4Address errorSrcAddress);
   /**
@@ -1057,16 +1057,17 @@
   virtual Ipv4Address GetErrorSrc () const;
   /**
    * \brief Set the salvage value of the packet
+   * \param salvage the salvage value
    */
   virtual void SetSalvage (uint8_t salvage);
   /**
    * \brief Get the salvage value of the packet
-   * \param The salvage value of the packet
+   * \return The salvage value of the packet
    */
   virtual uint8_t GetSalvage () const;
   /**
    * \brief Set the error destination ip address
-   * \param The error destination address
+   * \param errorDstAddress The error destination address
    */
   virtual void SetErrorDst (Ipv4Address errorDstAddress);
   /**
@@ -1076,7 +1077,7 @@
   virtual Ipv4Address GetErrorDst () const;
   /**
    * \brief Set the unsupported option type value
-   * \param The unsupported option type value
+   * \param optionType The unsupported option type value
    */
   void SetUnsupported (uint16_t optionType);
   /**
@@ -1175,7 +1176,7 @@
   virtual ~DsrOptionAckReqHeader ();
   /**
    * \brief Set the Ack request id number.
-   * \param the identification number
+   * \param identification the identification number
    */
   void SetAckId (uint16_t identification);
   /**
@@ -1212,7 +1213,7 @@
   virtual Alignment GetAlignment () const;
 
 private:
-  /*
+  /**
    * The identification field
    */
   uint16_t m_identification;
@@ -1262,7 +1263,7 @@
   virtual ~DsrOptionAckHeader ();
   /**
    * \brief Set the Ack id number.
-   * \param the identification number
+   * \param identification the identification number
    */
   void SetAckId (uint16_t identification);
   /**
@@ -1272,7 +1273,7 @@
   uint16_t GetAckId () const;
   /**
    * \brief Set Error source ip address.
-   * \param The real source address
+   * \param realSrcAddress The real source address
    */
   void SetRealSrc (Ipv4Address realSrcAddress);
   /**
@@ -1282,7 +1283,7 @@
   Ipv4Address GetRealSrc () const;
   /**
    * \brief Set Error source ip address.
-   * \param The real dst address
+   * \param realDstAddress The real dst address
    */
   void SetRealDst (Ipv4Address realDstAddress);
   /**
diff -Naur ns-3.18.1/src/dsr/model/dsr-options.cc ns-3.19/src/dsr/model/dsr-options.cc
--- ns-3.18.1/src/dsr/model/dsr-options.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-options.cc	2013-12-20 09:44:50.000000000 -0800
@@ -65,7 +65,8 @@
 namespace ns3 {
 namespace dsr {
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptions);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptions)
+  ;
 
 TypeId DsrOptions::GetTypeId ()
 {
@@ -371,7 +372,8 @@
   return 0;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionPad1);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionPad1)
+  ;
 
 TypeId DsrOptionPad1::GetTypeId ()
 {
@@ -411,7 +413,8 @@
   return pad1Header.GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionPadn);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionPadn)
+  ;
 
 TypeId DsrOptionPadn::GetTypeId ()
 {
@@ -451,7 +454,8 @@
   return padnHeader.GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionRreq);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionRreq)
+  ;
 
 TypeId DsrOptionRreq::GetTypeId ()
 {
@@ -949,7 +953,8 @@
   //unreachable:  return rreq.GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionRrep);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionRrep)
+  ;
 
 TypeId DsrOptionRrep::GetTypeId ()
 {
@@ -1149,7 +1154,8 @@
   return rrep.GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionSR);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionSR)
+  ;
 
 TypeId DsrOptionSR::GetTypeId ()
 {
@@ -1389,7 +1395,8 @@
   return sourceRoute.GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerr);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionRerr)
+  ;
 
 TypeId DsrOptionRerr::GetTypeId ()
 {
@@ -1555,7 +1562,7 @@
   newSourceRoute.SetNodesAddress (nodeList);
   nextAddress = newSourceRoute.GetNodeAddress (nextAddressIndex);
 
-  // / to test if the next address is multicast or not
+  /// to test if the next address is multicast or not
   if (nextAddress.IsMulticast () || targetAddress.IsMulticast ())
     {
       m_dropTrace (p);
@@ -1568,7 +1575,8 @@
   return serializedSize;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionAckReq);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionAckReq)
+  ;
 
 TypeId DsrOptionAckReq::GetTypeId ()
 {
@@ -1623,7 +1631,8 @@
   return ackReq.GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DsrOptionAck);
+NS_OBJECT_ENSURE_REGISTERED (DsrOptionAck)
+  ;
 
 TypeId DsrOptionAck::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/dsr/model/dsr-options.h ns-3.19/src/dsr/model/dsr-options.h
--- ns-3.18.1/src/dsr/model/dsr-options.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-options.h	2013-12-20 09:44:50.000000000 -0800
@@ -104,37 +104,58 @@
   Ptr<Node> GetNode () const;
   /**
    * \brief Search for the ipv4 address in the node list.
+   *
+   * \param ipv4Address IPv4 address to search for
+   * \param destAddress IPv4 address in the list that we begin the search
+   * \param nodeList List of IPv4 addresses
    * \return true if contain ip address
    */
   bool ContainAddressAfter (Ipv4Address ipv4Address, Ipv4Address destAddress, std::vector<Ipv4Address> &nodeList);
   /**
    * \brief Cut the route from ipv4Address to the end of the route vector
+   *
+   * \param ipv4Address the address to begin cutting
+   * \param nodeList List of IPv4 addresses
    * \return the vector after the route cut
    */
   std::vector<Ipv4Address> CutRoute (Ipv4Address ipv4Address, std::vector<Ipv4Address> &nodeList);
   /**
-   * \brief Set the route to use for data packets
+   * \brief Set the route to use for data packets,
+   *        used by the option headers when sending data/control packets
+   *
+   * \param nextHop IPv4 address of the next hop
+   * \param srcAddress IPv4 address of the source
    * \return the route
-   * \used by the option headers when sending data/control packets
    */
   virtual Ptr<Ipv4Route> SetRoute (Ipv4Address nextHop, Ipv4Address srcAddress);
   /**
    * \brief Reverse the routes.
+   *
+   * \param vec List of IPv4 addresses
    * \return true if successfully reversed
    */
   bool ReverseRoutes  (std::vector<Ipv4Address>& vec);
   /**
    * \brief Search for the next hop in the route
+   *
+   * \param ipv4Address the IPv4 address of the node we are looking for its next hop address
+   * \param vec List of IPv4 addresses
    * \return the next hop address if found
    */
   Ipv4Address SearchNextHop (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
   /**
    * \brief Reverse search for the next hop in the route
+   *
+   * \param ipv4Address the IPv4 address of the node we are looking for its next hop address
+   * \param vec List of IPv4 addresses
    * \return the previous next hop address if found
    */
   Ipv4Address ReverseSearchNextHop (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
   /**
    * \brief Reverse search for the next two hop in the route
+   *
+   * \param ipv4Address the IPv4 address of the node we are looking for its next two hop address
+   * \param vec List of IPv4 addresses
    * \return the previous next two hop address if found
    */
   Ipv4Address ReverseSearchNextTwoHop  (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
@@ -144,34 +165,46 @@
   void PrintVector (std::vector<Ipv4Address>& vec);
   /**
    * \brief Check if the two vectors contain duplicate or not
+   *
+   * \param vec the first list of IPv4 addresses
+   * \param vec2 the second list of IPv4 addresses
    * \return true if contains duplicate
    */
   bool IfDuplicates (std::vector<Ipv4Address>& vec, std::vector<Ipv4Address>& vec2);
   /**
    * \brief Check if the route already contains the node ip address
+   *
+   * \param ipv4Address the IPv4 address that we are looking for
+   * \param vec List of IPv4 addresses
    * \return true if it already exists
    */
   bool CheckDuplicates (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
-  /*
+  /**
    * \brief Remove the duplicates from the route
+   *
+   * \param vec List of IPv4 addresses to be clean
    * \return the route after route shorten
    */
   void RemoveDuplicates (std::vector<Ipv4Address>& vec);
   /**
    * \brief Schedule the intermediate node route request broadcast
-   * \param the original packet
-   * \param rrepHeader The rrep header
+   * \param packet the original packet
+   * \param nodeList The list of IPv4 addresses
    * \param source address
    * \param destination address
    */
   void ScheduleReply (Ptr<Packet> &packet, std::vector<Ipv4Address> &nodeList, Ipv4Address &source, Ipv4Address &destination);
   /**
    * \brief Get the node id with Ipv4Address
+   *
+   * \param address IPv4 address to look for ID
    * \return the id of the node
    */
   uint32_t GetIDfromIP (Ipv4Address address);
   /**
    * \brief Get the node object with Ipv4Address
+   *
+   * \param ipv4Address IPv4 address of the node
    * \return the object of the node
    */
   Ptr<Node> GetNodeWithAddress (Ipv4Address ipv4Address);
@@ -181,9 +214,12 @@
    * Called from DsrRouting::Receive.
    * \param packet the packet
    * \param dsrP  the clean packet with payload
+   * \param ipv4Address the IPv4 address
+   * \param source IPv4 address of the source
    * \param ipv4Header the IPv4 header of packet received
    * \param protocol the protocol number of the up layer
    * \param isPromisc if the packet must be dropped
+   * \param promiscSource IPv4 address
    * \return the processed size
    */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource) = 0;
@@ -245,35 +281,13 @@
    * \brief Pad1 option number.
    */
   static const uint8_t OPT_NUMBER = 224;
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
-  /**
-   * \brief Constructor.
-   */
+
   DsrOptionPad1 ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~DsrOptionPad1 ();
-  /**
-   * \brief Get the option number.
-   * \return option number
-   */
+
   virtual uint8_t GetOptionNumber () const;
-  /**
-   * \brief Process method
-   *
-   * Called from DsrRouting::Receive.
-   * \param packet the packet
-   * \param dsrP  the clean packet with payload
-   * \param ipv4Header the IPv4 header of packet received
-   * \param protocol the protocol number of the up layer
-   * \param isPromisc if the packet must be dropped
-   * \return the processed size
-   */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource);
 };
 
@@ -288,35 +302,13 @@
    * \brief PadN option number.
    */
   static const uint8_t OPT_NUMBER = 0;
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
-  /**
-   * \brief Constructor.
-   */
+
   DsrOptionPadn ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~DsrOptionPadn ();
-  /**
-   * \brief Get the option number.
-   * \return option number
-   */
+
   virtual uint8_t GetOptionNumber () const;
-  /**
-   * \brief Process method
-   *
-   * Called from DsrRouting::Receive.
-   * \param packet the packet
-   * \param dsrP  the clean packet with payload
-   * \param ipv4Header the IPv4 header of packet received
-   * \param protocol the protocol number of the up layer
-   * \param isPromisc if the packet must be dropped
-   * \return the processed size
-   */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource);
 };
 
@@ -331,10 +323,7 @@
    * \brief Rreq option number.
    */
   static const uint8_t OPT_NUMBER = 1;
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
   /**
    * \brief Get the instance type ID.
@@ -349,22 +338,8 @@
    * \brief Destructor.
    */
   virtual ~DsrOptionRreq ();
-  /**
-   * \brief Get the option number.
-   * \return option number
-   */
+
   virtual uint8_t GetOptionNumber () const;
-  /**
-   * \brief Process method
-   *
-   * Called from DsrRouting::Receive.
-   * \param packet the packet
-   * \param dsrP  the clean packet with payload
-   * \param ipv4Header the IPv4 header of packet received
-   * \param protocol the protocol number of the up layer
-   * \param isPromisc if the packet must be dropped
-   * \return the processed size
-   */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource);
 
 private:
@@ -389,40 +364,18 @@
    * \brief Router alert option number.
    */
   static const uint8_t OPT_NUMBER = 2;
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
   /**
    * \brief Get the instance type ID.
    * \return instance type ID
    */
   virtual TypeId GetInstanceTypeId () const;
-  /**
-   * \brief Constructor.
-   */
+
   DsrOptionRrep ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~DsrOptionRrep ();
-  /**
-   * \brief Get the option number.
-   * \return option number
-   */
+
   virtual uint8_t GetOptionNumber () const;
-  /**
-   * \brief Process method
-   *
-   * Called from DsrRouting::Receive.
-   * \param packet the packet
-   * \param dsrP  the clean packet with payload
-   * \param ipv4Header the IPv4 header of packet received
-   * \param protocol the protocol number of the up layer
-   * \param isPromisc if the packet must be dropped
-   * \return the processed size
-   */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource);
 
 private:
@@ -447,40 +400,18 @@
    * \brief Source Route option number.
    */
   static const uint8_t OPT_NUMBER = 96;
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
   /**
    * \brief Get the instance type ID.
    * \return instance type ID
    */
   virtual TypeId GetInstanceTypeId () const;
-  /**
-   * \brief Constructor.
-   */
+
   DsrOptionSR ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~DsrOptionSR ();
-  /**
-   * \brief Get the option number.
-   * \return option number
-   */
+
   virtual uint8_t GetOptionNumber () const;
-  /**
-   * \brief Process method
-   *
-   * Called from DsrRouting::Receive.
-   * \param packet the packet
-   * \param dsrP  the clean packet with payload
-   * \param ipv4Header the IPv4 header of packet received
-   * \param protocol the protocol number of the up layer
-   * \param isPromisc if the packet must be dropped
-   * \return the processed size
-   */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource);
 
 private:
@@ -501,40 +432,18 @@
    * \brief Dsr Route Error option number.
    */
   static const uint8_t OPT_NUMBER = 3;
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
   /**
    * \brief Get the instance type ID.
    * \return instance type ID
    */
   virtual TypeId GetInstanceTypeId () const;
-  /**
-   * \brief Constructor.
-   */
+
   DsrOptionRerr ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~DsrOptionRerr ();
-  /**
-   * \brief Get the option number.
-   * \return option number
-   */
+
   virtual uint8_t GetOptionNumber () const;
-  /**
-   * \brief Process method
-   *
-   * Called from DsrRouting::Receive.
-   * \param packet the packet
-   * \param dsrP  the clean packet with payload
-   * \param ipv4Header the IPv4 header of packet received
-   * \param protocol the protocol number of the up layer
-   * \param isPromisc if the packet must be dropped
-   * \return the processed size
-   */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource);
   /**
    * \brief Do Send error message
@@ -570,40 +479,18 @@
    * \brief Dsr ack request option number.
    */
   static const uint8_t OPT_NUMBER = 160;
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
   /**
    * \brief Get the instance type ID.
    * \return instance type ID
    */
   virtual TypeId GetInstanceTypeId () const;
-  /**
-   * \brief Constructor.
-   */
+
   DsrOptionAckReq ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~DsrOptionAckReq ();
-  /**
-   * \brief Get the option number.
-   * \return option number
-   */
+
   virtual uint8_t GetOptionNumber () const;
-  /**
-   * \brief Process method
-   *
-   * Called from DsrRouting::Receive.
-   * \param packet the packet
-   * \param dsrP  the clean packet with payload
-   * \param ipv4Header the IPv4 header of packet received
-   * \param protocol the protocol number of the up layer
-   * \param isPromisc if the packet must be dropped
-   * \return the processed size
-   */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource);
 
 private:
@@ -628,40 +515,18 @@
    * \brief The Dsr Ack option number.
    */
   static const uint8_t OPT_NUMBER = 32;
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
   /**
    * \brief Get the instance type ID.
    * \return instance type ID
    */
   virtual TypeId GetInstanceTypeId () const;
-  /**
-   * \brief Constructor.
-   */
+
   DsrOptionAck ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~DsrOptionAck ();
-  /**
-   * \brief Get the option number.
-   * \return option number
-   */
+
   virtual uint8_t GetOptionNumber () const;
-  /**
-   * \brief Process method
-   *
-   * Called from DsrRouting::Receive.
-   * \param packet the packet
-   * \param dsrP  the clean packet with payload
-   * \param ipv4Header the IPv4 header of packet received
-   * \param protocol the protocol number of the up layer
-   * \param isPromisc if the packet must be dropped
-   * \return the processed size
-   */
   virtual uint8_t Process (Ptr<Packet> packet, Ptr<Packet> dsrP, Ipv4Address ipv4Address, Ipv4Address source, Ipv4Header const& ipv4Header, uint8_t protocol, bool& isPromisc, Ipv4Address promiscSource);
 
 private:
diff -Naur ns-3.18.1/src/dsr/model/dsr-passive-buff.cc ns-3.19/src/dsr/model/dsr-passive-buff.cc
--- ns-3.18.1/src/dsr/model/dsr-passive-buff.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-passive-buff.cc	2013-12-20 09:44:50.000000000 -0800
@@ -41,7 +41,8 @@
 namespace ns3 {
 namespace dsr {
 
-NS_OBJECT_ENSURE_REGISTERED (PassiveBuffer);
+NS_OBJECT_ENSURE_REGISTERED (PassiveBuffer)
+  ;
 
 TypeId PassiveBuffer::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/dsr/model/dsr-passive-buff.h ns-3.19/src/dsr/model/dsr-passive-buff.h
--- ns-3.18.1/src/dsr/model/dsr-passive-buff.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-passive-buff.h	2013-12-20 09:44:50.000000000 -0800
@@ -45,7 +45,19 @@
 class PassiveBuffEntry
 {
 public:
-  // / c-tor
+  /**
+   * Construct a PassiveBuffEntry with the given parameters
+   *
+   * \param pa packet
+   * \param d IPv4 address of the destination
+   * \param s IPv4 address of the source
+   * \param n IPv4 address of the next hop node
+   * \param i ID
+   * \param f fragment offset
+   * \param seg number of segments left
+   * \param exp expiration time
+   * \param p protocol number
+   */
   PassiveBuffEntry (Ptr<const Packet> pa = 0, Ipv4Address d = Ipv4Address (), Ipv4Address s = Ipv4Address (),
                   Ipv4Address n = Ipv4Address (), uint16_t i = 0, uint16_t f = 0, uint8_t seg = 0, Time exp = Simulator::Now (),
                   uint8_t p = 0)
@@ -68,7 +80,7 @@
   {
     return ((m_packet == o.m_packet) && (m_source == o.m_source) && (m_nextHop == o.m_nextHop) && (m_dst == o.m_dst) && (m_expire == o.m_expire));
   }
-  // /\name Fields
+  ///\name Fields
   // \{
   Ptr<const Packet> GetPacket () const
   {
@@ -144,21 +156,21 @@
   }
   // \}
 private:
-  // / Data packet
+  /// Data packet
   Ptr<const Packet> m_packet;
-  // / Destination address
+  /// Destination address
   Ipv4Address m_dst;
-  // / Source address
+  /// Source address
   Ipv4Address m_source;
-  // / Nexthop address
+  /// Nexthop address
   Ipv4Address m_nextHop;
-  // /
+  ///
   uint16_t m_identification;
   uint16_t m_fragmentOffset;
   uint8_t m_segsLeft;
-  // / Expire time for queue entry
+  /// Expire time for queue entry
   Time m_expire;
-  // / The protocol number
+  /// The protocol number
   uint8_t m_protocol;
 };
 
@@ -170,31 +182,23 @@
 class PassiveBuffer  : public Object
 {
 public:
-  // / c-tor
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
-  /**
-   * \brief Constructor.
-   */
+
   PassiveBuffer ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~PassiveBuffer ();
-  // / Push entry in queue, if there is no entry with the same packet and destination address in queue.
+
+  /// Push entry in queue, if there is no entry with the same packet and destination address in queue.
   bool Enqueue (PassiveBuffEntry & entry);
-  // / Return first found (the earliest) entry for given destination
+  /// Return first found (the earliest) entry for given destination
   bool Dequeue (Ipv4Address dst, PassiveBuffEntry & entry);
-  // / Finds whether a packet with destination dst exists in the queue
+  /// Finds whether a packet with destination dst exists in the queue
   bool Find (Ipv4Address dst);
-  // / Check if all the entries in passive buffer entry is all equal or not
+  /// Check if all the entries in passive buffer entry is all equal or not
   bool AllEqual (PassiveBuffEntry & entry);
-  // / Number of entries
+  /// Number of entries
   uint32_t GetSize ();
-  // /\name Fields
+  ///\name Fields
   // \{
   uint32_t GetMaxQueueLen () const
   {
@@ -215,19 +219,19 @@
   // \}
 
 private:
-  // / The send buffer to cache unsent packet
+  /// The send buffer to cache unsent packet
   std::vector<PassiveBuffEntry> m_passiveBuffer;
-  // / Remove all expired entries
+  /// Remove all expired entries
   void Purge ();
-  // / Notify that packet is dropped from queue by timeout
+  /// Notify that packet is dropped from queue by timeout
   void Drop (PassiveBuffEntry en, std::string reason);
-  // / Notify that packet is dropped from queue by timeout
+  /// Notify that packet is dropped from queue by timeout
   void DropLink (PassiveBuffEntry en, std::string reason);
-  // / The maximum number of packets that we allow a routing protocol to buffer.
+  /// The maximum number of packets that we allow a routing protocol to buffer.
   uint32_t m_maxLen;
-  // / The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
+  /// The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
   Time m_passiveBufferTimeout;
-  // / Check if the send buffer entry is the same or not
+  /// Check if the send buffer entry is the same or not
   static bool LinkEqual (PassiveBuffEntry en, const std::vector<Ipv4Address> link)
   {
     return ((en.GetSource () == link[0]) && (en.GetNextHop () == link[1]));
diff -Naur ns-3.18.1/src/dsr/model/dsr-rcache.cc ns-3.19/src/dsr/model/dsr-rcache.cc
--- ns-3.18.1/src/dsr/model/dsr-rcache.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-rcache.cc	2013-12-20 09:44:50.000000000 -0800
@@ -131,7 +131,8 @@
      << "\t";
 }
 
-NS_OBJECT_ENSURE_REGISTERED (RouteCache);
+NS_OBJECT_ENSURE_REGISTERED (RouteCache)
+  ;
 
 TypeId RouteCache::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/dsr/model/dsr-rcache.h ns-3.19/src/dsr/model/dsr-rcache.h
--- ns-3.18.1/src/dsr/model/dsr-rcache.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-rcache.h	2013-12-20 09:44:50.000000000 -0800
@@ -155,14 +155,8 @@
 class NodeStab
 {
 public:
-  /**
-   * \brief Constructor
-   */
-//  NodeStab ();
+
   NodeStab (Time nodeStab = Simulator::Now ());
-  /**
-   * \brief Destructor
-   */
   virtual ~NodeStab ();
 
   void SetNodeStability (Time nodeStab)
@@ -182,18 +176,13 @@
 public:
   typedef std::vector<Ipv4Address> IP_VECTOR;                ///< Define the vector to hold Ip address
   typedef std::vector<Ipv4Address>::iterator Iterator;       ///< Define the iterator
-  // / c-tor
-  /**
-   * \brief Constructor
-   */
+
   RouteCacheEntry (IP_VECTOR const  & ip = IP_VECTOR (), Ipv4Address dst = Ipv4Address (), Time exp = Simulator::Now ());
-  /**
-   * \brief Destructor
-   */
   virtual ~RouteCacheEntry ();
-  // / Mark entry as "down" (i.e. disable it)
+
+  /// Mark entry as "down" (i.e. disable it)
   void Invalidate (Time badLinkLifetime);
-  // /\name Fields
+  ///\name Fields
   // \{
   void SetUnidirectional (bool u)
   {
@@ -278,23 +267,14 @@
 private:
 
   Timer m_ackTimer;                                                     ///< RREP_ACK timer
-
   Ipv4Address m_dst;                                                    ///< The destination Ip address
-
   IP_VECTOR m_path;                                                     ///< brief The IP address constructed route
-
   Time m_expire;                                                        ///< Expire time for queue entry
-
   Ipv4InterfaceAddress m_iface;                                         ///< Output interface address
-
   uint8_t m_reqCount;                                                   ///< Number of route requests
-
   bool m_blackListState;                                                ///< Indicate if this entry is in "blacklist"
-
   Time m_blackListTimeout;                                              ///< Time for which the node is put into the blacklist
-
   Ptr<Ipv4Route> m_ipv4Route;                                           ///< The Ipv4 route
-
   Ptr<Ipv4> m_ipv4;                                                     ///< The Ipv4 layer 3
 };
 /**
@@ -305,20 +285,12 @@
 class RouteCache : public Object
 {
 public:
-  // / Default c-tor
-/**
- * \ingroup dsr
- * \brief The Route Cache used by DSR
- */
+
   static TypeId GetTypeId ();
-  /**
-   * \brief Constructor.
-   */
+
   RouteCache ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~RouteCache ();
+
   /**
    * \brief Remove the aged route cache entries when the route cache is full
    */
@@ -327,7 +299,7 @@
    * \brief Define the vector of route entries.
    */
   typedef std::list<RouteCacheEntry::IP_VECTOR> routeVector;
-  // /\name Fields
+  ///\name Fields
   // \{
   bool GetSubRoute () const
   {
@@ -413,7 +385,6 @@
   /**
    * \brief Update route cache entry if it has been recently used and successfully delivered the data packet
    * \param dst destination address of the route
-   * \param vec the route vector
    * \return true in success
    */
   bool UpdateRouteEntry (Ipv4Address dst);
@@ -425,8 +396,8 @@
   bool AddRoute (RouteCacheEntry & rt);
   /**
    * \brief Lookup route cache entry with destination address dst
-   * \param dst destination address
-   * \param rt entry with destination address dst, if exists
+   * \param id destination address
+   * \param rt entry with destination address id, if exists
    * \return true on success
    */
   bool LookupRoute (Ipv4Address id, RouteCacheEntry & rt);
@@ -460,14 +431,14 @@
    * \param node This node's ip address
    */
   void DeleteAllRoutesIncludeLink (Ipv4Address errorSrc, Ipv4Address unreachNode, Ipv4Address node);
-  // / Delete all entries from routing table
+  /// Delete all entries from routing table
   void Clear ()
   {
     m_routeEntryVector.erase (m_routeEntryVector.begin (), m_routeEntryVector.end ());
   }
-  // / Delete all outdated entries and invalidate valid entry if Lifetime is expired
+  /// Delete all outdated entries and invalidate valid entry if Lifetime is expired
   void Purge ();
-  // / Print route cache
+  /// Print route cache
   void Print (std::ostream &os);
 
   //------------------------------------------------------------------------------------------
@@ -484,7 +455,7 @@
   /**
    * The following code handles link-layer acks
    */
-  // / Neighbor description
+  /// Neighbor description
   struct Neighbor
   {
     Ipv4Address m_neighborAddress;
@@ -549,7 +520,7 @@
   {
     return m_txErrorCallback;
   }
-  // /\name Handle link failure callback
+  ///\name Handle link failure callback
   // \{
   void SetCallback (Callback<void, Ipv4Address, uint8_t > cb)
   {
@@ -625,16 +596,16 @@
 
 public:
   /**
-   * \brief dijsktra algorithm to get the best route from m_netGraph and update the m_bestRoutesTable_link
-   * \when current graph information has changed
-   * \param The type of the cache
+   * \brief Dijsktra algorithm to get the best route from m_netGraph and update the m_bestRoutesTable_link
+   * when current graph information has changed
+   * \param type The type of the cache
    */
   void SetCacheType (std::string type);
   bool IsLinkCache ();
   bool AddRoute_Link (RouteCacheEntry::IP_VECTOR nodelist, Ipv4Address node);
   /**
    *  \brief USE MAXWEIGHT TO REPRESENT MAX; USE BROADCAST ADDRESS TO REPRESENT NULL PRECEEDING ADDRESS
-   *  \param The source address the routes based on
+   *  \param source The source address the routes based on
    */
   void RebuildBestRouteTable (Ipv4Address source);
   void PurgeLinkNode ();
diff -Naur ns-3.18.1/src/dsr/model/dsr-routing.cc ns-3.19/src/dsr/model/dsr-routing.cc
--- ns-3.18.1/src/dsr/model/dsr-routing.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-routing.cc	2013-12-20 09:44:50.000000000 -0800
@@ -79,7 +79,8 @@
 namespace ns3 {
 namespace dsr {
 
-NS_OBJECT_ENSURE_REGISTERED (DsrRouting);
+NS_OBJECT_ENSURE_REGISTERED (DsrRouting)
+  ;
 
 /* see http://www.iana.org/assignments/protocol-numbers */
 const uint8_t DsrRouting::PROT_NUMBER = 48;
diff -Naur ns-3.18.1/src/dsr/model/dsr-routing.h ns-3.19/src/dsr/model/dsr-routing.h
--- ns-3.18.1/src/dsr/model/dsr-routing.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-routing.h	2013-12-20 09:44:50.000000000 -0800
@@ -124,7 +124,7 @@
   void SetNode (Ptr<Node> node);
   /**
    * \brief Set the route cache.
-   * \param the route cache to set
+   * \param r the route cache to set
    */
   void SetRouteCache (Ptr<dsr::RouteCache> r);
   /**
@@ -134,7 +134,7 @@
   Ptr<dsr::RouteCache> GetRouteCache () const;
   /**
    * \brief Set the node.
-   * \param the request table to set
+   * \param r the request table to set
    */
   void SetRequestTable (Ptr<dsr::RreqTable> r);
   /**
@@ -144,7 +144,7 @@
   Ptr<dsr::RreqTable> GetRequestTable () const;
   /**
    * \brief Set the node.
-   * \param the passive buffer to set
+   * \param r the passive buffer to set
    */
   void SetPassiveBuffer (Ptr<dsr::PassiveBuffer> r);
   /**
@@ -153,7 +153,7 @@
     */
   Ptr<dsr::PassiveBuffer> GetPassiveBuffer () const;
 
-  ///\functions used to direct to route cache
+  /// functions used to direct to route cache
   //\{
   bool IsLinkCache ();
   void UseExtends (RouteCacheEntry::IP_VECTOR rt);
@@ -172,31 +172,37 @@
   void ConnectCallbacks ();
   /**
     * \brief Get the netdevice from the context.
+    * \param context context
     * \return the netdevice we are looking for
     */
   Ptr<NetDevice> GetNetDeviceFromContext (std::string context);
   /**
     * \brief Get the elements from the tracing context.
+    * \param context context
     * \return the elements we are looking for
     */
   std::vector<std::string> GetElementsFromContext (std::string context);
   /**
     * \brief Get the node id from ip address.
+    * \param address IPv4 address
     * \return the node id
     */
   uint16_t GetIDfromIP (Ipv4Address address);
   /**
     * \brief Get the ip address from id.
+    * \param id unique ID
     * \return the ip address for the id
     */
   Ipv4Address GetIPfromID (uint16_t id);
   /**
     * \brief Get the Ip address from mac address.
+    * \param address Mac48Address
     * \return the ip address
     */
   Ipv4Address GetIPfromMAC (Mac48Address address);
   /**
     * \brief Get the node with give ip address.
+    * \param ipv4Address IPv4 address
     * \return the node associated with the ip address
     */
   Ptr<Node> GetNodeWithAddress (Ipv4Address ipv4Address);
@@ -206,6 +212,8 @@
   void PrintVector (std::vector<Ipv4Address>& vec);
   /**
     * \brief Get the next hop of the route.
+    * \param ipv4Address
+    * \param vec Route
     * \return the next hop address of the route
     */
   Ipv4Address SearchNextHop (Ipv4Address ipv4Address, std::vector<Ipv4Address>& vec);
@@ -230,13 +238,16 @@
                        Ipv4Address destination,
                        uint8_t protocol);
   /**
-   * \brief Set the route to use for data packets
+   * \brief Set the route to use for data packets,
+   *        used by the option headers when sending data/control packets
+   * \param nextHop next hop IPv4 address
+   * \param srcAddress IPv4 address of the source
    * \return the route
-   * \used by the option headers when sending data/control packets
    */
   Ptr<Ipv4Route> SetRoute (Ipv4Address nextHop, Ipv4Address srcAddress);
   /**
    * \brief Set the priority of the packet in network queue
+   * \param messageType Message type
    * \return the priority value
    */
   uint32_t GetPriority (DsrMessageType messageType);
@@ -378,28 +389,28 @@
                            uint8_t protocol);
   /**
    * \brief Send the error request packet
-   * \param the route error header
-   * \param the protocol number
+   * \param rerr the route error header
+   * \param protocol the protocol number
    */
   void SendErrorRequest (DsrOptionRerrUnreachHeader &rerr, uint8_t protocol);
   /**
    * \brief Forward the route request if the node is not the destination
-   * \param the original packet
+   * \param packet the original packet
    * \param source address
    */
   void SendRequest (Ptr<Packet> packet,
                     Ipv4Address source);
   /**
    * \brief Schedule the intermediate route request
-   * \param the original packet
-   * \param source The source address
-   * \param destination The destination address
+   * \param packet the original packet
    */
   void ScheduleInterRequest (Ptr<Packet> packet);
   /**
    * \brief Send the gratuitous reply
    * \param replyTo The destination address to send the reply to
    * \param replyFrom The source address sending the reply
+   * \param nodeList Route
+   * \param protocol the protocol number
    */
   void SendGratuitousReply (Ipv4Address replyTo,
                             Ipv4Address replyFrom,
@@ -407,6 +418,11 @@
                             uint8_t protocol);
   /**
    * Send the route reply back to the request originator with the cumulated route
+   *
+   * \param packet the original packet
+   * \param source IPv4 address of the source (i.e. request originator)
+   * \param nextHop IPv4 address of the next hop
+   * \param route Route
    */
   void SendReply (Ptr<Packet> packet,
                   Ipv4Address source,
@@ -415,6 +431,11 @@
   /**
    * this is a generating the initial route reply from the destination address, a random delay time
    * [0, m_broadcastJitter] is used before unicasting back the route reply packet
+   *
+   * \param packet the original packet
+   * \param source IPv4 address of the source (i.e. request originator)
+   * \param nextHop IPv4 address of the next hop
+   * \param route Route
    */
   void ScheduleInitialReply (Ptr<Packet> packet,
                              Ipv4Address source,
@@ -422,6 +443,11 @@
                              Ptr<Ipv4Route> route);
   /**
    * Schedule the cached reply to a random start time to avoid possible route reply storm
+   *
+   * \param packet the original packet
+   * \param source IPv4 address of the source (i.e. request originator)
+   * \param destination IPv4 address of the destination
+   * \param route Route
    */
   void ScheduleCachedReply (Ptr<Packet> packet,
                             Ipv4Address source,
@@ -430,6 +456,13 @@
                             double hops);
   /**
    * Send network layer acknowledgment back to the earlier hop to notify the receipt of data packet
+   *
+   * \param ackId ACK ID
+   * \param destination IPv4 address of the immediate ACK receiver
+   * \param realSrc IPv4 address of the real source
+   * \param realDst IPv4 address of the real destination
+   * \param protocol the protocol number
+   * \param route Route
    */
   void SendAck   (uint16_t ackId,
                   Ipv4Address destination,
@@ -441,6 +474,7 @@
    * \param p packet to forward up
    * \param header IPv4 Header information
    * \param incomingInterface the Ipv4Interface on which the packet arrived
+   * \return receive status
    *
    * Called from lower-level layers to send the packet up
    * in the stack.
@@ -453,6 +487,7 @@
    * \param p packet to forward up
    * \param header IPv6 Header information
    * \param incomingInterface the Ipv6Interface on which the packet arrived
+   * \return receive status
    *
    * Called from lower-level layers to send the packet up
    * in the stack.  Not implemented (IPv6).
@@ -470,9 +505,10 @@
    * Called from Ipv4L3Protocol::Receive.
    *
    * \param packet the packet
-   * \param offset the offset of the extension to process
+   * \param ipv4Header IPv4 header of the packet
    * \param dst destination address of the packet received (i.e. us)
    * \param nextHeader the next header
+   * \param protocol the protocol number
    * \param isDropped if the packet must be dropped
    * \return the size processed
    */
@@ -496,10 +532,21 @@
   void CancelRreqTimer (Ipv4Address dst, bool isRemove);
   /**
    * \brief Schedule the route request retry.
-   * \param dst The dst address of the route request
+   * \param packet the original packet
+   * \param address List of IPv4 addresses
+   * \param nonProp flag if RREQ is non-propagating
+   * \param requestId Unique request ID
+   * \param protocol the protocol number
    */
   void ScheduleRreqRetry (Ptr<Packet> packet, std::vector<Ipv4Address> address, bool nonProp, uint32_t requestId, uint8_t protocol);
-  // / Handle route discovery timer
+  /**
+   * Handle route discovery timer
+   *
+   * \param packet the original packet
+   * \param address List of IPv4 addresses
+   * \param requestId Unique request ID
+   * \param protocol the protocol number
+   */
   void RouteRequestTimerExpire (Ptr<Packet> packet, std::vector<Ipv4Address> address, uint32_t requestId, uint8_t protocol);
 
  /**
@@ -548,6 +595,7 @@
    * \param from The from address we received the packet
    * \param to The address this packet is destined for
    * \param packetType The dsr packet type, 0 is for control packet, 1 for data packet
+   * \return true if the packet was processed, false otherwise
    */
   bool PromiscReceive (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol, const Address &from,
                        const Address &to, NetDevice::PacketType packetType);
diff -Naur ns-3.18.1/src/dsr/model/dsr-rreq-table.cc ns-3.19/src/dsr/model/dsr-rreq-table.cc
--- ns-3.18.1/src/dsr/model/dsr-rreq-table.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-rreq-table.cc	2013-12-20 09:44:50.000000000 -0800
@@ -39,7 +39,8 @@
 namespace ns3 {
 namespace dsr {
 
-NS_OBJECT_ENSURE_REGISTERED (RreqTable);
+NS_OBJECT_ENSURE_REGISTERED (RreqTable)
+  ;
 
 TypeId RreqTable::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/dsr/model/dsr-rreq-table.h ns-3.19/src/dsr/model/dsr-rreq-table.h
--- ns-3.18.1/src/dsr/model/dsr-rreq-table.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-rreq-table.h	2013-12-20 09:44:50.000000000 -0800
@@ -43,18 +43,27 @@
 namespace ns3 {
 namespace dsr {
 
+/**
+ * State of link
+ */
 enum LinkStates
 {
-  PROBABLE = 0,            // !< PROBABLE
-  QUESTIONABLE = 1,        // !< QUESTIONABLE
+  PROBABLE = 0,            //!< PROBABLE
+  QUESTIONABLE = 1,        //!< QUESTIONABLE
 };
-// / BlackList description
+/// BlackList description
 struct BlackList
 {
-  Ipv4Address m_neighborAddress;
-  Time m_expireTime;
-  LinkStates m_linkStates;
+  Ipv4Address m_neighborAddress; //!< IPv4 address of the black-listed neighbor
+  Time m_expireTime;             //!< Expire time in the black list
+  LinkStates m_linkStates;       //!< State of the link
 
+  /**
+   * Construct a BlackList with the given parameters
+   *
+   * \param ip IPv4 address of the neighbor
+   * \param t expire time for the black list entry
+   */
   BlackList (Ipv4Address ip, Time t)
     : m_neighborAddress (ip),
       m_expireTime (t),
@@ -67,8 +76,8 @@
  */
 struct RreqTableEntry
 {
-  uint32_t m_reqNo;
-  Time m_expire;
+  uint32_t m_reqNo; //!< Route request number
+  Time m_expire;    //!< Expire time
 };
 /**
  * The request entry for intermediate nodes to check if they have received this request or not
@@ -77,14 +86,20 @@
 class ReceivedRreqEntry
 {
 public:
-  // / c-tor
+  /**
+   * Construct a ReceivedRreqEntry with the given parameters
+   *
+   * \param d IPv4 address of the destination
+   * \param i identification
+   */
   ReceivedRreqEntry (Ipv4Address d = Ipv4Address (), uint16_t i = 0)
     : m_destination (d),
       m_identification (i)
   {
   }
   /**
-   * \brief Compare send buffer entries
+   * \brief Compare send buffer entries (destination address and identification)
+   * \param o another ReceivedRreqEntry
    * \return true if equal
    */
   bool operator== (ReceivedRreqEntry const & o) const
@@ -92,46 +107,89 @@
     return ((m_destination == o.m_destination) && (m_identification == o.m_identification)
            );
   }
-  // /\name Fields
-  // \{
+
+  /**
+   * Return IPv4 address of the destination
+   *
+   * \return IPv4 address of the destination
+   */
   Ipv4Address GetDestination () const
   {
     return m_destination;
   }
+  /**
+   * Set IPv4 address of the destination
+   *
+   * \param d IPv4 address of the destination
+   */
   void SetDestination (Ipv4Address d)
   {
     m_destination = d;
   }
+  /**
+   * Return IPv4 address of the source
+   *
+   * \return IPv4 address of the source
+   */
   Ipv4Address GetSource () const
   {
     return m_source;
   }
+  /**
+   * Set IPv4 address of the source
+   *
+   * \param s IPv4 address of the source
+   */
   void SetSource (Ipv4Address s)
   {
     m_source = s;
   }
+  /**
+   * Return identification
+   *
+   * \return identification
+   */
   uint16_t GetIdentification () const
   {
     return m_identification;
   }
+  /**
+   * Set identification
+   *
+   * \param i identification
+   */
   void SetIdentification (uint16_t i)
   {
     m_identification = i;
   }
+  /**
+   * Set expire time for the RREQ entry.
+   * Note that the parameter is duration but
+   * the stored value is the absolute time.
+   *
+   * \param exp duration before expire
+   */
   void SetExpireTime (Time exp)
   {
     m_expire = exp + Simulator::Now ();
   }
+  /**
+   * Return the remaining time before the RREQ entry expires.
+   * Note that we return the remaining time but the stored
+   * value is the absolute time.
+   *
+   * \return the remaining time before the RREQ entry expires
+   */
   Time GetExpireTime () const
   {
     return m_expire - Simulator::Now ();
   }
   // \}
 private:
-    Ipv4Address m_destination;
-    Ipv4Address m_source;
-    uint16_t m_identification;
-    Time m_expire;
+  Ipv4Address m_destination; //!< IPv4 address of the destinaton
+  Ipv4Address m_source;      //!< IPv4 address of the source
+  uint16_t m_identification; //!< Route request identification
+  Time m_expire;             //!< Route request expire time
 };
 
 /**
@@ -141,81 +199,122 @@
 class RreqTable  : public Object
 {
 public:
-  // / c-tor
-  /**
-   * \brief Get the type identificator.
-   * \return type identificator
-   */
+
   static TypeId GetTypeId ();
-  /**
-   * \brief Constructor.
-   */
+
   RreqTable ();
-  /**
-   * \brief Destructor.
-   */
   virtual ~RreqTable ();
 
-  // /\name Fields
-  // \{
+  /**
+   * Set the initial discovert hop limit
+   *
+   * \param hl the initial discovert hop limit
+   */
   void SetInitHopLimit (uint32_t hl)
   {
     m_initHopLimit = hl;
   }
+  /**
+   * Return the initial discovert hop limit
+   *
+   * \return the initial discovert hop limit
+   */
   uint32_t GetInitHopLimit () const
   {
     return m_initHopLimit;
   }
+  /**
+   * Set the maximum number of request entries in
+   * the request table.
+   *
+   * \param rt the maximum number of request entries
+   */
   void SetRreqTableSize (uint32_t rt)
   {
     m_requestTableSize = rt;
   }
+  /**
+   * Return the maximum number of request entries in
+   * the request table.
+   *
+   * \return the maximum number of request entries
+   */
   uint32_t GetRreqTableSize () const
   {
     return m_requestTableSize;
   }
+  /**
+   * Set the maximum number of request source Ids in
+   * the request table
+   *
+   * \param id the maximum number of request source Ids
+   */
   void SetRreqIdSize (uint32_t id)
   {
     m_requestIdSize = id;
   }
+  /**
+   * Return the maximum number of request source Ids in
+   * the request table
+   *
+   * \return the maximum number of request source Ids
+   */
   uint32_t GetRreqIdSize () const
   {
     return m_requestIdSize;
   }
+  /**
+   * Set the maximum number of request Ids in
+   * the request table for a single destination.
+   *
+   * \param uid the maximum number of request Ids
+   */
   void SetUniqueRreqIdSize (uint32_t uid)
   {
     m_maxRreqId = uid;
   }
+  /**
+   * Return the maximum number of request Ids in
+   * the request table for a single destination.
+   *
+   * \return the maximum number of request Ids
+   */
   uint32_t GetUniqueRreqIdSize () const
   {
     return m_maxRreqId;
   }
 
-  // \}
-  // / Remove the least used entry
+  /// Remove the least used entry
   void RemoveLeastExpire (std::map<Ipv4Address, RreqTableEntry > & rreqDstMap);
-  // / Find the entry in the route request queue to see if already exists
+  /// Find the entry in the route request queue to see if already exists
   void FindAndUpdate (Ipv4Address dst);
-  // / Remove route request entry for dst
+  /// Remove route request entry for dst
   void RemoveRreqEntry (Ipv4Address dst);
-  // / Get the request count number for one destination address
+  /// Get the request count number for one destination address
   uint32_t GetRreqCnt (Ipv4Address dst);
-  //----------------------------------------------------------------------------------------------------------
+
   /**
-   * The following code generates new request id for each destination
+   * The following code generates new request id for each destination.
+   * Check for duplicate ids and save new entries if the id is not present in the table.
+   *
+   * \param dst IPv4 address of the destination
+   * \return id
    */
-  // / Check for duplicate ids and save new entries if the id is not present in the table
   uint32_t CheckUniqueRreqId (Ipv4Address dst);
-  // / Get the request id size
+  /**
+   * Get the request id size
+   *
+   * \return the request id size
+   */
   uint32_t GetRreqSize ();
-  // ---------------------------------------------------------------------------------------------------------
+
   /**
    * set the unidirectional entry as QUESTIONABLE state
    */
   void Invalidate ();
   /**
    * \brief Verify if entry is unidirectional or not(e.g. add this neighbor to "blacklist" for blacklistTimeout period)
-   * \param neighbor - neighbor address link to which assumed to be unidirectional
+   * \param neighbor neighbor address link to which assumed to be unidirectional
    * \return true on success
    */
   BlackList* FindUnidirectional (Ipv4Address neighbor);
@@ -226,50 +325,59 @@
    * \return true on success
    */
   bool MarkLinkAsUnidirectional (Ipv4Address neighbor, Time blacklistTimeout);
-  ///< Remove all expired black list entries
+  /**
+   * Remove all expired black list entries
+   */
   void PurgeNeighbor ();
-  // ----------------------------------------------------------------------------------------------------------
+
   /**
    * Find the source request entry in the route request queue, return false if not found
    * \param src the source address we just received the source request
    * \param dst the destination address the request is targeted at
    * \param id the identification number for this request
+   * \return true if found, false otherwise
    */
   bool FindSourceEntry (Ipv4Address src, Ipv4Address dst, uint16_t id);
 
 private:
-  // / The max request period among requests
+  /// The max request period among requests
   Time  MaxRequestPeriod;
-  // / The original request period
+  /// The original request period
   Time  RequestPeriod;
-  // / The non-propagaton request timeout
+  /// The non-propagaton request timeout
   Time  NonpropRequestTimeout;
-  // / The source route entry expire time
+  /// The source route entry expire time
   Time m_rreqEntryExpire;
-  // / The initial hop limit
+  /// The initial hop limit
   uint32_t m_initHopLimit;
-  // / The request table size
+  /// The request table size
   uint32_t m_requestTableSize;
-  // / The request source id size
+  /// The request source id size
   uint32_t m_requestIdSize;
-  // / The unique request id for any destination
+  /// The unique request id for any destination
   uint32_t m_maxRreqId;
-  // / The state of the unidirectional link
+  /// The state of the unidirectional link
   LinkStates m_linkStates;
-  // / Map of entries
+  /// Map of entries
   std::list<ReceivedRreqEntry> m_sourceRequests;
-  // / The id cache to ensure all the ids are unique, it is used when sending out route request
+  /// The id cache to ensure all the ids are unique, it is used when sending out route request
   std::map<Ipv4Address, uint32_t> m_rreqIdCache;
-  // / The cache to save route request table entries indexed with destination address
+  /// The cache to save route request table entries indexed with destination address
   std::map<Ipv4Address, RreqTableEntry > m_rreqDstMap;
-  // / The cache to ensure all the route request from unique source
+  /// The cache to ensure all the route request from unique source
   std::map<Ipv4Address, std::list<ReceivedRreqEntry> > m_sourceRreqMap;
 
-  // / The Black list
+  /// The Black list
   std::vector<BlackList> m_blackList;
-  // / Check if the entry is expired or not
+  /// Check if the entry is expired or not
   struct IsExpired
   {
+    /**
+     * Check if the entry is expired
+     *
+     * \param b BlackList entry
+     * \return true if expired, false otherwise
+     */
     bool operator() (const struct BlackList & b) const
     {
       return (b.m_expireTime < Simulator::Now ());
diff -Naur ns-3.18.1/src/dsr/model/dsr-rsendbuff.h ns-3.19/src/dsr/model/dsr-rsendbuff.h
--- ns-3.18.1/src/dsr/model/dsr-rsendbuff.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/dsr/model/dsr-rsendbuff.h	2013-12-20 09:44:50.000000000 -0800
@@ -45,7 +45,14 @@
 class SendBuffEntry
 {
 public:
-  // / c-tor
+  /**
+   * Construct SendBuffEntry with the given parameters.
+   *
+   * \param pa packet
+   * \param d destination address
+   * \param exp expiration time
+   * \param p protocol number
+   */
   SendBuffEntry (Ptr<const Packet> pa = 0, Ipv4Address d = Ipv4Address (),
                  Time exp = Simulator::Now (), uint8_t p = 0)
     : m_packet (pa),
@@ -56,6 +63,7 @@
   }
   /**
    * Compare send buffer entries
+   * \param o another SendBuffEntry
    * \return true if equal
    */
   bool operator== (SendBuffEntry const & o) const
@@ -98,13 +106,13 @@
   }
   // \}
 private:
-  // / Data packet
+  /// Data packet
   Ptr<const Packet> m_packet;
-  // / Destination address
+  /// Destination address
   Ipv4Address m_dst;
-  // / Expire time for queue entry
+  /// Expire time for queue entry
   Time m_expire;
-  // / The protocol number
+  /// The protocol number
   uint8_t m_protocol;
 };
 
@@ -116,40 +124,93 @@
 class SendBuffer
 {
 public:
-  // / Default c-tor
+  /**
+   * Default constructor
+   */
   SendBuffer ()
   {
   }
-  // / Push entry in queue, if there is no entry with the same packet and destination address in queue.
+  /**
+   * Push entry in queue, if there is no entry with
+   * the same packet and destination address in queue.
+   *
+   * \param entry SendBuffEntry to put in the queue
+   * \return true if successfully enqueued,
+   *         false otherwise
+   */
   bool Enqueue (SendBuffEntry & entry);
-  // / Return first found (the earliest) entry for given destination
+  /**
+   * Return first found (the earliest) entry for
+   * the given destination.
+   *
+   * \param dst IPv4 address of the destination
+   * \param entry pointer to entry to return
+   * \return true if successfully dequeued,
+   *         false otherwise
+   */
   bool Dequeue (Ipv4Address dst, SendBuffEntry & entry);
-  // / Remove all packets with destination IP address dst
+  /**
+   * Remove all packets with destination IP address dst
+   *
+   * \param dst IPv4 address of the destination
+   */
   void DropPacketWithDst (Ipv4Address dst);
-  // / Finds whether a packet with destination dst exists in the queue
+  /**
+   * Check if a packet with destination dst exists in the queue
+   *
+   * \param dst IPv4 address of the destination
+   * \return true if found, false otherwise
+   */
   bool Find (Ipv4Address dst);
-  // / Number of entries
+  /**
+   * Number of entries
+   *
+   * \return the number of entries in the queue
+   */
   uint32_t GetSize ();
-  // /\name Fields
-  // \{
+  /**
+   * Return the maximum queue length
+   *
+   * \return the maximum queue length
+   */
   uint32_t GetMaxQueueLen () const
   {
     return m_maxLen;
   }
+  /**
+   * Set the maximum queue length
+   *
+   * \param len the maximum queue length
+   */
   void SetMaxQueueLen (uint32_t len)
   {
     m_maxLen = len;
   }
+  /**
+   * Return the entry lifetime in the queue
+   *
+   * \return the entry lifetime in the queue
+   */
   Time GetSendBufferTimeout () const
   {
     return m_sendBufferTimeout;
   }
+  /**
+   * Set the entry lifetime in the queue
+   *
+   * \param t the entry lifetime in the queue
+   */
   void SetSendBufferTimeout (Time t)
   {
     m_sendBufferTimeout = t;
   }
   // \}
 
+  /**
+   * Return a pointer to the internal queue
+   *
+   * \return a pointer to the internal queue
+   */
   std::vector<SendBuffEntry> & GetBuffer ()
   {
     return m_sendBuffer;
@@ -162,7 +223,15 @@
   void Drop (SendBuffEntry en, std::string reason);             ///< Notify that packet is dropped from queue by timeout
   uint32_t m_maxLen;                                            ///< The maximum number of packets that we allow a routing protocol to buffer.
   Time m_sendBufferTimeout;                                     ///< The maximum period of time that a routing protocol is allowed to buffer a packet for, seconds.
-  static bool IsEqual (SendBuffEntry en, const Ipv4Address dst) ///< Check if the send buffer entry is the same or not
+  /**
+   * Check if the send buffer entry is the same or not
+   *
+   * \param en SendBufferEntry
+   * \param dst IPv4 address to check
+   * \return true if the SendBufferEntry destination is the same,
+   *         false otherwise
+   */
+  static bool IsEqual (SendBuffEntry en, const Ipv4Address dst)
   {
     return (en.GetDestination () == dst);
   }
diff -Naur ns-3.18.1/src/emu/bindings/modulegen__gcc_ILP32.py ns-3.19/src/emu/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/emu/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/emu/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -169,7 +169,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1383,10 +1383,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3117,6 +3118,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3127,6 +3133,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3142,6 +3153,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3167,6 +3183,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/emu/bindings/modulegen__gcc_LP64.py ns-3.19/src/emu/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/emu/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/emu/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -169,7 +169,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1383,10 +1383,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3117,6 +3118,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3127,6 +3133,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3142,6 +3153,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3167,6 +3183,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/emu/doc/emu.rst ns-3.19/src/emu/doc/emu.rst
--- ns-3.18.1/src/emu/doc/emu.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/emu/doc/emu.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,11 +1,11 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 Emu NetDevice
 -------------
 
 **Note:** The ``EmuNetDevice`` is being deprecated as of ns-3.17.  The
-``EmuFdNetDeviceHelper`` class replaces this functionality and API
-entirely.
+:doc:`fd-net-device` and ``EmuFdNetDeviceHelper`` class replaces this functionality and API entirely.
 
 Behavior
 ********
@@ -59,7 +59,7 @@
 Any mixing of |ns3| objects with real objects will typically require that
 |ns3| compute checksums in its protocols. By default, checksums are not
 computed by |ns3|. To enable checksums (e.g. UDP, TCP, IP), users must set
-the attribute ``ChecksumEnabled`` to true, such as follows:::
+the attribute ``ChecksumEnabled`` to true, such as follows::
 
     GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
 
@@ -141,7 +141,7 @@
 
 The ``Emu`` net device and helper provide access to ASCII and pcap tracing
 functionality just as other |ns3| net devices to. You enable tracing similarly
-to these other net devices:::
+to these other net devices::
 
   EmuHelper::EnablePcapAll ("emu-udp-echo-client");
 
@@ -176,7 +176,7 @@
 
 Once the (promiscuous mode) socket is created, we bind it to an interface name 
 also provided as an attribute ("DeviceName") that is stored internally as 
-``m_deviceName``:::
+``m_deviceName``::
 
   struct ifreq ifr;
   bzero (&ifr, sizeof(ifr));
diff -Naur ns-3.18.1/src/emu/model/emu-net-device.cc ns-3.19/src/emu/model/emu-net-device.cc
--- ns-3.18.1/src/emu/model/emu-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/emu/model/emu-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -55,7 +55,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (EmuNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (EmuNetDevice)
+  ;
 
 #define EMU_MAGIC 65867
 
diff -Naur ns-3.18.1/src/emu/model/emu-net-device.h ns-3.19/src/emu/model/emu-net-device.h
--- ns-3.18.1/src/emu/model/emu-net-device.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/emu/model/emu-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,7 @@
 class Queue;
 
 /**
- * \defgroup emu EmuNetDevice
+ * \defgroup emu Emu Network Device
  * This section documents the API of the ns-3 emu module. For a generic functional description, please refer to the ns-3 manual.
  */
 
diff -Naur ns-3.18.1/src/energy/bindings/modulegen__gcc_ILP32.py ns-3.19/src/energy/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/energy/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -167,7 +167,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1401,10 +1401,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -2480,8 +2481,8 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'm'), param('uint8_t', 'l'), param('uint8_t', 'r'), param('bool', 'sg'), param('uint8_t', 'ns'), param('uint8_t', 'ne'), param('bool', 'Stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -2537,10 +2538,10 @@
     cls.add_method('SetShortGuardInterval', 
                    'void', 
                    [param('bool', 'guardinterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbcsatuts) [member function]
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
-                   [param('bool', 'stbcsatuts')])
+                   [param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
     cls.add_method('SetTxPowerLevel', 
                    'void', 
@@ -2966,6 +2967,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2976,6 +2982,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2991,6 +3002,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3016,6 +3032,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -3789,15 +3810,15 @@
                    'void', 
                    [param('bool', 'greenfield')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool GuardInterval) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
     cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('bool', 'guardInterval')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool Ldpc) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('bool', 'ldpc')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
diff -Naur ns-3.18.1/src/energy/bindings/modulegen__gcc_LP64.py ns-3.19/src/energy/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/energy/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -167,7 +167,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1401,10 +1401,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -2480,8 +2481,8 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'm'), param('uint8_t', 'l'), param('uint8_t', 'r'), param('bool', 'sg'), param('uint8_t', 'ns'), param('uint8_t', 'ne'), param('bool', 'Stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -2537,10 +2538,10 @@
     cls.add_method('SetShortGuardInterval', 
                    'void', 
                    [param('bool', 'guardinterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbcsatuts) [member function]
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
-                   [param('bool', 'stbcsatuts')])
+                   [param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
     cls.add_method('SetTxPowerLevel', 
                    'void', 
@@ -2966,6 +2967,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2976,6 +2982,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2991,6 +3002,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3016,6 +3032,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -3789,15 +3810,15 @@
                    'void', 
                    [param('bool', 'greenfield')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool GuardInterval) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
     cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('bool', 'guardInterval')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool Ldpc) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('bool', 'ldpc')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
diff -Naur ns-3.18.1/src/energy/model/basic-energy-source.cc ns-3.19/src/energy/model/basic-energy-source.cc
--- ns-3.18.1/src/energy/model/basic-energy-source.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/model/basic-energy-source.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BasicEnergySource);
+NS_OBJECT_ENSURE_REGISTERED (BasicEnergySource)
+  ;
 
 TypeId
 BasicEnergySource::GetTypeId (void)
diff -Naur ns-3.18.1/src/energy/model/device-energy-model.cc ns-3.19/src/energy/model/device-energy-model.cc
--- ns-3.18.1/src/energy/model/device-energy-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/model/device-energy-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (DeviceEnergyModel);
+NS_OBJECT_ENSURE_REGISTERED (DeviceEnergyModel)
+  ;
 
 TypeId
 DeviceEnergyModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/energy/model/energy-source.cc ns-3.19/src/energy/model/energy-source.cc
--- ns-3.18.1/src/energy/model/energy-source.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/model/energy-source.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (EnergySource);
+NS_OBJECT_ENSURE_REGISTERED (EnergySource)
+  ;
 
 TypeId
 EnergySource::GetTypeId (void)
diff -Naur ns-3.18.1/src/energy/model/li-ion-energy-source.cc ns-3.19/src/energy/model/li-ion-energy-source.cc
--- ns-3.18.1/src/energy/model/li-ion-energy-source.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/model/li-ion-energy-source.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LiIonEnergySource);
+NS_OBJECT_ENSURE_REGISTERED (LiIonEnergySource)
+  ;
 
 TypeId
 LiIonEnergySource::GetTypeId (void)
diff -Naur ns-3.18.1/src/energy/model/rv-battery-model.cc ns-3.19/src/energy/model/rv-battery-model.cc
--- ns-3.18.1/src/energy/model/rv-battery-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/model/rv-battery-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RvBatteryModel);
+NS_OBJECT_ENSURE_REGISTERED (RvBatteryModel)
+  ;
 
 TypeId
 RvBatteryModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/energy/model/simple-device-energy-model.cc ns-3.19/src/energy/model/simple-device-energy-model.cc
--- ns-3.18.1/src/energy/model/simple-device-energy-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/model/simple-device-energy-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SimpleDeviceEnergyModel);
+NS_OBJECT_ENSURE_REGISTERED (SimpleDeviceEnergyModel)
+  ;
 
 TypeId
 SimpleDeviceEnergyModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/energy/model/wifi-radio-energy-model.cc ns-3.19/src/energy/model/wifi-radio-energy-model.cc
--- ns-3.18.1/src/energy/model/wifi-radio-energy-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/model/wifi-radio-energy-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiRadioEnergyModel);
+NS_OBJECT_ENSURE_REGISTERED (WifiRadioEnergyModel)
+  ;
 
 TypeId
 WifiRadioEnergyModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/energy/test/li-ion-energy-source-test.cc ns-3.19/src/energy/test/li-ion-energy-source-test.cc
--- ns-3.18.1/src/energy/test/li-ion-energy-source-test.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/energy/test/li-ion-energy-source-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("LiIonEnergySourceTestSuite");
+NS_LOG_COMPONENT_DEFINE ("LiIonEnergySourceTestSuite")
+  ;
 
 class LiIonEnergyTestCase : public TestCase
 {
diff -Naur ns-3.18.1/src/fd-net-device/bindings/modulegen__gcc_ILP32.py ns-3.19/src/fd-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -173,7 +173,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1401,10 +1401,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3179,6 +3180,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3189,6 +3195,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3204,6 +3215,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3229,6 +3245,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/fd-net-device/bindings/modulegen__gcc_LP64.py ns-3.19/src/fd-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -173,7 +173,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1401,10 +1401,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3179,6 +3180,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3189,6 +3195,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3204,6 +3215,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3229,6 +3245,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/fd-net-device/doc/fd-net-device.rst ns-3.19/src/fd-net-device/doc/fd-net-device.rst
--- ns-3.18.1/src/fd-net-device/doc/fd-net-device.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/fd-net-device/doc/fd-net-device.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,6 +1,7 @@
 File Descriptor NetDevice
 -------------------------
-.. include:: replace.txt 
+.. include:: replace.txt
+.. highlight:: cpp
 
 .. heading hierarchy:
    ------------- Chapter
@@ -144,7 +145,7 @@
 provided helpers.  Support for these modes can be found in the output
 of the ``waf configure`` step, e.g.:
 
-::
+.. sourcecode:: text
 
    Threading Primitives          : enabled
    Real Time Simulator           : enabled
@@ -220,7 +221,7 @@
 The emulation helper permits to transparently integrate a simulated
 |ns3| node into a network composed of real nodes.
 
-::
+.. sourcecode:: text
 
  +----------------------+     +-----------------------+
  |         host 1       |     |         host 2        |
@@ -305,7 +306,7 @@
 provided by the TapBridge NetDevice found in ``src/tap-bridge``.
 The model in this helper is as follows:
 
-::
+.. sourcecode:: text
 
  +-------------------------------------+    
  |                host                 |
@@ -334,7 +335,7 @@
 
 The model in TapBridge (in another module) is as follows:
 
-::
+.. sourcecode:: text
 
     +--------+
     |  Linux |
@@ -404,7 +405,7 @@
 by the FdTapNetDeviceHelper, except that the underlying mechanisms
 to create the TAP device are different.
 
-::
+.. sourcecode:: text
 
  +-------------------------------------+    
  |         PlanetLab  host             |
diff -Naur ns-3.18.1/src/fd-net-device/model/fd-net-device.cc ns-3.19/src/fd-net-device/model/fd-net-device.cc
--- ns-3.18.1/src/fd-net-device/model/fd-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/fd-net-device/model/fd-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -74,7 +74,8 @@
   return FdReader::Data (buf, len);
 }
 
-NS_OBJECT_ENSURE_REGISTERED (FdNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (FdNetDevice)
+  ;
 
 TypeId
 FdNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/fd-net-device/model/fd-net-device.h ns-3.19/src/fd-net-device/model/fd-net-device.h
--- ns-3.18.1/src/fd-net-device/model/fd-net-device.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/fd-net-device/model/fd-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -63,7 +63,7 @@
 class Node;
 
 /**
- * \defgroup fd-net-device FdNetDevice
+ * \defgroup fd-net-device File Descriptor Network Device
  * This section documents the API of the ns-3 fd-net-device module.
  * For a generic functional description, please refer to the ns-3 manual.
  */
diff -Naur ns-3.18.1/src/flow-monitor/bindings/modulegen__gcc_ILP32.py ns-3.19/src/flow-monitor/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -229,7 +229,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1619,10 +1619,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3983,6 +3984,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3993,6 +3999,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4008,6 +4019,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4033,6 +4049,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/flow-monitor/bindings/modulegen__gcc_LP64.py ns-3.19/src/flow-monitor/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -229,7 +229,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1619,10 +1619,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3983,6 +3984,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3993,6 +3999,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4008,6 +4019,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4033,6 +4049,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/flow-monitor/examples/flowmon-parse-results.py ns-3.19/src/flow-monitor/examples/flowmon-parse-results.py
--- ns-3.18.1/src/flow-monitor/examples/flowmon-parse-results.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/examples/flowmon-parse-results.py	2013-12-20 09:44:50.000000000 -0800
@@ -8,7 +8,7 @@
 
 def parse_time_ns(tm):
     if tm.endswith('ns'):
-        return long(tm[:-2])
+        return long(tm[:-4])
     raise ValueError(tm)
 
 
@@ -39,8 +39,8 @@
         self.flowId = int(flow_el.get('flowId'))
         rxPackets = long(flow_el.get('rxPackets'))
         txPackets = long(flow_el.get('txPackets'))
-        tx_duration = float(long(flow_el.get('timeLastTxPacket')[:-2]) - long(flow_el.get('timeFirstTxPacket')[:-2]))*1e-9
-        rx_duration = float(long(flow_el.get('timeLastRxPacket')[:-2]) - long(flow_el.get('timeFirstRxPacket')[:-2]))*1e-9
+        tx_duration = float(long(flow_el.get('timeLastTxPacket')[:-4]) - long(flow_el.get('timeFirstTxPacket')[:-4]))*1e-9
+        rx_duration = float(long(flow_el.get('timeLastRxPacket')[:-4]) - long(flow_el.get('timeFirstRxPacket')[:-4]))*1e-9
         self.rx_duration = rx_duration
         self.probe_stats_unsorted = []
         if rxPackets:
@@ -48,7 +48,7 @@
         else:
             self.hopCount = -1000
         if rxPackets:
-            self.delayMean = float(flow_el.get('delaySum')[:-2]) / rxPackets * 1e-9
+            self.delayMean = float(flow_el.get('delaySum')[:-4]) / rxPackets * 1e-9
             self.packetSizeMean = float(flow_el.get('rxBytes')) / rxPackets
         else:
             self.delayMean = None
diff -Naur ns-3.18.1/src/flow-monitor/helper/flow-monitor-helper.h ns-3.19/src/flow-monitor/helper/flow-monitor-helper.h
--- ns-3.18.1/src/flow-monitor/helper/flow-monitor-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/helper/flow-monitor-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,38 +31,58 @@
 class AttributeValue;
 class Ipv4FlowClassifier;
 
-/// \brief Helper to enable IPv4 flow monitoring on a set of Nodes
+/**
+ * \ingroup flow-monitor
+ * \brief Helper to enable IPv4 flow monitoring on a set of Nodes
+ */
 class FlowMonitorHelper
 {
 public:
-  /// \brief Construct a FlowMonitorHelper class which makes it easier to 
-  /// configure and use the FlowMonitor
+
   FlowMonitorHelper ();
-  /// \brief Dispose of objects allocated by the helper
   ~FlowMonitorHelper ();
 
-  /// \brief Set an attribute for the to-be-created FlowMonitor object
+  /**
+   * \brief Set an attribute for the to-be-created FlowMonitor object
+   * \param n1 attribute name
+   * \param v1 attibute value
+   */
   void SetMonitorAttribute (std::string n1, const AttributeValue &v1);
 
-  /// \brief Enable flow monitoring on a set of nodes
-  /// \param nodes A NodeContainer holding the set of nodes to work with.
+  /**
+   * \brief Enable flow monitoring on a set of nodes
+   * \param nodes A NodeContainer holding the set of nodes to work with.
+   * \returns a pointer to the FlowMonitor object
+   */
   Ptr<FlowMonitor> Install (NodeContainer nodes);
-  /// \brief Enable flow monitoring on a single node
-  /// \param node A Ptr<Node> to the node on which to enable flow monitoring.
+  /**
+   * \brief Enable flow monitoring on a single node
+   * \param node A Ptr<Node> to the node on which to enable flow monitoring.
+   * \returns a pointer to the FlowMonitor object
+   */
   Ptr<FlowMonitor> Install (Ptr<Node> node);
-  /// \brief Enable flow monitoring on all nodes
+  /**
+   * \brief Enable flow monitoring on all nodes
+   * \returns a pointer to the FlowMonitor object
+   */
   Ptr<FlowMonitor> InstallAll ();
 
-  /// \brief Retrieve the FlowMonitor object created by the Install* methods
+  /**
+   * \brief Retrieve the FlowMonitor object created by the Install* methods
+   * \returns a pointer to the FlowMonitor object
+   */
   Ptr<FlowMonitor> GetMonitor ();
 
-  /// \brief Retrieve the FlowClassifier object created by the Install* methods
+  /**
+   * \brief Retrieve the FlowClassifier object created by the Install* methods
+   * \returns a pointer to the FlowClassifier object
+   */
   Ptr<FlowClassifier> GetClassifier ();
 
 private:
-  ObjectFactory m_monitorFactory;
-  Ptr<FlowMonitor> m_flowMonitor;
-  Ptr<FlowClassifier> m_flowClassifier;
+  ObjectFactory m_monitorFactory;       //!< Object factory
+  Ptr<FlowMonitor> m_flowMonitor;       //!< the FlowMonitor object
+  Ptr<FlowClassifier> m_flowClassifier; //!< the FlowClassifier object
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/flow-monitor/model/flow-classifier.h ns-3.19/src/flow-monitor/model/flow-classifier.h
--- ns-3.18.1/src/flow-monitor/model/flow-classifier.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/flow-classifier.h	2013-12-20 09:44:50.000000000 -0800
@@ -26,10 +26,21 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup flow-monitor
+ * \brief Abstract identifier of a packet flow
+ */
 typedef uint32_t FlowId;
+
+/**
+ * \ingroup flow-monitor
+ * \brief Abstract identifier of a packet within a flow
+ */
 typedef uint32_t FlowPacketId;
 
-/// provides a method to translate raw packet data into abstract
+
+/// \ingroup flow-monitor
+/// Provides a method to translate raw packet data into abstract
 /// ``flow identifier'' and ``packet identifier'' parameters.  These
 /// identifiers are unsigned 32-bit integers that uniquely identify a
 /// flow and a packet within that flow, respectively, for the whole
@@ -42,9 +53,12 @@
 class FlowClassifier : public SimpleRefCount<FlowClassifier>
 {
 private:
-  FlowId m_lastNewFlowId;
+  FlowId m_lastNewFlowId; //!< Last known Flow ID
 
+  /// Defined and not implemented to avoid misuse
   FlowClassifier (FlowClassifier const &);
+  /// Defined and not implemented to avoid misuse
+  /// \returns
   FlowClassifier& operator= (FlowClassifier const &);
 
 public:
@@ -52,9 +66,14 @@
   FlowClassifier ();
   virtual ~FlowClassifier ();
 
+  /// Serializes the results to an std::ostream in XML format
+  /// \param os the output stream
+  /// \param indent number of spaces to use as base indentation level
   virtual void SerializeToXmlStream (std::ostream &os, int indent) const = 0;
 
 protected:
+  /// Returns a new, unique Flow Identifier
+  /// \returns a new FlowId
   FlowId GetNewFlowId ();
 
 };
diff -Naur ns-3.18.1/src/flow-monitor/model/flow-monitor.cc ns-3.19/src/flow-monitor/model/flow-monitor.cc
--- ns-3.18.1/src/flow-monitor/model/flow-monitor.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/flow-monitor.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,9 +31,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("FlowMonitor");
+NS_LOG_COMPONENT_DEFINE ("FlowMonitor")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (FlowMonitor);
+NS_OBJECT_ENSURE_REGISTERED (FlowMonitor)
+  ;
 
 
 TypeId 
diff -Naur ns-3.18.1/src/flow-monitor/model/flow-monitor.h ns-3.19/src/flow-monitor/model/flow-monitor.h
--- ns-3.18.1/src/flow-monitor/model/flow-monitor.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/flow-monitor.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,10 +34,19 @@
 
 namespace ns3 {
 
-/// \brief An object that monitors and reports back packet flows observed during a simulation
-///
-/// The FlowMonitor class is responsible forcoordinating efforts
-/// regarding probes, and collects end-to-end flowstatistics.
+/**
+ * \defgroup flow-monitor Flow Monitor
+ * \brief  Collect and store performance data from a simulation
+ */
+
+/**
+ * \ingroup flow-monitor
+ * \brief An object that monitors and reports back packet flows observed during a simulation
+ *
+ * The FlowMonitor class is responsible for coordinating efforts
+ * regarding probes, and collects end-to-end flow statistics.
+ *
+ */
 class FlowMonitor : public Object
 {
 public:
@@ -77,6 +86,8 @@
     /// as defined in IETF \RFC{3393}.
     Time     jitterSum; // jitterCount == rxPackets - 1
 
+    /// Contains the last measured delay of a packet
+    /// It is stored to measure the packet's Jitter
     Time     lastDelay;
 
     /// Total number of transmitted bytes for the flow
@@ -123,20 +134,27 @@
     /// This attribute also tracks the number of lost bytes.  See also
     /// comment in attribute packetsDropped.
     std::vector<uint64_t> bytesDropped; // bytesDropped[reasonCode] => number of dropped bytes
-    Histogram flowInterruptionsHistogram; // histogram of durations of flow interruptions
+    Histogram flowInterruptionsHistogram; //!< histogram of durations of flow interruptions
   };
 
   // --- basic methods ---
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   TypeId GetInstanceTypeId () const;
   FlowMonitor ();
 
   /// Set the FlowClassifier to be used by the flow monitor.
+  /// \param classifier the FlowClassifier
   void SetFlowClassifier (Ptr<FlowClassifier> classifier);
 
-  /// Set the time, counting from the current time, from which to start monitoring flows
+  /// Set the time, counting from the current time, from which to start monitoring flows.
+  /// \param time delta time to start
   void Start (const Time &time);
-  /// Set the time, counting from the current time, from which to stop monitoring flows
+  /// Set the time, counting from the current time, from which to stop monitoring flows.
+  /// \param time delta time to stop
   void Stop (const Time &time);
   /// Begin monitoring flows *right now*
   void StartRightNow ();
@@ -147,21 +165,39 @@
   /// Register a new FlowProbe that will begin monitoring and report
   /// events to this monitor.  This method is normally only used by
   /// FlowProbe implementations.
+  /// \param probe the probe to add
   void AddProbe (Ptr<FlowProbe> probe);
 
   /// FlowProbe implementations are supposed to call this method to
   /// report that a new packet was transmitted (but keep in mind the
   /// distinction between a new packet entering the system and a
   /// packet that is already known and is only being forwarded).
+  /// \param probe the reporting probe
+  /// \param flowId flow identification
+  /// \param packetId Packet ID
+  /// \param packetSize packet size
   void ReportFirstTx (Ptr<FlowProbe> probe, FlowId flowId, FlowPacketId packetId, uint32_t packetSize);
   /// FlowProbe implementations are supposed to call this method to
   /// report that a known packet is being forwarded.
+  /// \param probe the reporting probe
+  /// \param flowId flow identification
+  /// \param packetId Packet ID
+  /// \param packetSize packet size
   void ReportForwarding (Ptr<FlowProbe> probe, FlowId flowId, FlowPacketId packetId, uint32_t packetSize);
   /// FlowProbe implementations are supposed to call this method to
   /// report that a known packet is being received.
+  /// \param probe the reporting probe
+  /// \param flowId flow identification
+  /// \param packetId Packet ID
+  /// \param packetSize packet size
   void ReportLastRx (Ptr<FlowProbe> probe, FlowId flowId, FlowPacketId packetId, uint32_t packetSize);
   /// FlowProbe implementations are supposed to call this method to
   /// report that a known packet is being dropped due to some reason.
+  /// \param probe the reporting probe
+  /// \param flowId flow identification
+  /// \param packetId Packet ID
+  /// \param packetSize packet size
+  /// \param reasonCode drop reason code
   void ReportDrop (Ptr<FlowProbe> probe, FlowId flowId, FlowPacketId packetId,
                    uint32_t packetSize, uint32_t reasonCode);
 
@@ -171,6 +207,7 @@
   /// Check right now for packets that appear to be lost, considering
   /// packets as lost if not seen in the network for a time larger
   /// than maxDelay
+  /// \param maxDelay the max delay for a packet
   void CheckForLostPackets (Time maxDelay);
 
   // --- methods to get the results ---
@@ -178,9 +215,11 @@
   /// FlowMonitor has not stopped monitoring yet, you should call
   /// CheckForLostPackets() to make sure all possibly lost packets are
   /// accounted for.
+  /// \returns the flows statistics
   std::map<FlowId, FlowStats> GetFlowStats () const;
 
   /// Get a list of all FlowProbe's associated with this FlowMonitor
+  /// \returns a list of all the probes
   std::vector< Ptr<FlowProbe> > GetAllProbes () const;
 
   /// Serializes the results to an std::ostream in XML format
@@ -209,35 +248,41 @@
 
 private:
 
+  /// Structure to represent a single tracked packet data
   struct TrackedPacket
   {
-    Time firstSeenTime; // absolute time when the packet was first seen by a probe
-    Time lastSeenTime; // absolute time when the packet was last seen by a probe
-    uint32_t timesForwarded; // number of times the packet was reportedly forwarded
+    Time firstSeenTime; //!< absolute time when the packet was first seen by a probe
+    Time lastSeenTime; //!< absolute time when the packet was last seen by a probe
+    uint32_t timesForwarded; //!< number of times the packet was reportedly forwarded
   };
 
-  // FlowId --> FlowStats
+  /// FlowId --> FlowStats
   std::map<FlowId, FlowStats> m_flowStats;
 
-  // (FlowId,PacketId) --> TrackedPacket
+  /// (FlowId,PacketId) --> TrackedPacket
   typedef std::map< std::pair<FlowId, FlowPacketId>, TrackedPacket> TrackedPacketMap;
-  TrackedPacketMap m_trackedPackets;
-  Time m_maxPerHopDelay;
-  std::vector< Ptr<FlowProbe> > m_flowProbes;
+  TrackedPacketMap m_trackedPackets; //!< Tracked packets
+  Time m_maxPerHopDelay; //!< Minimum per-hop delay
+  std::vector< Ptr<FlowProbe> > m_flowProbes; //!< all the FlowProbes
 
   // note: this is needed only for serialization
-  Ptr<FlowClassifier> m_classifier;
-
-  EventId m_startEvent;
-  EventId m_stopEvent;
-  bool m_enabled;
-  double m_delayBinWidth;
-  double m_jitterBinWidth;
-  double m_packetSizeBinWidth;
-  double m_flowInterruptionsBinWidth;
-  Time m_flowInterruptionsMinTime;
+  Ptr<FlowClassifier> m_classifier; //!< the FlowClassifier
 
+  EventId m_startEvent;     //!< Start event
+  EventId m_stopEvent;      //!< Stop event
+  bool m_enabled;           //!< FlowMon is enabled
+  double m_delayBinWidth;   //!< Delay bin width (for histograms)
+  double m_jitterBinWidth;  //!< Jitter bin width (for histograms)
+  double m_packetSizeBinWidth;  //!< packet size bin width (for histograms)
+  double m_flowInterruptionsBinWidth; //!< Flow interruptions bin width (for histograms)
+  Time m_flowInterruptionsMinTime; //!< Flow interruptions minimum time
+
+  /// Get the stats for a given flow
+  /// \param flowId the Flow identification
+  /// \returns the stats of the flow
   FlowStats& GetStatsForFlow (FlowId flowId);
+
+  /// Periodic function to check for lost packets and prune statistics
   void PeriodicCheckForLostPackets ();
 };
 
diff -Naur ns-3.18.1/src/flow-monitor/model/flow-probe.h ns-3.19/src/flow-monitor/model/flow-probe.h
--- ns-3.18.1/src/flow-monitor/model/flow-probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/flow-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -39,17 +39,22 @@
 class FlowProbe : public Object
 {
 private:
+  /// Defined and not implemented to avoid misuse
   FlowProbe (FlowProbe const &);
+  /// Defined and not implemented to avoid misuse
+  /// \returns
   FlowProbe& operator= (FlowProbe const &);
 
 protected:
-
+  /// Constructor
+  /// \param flowMonitor the FlowMonitor this probe is associated with
   FlowProbe (Ptr<FlowMonitor> flowMonitor);
   virtual void DoDispose (void);
 
 public:
   virtual ~FlowProbe ();
 
+  /// Structure to hold the statistics of a flow
   struct FlowStats
   {
     FlowStats () : delayFromFirstProbeSum (Seconds (0)), bytes (0), packets (0) {}
@@ -67,21 +72,35 @@
     uint32_t packets;
   };
 
+  /// Container to map FlowId -> FlowStats
   typedef std::map<FlowId, FlowStats> Stats;
 
+  /// Add a packet data to the flow stats
+  /// \param flowId the flow Identifier
+  /// \param packetSize the packet size
+  /// \param delayFromFirstProbe packet delay
   void AddPacketStats (FlowId flowId, uint32_t packetSize, Time delayFromFirstProbe);
+  /// Add a packet drop data to the flow stats
+  /// \param flowId the flow Identifier
+  /// \param packetSize the packet size
+  /// \param reasonCode reason code for the drop
   void AddPacketDropStats (FlowId flowId, uint32_t packetSize, uint32_t reasonCode);
 
   /// Get the partial flow statistics stored in this probe.  With this
   /// information you can, for example, find out what is the delay
   /// from the first probe to this one.
+  /// \returns the partial flow statistics
   Stats GetStats () const;
 
+  /// Serializes the results to an std::ostream in XML format
+  /// \param os the output stream
+  /// \param indent number of spaces to use as base indentation level
+  /// \param index FlowProbe index
   void SerializeToXmlStream (std::ostream &os, int indent, uint32_t index) const;
 
 protected:
-  Ptr<FlowMonitor> m_flowMonitor;
-  Stats m_stats;
+  Ptr<FlowMonitor> m_flowMonitor; //!< the FlowMonitor instance
+  Stats m_stats; //!< The flow stats
 
 };
 
diff -Naur ns-3.18.1/src/flow-monitor/model/histogram.cc ns-3.19/src/flow-monitor/model/histogram.cc
--- ns-3.18.1/src/flow-monitor/model/histogram.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/histogram.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Histogram");
+NS_LOG_COMPONENT_DEFINE ("Histogram")
+  ;
  
 // uint32_t 
 // Histogram::GetSize () const
diff -Naur ns-3.18.1/src/flow-monitor/model/histogram.h ns-3.19/src/flow-monitor/model/histogram.h
--- ns-3.18.1/src/flow-monitor/model/histogram.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/histogram.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,34 +27,94 @@
 
 namespace ns3 {
 
+/**
+ * \brief Class used to store data and make an histogram of the data frequency.
+ *
+ * Data are grouped in "bins", i.e., intervals. Each value is assigned to the
+ * bin according to the following formula: floor(value/binWidth).
+ * Hence, bin \a i groups the data from [i*binWidth, (i+1)binWidth).
+ *
+ * This class only handles \a positive bins, i.e., it does \a not handles negative data.
+ *
+ * \todo Add support for negative data.
+ *
+ * \todo Add method(s) to estimate \f$N\f$, \f$\mu\f$, and \f$s^2\f$ from the histogram,
+ * see http://www.dspguide.com/ch2/4.htm
+ *
+ */
 class Histogram
 {
 public:
 
   // --- basic methods ---
+  /**
+   * \brief Constructor
+   * \param binWidth width of the histogram "bin".
+   */
   Histogram (double binWidth);
   Histogram ();
 
   // Methods for Getting the Histogram Results
+  /**
+   * \brief Returns the number of bins in the histogram.
+   * \return the number of bins in the histogram
+   */
   uint32_t GetNBins () const;
+  /**
+   * \brief Returns the bin start, i.e., index*binWidth
+   * \param index the bin index
+   * \return the bin start
+   */
   double GetBinStart (uint32_t index);
+  /**
+   * \brief Returns the bin end, i.e., (index+1)*binWidth
+   * \param index the bin index
+   * \return the bin start
+   */
   double GetBinEnd (uint32_t index);
+  /**
+   * \brief Returns the bin width.
+   *
+   * Note that all the bins have the same width.
+   *
+   * \param index the bin index
+   * \return the bin width
+   */
   double GetBinWidth (uint32_t index) const;
+  /**
+   * \brief Set the bin width.
+   *
+   * Note that you can change the bin width only if the histogram is empty.
+   *
+   * \param binWidth the bin width
+   */
   void SetDefaultBinWidth (double binWidth);
+  /**
+   * \brief Get the number of data added to the bin.
+   * \param index the bin index
+   * \return the number of data added to the bin
+   */
   uint32_t GetBinCount (uint32_t index);
 
   // Method for adding values
+  /**
+   * \brief Add a value to the histogram
+   * \param value the value to add
+   */
   void AddValue (double value);
 
-
+  /**
+   * \brief Serializes the results to an std::ostream in XML format.
+   * \param os the output stream
+   * \param indent number of spaces to use as base indentation level
+   * \param elementName name of the element to serialize.
+   */
   void SerializeToXmlStream (std::ostream &os, int indent, std::string elementName) const;
 
-  /// \todo add method(s) to estimate N, µ, and s² from the histogram,
-  /// see http://www.dspguide.com/ch2/4.htm
 
 private:
-  std::vector<uint32_t> m_histogram;
-  double m_binWidth;
+  std::vector<uint32_t> m_histogram; //!< Histogram data
+  double m_binWidth; //!< Bin width
 };
 
 
diff -Naur ns-3.18.1/src/flow-monitor/model/ipv4-flow-classifier.cc ns-3.19/src/flow-monitor/model/ipv4-flow-classifier.cc
--- ns-3.18.1/src/flow-monitor/model/ipv4-flow-classifier.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/ipv4-flow-classifier.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,8 +27,8 @@
 namespace ns3 {
 
 /* see http://www.iana.org/assignments/protocol-numbers */
-const uint8_t TCP_PROT_NUMBER = 6;
-const uint8_t UDP_PROT_NUMBER = 17;
+const uint8_t TCP_PROT_NUMBER = 6;  //!< TCP Protocol number
+const uint8_t UDP_PROT_NUMBER = 17; //!< UDP Protocol number
 
 
 
@@ -109,35 +109,49 @@
       return false;
     }
 
+  if (ipHeader.GetFragmentOffset () > 0 )
+    {
+      // Ignore fragments: they don't carry a valid L4 header
+      return false;
+    }
+
   FiveTuple tuple;
   tuple.sourceAddress = ipHeader.GetSource ();
   tuple.destinationAddress = ipHeader.GetDestination ();
   tuple.protocol = ipHeader.GetProtocol ();
 
-  switch (tuple.protocol)
+  if ((tuple.protocol != UDP_PROT_NUMBER) && (tuple.protocol != TCP_PROT_NUMBER))
     {
-    case UDP_PROT_NUMBER:
-      {
-        UdpHeader udpHeader;
-        ipPayload->PeekHeader (udpHeader);
-        tuple.sourcePort = udpHeader.GetSourcePort ();
-        tuple.destinationPort = udpHeader.GetDestinationPort ();
-      }
-      break;
-
-    case TCP_PROT_NUMBER:
-      {
-        TcpHeader tcpHeader;
-        ipPayload->PeekHeader (tcpHeader);
-        tuple.sourcePort = tcpHeader.GetSourcePort ();
-        tuple.destinationPort = tcpHeader.GetDestinationPort ();
-      }
-      break;
+      return false;
+    }
 
-    default:
+  if (ipPayload->GetSize () < 4)
+    {
+      // the packet doesn't carry enough bytes
       return false;
     }
 
+  // we rely on the fact that for both TCP and UDP the ports are
+  // carried in the first 4 octects.
+  // This allows to read the ports even on fragmented packets
+  // not carrying a full TCP or UDP header.
+
+  uint8_t data[4];
+  ipPayload->CopyData (data, 4);
+
+  uint16_t srcPort = 0;
+  srcPort |= data[0];
+  srcPort <<= 8;
+  srcPort |= data[1];
+
+  uint16_t dstPort = 0;
+  dstPort |= data[2];
+  dstPort <<= 8;
+  dstPort |= data[3];
+
+  tuple.sourcePort = srcPort;
+  tuple.destinationPort = dstPort;
+
   // try to insert the tuple, but check if it already exists
   std::pair<std::map<FiveTuple, FlowId>::iterator, bool> insert
     = m_flowMap.insert (std::pair<FiveTuple, FlowId> (tuple, 0));
diff -Naur ns-3.18.1/src/flow-monitor/model/ipv4-flow-classifier.h ns-3.19/src/flow-monitor/model/ipv4-flow-classifier.h
--- ns-3.18.1/src/flow-monitor/model/ipv4-flow-classifier.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/ipv4-flow-classifier.h	2013-12-20 09:44:50.000000000 -0800
@@ -39,13 +39,14 @@
 {
 public:
 
+  /// Structure to classify a packet
   struct FiveTuple
   {
-    Ipv4Address sourceAddress;
-    Ipv4Address destinationAddress;
-    uint8_t protocol;
-    uint16_t sourcePort;
-    uint16_t destinationPort;
+    Ipv4Address sourceAddress;      //!< Source address
+    Ipv4Address destinationAddress; //!< Destination address
+    uint8_t protocol;               //!< Protocol
+    uint16_t sourcePort;            //!< Source port
+    uint16_t destinationPort;       //!< Destination port
   };
 
   Ipv4FlowClassifier ();
@@ -53,22 +54,43 @@
   /// \brief try to classify the packet into flow-id and packet-id
   /// \return true if the packet was classified, false if not (i.e. it
   /// does not appear to be part of a flow).
+  /// \param ipHeader packet's IP header
+  /// \param ipPayload packet's IP payload
+  /// \param out_flowId packet's FlowId
+  /// \param out_packetId packet's identifier
   bool Classify (const Ipv4Header &ipHeader, Ptr<const Packet> ipPayload,
                  uint32_t *out_flowId, uint32_t *out_packetId);
 
   /// Searches for the FiveTuple corresponding to the given flowId
+  /// \param flowId the FlowId to search for
+  /// \returns the FiveTuple corresponding to flowId
   FiveTuple FindFlow (FlowId flowId) const;
 
   virtual void SerializeToXmlStream (std::ostream &os, int indent) const;
 
 private:
 
+  /// Map to Flows Identifiers to FlowIds
   std::map<FiveTuple, FlowId> m_flowMap;
 
 };
 
-
+/**
+ * \brief Less than operator.
+ *
+ * \param t1 the first operand
+ * \param t2 the first operand
+ * \returns true if the operands are equal
+ */
 bool operator < (const Ipv4FlowClassifier::FiveTuple &t1, const Ipv4FlowClassifier::FiveTuple &t2);
+
+/**
+ * \brief Equal to operator.
+ *
+ * \param t1 the first operand
+ * \param t2 the first operand
+ * \returns true if the operands are equal
+ */
 bool operator == (const Ipv4FlowClassifier::FiveTuple &t1, const Ipv4FlowClassifier::FiveTuple &t2);
 
 
diff -Naur ns-3.18.1/src/flow-monitor/model/ipv4-flow-probe.cc ns-3.19/src/flow-monitor/model/ipv4-flow-probe.cc
--- ns-3.18.1/src/flow-monitor/model/ipv4-flow-probe.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/ipv4-flow-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,15 +30,29 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv4FlowProbe");
+NS_LOG_COMPONENT_DEFINE ("Ipv4FlowProbe")
+  ;
 
 //////////////////////////////////////
 // Ipv4FlowProbeTag class implementation //
 //////////////////////////////////////
 
+/**
+ * \ingroup flow-monitor
+ *
+ * \brief Tag used to allow a fast identification of the packet
+ *
+ * This tag is added by FlowMonitor when a packet is seen for
+ * the first time, and it is then used to classify the packet in
+ * the following hops.
+ */
 class Ipv4FlowProbeTag : public Tag
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual uint32_t GetSerializedSize (void) const;
@@ -46,17 +60,47 @@
   virtual void Deserialize (TagBuffer buf);
   virtual void Print (std::ostream &os) const;
   Ipv4FlowProbeTag ();
+  /**
+   * \brief Consructor
+   * \param flowId the flow identifier
+   * \param packetId the packet identifier
+   * \param packetSize the packet size
+   */
   Ipv4FlowProbeTag (uint32_t flowId, uint32_t packetId, uint32_t packetSize);
+  /**
+   * \brief Set the flow identifier
+   * \param flowId the flow identifier
+   */
   void SetFlowId (uint32_t flowId);
+  /**
+   * \brief Set the packet identifier
+   * \param packetId the packet identifier
+   */
   void SetPacketId (uint32_t packetId);
+  /**
+   * \brief Set the packet size
+   * \param packetSize the packet size
+   */
   void SetPacketSize (uint32_t packetSize);
+  /**
+   * \brief Set the flow identifier
+   * \returns the flow identifier
+   */
   uint32_t GetFlowId (void) const;
+  /**
+   * \brief Set the packet identifier
+   * \returns the packet identifier
+   */
   uint32_t GetPacketId (void) const;
+  /**
+   * \brief Get the packet size
+   * \returns the packet size
+   */
   uint32_t GetPacketSize (void) const;
 private:
-  uint32_t m_flowId;
-  uint32_t m_packetId;
-  uint32_t m_packetSize;
+  uint32_t m_flowId;      //!< flow identifier
+  uint32_t m_packetId;    //!< packet identifier
+  uint32_t m_packetSize;  //!< packet size
 
 };
 
diff -Naur ns-3.18.1/src/flow-monitor/model/ipv4-flow-probe.h ns-3.19/src/flow-monitor/model/ipv4-flow-probe.h
--- ns-3.18.1/src/flow-monitor/model/ipv4-flow-probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/flow-monitor/model/ipv4-flow-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -30,6 +30,7 @@
 class FlowMonitor;
 class Node;
 
+/// \ingroup flow-monitor
 /// \brief Class that monitors flows at the IPv4 layer of a Node
 ///
 /// For each node in the simulation, one instance of the class
@@ -40,6 +41,10 @@
 {
 
 public:
+  /// \brief Constructor
+  /// \param monitor the FlowMonitor this probe is associated with
+  /// \param classifier the Ipv4FlowClassifier this probe is associated with
+  /// \param node the Node this probe is associated with
   Ipv4FlowProbe (Ptr<FlowMonitor> monitor, Ptr<Ipv4FlowClassifier> classifier, Ptr<Node> node);
   virtual ~Ipv4FlowProbe ();
 
@@ -65,23 +70,42 @@
     DROP_ROUTE_ERROR,   /**< Route error */
     DROP_FRAGMENT_TIMEOUT, /**< Fragment timeout exceeded */
 
-    DROP_INVALID_REASON,
+    DROP_INVALID_REASON, /**< Fallback reason (no known reason) */
   };
 
 protected:
 
-    virtual void DoDispose (void);
+  virtual void DoDispose (void);
 
 private:
-
+  /// Log a packet being sent
+  /// \param ipHeader IP header
+  /// \param ipPayload IP payload
+  /// \param interface outgoing interface
   void SendOutgoingLogger (const Ipv4Header &ipHeader, Ptr<const Packet> ipPayload, uint32_t interface);
+  /// Log a packet being forwarded
+  /// \param ipHeader IP header
+  /// \param ipPayload IP payload
+  /// \param interface incoming interface
   void ForwardLogger (const Ipv4Header &ipHeader, Ptr<const Packet> ipPayload, uint32_t interface);
+  /// Log a packet being received by the destination
+  /// \param ipHeader IP header
+  /// \param ipPayload IP payload
+  /// \param interface incoming interface
   void ForwardUpLogger (const Ipv4Header &ipHeader, Ptr<const Packet> ipPayload, uint32_t interface);
+  /// Log a packet being dropped
+  /// \param ipHeader IP header
+  /// \param ipPayload IP payload
+  /// \param reason drop reason
+  /// \param ipv4 pointer to the IP object dropping the packet
+  /// \param ifIndex interface index
   void DropLogger (const Ipv4Header &ipHeader, Ptr<const Packet> ipPayload,
                    Ipv4L3Protocol::DropReason reason, Ptr<Ipv4> ipv4, uint32_t ifIndex);
+  /// Log a packet being dropped by a queue
+  /// \param ipPayload IP payload
   void QueueDropLogger (Ptr<const Packet> ipPayload);
 
-  Ptr<Ipv4FlowClassifier> m_classifier;
+  Ptr<Ipv4FlowClassifier> m_classifier; //!< the Ipv4FlowClassifier this probe is associated with
 };
 
 
diff -Naur ns-3.18.1/src/internet/bindings/modulegen__gcc_ILP32.py ns-3.19/src/internet/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/internet/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -439,7 +439,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -3000,10 +3000,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -7526,8 +7527,8 @@
 def register_Ns3RttEstimator_methods(root_module, cls):
     ## rtt-estimator.h (module 'internet'): ns3::RttEstimator::RttEstimator() [constructor]
     cls.add_constructor([])
-    ## rtt-estimator.h (module 'internet'): ns3::RttEstimator::RttEstimator(ns3::RttEstimator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::RttEstimator const &', 'arg0')])
+    ## rtt-estimator.h (module 'internet'): ns3::RttEstimator::RttEstimator(ns3::RttEstimator const & r) [copy constructor]
+    cls.add_constructor([param('ns3::RttEstimator const &', 'r')])
     ## rtt-estimator.h (module 'internet'): ns3::Time ns3::RttEstimator::AckSeq(ns3::SequenceNumber32 ackSeq) [member function]
     cls.add_method('AckSeq', 
                    'ns3::Time', 
@@ -7606,8 +7607,8 @@
 def register_Ns3RttMeanDeviation_methods(root_module, cls):
     ## rtt-estimator.h (module 'internet'): ns3::RttMeanDeviation::RttMeanDeviation() [constructor]
     cls.add_constructor([])
-    ## rtt-estimator.h (module 'internet'): ns3::RttMeanDeviation::RttMeanDeviation(ns3::RttMeanDeviation const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::RttMeanDeviation const &', 'arg0')])
+    ## rtt-estimator.h (module 'internet'): ns3::RttMeanDeviation::RttMeanDeviation(ns3::RttMeanDeviation const & r) [copy constructor]
+    cls.add_constructor([param('ns3::RttMeanDeviation const &', 'r')])
     ## rtt-estimator.h (module 'internet'): ns3::Ptr<ns3::RttEstimator> ns3::RttMeanDeviation::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::RttEstimator >', 
@@ -8776,10 +8777,10 @@
                    'void', 
                    [param('ns3::Time', 'timeout')], 
                    is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## tcp-socket.h (module 'internet'): void ns3::TcpSocket::SetInitialCwnd(uint32_t count) [member function]
+    ## tcp-socket.h (module 'internet'): void ns3::TcpSocket::SetInitialCwnd(uint32_t cwnd) [member function]
     cls.add_method('SetInitialCwnd', 
                    'void', 
-                   [param('uint32_t', 'count')], 
+                   [param('uint32_t', 'cwnd')], 
                    is_pure_virtual=True, visibility='private', is_virtual=True)
     ## tcp-socket.h (module 'internet'): void ns3::TcpSocket::SetPersistTimeout(ns3::Time timeout) [member function]
     cls.add_method('SetPersistTimeout', 
@@ -8933,10 +8934,10 @@
                    'int', 
                    [], 
                    is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::AddOptions(ns3::TcpHeader & arg0) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::AddOptions(ns3::TcpHeader & tcpHeader) [member function]
     cls.add_method('AddOptions', 
                    'void', 
-                   [param('ns3::TcpHeader &', 'arg0')], 
+                   [param('ns3::TcpHeader &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): uint16_t ns3::TcpSocketBase::AdvertisedWindowSize() [member function]
     cls.add_method('AdvertisedWindowSize', 
@@ -8963,10 +8964,10 @@
                    'void', 
                    [], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::CompleteFork(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1, ns3::Address const & fromAddress, ns3::Address const & toAdress) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::CompleteFork(ns3::Ptr<ns3::Packet> p, ns3::TcpHeader const & tcpHeader, ns3::Address const & fromAddress, ns3::Address const & toAddress) [member function]
     cls.add_method('CompleteFork', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAdress')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::TcpHeader const &', 'tcpHeader'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAddress')], 
                    visibility='protected')
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ConnectionSucceeded() [member function]
     cls.add_method('ConnectionSucceeded', 
@@ -9023,15 +9024,15 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DupAck(ns3::TcpHeader const & tcpHeader, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
-                   [param('ns3::TcpHeader const &', 't'), param('uint32_t', 'count')], 
+                   [param('ns3::TcpHeader const &', 'tcpHeader'), param('uint32_t', 'count')], 
                    is_pure_virtual=True, visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::EstimateRtt(ns3::TcpHeader const & arg0) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::EstimateRtt(ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('EstimateRtt', 
                    'void', 
-                   [param('ns3::TcpHeader const &', 'arg0')], 
+                   [param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): ns3::Ptr<ns3::TcpSocketBase> ns3::TcpSocketBase::Fork() [member function]
     cls.add_method('Fork', 
@@ -9053,10 +9054,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Header', 'header'), param('uint16_t', 'port'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ForwardUp6(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header header, uint16_t port) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ForwardUp6(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header header, uint16_t port, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('ForwardUp6', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Header', 'header'), param('uint16_t', 'port')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Header', 'header'), param('uint16_t', 'port'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    visibility='protected')
     ## tcp-socket-base.h (module 'internet'): bool ns3::TcpSocketBase::GetAllowBroadcast() const [member function]
     cls.add_method('GetAllowBroadcast', 
@@ -9133,70 +9134,70 @@
                    'bool', 
                    [param('ns3::SequenceNumber32', 'head'), param('ns3::SequenceNumber32', 'tail')], 
                    is_const=True, visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::PeerClose(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::PeerClose(ns3::Ptr<ns3::Packet> p, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('PeerClose', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::PersistTimeout() [member function]
     cls.add_method('PersistTimeout', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessClosing(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessClosing(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessClosing', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessEstablished(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessEstablished(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessEstablished', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessLastAck(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessLastAck(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessLastAck', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessListen(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1, ns3::Address const & arg2, ns3::Address const & arg3) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessListen(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader, ns3::Address const & fromAddress, ns3::Address const & toAddress) [member function]
     cls.add_method('ProcessListen', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1'), param('ns3::Address const &', 'arg2'), param('ns3::Address const &', 'arg3')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAddress')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessSynRcvd(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1, ns3::Address const & arg2, ns3::Address const & arg3) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessSynRcvd(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader, ns3::Address const & fromAddress, ns3::Address const & toAddress) [member function]
     cls.add_method('ProcessSynRcvd', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1'), param('ns3::Address const &', 'arg2'), param('ns3::Address const &', 'arg3')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAddress')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessSynSent(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessSynSent(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessSynSent', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessWait(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessWait(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessWait', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReTxTimeout() [member function]
     cls.add_method('ReTxTimeout', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReadOptions(ns3::TcpHeader const & arg0) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReadOptions(ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ReadOptions', 
                    'void', 
-                   [param('ns3::TcpHeader const &', 'arg0')], 
+                   [param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReceivedAck(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReceivedAck(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ReceivedAck', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReceivedData(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReceivedData(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ReceivedData', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::Retransmit() [member function]
     cls.add_method('Retransmit', 
@@ -9481,10 +9482,10 @@
                    'int', 
                    [], 
                    is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::DupAck(ns3::TcpHeader const & header, uint32_t count) [member function]
+    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
-                   [param('ns3::TcpHeader const &', 'header'), param('uint32_t', 'count')], 
+                   [param('ns3::TcpHeader const &', 't'), param('uint32_t', 'count')], 
                    visibility='protected', is_virtual=True)
     ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::EstimateRtt(ns3::TcpHeader const & header) [member function]
     cls.add_method('EstimateRtt', 
@@ -9602,6 +9603,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -9612,6 +9618,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -9627,6 +9638,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -9652,6 +9668,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -9865,6 +9886,18 @@
     cls.add_method('EnableChecksums', 
                    'void', 
                    [])
+    ## udp-header.h (module 'internet'): void ns3::UdpHeader::ForceChecksum(uint16_t checksum) [member function]
+    cls.add_method('ForceChecksum', 
+                   'void', 
+                   [param('uint16_t', 'checksum')])
+    ## udp-header.h (module 'internet'): void ns3::UdpHeader::ForcePayloadSize(uint16_t payloadSize) [member function]
+    cls.add_method('ForcePayloadSize', 
+                   'void', 
+                   [param('uint16_t', 'payloadSize')])
+    ## udp-header.h (module 'internet'): uint16_t ns3::UdpHeader::GetChecksum() [member function]
+    cls.add_method('GetChecksum', 
+                   'uint16_t', 
+                   [])
     ## udp-header.h (module 'internet'): uint16_t ns3::UdpHeader::GetDestinationPort() const [member function]
     cls.add_method('GetDestinationPort', 
                    'uint16_t', 
@@ -11575,10 +11608,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
     cls.add_method('SetArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
     ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
@@ -13221,10 +13254,10 @@
                    'bool', 
                    [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
                    is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interface, ns3::Ipv6Address address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, ns3::Ipv6Address address) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'address')], 
+                   [param('uint32_t', 'interfaceIndex'), param('ns3::Ipv6Address', 'address')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMetric(uint32_t i, uint16_t metric) [member function]
     cls.add_method('SetMetric', 
@@ -14727,10 +14760,10 @@
                    'ns3::IpL4Protocol::RxStatus', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> interface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'interface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::ReceiveIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, ns3::Ipv4Address payloadSource, ns3::Ipv4Address payloadDestination, uint8_t const * payload) [member function]
     cls.add_method('ReceiveIcmp', 
diff -Naur ns-3.18.1/src/internet/bindings/modulegen__gcc_LP64.py ns-3.19/src/internet/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/internet/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -439,7 +439,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -3000,10 +3000,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -7526,8 +7527,8 @@
 def register_Ns3RttEstimator_methods(root_module, cls):
     ## rtt-estimator.h (module 'internet'): ns3::RttEstimator::RttEstimator() [constructor]
     cls.add_constructor([])
-    ## rtt-estimator.h (module 'internet'): ns3::RttEstimator::RttEstimator(ns3::RttEstimator const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::RttEstimator const &', 'arg0')])
+    ## rtt-estimator.h (module 'internet'): ns3::RttEstimator::RttEstimator(ns3::RttEstimator const & r) [copy constructor]
+    cls.add_constructor([param('ns3::RttEstimator const &', 'r')])
     ## rtt-estimator.h (module 'internet'): ns3::Time ns3::RttEstimator::AckSeq(ns3::SequenceNumber32 ackSeq) [member function]
     cls.add_method('AckSeq', 
                    'ns3::Time', 
@@ -7606,8 +7607,8 @@
 def register_Ns3RttMeanDeviation_methods(root_module, cls):
     ## rtt-estimator.h (module 'internet'): ns3::RttMeanDeviation::RttMeanDeviation() [constructor]
     cls.add_constructor([])
-    ## rtt-estimator.h (module 'internet'): ns3::RttMeanDeviation::RttMeanDeviation(ns3::RttMeanDeviation const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::RttMeanDeviation const &', 'arg0')])
+    ## rtt-estimator.h (module 'internet'): ns3::RttMeanDeviation::RttMeanDeviation(ns3::RttMeanDeviation const & r) [copy constructor]
+    cls.add_constructor([param('ns3::RttMeanDeviation const &', 'r')])
     ## rtt-estimator.h (module 'internet'): ns3::Ptr<ns3::RttEstimator> ns3::RttMeanDeviation::Copy() const [member function]
     cls.add_method('Copy', 
                    'ns3::Ptr< ns3::RttEstimator >', 
@@ -8776,10 +8777,10 @@
                    'void', 
                    [param('ns3::Time', 'timeout')], 
                    is_pure_virtual=True, visibility='private', is_virtual=True)
-    ## tcp-socket.h (module 'internet'): void ns3::TcpSocket::SetInitialCwnd(uint32_t count) [member function]
+    ## tcp-socket.h (module 'internet'): void ns3::TcpSocket::SetInitialCwnd(uint32_t cwnd) [member function]
     cls.add_method('SetInitialCwnd', 
                    'void', 
-                   [param('uint32_t', 'count')], 
+                   [param('uint32_t', 'cwnd')], 
                    is_pure_virtual=True, visibility='private', is_virtual=True)
     ## tcp-socket.h (module 'internet'): void ns3::TcpSocket::SetPersistTimeout(ns3::Time timeout) [member function]
     cls.add_method('SetPersistTimeout', 
@@ -8933,10 +8934,10 @@
                    'int', 
                    [], 
                    is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::AddOptions(ns3::TcpHeader & arg0) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::AddOptions(ns3::TcpHeader & tcpHeader) [member function]
     cls.add_method('AddOptions', 
                    'void', 
-                   [param('ns3::TcpHeader &', 'arg0')], 
+                   [param('ns3::TcpHeader &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): uint16_t ns3::TcpSocketBase::AdvertisedWindowSize() [member function]
     cls.add_method('AdvertisedWindowSize', 
@@ -8963,10 +8964,10 @@
                    'void', 
                    [], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::CompleteFork(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1, ns3::Address const & fromAddress, ns3::Address const & toAdress) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::CompleteFork(ns3::Ptr<ns3::Packet> p, ns3::TcpHeader const & tcpHeader, ns3::Address const & fromAddress, ns3::Address const & toAddress) [member function]
     cls.add_method('CompleteFork', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAdress')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::TcpHeader const &', 'tcpHeader'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAddress')], 
                    visibility='protected')
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ConnectionSucceeded() [member function]
     cls.add_method('ConnectionSucceeded', 
@@ -9023,15 +9024,15 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::DupAck(ns3::TcpHeader const & tcpHeader, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
-                   [param('ns3::TcpHeader const &', 't'), param('uint32_t', 'count')], 
+                   [param('ns3::TcpHeader const &', 'tcpHeader'), param('uint32_t', 'count')], 
                    is_pure_virtual=True, visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::EstimateRtt(ns3::TcpHeader const & arg0) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::EstimateRtt(ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('EstimateRtt', 
                    'void', 
-                   [param('ns3::TcpHeader const &', 'arg0')], 
+                   [param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): ns3::Ptr<ns3::TcpSocketBase> ns3::TcpSocketBase::Fork() [member function]
     cls.add_method('Fork', 
@@ -9053,10 +9054,10 @@
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv4Header', 'header'), param('uint16_t', 'port'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ForwardUp6(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header header, uint16_t port) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ForwardUp6(ns3::Ptr<ns3::Packet> packet, ns3::Ipv6Header header, uint16_t port, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('ForwardUp6', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Header', 'header'), param('uint16_t', 'port')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Ipv6Header', 'header'), param('uint16_t', 'port'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    visibility='protected')
     ## tcp-socket-base.h (module 'internet'): bool ns3::TcpSocketBase::GetAllowBroadcast() const [member function]
     cls.add_method('GetAllowBroadcast', 
@@ -9133,70 +9134,70 @@
                    'bool', 
                    [param('ns3::SequenceNumber32', 'head'), param('ns3::SequenceNumber32', 'tail')], 
                    is_const=True, visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::PeerClose(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::PeerClose(ns3::Ptr<ns3::Packet> p, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('PeerClose', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::PersistTimeout() [member function]
     cls.add_method('PersistTimeout', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessClosing(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessClosing(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessClosing', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessEstablished(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessEstablished(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessEstablished', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessLastAck(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessLastAck(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessLastAck', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessListen(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1, ns3::Address const & arg2, ns3::Address const & arg3) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessListen(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader, ns3::Address const & fromAddress, ns3::Address const & toAddress) [member function]
     cls.add_method('ProcessListen', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1'), param('ns3::Address const &', 'arg2'), param('ns3::Address const &', 'arg3')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAddress')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessSynRcvd(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1, ns3::Address const & arg2, ns3::Address const & arg3) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessSynRcvd(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader, ns3::Address const & fromAddress, ns3::Address const & toAddress) [member function]
     cls.add_method('ProcessSynRcvd', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1'), param('ns3::Address const &', 'arg2'), param('ns3::Address const &', 'arg3')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader'), param('ns3::Address const &', 'fromAddress'), param('ns3::Address const &', 'toAddress')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessSynSent(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessSynSent(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessSynSent', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessWait(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ProcessWait(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ProcessWait', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected')
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReTxTimeout() [member function]
     cls.add_method('ReTxTimeout', 
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReadOptions(ns3::TcpHeader const & arg0) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReadOptions(ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ReadOptions', 
                    'void', 
-                   [param('ns3::TcpHeader const &', 'arg0')], 
+                   [param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReceivedAck(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReceivedAck(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ReceivedAck', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
-    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReceivedData(ns3::Ptr<ns3::Packet> arg0, ns3::TcpHeader const & arg1) [member function]
+    ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ReceivedData(ns3::Ptr<ns3::Packet> packet, ns3::TcpHeader const & tcpHeader) [member function]
     cls.add_method('ReceivedData', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'arg0'), param('ns3::TcpHeader const &', 'arg1')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::TcpHeader const &', 'tcpHeader')], 
                    visibility='protected', is_virtual=True)
     ## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::Retransmit() [member function]
     cls.add_method('Retransmit', 
@@ -9481,10 +9482,10 @@
                    'int', 
                    [], 
                    is_virtual=True)
-    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::DupAck(ns3::TcpHeader const & header, uint32_t count) [member function]
+    ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::DupAck(ns3::TcpHeader const & t, uint32_t count) [member function]
     cls.add_method('DupAck', 
                    'void', 
-                   [param('ns3::TcpHeader const &', 'header'), param('uint32_t', 'count')], 
+                   [param('ns3::TcpHeader const &', 't'), param('uint32_t', 'count')], 
                    visibility='protected', is_virtual=True)
     ## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::EstimateRtt(ns3::TcpHeader const & header) [member function]
     cls.add_method('EstimateRtt', 
@@ -9602,6 +9603,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -9612,6 +9618,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -9627,6 +9638,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -9652,6 +9668,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -9865,6 +9886,18 @@
     cls.add_method('EnableChecksums', 
                    'void', 
                    [])
+    ## udp-header.h (module 'internet'): void ns3::UdpHeader::ForceChecksum(uint16_t checksum) [member function]
+    cls.add_method('ForceChecksum', 
+                   'void', 
+                   [param('uint16_t', 'checksum')])
+    ## udp-header.h (module 'internet'): void ns3::UdpHeader::ForcePayloadSize(uint16_t payloadSize) [member function]
+    cls.add_method('ForcePayloadSize', 
+                   'void', 
+                   [param('uint16_t', 'payloadSize')])
+    ## udp-header.h (module 'internet'): uint16_t ns3::UdpHeader::GetChecksum() [member function]
+    cls.add_method('GetChecksum', 
+                   'uint16_t', 
+                   [])
     ## udp-header.h (module 'internet'): uint16_t ns3::UdpHeader::GetDestinationPort() const [member function]
     cls.add_method('GetDestinationPort', 
                    'uint16_t', 
@@ -11575,10 +11608,10 @@
     cls.add_method('Send', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arg0) [member function]
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
     cls.add_method('SetArpCache', 
                    'void', 
-                   [param('ns3::Ptr< ns3::ArpCache >', 'arg0')])
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
     ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
     cls.add_method('SetDevice', 
                    'void', 
@@ -13221,10 +13254,10 @@
                    'bool', 
                    [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
                    is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interface, ns3::Ipv6Address address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, ns3::Ipv6Address address) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'address')], 
+                   [param('uint32_t', 'interfaceIndex'), param('ns3::Ipv6Address', 'address')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMetric(uint32_t i, uint16_t metric) [member function]
     cls.add_method('SetMetric', 
@@ -14727,10 +14760,10 @@
                    'ns3::IpL4Protocol::RxStatus', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'header'), param('ns3::Ptr< ns3::Ipv4Interface >', 'incomingInterface')], 
                    is_virtual=True)
-    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> interface) [member function]
+    ## tcp-l4-protocol.h (module 'internet'): ns3::IpL4Protocol::RxStatus ns3::TcpL4Protocol::Receive(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<ns3::Ipv6Interface> incomingInterface) [member function]
     cls.add_method('Receive', 
                    'ns3::IpL4Protocol::RxStatus', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'interface')], 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::Ipv6Interface >', 'incomingInterface')], 
                    is_virtual=True)
     ## tcp-l4-protocol.h (module 'internet'): void ns3::TcpL4Protocol::ReceiveIcmp(ns3::Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo, ns3::Ipv4Address payloadSource, ns3::Ipv4Address payloadDestination, uint8_t const * payload) [member function]
     cls.add_method('ReceiveIcmp', 
diff -Naur ns-3.18.1/src/internet/doc/internet-stack.rst ns-3.19/src/internet/doc/internet-stack.rst
--- ns-3.18.1/src/internet/doc/internet-stack.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/doc/internet-stack.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 Internet Stack
 --------------
@@ -16,7 +17,7 @@
 Internet Nodes are not subclasses of class Node; they are simply Nodes that have
 had a bunch of IP-related objects aggregated to them. They can be put together
 by hand, or via a helper function :cpp:func:`InternetStackHelper::Install ()`
-which does the following to all nodes passed in as arguments:::
+which does the following to all nodes passed in as arguments::
 
     void
     InternetStackHelper::Install (Ptr<Node> node) const
@@ -76,7 +77,7 @@
 are added by a factory object (TCP) or by a routing helper (m_routing).
 
 Note that the routing protocol is configured and set outside this
-function. By default, the following protocols are added:::
+function. By default, the following protocols are added::
 
     void InternetStackHelper::Initialize ()
     {
@@ -110,7 +111,7 @@
 typically class :cpp:class:`Ipv4`, but the
 Ipv4L3Protocol public API is also used internally at present.
 
-In class Ipv4L3Protocol, one method described below is ``Receive ()``:::
+In class Ipv4L3Protocol, one method described below is ``Receive ()``::
 
      /**
        * Lower layer calls this method after calling L3Demux::Lookup
@@ -119,22 +120,22 @@
        *    - implement a per-NetDevice ARP cache
        *    - send back arp replies on the right device
        */
-      void Receive( Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol, 
-    const Address &from, const Address &to, NetDevice::PacketType packetType);
+     void Receive( Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol, 
+     const Address &from, const Address &to, NetDevice::PacketType packetType);
 
 First, note that the ``Receive ()`` function has a matching signature to the
 ReceiveCallback in the class :cpp:class:`Node`. This function pointer is
 inserted into the Node's protocol handler when ``AddInterface ()`` is called.
 The actual registration is done
-with a statement such as follows:::
+with a statement such as follows::
 
      RegisterProtocolHandler ( MakeCallback (&Ipv4Protocol::Receive, ipv4),
-        Ipv4L3Protocol::PROT_NUMBER, 0);
+                               Ipv4L3Protocol::PROT_NUMBER, 0);
 
 The Ipv4L3Protocol object is aggregated to the Node; there is only one such
 Ipv4L3Protocol object. Higher-layer protocols that have a packet to send down to
 the Ipv4L3Protocol object can call ``GetObject<Ipv4L3Protocol> ()`` to obtain a
-pointer, as follows:::
+pointer, as follows::
 
   Ptr<Ipv4L3Protocol> ipv4 = m_node->GetObject<Ipv4L3Protocol> ();
   if (ipv4 != 0)
@@ -146,7 +147,7 @@
 objects together:  callbacks, and object aggregation.
 
 Once IPv4 routing has determined that a packet is for the local node, it
-forwards it up the stack.  This is done with the following function:::
+forwards it up the stack.  This is done with the following function::
 
     void
     Ipv4L3Protocol::LocalDeliver (Ptr<const Packet> packet, Ipv4Header const&ip, uint32_t iif)
@@ -168,7 +169,7 @@
 queue. This can be particularly puzzling when sending jumbo packets or packet bursts using UDP.
 The ARP cache pending queue is limited (3 datagrams) and IP packets might be fragmented, easily
 overfilling the ARP cache queue size. In those cases it is useful to increase the ARP cache
-pending size to a proper value, e.g.:::
+pending size to a proper value, e.g.::
 
     Config::SetDefault ("ns3::ArpCache::PendingQueueSize", UintegerValue (MAX_BURST_SIZE/L2MTU*3));
 
@@ -187,7 +188,7 @@
 factory. An application that needs a new socket 
 
 For instance, to create a UDP socket, an application would use a code snippet
-such as the following:::
+such as the following::
 
       Ptr<Udp> udpSocketFactory = GetNode ()->GetObject<Udp> ();
       Ptr<Socket> m_socket = socketFactory->CreateSocket ();
@@ -225,13 +226,14 @@
 |ns3| implements an asynchronous model for socket I/O; the application
 sets a callback to be notified of received data ready to be read, and the 
 callback is invoked by the transport protocol when data is available.
-This callback is specified as follows:::
+This callback is specified as follows::
 
   void Socket::SetRecvCallback (Callback<void, Ptr<Socket>, 
-    Ptr<Packet>, const Address&> receivedData);
+                                Ptr<Packet>,
+                                const Address&> receivedData);
 
 The data being received is conveyed in the Packet data buffer.  An example
-usage is in class :cpp:class:`PacketSink`:::
+usage is in class :cpp:class:`PacketSink`::
 
   m_socket->SetRecvCallback (MakeCallback(&PacketSink::HandleRead, this));
 
diff -Naur ns-3.18.1/src/internet/doc/ipv6.rst ns-3.19/src/internet/doc/ipv6.rst
--- ns-3.18.1/src/internet/doc/ipv6.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/doc/ipv6.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 IPv6
 ----
@@ -21,7 +22,7 @@
 
 The implementation of IPv6 is contained in the following files:
 
-::
+.. sourcecode:: text
 
     src/internet/model/icmpv6-header.{cc,h}
     src/internet/model/icmpv6-l4-protocol.{cc,h}
@@ -56,7 +57,7 @@
 
 Also some helpers are involved with IPv6:
 
-::
+.. sourcecode:: text
 
     src/internet/helper/internet-stack-helper.{cc,h}
     src/internet/helper/ipv6-address-helper.{cc,h}
diff -Naur ns-3.18.1/src/internet/doc/routing-overview.rst ns-3.19/src/internet/doc/routing-overview.rst
--- ns-3.18.1/src/internet/doc/routing-overview.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/doc/routing-overview.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 Routing overview
 ----------------
@@ -110,14 +111,14 @@
 Global Unicast Routing API
 ++++++++++++++++++++++++++
 
-The public API is very minimal. User scripts include the following:::
+The public API is very minimal. User scripts include the following::
 
     #include "ns3/internet-module.h"
 
 If the default InternetStackHelper is used, then an instance of global routing
 will be aggregated to each node.  After IP addresses are configured, the
 following function call will cause all of the nodes that have an Ipv4 interface
-to receive forwarding tables entered automatically by the GlobalRouteManager:::
+to receive forwarding tables entered automatically by the GlobalRouteManager::
 
   Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
 
@@ -126,7 +127,7 @@
 described below.
 
 It is possible to call this function again in the midst of a simulation using
-the following additional public function:::
+the following additional public function::
 
   Ipv4GlobalRoutingHelper::RecomputeRoutingTables ();
 
@@ -134,10 +135,10 @@
 and rebuilds the routes.
 
 For instance, this scheduling call will cause the tables to be rebuilt
-at time 5 seconds:::
+at time 5 seconds::
 
   Simulator::Schedule (Seconds (5),
-    &Ipv4GlobalRoutingHelper::RecomputeRoutingTables);
+                       &Ipv4GlobalRoutingHelper::RecomputeRoutingTables);
 
 
 There are two attributes that govern the behavior. The first is
@@ -194,7 +195,7 @@
 be treated like a broadcast CSMA link).
 
 The GlobalRouteManager first walks the list of nodes and aggregates
-a GlobalRouter interface to each one as follows:::
+a GlobalRouter interface to each one as follows::
 
   typedef std::vector < Ptr<Node> >::iterator Iterator;
   for (Iterator i = NodeList::Begin (); i != NodeList::End (); i++)
@@ -219,9 +220,9 @@
 
 * class Ipv4StaticRouting (covering both unicast and multicast)
 * IPv4 Optimized Link State Routing (OLSR) (a MANET protocol defined in 
-  `RFC 3626 <http://www.ietf.org/rfc/rfc3626.txt>`_)
+  :rfc:`3626`)
 * IPv4 Ad Hoc On Demand Distance Vector (AODV) (a MANET protocol defined in
-  `RFC 3561 <http://www.ietf.org/rfc/rfc3561.txt>`_)
+  :rfc:`3561`)
 * IPv4 Destination Sequenced Distance Vector (DSDV) (a MANET protocol)
 * class Ipv4ListRouting (used to store a prioritized list of routing protocols)
 * class Ipv4GlobalRouting (used to store routes computed by the global route
@@ -256,7 +257,7 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Class Ipv4ListRouting provides a pure virtual function declaration for the
-method that allows one to add a routing protocol:::
+method that allows one to add a routing protocol::
 
   void AddRoutingProtocol (Ptr<Ipv4RoutingProtocol> routingProtocol,
                            int16_t priority);
@@ -271,7 +272,7 @@
 Ipv4RoutingProtocols is stored, and and the routing protocols are each consulted
 in decreasing order of priority to see whether a match is found. Therefore, if
 you want your Ipv4RoutingProtocol to have priority lower than the static
-routing, insert it with priority less than 0; e.g.:::
+routing, insert it with priority less than 0; e.g.::
 
   Ptr<MyRoutingProtocol> myRoutingProto = CreateObject<MyRoutingProtocol> ();
   listRoutingPtr->AddRoutingProtocol (myRoutingProto, -10);
@@ -334,13 +335,13 @@
 *****************
 
 The following function is used to add a static multicast route
-to a node:::
+to a node::
 
     void 
     Ipv4StaticRouting::AddMulticastRoute (Ipv4Address origin,
-                              Ipv4Address group,
-                              uint32_t inputInterface,
-                              std::vector<uint32_t> outputInterfaces);
+                                          Ipv4Address group,
+                                          uint32_t inputInterface,
+                                          std::vector<uint32_t> outputInterfaces);
 
 A multicast route must specify an origin IP address, a multicast group and an
 input network interface index as conditions and provide a vector of output
@@ -370,7 +371,7 @@
 limited to specifying a single output interface for compatibility with
 existing functionality in other systems.
 
-Another command sets the default multicast route:::
+Another command sets the default multicast route::
 
     void 
     Ipv4StaticRouting::SetDefaultMulticastRoute (uint32_t outputInterface);
@@ -391,7 +392,7 @@
 found.
 
 Finally, a number of additional functions are provided to fetch and remove
-multicast routes:::
+multicast routes::
 
   uint32_t GetNMulticastRoutes (void) const;
 
diff -Naur ns-3.18.1/src/internet/doc/tcp.rst ns-3.19/src/internet/doc/tcp.rst
--- ns-3.18.1/src/internet/doc/tcp.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/doc/tcp.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 TCP models in ns-3
 ------------------
@@ -41,7 +42,9 @@
 The model is a full TCP, in that it is bidirectional and attempts to model the
 connection setup and close logic. 
 
-The implementation of TCP is contained in the following files:::
+The implementation of TCP is contained in the following files:
+
+.. sourcecode:: text
 
     src/internet/model/tcp-header.{cc,h}
     src/internet/model/tcp-l4-protocol.{cc,h}
@@ -59,7 +62,7 @@
 
 Different variants of TCP congestion control are supported by subclassing
 the common base class :cpp:class:`TcpSocketBase`.  Several variants
-are supported, including RFC 793 (no congestion control), Tahoe, Reno, Westwood,
+are supported, including :rfc:`793` (no congestion control), Tahoe, Reno, Westwood,
 Westwood+, and NewReno.  NewReno is used by default.  See the Usage section of this
 document for on how to change the default TCP variant used in simulation.
 
@@ -70,7 +73,7 @@
 the |ns3| application which kind of socket factory to use.
 
 Using the helper functions defined in ``src/applications/helper`` and
-``src/network/helper``, here is how one would create a TCP receiver:::
+``src/network/helper``, here is how one would create a TCP receiver::
 
   // Create a packet sink on the star "hub" to receive these packets
   uint16_t port = 50000;
@@ -81,7 +84,7 @@
   sinkApp.Stop (Seconds (10.0));
 
 Similarly, the below snippet configures OnOffApplication traffic source to use
-TCP:::
+TCP::
 
   // Create the OnOff applications to send TCP to the server
   OnOffHelper clientHelper ("ns3::TcpSocketFactory", Address ());
@@ -103,7 +106,7 @@
 
 To set the default socket type before any internet stack-related objects are
 created, one may put the following statement at the top of the simulation
-program::: 
+program:: 
 
   Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue ("ns3::TcpTahoe")); 
 
@@ -116,7 +119,7 @@
 underlying TcpL4Protocol object.  The easiest way to get at this would be 
 through the attribute configuration system.  In the below example,
 the Node container "n0n1" is accessed
-to get the zeroth element, and a socket is created on this node:::
+to get the zeroth element, and a socket is created on this node::
 
   // Create and bind the socket...
   TypeId tid = TypeId::LookupByName ("ns3::TcpTahoe");
@@ -127,7 +130,7 @@
 Above, the "*" wild card for node number is passed to the attribute
 configuration system, so that all future sockets on all nodes are set to 
 Tahoe, not just on node 'n0n1.Get (0)'.  If one wants to limit it to just 
-the specified node, one would have to do something like:::
+the specified node, one would have to do something like::
 
   // Create and bind the socket...
   TypeId tid = TypeId::LookupByName ("ns3::TcpTahoe");
@@ -186,9 +189,11 @@
 
 Using the ``build.py`` script in ns-3-allinone directory, NSC will be enabled by
 default unless the platform does not support it. To disable it when building
-|ns3|, type:::
+|ns3|, type:
+
+.. sourcecode:: bash
 
-./waf configure --enable-examples --enable-tests --disable-nsc
+  $ ./waf configure --enable-examples --enable-tests --disable-nsc
 
 Building and validating
 +++++++++++++++++++++++
@@ -197,12 +202,16 @@
 additional arguments are needed for waf. Building nsc may take some time
 compared to |ns3|; it is interleaved in the |ns3| building process.
 
-Try running the following ns-3 test suite:::  
+Try running the following ns-3 test suite:
+
+.. sourcecode:: bash
 
-    ./test.py -s ns3-tcp-interoperability
+    $ ./test.py -s ns3-tcp-interoperability
 
 If NSC has been successfully built, the following test should show up 
-in the results:::
+in the results:
+
+.. sourcecode:: text
 
     PASS TestSuite ns3-tcp-interoperability
 
@@ -211,10 +220,12 @@
 Usage
 +++++
 
-There are a few example files.  Try::
+There are a few example files.  Try:
+
+.. sourcecode:: bash
 
-    ./waf --run tcp-nsc-zoo
-    ./waf --run tcp-nsc-lfn
+    $ ./waf --run tcp-nsc-zoo
+    $ ./waf --run tcp-nsc-lfn
 
 These examples will deposit some ``.pcap`` files in your directory,
 which can be examined by tcpdump or wireshark.
@@ -222,7 +233,7 @@
 Let's look at the ``examples/tcp/tcp-nsc-zoo.cc`` file for some typical
 usage. How does it differ from using native |ns3| TCP? There is one main
 configuration line, when using NSC and the |ns3| helper API, that needs to be
-set:::
+set::
 
   InternetStackHelper internetStack;
 
@@ -240,9 +251,11 @@
 Which stacks are available to use? Presently, the focus has been on
 Linux 2.6.18 and Linux 2.6.26 stacks for |ns3|. To see which stacks
 were built, one can execute the following find command at the |ns3| top level
-directory:::
+directory:
+
+.. sourcecode:: bash
 
-    ~/ns-3.10> find nsc -name "*.so" -type f 
+    $ find nsc -name "*.so" -type f 
     nsc/linux-2.6.18/liblinux2.6.18.so
     nsc/linux-2.6.26/liblinux2.6.26.so
 
@@ -258,7 +271,7 @@
 
 Additionally, NSC TCP exports a lot of configuration variables into the 
 |ns3| attributes system, via a `sysctl <http://en.wikipedia.org/wiki/Sysctl>`_-like interface. In the ``examples/tcp/tcp-nsc-zoo`` example, you
-can see the following configuration:::
+can see the following configuration::
 
 
   // this disables TCP SACK, wscale and timestamps on node 1 (the attributes 
@@ -272,10 +285,10 @@
 
 These additional configuration variables are not available to native |ns3| TCP.
 
-Also note that default values for TCP attributes in |ns3| TCP may differ from the nsc TCP implementation.  Specifically in |ns3|::: 
+Also note that default values for TCP attributes in |ns3| TCP may differ from the nsc TCP implementation.  Specifically in |ns3|:
 
-		1) TCP default MSS is 536
-		2) TCP Delayed Ack count is 2 
+  1) TCP default MSS is 536
+  2) TCP Delayed Ack count is 2 
 		
 Therefore when making comparisons between results obtained using nsc and |ns3| TCP, care must be taken to ensure these values are set appropriately.  See /examples/tcp/tcp-nsc-comparision.cc for an example.
 
diff -Naur ns-3.18.1/src/internet/helper/internet-stack-helper.cc ns-3.19/src/internet/helper/internet-stack-helper.cc
--- ns-3.18.1/src/internet/helper/internet-stack-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/internet-stack-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -216,16 +216,16 @@
 // Global maps of protocol/interface pairs to file objects seems to fit the 
 // bill.
 //
-typedef std::pair<Ptr<Ipv4>, uint32_t> InterfacePairIpv4; 
-typedef std::map<InterfacePairIpv4, Ptr<PcapFileWrapper> > InterfaceFileMapIpv4;
-typedef std::map<InterfacePairIpv4, Ptr<OutputStreamWrapper> > InterfaceStreamMapIpv4;
+typedef std::pair<Ptr<Ipv4>, uint32_t> InterfacePairIpv4;  /**< Ipv4/interface pair */
+typedef std::map<InterfacePairIpv4, Ptr<PcapFileWrapper> > InterfaceFileMapIpv4;  /**< Ipv4/interface and Pcap file wrapper container */
+typedef std::map<InterfacePairIpv4, Ptr<OutputStreamWrapper> > InterfaceStreamMapIpv4;  /**< Ipv4/interface and output stream container */
 
 static InterfaceFileMapIpv4 g_interfaceFileMapIpv4; /**< A mapping of Ipv4/interface pairs to pcap files */
 static InterfaceStreamMapIpv4 g_interfaceStreamMapIpv4; /**< A mapping of Ipv4/interface pairs to ascii streams */
 
-typedef std::pair<Ptr<Ipv6>, uint32_t> InterfacePairIpv6;
-typedef std::map<InterfacePairIpv6, Ptr<PcapFileWrapper> > InterfaceFileMapIpv6;
-typedef std::map<InterfacePairIpv6, Ptr<OutputStreamWrapper> > InterfaceStreamMapIpv6;
+typedef std::pair<Ptr<Ipv6>, uint32_t> InterfacePairIpv6;  /**< Ipv6/interface pair */
+typedef std::map<InterfacePairIpv6, Ptr<PcapFileWrapper> > InterfaceFileMapIpv6;  /**< Ipv6/interface and Pcap file wrapper container */
+typedef std::map<InterfacePairIpv6, Ptr<OutputStreamWrapper> > InterfaceStreamMapIpv6;  /**< Ipv6/interface and output stream container */
 
 static InterfaceFileMapIpv6 g_interfaceFileMapIpv6; /**< A mapping of Ipv6/interface pairs to pcap files */
 static InterfaceStreamMapIpv6 g_interfaceStreamMapIpv6; /**< A mapping of Ipv6/interface pairs to pcap files */
@@ -490,6 +490,12 @@
   Install (node);
 }
 
+/**
+ * \brief Sync function for IPv4 packet - Pcap output
+ * \param p smart pointer to the packet
+ * \param ipv4 smart pointer to the node's IPv4 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv4L3ProtocolRxTxSink (Ptr<const Packet> p, Ptr<Ipv4> ipv4, uint32_t interface)
 {
@@ -582,6 +588,12 @@
   g_interfaceFileMapIpv4[std::make_pair (ipv4, interface)] = file;
 }
 
+/**
+ * \brief Sync function for IPv6 packet - Pcap output
+ * \param p smart pointer to the packet
+ * \param ipv6 smart pointer to the node's IPv6 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv6L3ProtocolRxTxSink (Ptr<const Packet> p, Ptr<Ipv6> ipv6, uint32_t interface)
 {
@@ -674,6 +686,15 @@
   g_interfaceFileMapIpv6[std::make_pair (ipv6, interface)] = file;
 }
 
+/**
+ * \brief Sync function for IPv4 dropped packet - Ascii output
+ * \param stream the output stream
+ * \param header IPv4 header
+ * \param packet smart pointer to the packet
+ * \param reason the reason for the dropping
+ * \param ipv4 smart pointer to the node's IPv4 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv4L3ProtocolDropSinkWithoutContext (
   Ptr<OutputStreamWrapper> stream,
@@ -701,6 +722,13 @@
   *stream->GetStream () << "d " << Simulator::Now ().GetSeconds () << " " << *p << std::endl;
 }
 
+/**
+ * \brief Sync function for IPv4 transmitted packet - Ascii output
+ * \param stream the output stream
+ * \param packet smart pointer to the packet
+ * \param ipv4 smart pointer to the node's IPv4 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv4L3ProtocolTxSinkWithoutContext (
   Ptr<OutputStreamWrapper> stream,
@@ -718,6 +746,13 @@
   *stream->GetStream () << "t " << Simulator::Now ().GetSeconds () << " " << *packet << std::endl;
 }
 
+/**
+ * \brief Sync function for IPv4 received packet - Ascii output
+ * \param stream the output stream
+ * \param packet smart pointer to the packet
+ * \param ipv4 smart pointer to the node's IPv4 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv4L3ProtocolRxSinkWithoutContext (
   Ptr<OutputStreamWrapper> stream,
@@ -735,6 +770,16 @@
   *stream->GetStream () << "r " << Simulator::Now ().GetSeconds () << " " << *packet << std::endl;
 }
 
+/**
+ * \brief Sync function for IPv4 dropped packet - Ascii output
+ * \param stream the output stream
+ * \param context the context
+ * \param header IPv4 header
+ * \param packet smart pointer to the packet
+ * \param reason the reason for the dropping
+ * \param ipv4 smart pointer to the node's IPv4 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv4L3ProtocolDropSinkWithContext (
   Ptr<OutputStreamWrapper> stream,
@@ -768,6 +813,14 @@
 #endif
 }
 
+/**
+ * \brief Sync function for IPv4 transmitted packet - Ascii output
+ * \param stream the output stream
+ * \param context the context
+ * \param packet smart pointer to the packet
+ * \param ipv4 smart pointer to the node's IPv4 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv4L3ProtocolTxSinkWithContext (
   Ptr<OutputStreamWrapper> stream,
@@ -791,6 +844,14 @@
 #endif
 }
 
+/**
+ * \brief Sync function for IPv4 received packet - Ascii output
+ * \param stream the output stream
+ * \param context the context
+ * \param packet smart pointer to the packet
+ * \param ipv4 smart pointer to the node's IPv4 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv4L3ProtocolRxSinkWithContext (
   Ptr<OutputStreamWrapper> stream,
@@ -963,6 +1024,15 @@
   g_interfaceStreamMapIpv4[std::make_pair (ipv4, interface)] = stream;
 }
 
+/**
+ * \brief Sync function for IPv6 dropped packet - Ascii output
+ * \param stream the output stream
+ * \param header IPv6 header
+ * \param packet smart pointer to the packet
+ * \param reason the reason for the dropping
+ * \param ipv6 smart pointer to the node's IPv6 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv6L3ProtocolDropSinkWithoutContext (
   Ptr<OutputStreamWrapper> stream,
@@ -990,6 +1060,13 @@
   *stream->GetStream () << "d " << Simulator::Now ().GetSeconds () << " " << *p << std::endl;
 }
 
+/**
+ * \brief Sync function for IPv6 transmitted packet - Ascii output
+ * \param stream the output stream
+ * \param packet smart pointer to the packet
+ * \param ipv6 smart pointer to the node's IPv6 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv6L3ProtocolTxSinkWithoutContext (
   Ptr<OutputStreamWrapper> stream,
@@ -1007,6 +1084,13 @@
   *stream->GetStream () << "t " << Simulator::Now ().GetSeconds () << " " << *packet << std::endl;
 }
 
+/**
+ * \brief Sync function for IPv6 received packet - Ascii output
+ * \param stream the output stream
+ * \param packet smart pointer to the packet
+ * \param ipv6 smart pointer to the node's IPv6 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv6L3ProtocolRxSinkWithoutContext (
   Ptr<OutputStreamWrapper> stream,
@@ -1024,6 +1108,16 @@
   *stream->GetStream () << "r " << Simulator::Now ().GetSeconds () << " " << *packet << std::endl;
 }
 
+/**
+ * \brief Sync function for IPv6 dropped packet - Ascii output
+ * \param stream the output stream
+ * \param context the context
+ * \param header IPv6 header
+ * \param packet smart pointer to the packet
+ * \param reason the reason for the dropping
+ * \param ipv6 smart pointer to the node's IPv6 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv6L3ProtocolDropSinkWithContext (
   Ptr<OutputStreamWrapper> stream,
@@ -1057,6 +1151,14 @@
 #endif
 }
 
+/**
+ * \brief Sync function for IPv6 transmitted packet - Ascii output
+ * \param stream the output stream
+ * \param context the context
+ * \param packet smart pointer to the packet
+ * \param ipv6 smart pointer to the node's IPv6 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv6L3ProtocolTxSinkWithContext (
   Ptr<OutputStreamWrapper> stream,
@@ -1080,6 +1182,14 @@
 #endif
 }
 
+/**
+ * \brief Sync function for IPv6 received packet - Ascii output
+ * \param stream the output stream
+ * \param context the context
+ * \param packet smart pointer to the packet
+ * \param ipv6 smart pointer to the node's IPv6 stack
+ * \param interface incoming interface
+ */
 static void
 Ipv6L3ProtocolRxSinkWithContext (
   Ptr<OutputStreamWrapper> stream,
diff -Naur ns-3.18.1/src/internet/helper/internet-stack-helper.h ns-3.19/src/internet/helper/internet-stack-helper.h
--- ns-3.18.1/src/internet/helper/internet-stack-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/internet-stack-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -80,7 +80,15 @@
    * Destroy the InternetStackHelper
    */
   virtual ~InternetStackHelper(void);
+
+  /**
+   * \brief Copy constructor
+   */
   InternetStackHelper (const InternetStackHelper &);
+
+  /**
+   * \brief Copy constructor
+   */
   InternetStackHelper &operator = (const InternetStackHelper &o);
 
   /**
@@ -266,8 +274,21 @@
                                         uint32_t interface,
                                         bool explicitFilename);
 
+  /**
+   * \brief Initialize the helper to its default values
+   */
   void Initialize (void);
+
+  /**
+   * \internal
+   * \brief TCP objects factory
+   */
   ObjectFactory m_tcpFactory;
+
+  /**
+   * \internal
+   * \brief IPv4 routing helper.
+   */
   const Ipv4RoutingHelper *m_routing;
 
   /**
@@ -278,6 +299,10 @@
 
   /**
    * \internal
+   *
+   * \brief create an object from its TypeId and aggregates it to the node
+   * \param node the node
+   * \param typeId the object TypeId
    */
   static void CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId);
 
@@ -288,40 +313,64 @@
 
   /**
    * \internal
+   *
+   * \brief checks if there is an hook to a Pcap wrapper
+   * \param ipv4 pointer to the IPv4 object
+   * \returns true if a hook is found
    */
   bool PcapHooked (Ptr<Ipv4> ipv4);
 
   /**
    * \internal
+   *
+   * \brief checks if there is an hook to an ascii output stream
+   * \param ipv4 pointer to the IPv4 object
+   * \returns true if a hook is found
    */
   bool AsciiHooked (Ptr<Ipv4> ipv4);
 
   /**
    * \internal
+   *
+   * \brief checks if there is an hook to a Pcap wrapper
+   * \param ipv6 pointer to the IPv6 object
+   * \returns true if a hook is found
    */
   bool PcapHooked (Ptr<Ipv6> ipv6);
 
   /**
    * \internal
+   *
+   * \brief checks if there is an hook to an ascii output stream
+   * \param ipv6 pointer to the IPv6 object
+   * \returns true if a hook is found
    */
   bool AsciiHooked (Ptr<Ipv6> ipv6);
 
   /**
+   * \internal
+   *
    * \brief IPv4 install state (enabled/disabled) ?
    */
   bool m_ipv4Enabled;
 
   /**
+   * \internal
+   *
    * \brief IPv6 install state (enabled/disabled) ?
    */
   bool m_ipv6Enabled;
 
   /**
+   * \internal
+   *
    * \brief IPv4 ARP Jitter state (enabled/disabled) ?
    */
   bool m_ipv4ArpJitterEnabled;
 
   /**
+   * \internal
+   *
    * \brief IPv6 IPv6 NS and RS Jitter state (enabled/disabled) ?
    */
   bool m_ipv6NsRsJitterEnabled;
diff -Naur ns-3.18.1/src/internet/helper/internet-trace-helper.h ns-3.19/src/internet/helper/internet-trace-helper.h
--- ns-3.18.1/src/internet/helper/internet-trace-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/internet-trace-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -268,7 +268,7 @@
   void EnableAsciiIpv4All (Ptr<OutputStreamWrapper> stream);
 
   /**
-   * @brief Enable pcap output on the Ipv4 and interface pair specified by a 
+   * @brief Enable ascii trace output on the Ipv4 and interface pair specified by a
    * global node-id (of a previously created node) and interface.  Since there
    * can be only one Ipv4 aggregated to a node, the node-id unambiguously 
    * determines the Ipv4.
@@ -283,7 +283,7 @@
   void EnableAsciiIpv4 (std::string prefix, uint32_t nodeid, uint32_t deviceid, bool explicitFilename);
 
   /**
-   * @brief Enable pcap output on the Ipv4 and interface pair specified by a 
+   * @brief Enable ascii trace output on the Ipv4 and interface pair specified by a
    * global node-id (of a previously created node) and interface.  Since there
    * can be only one Ipv4 aggregated to a node, the node-id unambiguously 
    * determines the Ipv4.
@@ -299,7 +299,21 @@
 
 private:
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv4 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv4 aggregated to a node, the node-id unambiguously
+   * determines the Ipv4.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param nodeid The node identifier/number of the node on which to enable
+   *               ascii tracing
+   * @param interface The device identifier/index of the device on which to enable
+   *               ascii tracing
+   * @param explicitFilename Treat the prefix as an explicit filename if true.
    */
   void EnableAsciiIpv4Impl (Ptr<OutputStreamWrapper> stream, 
                             std::string prefix, 
@@ -308,17 +322,50 @@
                             bool explicitFilename);
 
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv4 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv4 aggregated to a node, the node-id unambiguously
+   * determines the Ipv4.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param n container of nodes.
    */
   void EnableAsciiIpv4Impl (Ptr<OutputStreamWrapper> stream, std::string prefix, NodeContainer n);
 
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv4 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv4 aggregated to a node, the node-id unambiguously
+   * determines the Ipv4.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param c Ipv4InterfaceContainer of Ipv4 and interface pairs
    */
   void EnableAsciiIpv4Impl (Ptr<OutputStreamWrapper> stream, std::string prefix, Ipv4InterfaceContainer c);
 
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv4 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv4 aggregated to a node, the node-id unambiguously
+   * determines the Ipv4.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param ipv4Name Name of the Ptr<Ipv4> on which you want to enable tracing.
+   * @param interface The device identifier/index of the device on which to enable
+   *               ascii tracing
+   * @param explicitFilename Treat the prefix as an explicit filename if true.
    */
   void EnableAsciiIpv4Impl (Ptr<OutputStreamWrapper> stream, 
                             std::string prefix, 
@@ -327,7 +374,20 @@
                             bool explicitFilename);
 
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv4 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv4 aggregated to a node, the node-id unambiguously
+   * determines the Ipv4.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param ipv4 Ptr<Ipv4> on which you want to enable tracing.
+   * @param interface The device identifier/index of the device on which to enable
+   *               ascii tracing
+   * @param explicitFilename Treat the prefix as an explicit filename if true.
    */
   void EnableAsciiIpv4Impl (Ptr<OutputStreamWrapper> stream, 
                             std::string prefix, 
@@ -558,7 +618,7 @@
   void EnableAsciiIpv6 (Ptr<OutputStreamWrapper> stream, NodeContainer n);
 
   /**
-   * @brief Enable pcap output on the Ipv6 and interface pair specified by a 
+   * @brief Enable ascii trace output on the Ipv6 and interface pair specified by a
    * global node-id (of a previously created node) and interface.  Since there
    * can be only one Ipv6 aggregated to a node, the node-id unambiguously 
    * determines the Ipv6.
@@ -573,7 +633,7 @@
   void EnableAsciiIpv6 (std::string prefix, uint32_t nodeid, uint32_t interface, bool explicitFilename);
 
   /**
-   * @brief Enable pcap output on the Ipv6 and interface pair specified by a 
+   * @brief Enable ascii trace output on the Ipv6 and interface pair specified by a
    * global node-id (of a previously created node) and interface.  Since there
    * can be only one Ipv6 aggregated to a node, the node-id unambiguously 
    * determines the Ipv6.
@@ -605,7 +665,21 @@
 
 private:
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv6 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv6 aggregated to a node, the node-id unambiguously
+   * determines the Ipv6.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param nodeid The node identifier/number of the node on which to enable
+   *               ascii tracing
+   * @param interface The device identifier/index of the device on which to enable
+   *               ascii tracing
+   * @param explicitFilename Treat the prefix as an explicit filename if true.
    */
   void EnableAsciiIpv6Impl (Ptr<OutputStreamWrapper> stream, 
                             std::string prefix, 
@@ -614,17 +688,50 @@
                             bool explicitFilename);
 
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv6 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv6 aggregated to a node, the node-id unambiguously
+   * determines the Ipv6.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param n container of nodes.
    */
   void EnableAsciiIpv6Impl (Ptr<OutputStreamWrapper> stream, std::string prefix, NodeContainer n);
 
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv6 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv6 aggregated to a node, the node-id unambiguously
+   * determines the Ipv6.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param c Ipv6InterfaceContainer of Ipv6 and interface pairs
    */
   void EnableAsciiIpv6Impl (Ptr<OutputStreamWrapper> stream, std::string prefix, Ipv6InterfaceContainer c);
 
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv6 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv6 aggregated to a node, the node-id unambiguously
+   * determines the Ipv6.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param ipv6Name Name of the Ptr<Ipv6> on which you want to enable tracing.
+   * @param interface The device identifier/index of the device on which to enable
+   *               ascii tracing
+   * @param explicitFilename Treat the prefix as an explicit filename if true.
    */
   void EnableAsciiIpv6Impl (Ptr<OutputStreamWrapper> stream, 
                             std::string prefix, 
@@ -633,7 +740,20 @@
                             bool explicitFilename);
 
   /**
-   * @internal Avoid code duplication.
+   * @internal
+   *
+   * @brief Enable ascii trace output on the Ipv6 and interface pair specified by a
+   * global node-id (of a previously created node) and interface.  Since there
+   * can be only one Ipv6 aggregated to a node, the node-id unambiguously
+   * determines the Ipv6.
+   *
+   * @param stream An OutputStreamWrapper representing an existing file to use
+   *               when writing trace data.
+   * @param prefix Filename prefix to use when creating ascii trace files
+   * @param ipv6 Ptr<Ipv6> on which you want to enable tracing.
+   * @param interface The device identifier/index of the device on which to enable
+   *               ascii tracing
+   * @param explicitFilename Treat the prefix as an explicit filename if true.
    */
   void EnableAsciiIpv6Impl (Ptr<OutputStreamWrapper> stream, 
                             std::string prefix, 
diff -Naur ns-3.18.1/src/internet/helper/ipv4-address-helper.cc ns-3.19/src/internet/helper/ipv4-address-helper.cc
--- ns-3.18.1/src/internet/helper/ipv4-address-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv4-address-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -161,7 +161,7 @@
   return retval;
 }
 
-const uint32_t N_BITS = 32;
+const uint32_t N_BITS = 32; //!< number of bits in a IPv4 address
 
 uint32_t
 Ipv4AddressHelper::NumAddressBits (uint32_t maskbits) const
diff -Naur ns-3.18.1/src/internet/helper/ipv4-address-helper.h ns-3.19/src/internet/helper/ipv4-address-helper.h
--- ns-3.18.1/src/internet/helper/ipv4-address-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv4-address-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -178,15 +178,18 @@
 private:
   /**
    * @internal
+   * \brief Returns the number of address bits (hostpart) for a given netmask
+   * \param maskbits the netmask
+   * \returns the number of bits in the hostpart
    */
   uint32_t NumAddressBits (uint32_t maskbits) const;
 
-  uint32_t m_network;
-  uint32_t m_mask;
-  uint32_t m_address;
-  uint32_t m_base;
-  uint32_t m_shift;
-  uint32_t m_max;
+  uint32_t m_network; //!< network address
+  uint32_t m_mask;    //!< network mask
+  uint32_t m_address; //!< address
+  uint32_t m_base;    //!< base address
+  uint32_t m_shift;   //!< shift, equivalent to the number of bits in the hostpart
+  uint32_t m_max;     //!< maximum allowed address
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/helper/ipv4-global-routing-helper.h ns-3.19/src/internet/helper/ipv4-global-routing-helper.h
--- ns-3.18.1/src/internet/helper/ipv4-global-routing-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv4-global-routing-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -88,8 +88,9 @@
    * \internal
    * \brief Assignment operator declared private and not implemented to disallow
    * assignment and prevent the compiler from happily inserting its own.
+   * \return
    */
-  Ipv4GlobalRoutingHelper &operator = (const Ipv4GlobalRoutingHelper &o);
+  Ipv4GlobalRoutingHelper &operator = (const Ipv4GlobalRoutingHelper &);
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/helper/ipv4-interface-container.h ns-3.19/src/internet/helper/ipv4-interface-container.h
--- ns-3.18.1/src/internet/helper/ipv4-interface-container.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv4-interface-container.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,9 @@
 class Ipv4InterfaceContainer
 {
 public:
+  /**
+   * \brief Container Const Iterator for pairs of Ipv4 smart pointer / Interface Index.
+   */
   typedef std::vector<std::pair<Ptr<Ipv4>, uint32_t> >::const_iterator Iterator;
 
   /**
@@ -124,6 +127,11 @@
    */
   Ipv4Address GetAddress (uint32_t i, uint32_t j = 0) const;
 
+  /**
+   * \brief Set a metric for the given interface
+   * \param i Interface index
+   * \param metric the interface metric
+   */
   void SetMetric (uint32_t i, uint16_t metric);
 
   /**
@@ -163,15 +171,24 @@
    * Get the std::pair of an Ptr<Ipv4> and interface stored at the location 
    * specified by the index.
    *
-   * \param i the index of the entery to retrieve.
+   * \param i the index of the entry to retrieve.
+   * \return the Ipv4InterfaceContainer
    *
    * @see Ipv4InterfaceContainer
    */
   std::pair<Ptr<Ipv4>, uint32_t> Get (uint32_t i) const;
 
 private:
-
+  /**
+   * \internal
+   * \brief Container for pairs of Ipv4 smart pointer / Interface Index.
+   */
   typedef std::vector<std::pair<Ptr<Ipv4>,uint32_t> > InterfaceVector;
+
+  /**
+   * \internal
+   * \brief List of IPv4 stack and interfaces index.
+   */
   InterfaceVector m_interfaces;
 };
 
diff -Naur ns-3.18.1/src/internet/helper/ipv4-list-routing-helper.h ns-3.19/src/internet/helper/ipv4-list-routing-helper.h
--- ns-3.18.1/src/internet/helper/ipv4-list-routing-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv4-list-routing-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -85,9 +85,14 @@
    * \internal
    * \brief Assignment operator declared private and not implemented to disallow
    * assignment and prevent the compiler from happily inserting its own.
+   * \return
    */
-  Ipv4ListRoutingHelper &operator = (const Ipv4ListRoutingHelper &o);
+  Ipv4ListRoutingHelper &operator = (const Ipv4ListRoutingHelper &);
 
+  /**
+   * \internal
+   * \brief Container for pairs of Ipv4RoutingHelper pointer / priority.
+   */
   std::list<std::pair<const Ipv4RoutingHelper *,int16_t> > m_list;
 };
 
diff -Naur ns-3.18.1/src/internet/helper/ipv4-routing-helper.h ns-3.19/src/internet/helper/ipv4-routing-helper.h
--- ns-3.18.1/src/internet/helper/ipv4-routing-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv4-routing-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -110,7 +110,7 @@
   void PrintRoutingTableEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
 
   /**
-   * \brief Request a specified routing protocol <T> from Ipv4RoutingProtocol protocol
+   * \brief Request a specified routing protocol &lt;T&gt; from Ipv4RoutingProtocol protocol
    *
    * If protocol is Ipv4ListRouting, then protocol will be searched in the list,
    * otherwise a simple DynamicCast will be performed
@@ -122,11 +122,44 @@
   static Ptr<T> GetRouting (Ptr<Ipv4RoutingProtocol> protocol);
   
 private:
+  /**
+   * \internal
+   *
+   * \brief prints the routing tables of a node.
+   * \param node The node ptr for which we need the routing table to be printed
+   * \param stream The output stream object to use
+   *
+   * This method calls the PrintRoutingTable() method of the
+   * Ipv6RoutingProtocol stored in the Ipv6 object;
+   * the output format is routing protocol-specific.
+   */
   void Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
+
+  /**
+   * \internal
+   *
+   * \brief prints the routing tables of a node at regular intervals specified by user.
+   * \param printInterval the time interval for which the routing table is supposed to be printed.
+   * \param node The node ptr for which we need the routing table to be printed
+   * \param stream The output stream object to use
+   *
+   * This method calls the PrintRoutingTable() method of the
+   * Ipv6RoutingProtocol stored in the Ipv6 object, for the selected node
+   * at the specified interval; the output format is routing protocol-specific.
+   */
   void PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
 };
 
 
+/**
+ * \brief Request a specified routing protocol &lt;T&gt; from Ipv4RoutingProtocol protocol
+ *
+ * If protocol is Ipv4ListRouting, then protocol will be searched in the list,
+ * otherwise a simple DynamicCast will be performed
+ *
+ * \param protocol Smart pointer to Ipv4RoutingProtocol object
+ * \return a Smart Pointer to the requested protocol (zero if the protocol can't be found)
+ */
 template<class T>
 Ptr<T> Ipv4RoutingHelper::GetRouting (Ptr<Ipv4RoutingProtocol> protocol)
 {
diff -Naur ns-3.18.1/src/internet/helper/ipv4-static-routing-helper.h ns-3.19/src/internet/helper/ipv4-static-routing-helper.h
--- ns-3.18.1/src/internet/helper/ipv4-static-routing-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv4-static-routing-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -75,6 +75,7 @@
    * Ipv4 provided.
    *
    * \param ipv4 the Ptr<Ipv4> to search for the static routing protocol
+   * \returns Ipv4StaticRouting pointer or 0 if not found
    */
   Ptr<Ipv4StaticRouting> GetStaticRouting (Ptr<Ipv4> ipv4) const;
 
@@ -160,8 +161,9 @@
    * \internal
    * \brief Assignment operator declared private and not implemented to disallow
    * assignment and prevent the compiler from happily inserting its own.
+   * \returns
    */
-  Ipv4StaticRoutingHelper &operator = (const Ipv4StaticRoutingHelper &o);
+  Ipv4StaticRoutingHelper &operator = (const Ipv4StaticRoutingHelper &);
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/helper/ipv6-address-helper.cc ns-3.19/src/internet/helper/ipv6-address-helper.cc
--- ns-3.18.1/src/internet/helper/ipv6-address-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv6-address-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 namespace ns3 
 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6AddressHelper");
+NS_LOG_COMPONENT_DEFINE ("Ipv6AddressHelper")
+  ;
 
 Ipv6AddressHelper::Ipv6AddressHelper ()
 {
diff -Naur ns-3.18.1/src/internet/helper/ipv6-address-helper.h ns-3.19/src/internet/helper/ipv6-address-helper.h
--- ns-3.18.1/src/internet/helper/ipv6-address-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv6-address-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -73,6 +73,11 @@
  * If this method is called, the addressed returned will include a
  * modified EUI-64-format identifier created from the MAC address as 
  * specified in \RFC{4291}.
+ *
+ * BEWARE: the underlying implementation acts as a Singleton.
+ * In other terms, two different instances of Ipv6AddressHelper will
+ * pick IPv6 numbers from the same pool. Changing the network in one of them
+ * will also change the network in the other instances.
  */
 class Ipv6AddressHelper
 {
diff -Naur ns-3.18.1/src/internet/helper/ipv6-interface-container.h ns-3.19/src/internet/helper/ipv6-interface-container.h
--- ns-3.18.1/src/internet/helper/ipv6-interface-container.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv6-interface-container.h	2013-12-20 09:44:50.000000000 -0800
@@ -41,7 +41,12 @@
 class Ipv6InterfaceContainer
 {
 public:
+
+  /**
+   * \brief Container Const Iterator for pairs of Ipv6 smart pointer / Interface Index.
+   */
   typedef std::vector<std::pair<Ptr<Ipv6>, uint32_t> >::const_iterator Iterator;
+
   /**
    * \brief Constructor.
    */
@@ -205,6 +210,10 @@
   void SetDefaultRoute (uint32_t i, Ipv6Address routerAddr);
 
 private:
+  /**
+   * \internal
+   * \brief Container for pairs of Ipv6 smart pointer / Interface Index.
+   */
   typedef std::vector<std::pair<Ptr<Ipv6>, uint32_t> > InterfaceVector;
 
   /**
diff -Naur ns-3.18.1/src/internet/helper/ipv6-list-routing-helper.h ns-3.19/src/internet/helper/ipv6-list-routing-helper.h
--- ns-3.18.1/src/internet/helper/ipv6-list-routing-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv6-list-routing-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -86,9 +86,15 @@
    * \internal
    * \brief Assignment operator declared private and not implemented to disallow
    * assignment and prevent the compiler from happily inserting its own.
+   * \param o object to copy from
+   * \returns a reference to the new object
    */
   Ipv6ListRoutingHelper &operator = (const Ipv6ListRoutingHelper &o);
 
+  /**
+   * \internal
+   * \brief Container for pairs of Ipv6RoutingHelper pointer / priority.
+   */
   std::list<std::pair<const Ipv6RoutingHelper *,int16_t> > m_list;
 };
 
diff -Naur ns-3.18.1/src/internet/helper/ipv6-routing-helper.h ns-3.19/src/internet/helper/ipv6-routing-helper.h
--- ns-3.18.1/src/internet/helper/ipv6-routing-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv6-routing-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -112,7 +112,7 @@
   void PrintRoutingTableEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
 
   /**
-   * \brief Request a specified routing protocol <T> from Ipv6RoutingProtocol protocol
+   * \brief Request a specified routing protocol &lt;T&gt; from Ipv6RoutingProtocol protocol
    *
    * If protocol is Ipv6ListRouting, then protocol will be searched in the list,
    * otherwise a simple DynamicCast will be performed
@@ -124,10 +124,43 @@
   static Ptr<T> GetRouting (Ptr<Ipv6RoutingProtocol> protocol);
   
 private:
+  /**
+   * \internal
+   *
+   * \brief prints the routing tables of a node.
+   * \param node The node ptr for which we need the routing table to be printed
+   * \param stream The output stream object to use
+   *
+   * This method calls the PrintRoutingTable() method of the
+   * Ipv6RoutingProtocol stored in the Ipv6 object;
+   * the output format is routing protocol-specific.
+   */
   void Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
+
+  /**
+   * \internal
+   *
+   * \brief prints the routing tables of a node at regular intervals specified by user.
+   * \param printInterval the time interval for which the routing table is supposed to be printed.
+   * \param node The node ptr for which we need the routing table to be printed
+   * \param stream The output stream object to use
+   *
+   * This method calls the PrintRoutingTable() method of the
+   * Ipv6RoutingProtocol stored in the Ipv6 object, for the selected node
+   * at the specified interval; the output format is routing protocol-specific.
+   */
   void PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
 };
 
+/**
+ * \brief Request a specified routing protocol &lt;T&gt; from Ipv6RoutingProtocol protocol
+ *
+ * If protocol is Ipv6ListRouting, then protocol will be searched in the list,
+ * otherwise a simple DynamicCast will be performed
+ *
+ * \param protocol Smart pointer to Ipv6RoutingProtocol object
+ * \return a Smart Pointer to the requested protocol (zero if the protocol can't be found)
+ */
 template<class T>
 Ptr<T> Ipv6RoutingHelper::GetRouting (Ptr<Ipv6RoutingProtocol> protocol)
 {
diff -Naur ns-3.18.1/src/internet/helper/ipv6-static-routing-helper.h ns-3.19/src/internet/helper/ipv6-static-routing-helper.h
--- ns-3.18.1/src/internet/helper/ipv6-static-routing-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/helper/ipv6-static-routing-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -72,7 +72,7 @@
   /**
    * \brief Get Ipv6StaticRouting pointer from IPv6 stack.
    * \param ipv6 Ipv6 pointer
-   * \return Ipv6StaticRouting pointer or 0 if not exist
+   * \return Ipv6StaticRouting pointer or 0 if not found
    */
   Ptr<Ipv6StaticRouting> GetStaticRouting (Ptr<Ipv6> ipv6) const;
 
@@ -121,6 +121,8 @@
    * \internal
    * \brief Assignment operator declared private and not implemented to disallow
    * assignment and prevent the compiler from happily inserting its own.
+   * \param o object to copy from
+   * \returns a reference to the new object
    */
   Ipv6StaticRoutingHelper &operator = (const Ipv6StaticRoutingHelper &o);
 };
diff -Naur ns-3.18.1/src/internet/model/arp-cache.cc ns-3.19/src/internet/model/arp-cache.cc
--- ns-3.18.1/src/internet/model/arp-cache.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/arp-cache.cc	2013-12-20 09:44:50.000000000 -0800
@@ -33,7 +33,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ArpCache);
+NS_OBJECT_ENSURE_REGISTERED (ArpCache)
+  ;
 
 TypeId 
 ArpCache::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/arp-cache.h ns-3.19/src/internet/model/arp-cache.h
--- ns-3.18.1/src/internet/model/arp-cache.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/arp-cache.h	2013-12-20 09:44:50.000000000 -0800
@@ -49,34 +49,78 @@
 class ArpCache : public Object
 {
 private:
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   */
   ArpCache (ArpCache const &);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   * \returns
+   */
   ArpCache& operator= (ArpCache const &);
 
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   class Entry;
   ArpCache ();
   ~ArpCache ();
 
   /**
+   * \brief Set the NetDevice and Ipv4Interface associated with the ArpCache
+   *
    * \param device The hardware NetDevice associated with this ARP chache
    * \param interface the Ipv4Interface associated with this ARP chache
    */
   void SetDevice (Ptr<NetDevice> device, Ptr<Ipv4Interface> interface);
   /**
+   * \brief Returns the NetDevice that this ARP cache is associated with
    * \return The NetDevice that this ARP cache is associated with
    */
   Ptr<NetDevice> GetDevice (void) const;
   /**
+   * \brief Returns the Ipv4Interface that this ARP cache is associated with
    * \return the Ipv4Interface that this ARP cache is associated with
    */
   Ptr<Ipv4Interface> GetInterface (void) const;
 
+  /**
+   * \brief Set the time the entry will be in ALIVE state (unless refreshed)
+   * \param aliveTimeout the Alive state timeout
+   */
   void SetAliveTimeout (Time aliveTimeout);
+  /**
+   * \brief Set the time the entry will be in DEAD state before being removed
+   * \param deadTimeout the Dead state timeout
+   */
   void SetDeadTimeout (Time deadTimeout);
+  /**
+   * \brief Set the time the entry will be in WAIT_REPLY state
+   * \param waitReplyTimeout the WAIT_REPLY state timeout
+   */
   void SetWaitReplyTimeout (Time waitReplyTimeout);
+
+  /**
+   * \brief Get the time the entry will be in ALIVE state (unless refreshed)
+   * \returns the Alive state timeout
+   */
   Time GetAliveTimeout (void) const;
+  /**
+   * \brief Get the time the entry will be in DEAD state before being removed
+   * \returns the Dead state timeout
+   */
   Time GetDeadTimeout (void) const;
+  /**
+   * \brief Get the time the entry will be in WAIT_REPLY state
+   * \returns the WAIT_REPLY state timeout
+   */
   Time GetWaitReplyTimeout (void) const;
 
   /**
@@ -190,46 +234,65 @@
     void ClearRetries (void);
 
 private:
+    /**
+     * \brief ARP cache entry states
+     */
     enum ArpCacheEntryState_e {
       ALIVE,
       WAIT_REPLY,
       DEAD
     };
 
+    /**
+     * \brief Update the entry when seeing a packet
+     */
     void UpdateSeen (void);
+
+    /**
+     * \brief Returns the entry timeout
+     * \returns the entry timeout
+     */
     Time GetTimeout (void) const;
-    ArpCache *m_arp;
-    ArpCacheEntryState_e m_state;
-    Time m_lastSeen;
-    Address m_macAddress;
-    Ipv4Address m_ipv4Address;
-    std::list<Ptr<Packet> > m_pending;
-    uint32_t m_retries;
+
+    ArpCache *m_arp; //!< pointer to the ARP cache owning the entry
+    ArpCacheEntryState_e m_state; //!< state of the entry
+    Time m_lastSeen; //!< last moment a packet from that address has been seen
+    Address m_macAddress; //!< entry's MAC address
+    Ipv4Address m_ipv4Address; //!< entry's IP address
+    std::list<Ptr<Packet> > m_pending; //!< list of pending packets for the entry's IP
+    uint32_t m_retries; //!< rerty counter
   };
 
 private:
+  /**
+   * \brief ARP Cache container
+   */
   typedef sgi::hash_map<Ipv4Address, ArpCache::Entry *, Ipv4AddressHash> Cache;
+  /**
+   * \brief ARP Cache container iterator
+   */
   typedef sgi::hash_map<Ipv4Address, ArpCache::Entry *, Ipv4AddressHash>::iterator CacheI;
 
   virtual void DoDispose (void);
 
-  Ptr<NetDevice> m_device;
-  Ptr<Ipv4Interface> m_interface;
-  Time m_aliveTimeout;
-  Time m_deadTimeout;
-  Time m_waitReplyTimeout;
-  EventId m_waitReplyTimer;
-  Callback<void, Ptr<const ArpCache>, Ipv4Address> m_arpRequestCallback;
-  uint32_t m_maxRetries;
+  Ptr<NetDevice> m_device; //!< NetDevice associated with the cache
+  Ptr<Ipv4Interface> m_interface; //!< Ipv4Interface associated with the cache
+  Time m_aliveTimeout; //!< cache alive state timeout
+  Time m_deadTimeout; //!< cache dead state timeout
+  Time m_waitReplyTimeout; //!< cache reply state timeout
+  EventId m_waitReplyTimer;  //!< cache alive state timer
+  Callback<void, Ptr<const ArpCache>, Ipv4Address> m_arpRequestCallback;  //!< reply timeout callback
+  uint32_t m_maxRetries; //!< max retries for a resolution
+
   /**
    * This function is an event handler for the event that the
    * ArpCache wants to check whether it must retry any Arp requests.
    * If there are no Arp requests pending, this event is not scheduled.
    */
   void HandleWaitReplyTimeout (void);
-  uint32_t m_pendingQueueSize;
-  Cache m_arpCache;
-  TracedCallback<Ptr<const Packet> > m_dropTrace;
+  uint32_t m_pendingQueueSize; //!< number of packets waiting for a resolution
+  Cache m_arpCache; //!< the ARP cache
+  TracedCallback<Ptr<const Packet> > m_dropTrace; //!< trace for packets dropped by the ARP cache queue
 };
 
 
diff -Naur ns-3.18.1/src/internet/model/arp-header.cc ns-3.19/src/internet/model/arp-header.cc
--- ns-3.18.1/src/internet/model/arp-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/arp-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ArpHeader);
+NS_OBJECT_ENSURE_REGISTERED (ArpHeader)
+  ;
 
 void 
 ArpHeader::SetRequest (Address sourceHardwareAddress,
diff -Naur ns-3.18.1/src/internet/model/arp-header.h ns-3.19/src/internet/model/arp-header.h
--- ns-3.18.1/src/internet/model/arp-header.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/arp-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,21 +34,69 @@
 class ArpHeader : public Header 
 {
 public:
+  /**
+   * \brief Set the ARP request parameters
+   * \param sourceHardwareAddress the source hardware address
+   * \param sourceProtocolAddress the source IP address
+   * \param destinationHardwareAddress the destination hardware address (usually the broadcast address)
+   * \param destinationProtocolAddress the destination IP address
+   */
   void SetRequest (Address sourceHardwareAddress,
                    Ipv4Address sourceProtocolAddress,
                    Address destinationHardwareAddress,
                    Ipv4Address destinationProtocolAddress);
+  /**
+   * \brief Set the ARP reply parameters
+   * \param sourceHardwareAddress the source hardware address
+   * \param sourceProtocolAddress the source IP address
+   * \param destinationHardwareAddress the destination hardware address (usually the broadcast address)
+   * \param destinationProtocolAddress the destination IP address
+   */
   void SetReply (Address sourceHardwareAddress,
                  Ipv4Address sourceProtocolAddress,
                  Address destinationHardwareAddress,
                  Ipv4Address destinationProtocolAddress);
+
+  /**
+   * \brief Check if the ARP is a request
+   * \returns true if it is a request
+   */
   bool IsRequest (void) const;
+
+  /**
+   * \brief Check if the ARP is a reply
+   * \returns true if it is a reply
+   */
   bool IsReply (void) const;
+
+  /**
+   * \brief Returns the source hardware address
+   * \returns the source hardware address
+   */
   Address GetSourceHardwareAddress (void);
+
+  /**
+   * \brief Returns the destination hardware address
+   * \returns the destination hardware address
+   */
   Address GetDestinationHardwareAddress (void);
+
+  /**
+   * \brief Returns the source IP address
+   * \returns the source IP address
+   */
   Ipv4Address GetSourceIpv4Address (void);
+
+  /**
+   * \brief Returns the destination IP address
+   * \returns the destination IP address
+   */
   Ipv4Address GetDestinationIpv4Address (void);
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -56,15 +104,18 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
+  /**
+   * \brief Enumeration listing the possible ARP types
+   */
   enum ArpType_e {
     ARP_TYPE_REQUEST = 1,
     ARP_TYPE_REPLY   = 2
   };
-  uint16_t m_type;
-  Address m_macSource;
-  Address m_macDest;
-  Ipv4Address m_ipv4Source;
-  Ipv4Address m_ipv4Dest;
+  uint16_t m_type;           //!< type of the ICMP (ARP_TYPE_REQUEST)
+  Address m_macSource;       //!< hardware source address
+  Address m_macDest;         //!< hardware destination address
+  Ipv4Address m_ipv4Source;  //!< IP source address
+  Ipv4Address m_ipv4Dest;    //!< IP destination address
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/arp-l3-protocol.cc ns-3.19/src/internet/model/arp-l3-protocol.cc
--- ns-3.18.1/src/internet/model/arp-l3-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/arp-l3-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 
 const uint16_t ArpL3Protocol::PROT_NUMBER = 0x0806;
 
-NS_OBJECT_ENSURE_REGISTERED (ArpL3Protocol);
+NS_OBJECT_ENSURE_REGISTERED (ArpL3Protocol)
+  ;
 
 TypeId 
 ArpL3Protocol::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/arp-l3-protocol.h ns-3.19/src/internet/model/arp-l3-protocol.h
--- ns-3.18.1/src/internet/model/arp-l3-protocol.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/arp-l3-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -49,29 +49,49 @@
 class ArpL3Protocol : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
-  static const uint16_t PROT_NUMBER;
+  static const uint16_t PROT_NUMBER; //!< ARP protocol number (0x0806)
 
   ArpL3Protocol ();
   virtual ~ArpL3Protocol ();
 
+  /**
+   * \brief Set the node the ARP L3 protocol is associated with
+   * \param node the node
+   */
   void SetNode (Ptr<Node> node);
 
+  /**
+   * \brief Create an ARP cache for the device/interface
+   * \param device the NetDevice
+   * \param interface the Ipv4Interface
+   * \returns a smart pointer to the ARP cache
+   */
   Ptr<ArpCache> CreateCache (Ptr<NetDevice> device, Ptr<Ipv4Interface> interface);
 
   /**
    * \brief Receive a packet
+   * \param device the source NetDevice
+   * \param p the packet
+   * \param protocol the protocol
+   * \param from the source address
+   * \param to the destination address
+   * \param packetType type of packet (i.e., unicast, multicast, etc.)
    */
   void Receive (Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol, const Address &from, const Address &to,
                 NetDevice::PacketType packetType);
   /**
    * \brief Perform an ARP lookup
-   * \param p
-   * \param destination
-   * \param device
-   * \param cache
-   * \param hardwareDestination
-   * \return 
+   * \param p the packet
+   * \param destination destination IP address
+   * \param device outgoing device
+   * \param cache ARP cache
+   * \param hardwareDestination filled with the destination MAC address (if the entry exists)
+   * \return true if there is a matching ARP Entry
    */
   bool Lookup (Ptr<Packet> p, Ipv4Address destination, 
                Ptr<NetDevice> device,
@@ -96,16 +116,49 @@
    */
   virtual void NotifyNewAggregate ();
 private:
-  typedef std::list<Ptr<ArpCache> > CacheList;
+  typedef std::list<Ptr<ArpCache> > CacheList; //!< container of the ARP caches
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   * \param o
+   */
   ArpL3Protocol (const ArpL3Protocol &o);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   * \param o
+   * \returns
+   */
   ArpL3Protocol &operator = (const ArpL3Protocol &o);
+
+  /**
+   * \brief Finds the cache associated with a NetDevice
+   * \param device the NetDevice
+   * \returns the ARP cache, or null if no cache is found
+   */
   Ptr<ArpCache> FindCache (Ptr<NetDevice> device);
+
+  /**
+   * \brief Send an ARP request to an host
+   * \param cache the ARP cache to use
+   * \param to the destination IP
+   */
   void SendArpRequest (Ptr<const ArpCache>cache, Ipv4Address to);
+  /**
+   * \brief Send an ARP reply to an host
+   * \param cache the ARP cache to use
+   * \param myIp the source IP address
+   * \param toIp the destination IP
+   * \param toMac the destination MAC address
+   */
   void SendArpReply (Ptr<const ArpCache> cache, Ipv4Address myIp, Ipv4Address toIp, Address toMac);
-  CacheList m_cacheList;
-  Ptr<Node> m_node;
-  TracedCallback<Ptr<const Packet> > m_dropTrace;
-  Ptr<RandomVariableStream> m_requestJitter;
+
+  CacheList m_cacheList; //!< ARP cache container
+  Ptr<Node> m_node; //!< node the ARP L3 protocol is associated with
+  TracedCallback<Ptr<const Packet> > m_dropTrace; //!< trace for packets dropped by ARP
+  Ptr<RandomVariableStream> m_requestJitter; //!< jitter to de-sync ARP requests
 
 };
 
diff -Naur ns-3.18.1/src/internet/model/candidate-queue.cc ns-3.19/src/internet/model/candidate-queue.cc
--- ns-3.18.1/src/internet/model/candidate-queue.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/candidate-queue.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,6 +27,13 @@
 
 namespace ns3 {
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param t the SPFVertex type
+ * \returns the reference to the output stream
+ */
 std::ostream&
 operator<< (std::ostream& os, const SPFVertex::VertexType& t)
 {
diff -Naur ns-3.18.1/src/internet/model/candidate-queue.h ns-3.19/src/internet/model/candidate-queue.h
--- ns-3.18.1/src/internet/model/candidate-queue.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/candidate-queue.h	2013-12-20 09:44:50.000000000 -0800
@@ -176,6 +176,7 @@
  * prevent the compiler from slipping in incorrect versions that don't
  * properly deal with deep copies.
  * \param sr object to assign
+ * \return copied object
  */
   CandidateQueue& operator= (CandidateQueue& sr);
 /**
@@ -185,13 +186,22 @@
  * defined by this method. If v1 should be popped before v2, this 
  * method return true; false otherwise
  *
+ * \param v1 first operand
+ * \param v2 second operand
  * \return True if v1 should be popped before v2; false otherwise
  */
   static bool CompareSPFVertex (const SPFVertex* v1, const SPFVertex* v2);
 
-  typedef std::list<SPFVertex*> CandidateList_t;
-  CandidateList_t m_candidates;
+  typedef std::list<SPFVertex*> CandidateList_t; //!< container of SPFVertex pointers
+  CandidateList_t m_candidates;  //!< SPFVertex candidates
 
+  /**
+   * \brief Stream insertion operator.
+   *
+   * \param os the reference to the output stream
+   * \param q the CandidateQueue
+   * \returns the reference to the output stream
+   */
   friend std::ostream& operator<< (std::ostream& os, const CandidateQueue& q);
 };
 
diff -Naur ns-3.18.1/src/internet/model/global-route-manager-impl.cc ns-3.19/src/internet/model/global-route-manager-impl.cc
--- ns-3.18.1/src/internet/model/global-route-manager-impl.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/global-route-manager-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -44,6 +44,13 @@
 
 namespace ns3 {
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param exit the exit node
+ * \returns the reference to the output stream
+ */
 std::ostream& 
 operator<< (std::ostream& os, const SPFVertex::NodeExit_t& exit)
 {
@@ -704,8 +711,9 @@
       Ptr<GlobalRouter> rtr = 
         node->GetObject<GlobalRouter> ();
 
+      uint32_t systemId = MpiInterface::GetSystemId ();
       // Ignore nodes that are not assigned to our systemId (distributed sim)
-      if (node->GetSystemId () != MpiInterface::GetSystemId ()) 
+      if (node->GetSystemId () != systemId) 
         {
           continue;
         }
diff -Naur ns-3.18.1/src/internet/model/global-route-manager-impl.h ns-3.19/src/internet/model/global-route-manager-impl.h
--- ns-3.18.1/src/internet/model/global-route-manager-impl.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/global-route-manager-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,7 @@
 
 namespace ns3 {
 
-const uint32_t SPF_INFINITY = 0xffffffff;
+const uint32_t SPF_INFINITY = 0xffffffff; //!< "infinite" distance between nodes
 
 class CandidateQueue;
 class Ipv4GlobalRouting;
@@ -298,7 +298,9 @@
  * network represented by "this" SPFVertex.
  */
   void SetRootExitDirection (Ipv4Address nextHop, int32_t id = SPF_INFINITY);
-  typedef std::pair<Ipv4Address, int32_t> NodeExit_t;
+
+  typedef std::pair<Ipv4Address, int32_t> NodeExit_t; //!< IPv4 / interface container for exit nodes.
+
 /**
  * @brief Set the IP address and outgoing interface index that should be used 
  * to begin forwarding packets from the root SPFVertex to "this" SPFVertex.
@@ -532,22 +534,27 @@
    */ 
   bool IsVertexProcessed (void) const;
 
+  /**
+   * @brief Clear the value of the VertexProcessed flag
+   *
+   * Flag to note whether vertex has been processed in stage two of
+   * SPF computation
+   */
   void ClearVertexProcessed (void);
 
 private:
-  VertexType m_vertexType;
-  Ipv4Address m_vertexId;
-  GlobalRoutingLSA* m_lsa;
-  uint32_t m_distanceFromRoot;
-  int32_t m_rootOif;
-  Ipv4Address m_nextHop;
-  typedef std::list< NodeExit_t > ListOfNodeExit_t;
-  /// store the multiple root's exits for supporting ECMP
-  ListOfNodeExit_t m_ecmpRootExits;
-  typedef std::list<SPFVertex*> ListOfSPFVertex_t;
-  ListOfSPFVertex_t m_parents;
-  ListOfSPFVertex_t m_children;
-  bool m_vertexProcessed; 
+  VertexType m_vertexType; //!< Vertex type
+  Ipv4Address m_vertexId; //!< Vertex ID
+  GlobalRoutingLSA* m_lsa; //!< Link State Advertisement
+  uint32_t m_distanceFromRoot; //!< Distance from root node
+  int32_t m_rootOif; //!< root Output Interface
+  Ipv4Address m_nextHop; //!< next hop
+  typedef std::list< NodeExit_t > ListOfNodeExit_t; //!< container of Exit nodes
+  ListOfNodeExit_t m_ecmpRootExits; //!< store the multiple root's exits for supporting ECMP
+  typedef std::list<SPFVertex*> ListOfSPFVertex_t; //!< container of SPFVertexes
+  ListOfSPFVertex_t m_parents; //!< parent list
+  ListOfSPFVertex_t m_children; //!< Children list
+  bool m_vertexProcessed; //!< Flag to note whether vertex has been processed in stage two of SPF computation
 
 /**
  * @brief The SPFVertex copy construction is disallowed.  There's no need for
@@ -561,8 +568,13 @@
  */
   SPFVertex& operator= (SPFVertex& v);
 
-  //friend std::ostream& operator<< (std::ostream& os, const ListOfIf_t& ifs);
-  //friend std::ostream& operator<< (std::ostream& os, const ListOfAddr_t& addrs);
+  /**
+   * \brief Stream insertion operator.
+   *
+   * \param os the reference to the output stream
+   * \param vs a list of SPFVertexes
+   * \returns the reference to the output stream
+   */
   friend std::ostream& operator<< (std::ostream& os, const SPFVertex::ListOfSPFVertex_t& vs);
 };
 
@@ -662,16 +674,35 @@
  */
   void Initialize ();
 
+  /**
+   * @brief Look up the External Link State Advertisement associated with the given
+   * index.
+   * @internal
+   *
+   * The external database map is searched for the given index and corresponding
+   * GlobalRoutingLSA is returned.
+   *
+   * @see GlobalRoutingLSA
+   * @param index the index associated with the LSA.
+   * @returns A pointer to the Link State Advertisement.
+   */
   GlobalRoutingLSA* GetExtLSA (uint32_t index) const;
+  /**
+   * @brief Get the number of External Link State Advertisements.
+   * @internal
+   *
+   * @see GlobalRoutingLSA
+   * @returns the number of External Link State Advertisements.
+   */
   uint32_t GetNumExtLSAs () const;
 
 
 private:
-  typedef std::map<Ipv4Address, GlobalRoutingLSA*> LSDBMap_t;
-  typedef std::pair<Ipv4Address, GlobalRoutingLSA*> LSDBPair_t;
+  typedef std::map<Ipv4Address, GlobalRoutingLSA*> LSDBMap_t; //!< container of IPv4 addresses / Link State Advertisements
+  typedef std::pair<Ipv4Address, GlobalRoutingLSA*> LSDBPair_t; //!< pair of IPv4 addresses / Link State Advertisements
 
-  LSDBMap_t m_database;
-  std::vector<GlobalRoutingLSA*> m_extdatabase;
+  LSDBMap_t m_database; //!< database of IPv4 addresses / Link State Advertisements
+  std::vector<GlobalRoutingLSA*> m_extdatabase; //!< database of External Link State Advertisements
 
 /**
  * @brief GlobalRouteManagerLSDB copy construction is disallowed.  There's no 
@@ -736,6 +767,7 @@
 /**
  * @brief Debugging routine; call the core SPF from the unit tests
  * @internal
+ * @param root the root node to start calculations
  */
   void DebugSPFCalculate (Ipv4Address root);
 
@@ -754,22 +786,184 @@
  */
   GlobalRouteManagerImpl& operator= (GlobalRouteManagerImpl& srmi);
 
-  SPFVertex* m_spfroot;
-  GlobalRouteManagerLSDB* m_lsdb;
+  SPFVertex* m_spfroot; //!< the root node
+  GlobalRouteManagerLSDB* m_lsdb; //!< the Link State DataBase (LSDB) of the Global Route Manager
+
+  /**
+   * \brief Test if a node is a stub, from an OSPF sense.
+   *
+   * If there is only one link of type 1 or 2, then a default route
+   * can safely be added to the next-hop router and SPF does not need
+   * to be run
+   *
+   * \param root the root node
+   * \returns true if the node is a stub
+   */
   bool CheckForStubNode (Ipv4Address root);
+
+  /**
+   * \brief Calculate the shortest path first (SPF) tree
+   *
+   * Equivalent to quagga ospf_spf_calculate
+   * \param root the root node
+   */
   void SPFCalculate (Ipv4Address root);
+
+  /**
+   * \brief Process Stub nodes
+   *
+   * Processing logic from RFC 2328, page 166 and quagga ospf_spf_process_stubs ()
+   * stub link records will exist for point-to-point interfaces and for
+   * broadcast interfaces for which no neighboring router can be found
+   *
+   * \param v vertex to be processed
+   */
   void SPFProcessStubs (SPFVertex* v);
+
+  /**
+   * \brief Process Autonomous Systems (AS) External LSA
+   *
+   * \param v vertex to be processed
+   * \param extlsa external LSA
+   */
   void ProcessASExternals (SPFVertex* v, GlobalRoutingLSA* extlsa);
-  void SPFNext (SPFVertex*, CandidateQueue&);
+
+  /**
+   * \brief Examine the links in v's LSA and update the list of candidates with any
+   *        vertices not already on the list
+   *
+   * \internal
+   *
+   * This method is derived from quagga ospf_spf_next ().  See RFC2328 Section
+   * 16.1 (2) for further details.
+   *
+   * We're passed a parameter \a v that is a vertex which is already in the SPF
+   * tree.  A vertex represents a router node.  We also get a reference to the
+   * SPF candidate queue, which is a priority queue containing the shortest paths
+   * to the networks we know about.
+   *
+   * We examine the links in v's LSA and update the list of candidates with any
+   * vertices not already on the list.  If a lower-cost path is found to a
+   * vertex already on the candidate list, store the new (lower) cost.
+   *
+   * \param v the vertex
+   * \param candidate the SPF candidate queue
+   */
+  void SPFNext (SPFVertex* v, CandidateQueue& candidate);
+
+  /**
+   * \brief Calculate nexthop from root through V (parent) to vertex W (destination)
+   *        with given distance from root->W.
+   *
+   * This method is derived from quagga ospf_nexthop_calculation() 16.1.1.
+   * For now, this is greatly simplified from the quagga code
+   *
+   * \param v the parent
+   * \param w the destination
+   * \param l the link record
+   * \param distance the target distance
+   * \returns 1 on success
+   */
   int SPFNexthopCalculation (SPFVertex* v, SPFVertex* w, 
                              GlobalRoutingLinkRecord* l, uint32_t distance);
+
+  /**
+   * \brief Adds a vertex to the list of children *in* each of its parents
+   *
+   * Derived from quagga ospf_vertex_add_parents ()
+   *
+   * This is a somewhat oddly named method (blame quagga).  Although you might
+   * expect it to add a parent *to* something, it actually adds a vertex
+   * to the list of children *in* each of its parents.
+   *
+   * Given a pointer to a vertex, it links back to the vertex's parent that it
+   * already has set and adds itself to that vertex's list of children.
+   *
+   * \param v the vertex
+   */
   void SPFVertexAddParent (SPFVertex* v);
+
+  /**
+   * \brief Search for a link between two vertexes.
+   *
+   * This method is derived from quagga ospf_get_next_link ()
+   *
+   * First search the Global Router Link Records of vertex \a v for one
+   * representing a point-to point link to vertex \a w.
+   *
+   * What is done depends on prev_link.  Contrary to appearances, prev_link just
+   * acts as a flag here.  If prev_link is NULL, we return the first Global
+   * Router Link Record we find that describes a point-to-point link from \a v
+   * to \a w.  If prev_link is not NULL, we return a Global Router Link Record
+   * representing a possible *second* link from \a v to \a w.
+   *
+   * \param v first vertex
+   * \param w second vertex
+   * \param prev_link the previous link in the list
+   * \returns the link's record
+   */
   GlobalRoutingLinkRecord* SPFGetNextLink (SPFVertex* v, SPFVertex* w, 
                                            GlobalRoutingLinkRecord* prev_link);
+
+  /**
+   * \brief Add a host route to the routing tables
+   *
+   *
+   * This method is derived from quagga ospf_intra_add_router ()
+   *
+   * This is where we are actually going to add the host routes to the routing
+   * tables of the individual nodes.
+   *
+   * The vertex passed as a parameter has just been added to the SPF tree.
+   * This vertex must have a valid m_root_oid, corresponding to the outgoing
+   * interface on the root router of the tree that is the first hop on the path
+   * to the vertex.  The vertex must also have a next hop address, corresponding
+   * to the next hop on the path to the vertex.  The vertex has an m_lsa field
+   * that has some number of link records.  For each point to point link record,
+   * the m_linkData is the local IP address of the link.  This corresponds to
+   * a destination IP address, reachable from the root, to which we add a host
+   * route.
+   *
+   * \param v the vertex
+   *
+   */
   void SPFIntraAddRouter (SPFVertex* v);
+
+  /**
+   * \brief Add a transit to the routing tables
+   *
+   * \param v the vertex
+   */
   void SPFIntraAddTransit (SPFVertex* v);
+
+  /**
+   * \brief Add a stub to the routing tables
+   *
+   * \param l the global routing link record
+   * \param v the vertex
+   */
   void SPFIntraAddStub (GlobalRoutingLinkRecord *l, SPFVertex* v);
+
+  /**
+   * \brief Add an external route to the routing tables
+   *
+   * \param extlsa the external LSA
+   * \param v the vertex
+   */
   void SPFAddASExternal (GlobalRoutingLSA *extlsa, SPFVertex *v);
+
+  /**
+   * \brief Return the interface number corresponding to a given IP address and mask
+   *
+   * This is a wrapper around GetInterfaceForPrefix(), but we first
+   * have to find the right node pointer to pass to that function.
+   * If no such interface is found, return -1 (note:  unit test framework
+   * for routing assumes -1 to be a legal return value)
+   *
+   * \param a the target IP address
+   * \param amask the target subnet mask
+   * \return the outgoing interface number
+   */
   int32_t FindOutgoingInterfaceId (Ipv4Address a, 
                                    Ipv4Mask amask = Ipv4Mask ("255.255.255.255"));
 };
diff -Naur ns-3.18.1/src/internet/model/global-router-interface.cc ns-3.19/src/internet/model/global-router-interface.cc
--- ns-3.18.1/src/internet/model/global-router-interface.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/global-router-interface.cc	2013-12-20 09:44:50.000000000 -0800
@@ -504,7 +504,8 @@
 //
 // ---------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (GlobalRouter);
+NS_OBJECT_ENSURE_REGISTERED (GlobalRouter)
+  ;
 
 TypeId 
 GlobalRouter::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/global-router-interface.h ns-3.19/src/internet/model/global-router-interface.h
--- ns-3.18.1/src/internet/model/global-router-interface.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/global-router-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -559,9 +559,16 @@
  * proper position in the tree.
  */
   SPFStatus m_status;
-  uint32_t m_node_id;
+  uint32_t m_node_id; //!< node ID
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param lsa the LSA
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, GlobalRoutingLSA& lsa);
 
 /**
@@ -576,11 +583,10 @@
 class GlobalRouter : public Object
 {
 public:
-/**
- * @brief The Interface ID of the Global Router interface.
- *
- * @see Object::GetObject ()
- */
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
 /**
@@ -588,8 +594,16 @@
  */
   GlobalRouter ();
 
-
+  /**
+   * \brief Set the specific Global Routing Protocol to be used
+   * \param routing the routing protocol
+   */
   void SetRoutingProtocol (Ptr<Ipv4GlobalRouting> routing);
+
+  /**
+   * \brief Get the specific Global Routing Protocol used
+   * \returns the routing protocol
+   */
   Ptr<Ipv4GlobalRouting> GetRoutingProtocol (void);
 
 /**
@@ -709,31 +723,129 @@
 
 private:
   virtual ~GlobalRouter ();
+
+  /**
+   * \brief Clear list of LSAs
+   */
   void ClearLSAs (void);
 
+  /**
+   * \brief Link through the given channel and find the net device that's on the other end.
+   *
+   * This only makes sense with a point-to-point channel.
+   *
+   * \param nd outgoing NetDevice
+   * \param ch channel
+   * \returns the NetDevice on the other end
+   */
   Ptr<NetDevice> GetAdjacent (Ptr<NetDevice> nd, Ptr<Channel> ch) const;
+
+  /**
+   * \brief Given a node and a net device, find an IPV4 interface index that corresponds
+   *        to that net device.
+   *
+   * This function may fail for various reasons.  If a node
+   * does not have an internet stack (for example if it is a bridge) we won't have
+   * an IPv4 at all.  If the node does have a stack, but the net device in question
+   * is bridged, there will not be an interface associated directly with the device.
+   *
+   * \param node the node
+   * \param nd outgoing NetDevice
+   * \param index the IPV4 interface index
+   * \returns true on success
+   */
   bool FindInterfaceForDevice (Ptr<Node> node, Ptr<NetDevice> nd, uint32_t &index) const;
+
+  /**
+   * \brief Finds a designated router
+   *
+   * Given a local net device, we need to walk the channel to which the net device is
+   * attached and look for nodes with GlobalRouter interfaces on them (one of them
+   * will be us).  Of these, the router with the lowest IP address on the net device
+   * connecting to the channel becomes the designated router for the link.
+   *
+   * \param ndLocal local NetDevice to scan
+   * \param allowRecursion Recursively look for routers down bridge port
+   * \returns the IP address of the designated router
+   */
   Ipv4Address FindDesignatedRouterForLink (Ptr<NetDevice> ndLocal, bool allowRecursion) const;
+
+  /**
+   * \brief Checks for the presence of another router on the NetDevice
+   *
+   * Given a node and an attached net device, take a look off in the channel to
+   * which the net device is attached and look for a node on the other side
+   * that has a GlobalRouter interface aggregated.  Life gets more complicated
+   * when there is a bridged net device on the other side.
+   *
+   * \param nd NetDevice to scan
+   * \param allowRecursion Recursively look for routers down bridge port
+   * \returns true if a router is found
+   */
   bool AnotherRouterOnLink (Ptr<NetDevice> nd, bool allowRecursion) const;
+
+  /**
+   * \brief Process a generic broadcast link
+   *
+   * \param nd the NetDevice
+   * \param pLSA the Global LSA
+   * \param c the returned NetDevice container
+   */
   void ProcessBroadcastLink (Ptr<NetDevice> nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c);
+
+  /**
+   * \brief Process a single broadcast link
+   *
+   * \param nd the NetDevice
+   * \param pLSA the Global LSA
+   * \param c the returned NetDevice container
+   */
   void ProcessSingleBroadcastLink (Ptr<NetDevice> nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c);
+
+  /**
+   * \brief Process a bridged broadcast link
+   *
+   * \param nd the NetDevice
+   * \param pLSA the Global LSA
+   * \param c the returned NetDevice container
+   */
   void ProcessBridgedBroadcastLink (Ptr<NetDevice> nd, GlobalRoutingLSA *pLSA, NetDeviceContainer &c);
 
+  /**
+   * \brief Process a point to point link
+   *
+   * \param ndLocal the NetDevice
+   * \param pLSA the Global LSA
+   */
   void ProcessPointToPointLink (Ptr<NetDevice> ndLocal, GlobalRoutingLSA *pLSA);
+
+  /**
+   * \brief Build one NetworkLSA for each net device talking to a network that we are the
+   * designated router for.
+   *
+   * \param c the devices.
+   */
   void BuildNetworkLSAs (NetDeviceContainer c);
+
+  /**
+   * \brief Decide whether or not a given net device is being bridged by a BridgeNetDevice.
+   *
+   * \param nd the NetDevice
+   * \returns the BridgeNetDevice smart pointer or null if not found
+   */
   Ptr<BridgeNetDevice> NetDeviceIsBridged (Ptr<NetDevice> nd) const;
 
 
-  typedef std::list<GlobalRoutingLSA*> ListOfLSAs_t;
-  ListOfLSAs_t m_LSAs;
+  typedef std::list<GlobalRoutingLSA*> ListOfLSAs_t; //!< container for the GlobalRoutingLSAs
+  ListOfLSAs_t m_LSAs; //!< database of GlobalRoutingLSAs
 
-  Ipv4Address m_routerId;
-  Ptr<Ipv4GlobalRouting> m_routingProtocol;
+  Ipv4Address m_routerId; //!< router ID (its IPv4 address)
+  Ptr<Ipv4GlobalRouting> m_routingProtocol; //!< the Ipv4GlobalRouting in use
 
-  typedef std::list<Ipv4RoutingTableEntry *> InjectedRoutes;
-  typedef std::list<Ipv4RoutingTableEntry *>::const_iterator InjectedRoutesCI;
-  typedef std::list<Ipv4RoutingTableEntry *>::iterator InjectedRoutesI;
-  InjectedRoutes m_injectedRoutes; // Routes we are exporting
+  typedef std::list<Ipv4RoutingTableEntry *> InjectedRoutes; //!< container of Ipv4RoutingTableEntry
+  typedef std::list<Ipv4RoutingTableEntry *>::const_iterator InjectedRoutesCI; //!< Const Iterator to container of Ipv4RoutingTableEntry
+  typedef std::list<Ipv4RoutingTableEntry *>::iterator InjectedRoutesI; //!< Iterator to container of Ipv4RoutingTableEntry
+  InjectedRoutes m_injectedRoutes; //!< Routes we are exporting
 
   // inherited from Object
   virtual void DoDispose (void);
diff -Naur ns-3.18.1/src/internet/model/icmpv4.cc ns-3.19/src/internet/model/icmpv4.cc
--- ns-3.18.1/src/internet/model/icmpv4.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/icmpv4.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
  *        Icmpv4Header
  ********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv4Header);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv4Header)
+  ;
 
 TypeId 
 Icmpv4Header::GetTypeId (void)
@@ -133,7 +134,8 @@
  *        Icmpv4Echo
  ********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv4Echo);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv4Echo)
+  ;
 
 void 
 Icmpv4Echo::SetIdentifier (uint16_t id)
@@ -270,7 +272,8 @@
  *        Icmpv4DestinationUnreachable
  ********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv4DestinationUnreachable);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv4DestinationUnreachable)
+  ;
 
 TypeId 
 Icmpv4DestinationUnreachable::GetTypeId (void)
@@ -393,7 +396,8 @@
  *        Icmpv4TimeExceeded
  ********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv4TimeExceeded);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv4TimeExceeded)
+  ;
 
 TypeId 
 Icmpv4TimeExceeded::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/icmpv4.h ns-3.19/src/internet/model/icmpv4.h
--- ns-3.18.1/src/internet/model/icmpv4.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/icmpv4.h	2013-12-20 09:44:50.000000000 -0800
@@ -40,16 +40,42 @@
     TIME_EXCEEDED = 11
   };
 
+  /**
+   * Enables ICMP Checksum calculation
+   */
   void EnableChecksum (void);
+
+  /**
+   * Set ICMP type
+   * \param type the ICMP type
+   */
   void SetType (uint8_t type);
+
+  /**
+   * Set ICMP code
+   * \param code the ICMP code
+   */
   void SetCode (uint8_t code);
 
+  /**
+   * Get ICMP type
+   * \returns the ICMP type
+   */
   uint8_t GetType (void) const;
+  /**
+   * Get ICMP code
+   * \returns the ICMP code
+   */
   uint8_t GetCode (void) const;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   Icmpv4Header ();
   virtual ~Icmpv4Header ();
+
   virtual TypeId GetInstanceTypeId (void) const;
   virtual uint32_t GetSerializedSize (void) const;
   virtual void Serialize (Buffer::Iterator start) const;
@@ -57,23 +83,56 @@
   virtual void Print (std::ostream &os) const;
 
 private:
-  uint8_t m_type;
-  uint8_t m_code;
-  bool m_calcChecksum;
+  uint8_t m_type; //!< ICMP type
+  uint8_t m_code; //!< ICMP code
+  bool m_calcChecksum;  //!< true if checksum is calculated
 };
 
 class Icmpv4Echo : public Header
 {
 public:
+  /**
+   * \brief Set the Echo identifier
+   * \param id the identifier
+   */
   void SetIdentifier (uint16_t id);
+  /**
+   * \brief Set the Echo sequence number
+   * \param seq the sequence number
+   */
   void SetSequenceNumber (uint16_t seq);
+  /**
+   * \brief Set the Echo data
+   * \param data the data
+   */
   void SetData (Ptr<const Packet> data);
+  /**
+   * \brief Get the Echo identifier
+   * \returns the identifier
+   */
   uint16_t GetIdentifier (void) const;
+  /**
+   * \brief Get the Echo sequence number
+   * \returns the sequence number
+   */
   uint16_t GetSequenceNumber (void) const;
+  /**
+   * \brief Get the Echo data size
+   * \returns the data size
+   */
   uint32_t GetDataSize (void) const;
+  /**
+   * \brief Get the Echo data
+   * \param payload the data (filled)
+   * \returns the data length
+   */
   uint32_t GetData (uint8_t payload[]) const;
 
 
+  /**
+   * Get ICMP type
+   * \returns the ICMP type
+   */
   static TypeId GetTypeId (void);
   Icmpv4Echo ();
   virtual ~Icmpv4Echo ();
@@ -83,10 +142,10 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
   virtual void Print (std::ostream &os) const;
 private:
-  uint16_t m_identifier;
-  uint16_t m_sequence;
-  uint8_t *m_data;
-  uint32_t m_dataSize;
+  uint16_t m_identifier; //!< identifier
+  uint16_t m_sequence;   //!< sequence number
+  uint8_t *m_data;       //!< data
+  uint32_t m_dataSize;   //!< data size
 };
 
 class Icmpv4DestinationUnreachable : public Header
@@ -100,17 +159,46 @@
     FRAG_NEEDED = 4,
     SOURCE_ROUTE_FAILED = 5
   };
+
+  /**
+   * Get ICMP type
+   * \returns the ICMP type
+   */
   static TypeId GetTypeId (void);
   Icmpv4DestinationUnreachable ();
   virtual ~Icmpv4DestinationUnreachable ();
 
+  /**
+   * \brief Set the next hop MTU
+   * \param mtu the MTU
+   */
   void SetNextHopMtu (uint16_t mtu);
+  /**
+   * \brief Get the next hop MTU
+   * \returns the MTU
+   */
   uint16_t GetNextHopMtu (void) const;
 
+  /**
+   * \brief Set the ICMP carried data
+   * \param data the data
+   */
   void SetData (Ptr<const Packet> data);
+  /**
+   * \brief Set the ICMP carried IPv4 header
+   * \param header the header
+   */
   void SetHeader (Ipv4Header header);
 
+  /**
+   * \brief Get the ICMP carried data
+   * \param payload the data (filled)
+   */
   void GetData (uint8_t payload[8]) const;
+  /**
+   * \brief Get the ICMP carried IPv4 header
+   * \returns the header
+   */
   Ipv4Header GetHeader (void) const;
 
 private:
@@ -120,9 +208,9 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
   virtual void Print (std::ostream &os) const;
 private:
-  uint16_t m_nextHopMtu;
-  Ipv4Header m_header;
-  uint8_t m_data[8];
+  uint16_t m_nextHopMtu; //!< next hop MTU
+  Ipv4Header m_header;   //!< carried IPv4 header
+  uint8_t m_data[8];     //!< carried data
 };
 
 
@@ -134,12 +222,32 @@
     FRAGMENT_REASSEMBLY = 1
   };
 
+  /**
+   * \brief Get the ICMP carried data
+   * \param data the data
+   */
   void SetData (Ptr<const Packet> data);
+  /**
+   * \brief Set the ICMP carried IPv4 header
+   * \param header the header
+   */
   void SetHeader (Ipv4Header header);
 
+  /**
+   * \brief Get the ICMP carried data
+   * \param payload the data (filled)
+   */
   void GetData (uint8_t payload[8]) const;
+  /**
+   * \brief Get the ICMP carried IPv4 header
+   * \returns the header
+   */
   Ipv4Header GetHeader (void) const;
 
+  /**
+   * Get ICMP type
+   * \returns the ICMP type
+   */
   static TypeId GetTypeId (void);
   Icmpv4TimeExceeded ();
   virtual ~Icmpv4TimeExceeded ();
@@ -150,8 +258,8 @@
   virtual void Print (std::ostream &os) const;
 
 private:
-  Ipv4Header m_header;
-  uint8_t m_data[8];
+  Ipv4Header m_header;   //!< carried IPv4 header
+  uint8_t m_data[8];     //!< carried data
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/icmpv4-l4-protocol.cc ns-3.19/src/internet/model/icmpv4-l4-protocol.cc
--- ns-3.18.1/src/internet/model/icmpv4-l4-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/icmpv4-l4-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -11,9 +11,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Icmpv4L4Protocol");
+NS_LOG_COMPONENT_DEFINE ("Icmpv4L4Protocol")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv4L4Protocol);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv4L4Protocol)
+  ;
 
 // see rfc 792
 const uint8_t Icmpv4L4Protocol::PROT_NUMBER = 1;
diff -Naur ns-3.18.1/src/internet/model/icmpv4-l4-protocol.h ns-3.19/src/internet/model/icmpv4-l4-protocol.h
--- ns-3.18.1/src/internet/model/icmpv4-l4-protocol.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/icmpv4-l4-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -14,25 +14,76 @@
 class Icmpv4L4Protocol : public IpL4Protocol
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
-  static const uint8_t PROT_NUMBER;
+  static const uint8_t PROT_NUMBER; //!< ICMP protocol number (0x1)
 
   Icmpv4L4Protocol ();
   virtual ~Icmpv4L4Protocol ();
 
+  /**
+   * \brief Set the node the protocol is associated with.
+   * \param node the node
+   */
   void SetNode (Ptr<Node> node);
 
+  /**
+   * Get the protocol number
+   * \returns the protocol number
+   */
   static uint16_t GetStaticProtocolNumber (void);
+
+  /**
+   * Get the protocol number
+   * \returns the protocol number
+   */
   virtual int GetProtocolNumber (void) const;
+
+  /**
+   * \brief Receive method.
+   * \param p the packet
+   * \param header the IPv4 header
+   * \param incomingInterface the interface from which the packet is coming
+   * \returns the receive status
+   */
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                                 Ipv4Header const &header,
-                                                 Ptr<Ipv4Interface> incomingInterface);
+                                               Ipv4Header const &header,
+                                               Ptr<Ipv4Interface> incomingInterface);
+
+  /**
+   * \brief Receive method.
+   * \param p the packet
+   * \param header the IPv6 header
+   * \param incomingInterface the interface from which the packet is coming
+   * \returns the receive status
+   */
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                                 Ipv6Header const &header,
-                                                 Ptr<Ipv6Interface> incomingInterface);
+                                               Ipv6Header const &header,
+                                               Ptr<Ipv6Interface> incomingInterface);
 
+  /**
+   * \brief Send a Destination Unreachable - Fragmentation needed ICMP error
+   * \param header the original IP header
+   * \param orgData the original packet
+   * \param nextHopMtu the next hop MTU
+   */
   void SendDestUnreachFragNeeded (Ipv4Header header, Ptr<const Packet> orgData, uint16_t nextHopMtu);
+
+  /**
+   * \brief Send a Time Exceeded ICMP error
+   * \param header the original IP header
+   * \param orgData the original packet
+   */
   void SendTimeExceededTtl (Ipv4Header header, Ptr<const Packet> orgData);
+
+  /**
+   * \brief Send a Time Exceeded ICMP error
+   * \param header the original IP header
+   * \param orgData the original packet
+   */
   void SendDestUnreachPort (Ipv4Header header, Ptr<const Packet> orgData);
 
   // From IpL4Protocol
@@ -48,30 +99,86 @@
    */
   virtual void NotifyNewAggregate ();
 private:
+  /**
+   * \brief Handles an incoming ICMP Echo packet
+   * \param p the packet
+   * \param header the IP header
+   * \param source the source address
+   * \param destination the destination address
+   */
   void HandleEcho (Ptr<Packet> p,
                    Icmpv4Header header,
                    Ipv4Address source,
                    Ipv4Address destination);
+  /**
+   * \brief Handles an incoming ICMP Destination Unreachable packet
+   * \param p the packet
+   * \param header the IP header
+   * \param source the source address
+   * \param destination the destination address
+   */
   void HandleDestUnreach (Ptr<Packet> p,
                           Icmpv4Header header,
                           Ipv4Address source,
                           Ipv4Address destination);
+  /**
+   * \brief Handles an incoming ICMP Time Exceeded packet
+   * \param p the packet
+   * \param icmp the ICMP header
+   * \param source the source address
+   * \param destination the destination address
+   */
   void HandleTimeExceeded (Ptr<Packet> p,
                            Icmpv4Header icmp,
                            Ipv4Address source,
                            Ipv4Address destination);
+  /**
+   * \brief Send an ICMP Destination Unreachable packet
+   *
+   * \param header the original IP header
+   * \param orgData the original packet
+   * \param code the ICMP code
+   * \param nextHopMtu the next hop MTU
+   */
   void SendDestUnreach (Ipv4Header header, Ptr<const Packet> orgData, 
                         uint8_t code, uint16_t nextHopMtu);
+  /**
+   * \brief Send a generic ICMP packet
+   *
+   * \param packet the packet
+   * \param dest the destination
+   * \param type the ICMP type
+   * \param code the ICMP code
+   */
   void SendMessage (Ptr<Packet> packet, Ipv4Address dest, uint8_t type, uint8_t code);
+  /**
+   * \brief Send a generic ICMP packet
+   *
+   * \param packet the packet
+   * \param source the source
+   * \param dest the destination
+   * \param type the ICMP type
+   * \param code the ICMP code
+   * \param route the route to be used
+   */
   void SendMessage (Ptr<Packet> packet, Ipv4Address source, Ipv4Address dest, uint8_t type, uint8_t code, Ptr<Ipv4Route> route);
+  /**
+   * \brief Forward the message to an L4 protocol
+   *
+   * \param source the source
+   * \param icmp the ICMP header
+   * \param info info data (e.g., the target MTU)
+   * \param ipHeader the IP header carried by ICMP
+   * \param payload payload chunk carried by ICMP
+   */
   void Forward (Ipv4Address source, Icmpv4Header icmp,
                 uint32_t info, Ipv4Header ipHeader,
                 const uint8_t payload[8]);
 
   virtual void DoDispose (void);
 
-  Ptr<Node> m_node;
-  IpL4Protocol::DownTargetCallback m_downTarget;
+  Ptr<Node> m_node; //!< the node this protocol is associated with
+  IpL4Protocol::DownTargetCallback m_downTarget; //!< callback to Ipv4::Send
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/icmpv6-header.cc ns-3.19/src/internet/model/icmpv6-header.cc
--- ns-3.18.1/src/internet/model/icmpv6-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/icmpv6-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 namespace ns3
 {
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6Header);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6Header)
+  ;
 
 TypeId Icmpv6Header::GetTypeId ()
 {
@@ -172,7 +173,8 @@
   m_checksum = ~(it.CalculateIpChecksum (40));
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6NS);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6NS)
+  ;
 
 Icmpv6NS::Icmpv6NS ()
 {
@@ -294,7 +296,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6NA);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6NA)
+  ;
 
 TypeId Icmpv6NA::GetTypeId ()
 {
@@ -477,7 +480,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6RA);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6RA)
+  ;
 
 TypeId Icmpv6RA::GetTypeId ()
 {
@@ -696,7 +700,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6RS);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6RS)
+  ;
 
 TypeId Icmpv6RS::GetTypeId ()
 {
@@ -786,7 +791,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6Redirection);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6Redirection)
+  ;
 
 TypeId Icmpv6Redirection::GetTypeId ()
 {
@@ -916,7 +922,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6Echo);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6Echo)
+  ;
 
 TypeId Icmpv6Echo::GetTypeId ()
 {
@@ -1033,7 +1040,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6DestinationUnreachable);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6DestinationUnreachable)
+  ;
 
 TypeId Icmpv6DestinationUnreachable::GetTypeId ()
 {
@@ -1130,7 +1138,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6TooBig);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6TooBig)
+  ;
 
 TypeId Icmpv6TooBig::GetTypeId ()
 {
@@ -1240,7 +1249,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6TimeExceeded);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6TimeExceeded)
+  ;
 
 TypeId Icmpv6TimeExceeded::GetTypeId ()
 {
@@ -1339,7 +1349,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6ParameterError);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6ParameterError)
+  ;
 
 TypeId Icmpv6ParameterError::GetTypeId ()
 {
@@ -1449,7 +1460,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionHeader);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionHeader)
+  ;
 
 TypeId Icmpv6OptionHeader::GetTypeId ()
 {
@@ -1527,7 +1539,8 @@
   NS_LOG_FUNCTION (this << &start);
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionMtu);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionMtu)
+  ;
 
 TypeId Icmpv6OptionMtu::GetTypeId ()
 {
@@ -1623,7 +1636,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionPrefixInformation);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionPrefixInformation)
+  ;
 
 TypeId Icmpv6OptionPrefixInformation::GetTypeId ()
 {
@@ -1796,7 +1810,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionLinkLayerAddress);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionLinkLayerAddress)
+  ;
 
 TypeId Icmpv6OptionLinkLayerAddress::GetTypeId ()
 {
@@ -1903,7 +1918,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionRedirected);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6OptionRedirected)
+  ;
 
 TypeId Icmpv6OptionRedirected::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/icmpv6-l4-protocol.cc ns-3.19/src/internet/model/icmpv6-l4-protocol.cc
--- ns-3.18.1/src/internet/model/icmpv6-l4-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/icmpv6-l4-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -39,9 +39,11 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Icmpv6L4Protocol);
+NS_OBJECT_ENSURE_REGISTERED (Icmpv6L4Protocol)
+  ;
 
-NS_LOG_COMPONENT_DEFINE ("Icmpv6L4Protocol");
+NS_LOG_COMPONENT_DEFINE ("Icmpv6L4Protocol")
+  ;
 
 const uint8_t Icmpv6L4Protocol::PROT_NUMBER = 58;
 
diff -Naur ns-3.18.1/src/internet/model/icmpv6-l4-protocol.h ns-3.19/src/internet/model/icmpv6-l4-protocol.h
--- ns-3.18.1/src/internet/model/icmpv6-l4-protocol.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/icmpv6-l4-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -338,6 +338,7 @@
    * \param p the packet
    * \param header the IPv4 header
    * \param interface the interface from which the packet is coming
+   * \returns the receive status
    */
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
                                                Ipv4Header const &header,
@@ -346,9 +347,9 @@
   /**
    * \brief Receive method.
    * \param p the packet
-   * \param src source address
-   * \param dst destination address
+   * \param header the IPv6 header
    * \param interface the interface from which the packet is coming
+   * \returns the receive status
    */
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
                                                Ipv6Header const &header,
@@ -364,11 +365,14 @@
 
   /**
    * \brief Lookup in the ND cache for the IPv6 address
+   *
+   * \note Unlike other Lookup method, it does not send NS request!
+   *
    * \param dst destination address
    * \param device device
    * \param cache the neighbor cache
    * \param hardwareDestination hardware address
-   * \note Unlike other Lookup method, it does not send NS request!
+   * \return true if the address is in the ND cache, the hardwareDestination is updated.
    */
   bool Lookup (Ipv6Address dst, Ptr<NetDevice> device, Ptr<NdiscCache> cache, Address* hardwareDestination);
 
@@ -424,7 +428,7 @@
   virtual void DoDispose ();
 
 private:
-  typedef std::list<Ptr<NdiscCache> > CacheList;
+  typedef std::list<Ptr<NdiscCache> > CacheList; //!< container of NdiscCaches
 
   /**
    * \brief The node.
@@ -560,6 +564,7 @@
   /**
    * \brief Get the cache corresponding to the device.
    * \param device the device
+   * \returns the NdiscCache associated with the device
    */
   Ptr<NdiscCache> FindCache (Ptr<NetDevice> device);
 
@@ -570,7 +575,7 @@
   virtual IpL4Protocol::DownTargetCallback GetDownTarget (void) const;
   virtual IpL4Protocol::DownTargetCallback6 GetDownTarget6 (void) const;
 
-  IpL4Protocol::DownTargetCallback6 m_downTarget;
+  IpL4Protocol::DownTargetCallback6 m_downTarget; //!< callback to Ipv6::Send
 
 };
 
diff -Naur ns-3.18.1/src/internet/model/ip-l4-protocol.cc ns-3.19/src/internet/model/ip-l4-protocol.cc
--- ns-3.18.1/src/internet/model/ip-l4-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ip-l4-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (IpL4Protocol);
+NS_OBJECT_ENSURE_REGISTERED (IpL4Protocol)
+  ;
 
 TypeId 
 IpL4Protocol::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/ip-l4-protocol.h ns-3.19/src/internet/model/ip-l4-protocol.h
--- ns-3.18.1/src/internet/model/ip-l4-protocol.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ip-l4-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -47,6 +47,9 @@
 class IpL4Protocol : public Object
 {
 public:
+  /**
+   * \brief Rx status codes
+   */
   enum RxStatus {
     RX_OK,
     RX_CSUM_FAILED,
@@ -54,6 +57,10 @@
     RX_ENDPOINT_UNREACH
   };
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   virtual ~IpL4Protocol ();
@@ -64,21 +71,29 @@
   virtual int GetProtocolNumber (void) const = 0;
 
   /**
+   * \brief Called from lower-level layers to send the packet up in the stack.
    * \param p packet to forward up
    * \param header IPv4 Header information
    * \param incomingInterface the Ipv4Interface on which the packet arrived
-   * 
-   * Called from lower-level layers to send the packet up
-   * in the stack. 
+   * \returns Rx status code
    */
   virtual enum RxStatus Receive (Ptr<Packet> p,
                                  Ipv4Header const &header,
                                  Ptr<Ipv4Interface> incomingInterface) = 0;
+
+  /**
+   * \brief Called from lower-level layers to send the packet up in the stack.
+   * \param p packet to forward up
+   * \param header IPv6 Header information
+   * \param incomingInterface the Ipv6Interface on which the packet arrived
+   * \returns Rx status code
+   */
   virtual enum RxStatus Receive (Ptr<Packet> p,
                                  Ipv6Header const &header,
                                  Ptr<Ipv6Interface> incomingInterface) = 0;
 
   /**
+   * \brief Called from lower-level layers to send the ICMP packet up in the stack.
    * \param icmpSource the source address of the icmp message
    * \param icmpTtl the ttl of the icmp message
    * \param icmpType the 'type' field of the icmp message
@@ -89,35 +104,74 @@
    *        the icmp message
    * \param payloadDestination the destination address of the packet which
    *        triggered the icmp message.
-   * \param payload the first 8 bytes of the udp header of the packet
+   * \param payload the first 8 bytes of the packet payload
    *        which triggered the icmp message.
    */
   virtual void ReceiveIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
                             uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
                             Ipv4Address payloadSource, Ipv4Address payloadDestination,
                             const uint8_t payload[8]);
+
+
+  /**
+   * \brief Called from lower-level layers to send the ICMPv6 packet up in the stack.
+   * \param icmpSource the source address of the icmp message
+   * \param icmpTtl the ttl of the icmp message
+   * \param icmpType the 'type' field of the icmp message
+   * \param icmpCode the 'code' field of the icmp message
+   * \param icmpInfo extra information dependent on the icmp message
+   *        generated by Icmpv6L4Protocol
+   * \param payloadSource the source address of the packet which triggered
+   *        the icmp message
+   * \param payloadDestination the destination address of the packet which
+   *        triggered the icmp message.
+   * \param payload the first 8 bytes of the packet payload
+   *        which triggered the icmp message.
+   */
   virtual void ReceiveIcmp (Ipv6Address icmpSource, uint8_t icmpTtl,
                             uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
                             Ipv6Address payloadSource, Ipv6Address payloadDestination,
                             const uint8_t payload[8]);
 
+  /**
+   * \brief callback to send packets over IPv4
+   */
   typedef Callback<void,Ptr<Packet>, Ipv4Address, Ipv4Address, uint8_t, Ptr<Ipv4Route> > DownTargetCallback;
+  /**
+   * \brief callback to send packets over IPv6
+   */
   typedef Callback<void,Ptr<Packet>, Ipv6Address, Ipv6Address, uint8_t, Ptr<Ipv6Route> > DownTargetCallback6;
+
   /**
    * This method allows a caller to set the current down target callback
-   * set for this L4 protocol
+   * set for this L4 protocol (IPv4 case)
    *
    * \param cb current Callback for the L4 protocol
    */
   virtual void SetDownTarget (DownTargetCallback cb) = 0;
+
+  /**
+   * This method allows a caller to set the current down target callback
+   * set for this L4 protocol (IPv6 case)
+   *
+   * \param cb current Callback for the L4 protocol
+   */
   virtual void SetDownTarget6 (DownTargetCallback6 cb) = 0;
+
   /**
    * This method allows a caller to get the current down target callback
-   * set for this L4 protocol, for
+   * set for this L4 protocol (IPv4 case)
    *
    * \return current Callback for the L4 protocol
    */
   virtual DownTargetCallback GetDownTarget (void) const = 0;
+
+  /**
+   * This method allows a caller to get the current down target callback
+   * set for this L4 protocol (IPv6 case)
+   *
+   * \return current Callback for the L4 protocol
+   */
   virtual DownTargetCallback6 GetDownTarget6 (void) const = 0;
 };
 
diff -Naur ns-3.18.1/src/internet/model/ipv4-address-generator.cc ns-3.19/src/internet/model/ipv4-address-generator.cc
--- ns-3.18.1/src/internet/model/ipv4-address-generator.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-address-generator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,53 +27,160 @@
 
 namespace ns3 {
 
+/**
+ * \internal
+ * \ingroup address
+ *
+ * \brief Implementation class of Ipv4AddressGenerator
+ * This generator assigns addresses sequentially from a provided
+ * network address; used in topology code. It also keeps track of all
+ * addresses assigned to perform duplicate detection.
+ */
 class Ipv4AddressGeneratorImpl
 {
 public:
   Ipv4AddressGeneratorImpl ();
   virtual ~Ipv4AddressGeneratorImpl ();
 
+  /**
+   * \internal
+   * \brief Initialise the base network, mask and address for the generator
+   *
+   * The first call to NextAddress() or GetAddress() will return the
+   * value passed in.
+   *
+   * \param net The network for the base Ipv4Address
+   * \param mask The network mask of the base Ipv4Address
+   * \param addr The base address used for initialization
+   */
   void Init (const Ipv4Address net, const Ipv4Mask mask, 
              const Ipv4Address addr);
 
+  /**
+   * \internal
+   * \brief Get the current network of the given Ipv4Mask
+   *
+   * Does not change the internal state; this just peeks at the current
+   * network
+   *
+   * \param mask The Ipv4Mask for the current network
+   * \returns the IPv4 address of the current network
+   */
   Ipv4Address GetNetwork (const Ipv4Mask mask) const;
+
+  /**
+   * \internal
+   * \brief Get the next network according to the given Ipv4Mask
+   *
+   * This operation is a pre-increment, meaning that the internal state
+   * is changed before returning the new network address.
+   *
+   * This also resets the address to the base address that was
+   * used for initialization.
+   *
+   * \param mask The Ipv4Mask used to set the next network
+   * \returns the IPv4 address of the next network
+   */
   Ipv4Address NextNetwork (const Ipv4Mask mask);
 
+  /**
+   * \internal
+   * \brief Set the address for the given mask
+   *
+   * \param addr The address to set for the current mask
+   * \param mask The Ipv4Mask whose address is to be set
+   */
   void InitAddress (const Ipv4Address addr, const Ipv4Mask mask);
-  Ipv4Address GetAddress (const Ipv4Mask mask) const;
+
+  /**
+   * \internal
+   * \brief Allocate the next Ipv4Address for the configured network and mask
+   *
+   * This operation is a post-increment, meaning that the first address
+   * allocated will be the one that was initially configured.
+   *
+   * \param mask The Ipv4Mask for the current network
+   * \returns the IPv4 address
+   */
   Ipv4Address NextAddress (const Ipv4Mask mask);
 
+  /**
+   * \internal
+   * \brief Get the Ipv4Address that will be allocated upon NextAddress ()
+   *
+   * Does not change the internal state; just is used to peek the next
+   * address that will be allocated upon NextAddress ()
+   *
+   * \param mask The Ipv4Mask for the current network
+   * \returns the IPv4 address
+   */
+  Ipv4Address GetAddress (const Ipv4Mask mask) const;
+
+  /**
+   * \internal
+   * \brief Reset the networks and Ipv4Address to zero
+   */
   void Reset (void);
+
+  /**
+   * \internal
+   * \brief Add the Ipv4Address to the list of IPv4 entries
+   *
+   * Typically, this is used by external address allocators that want
+   * to make use of this class's ability to track duplicates.  AddAllocated
+   * is always called internally for any address generated by NextAddress ()
+   *
+   * \param addr The Ipv4Address to be added to the list of Ipv4 entries
+   * \returns true on success
+   */
   bool AddAllocated (const Ipv4Address addr);
 
+  /**
+   * \internal
+   * \brief Used to turn off fatal errors and assertions, for testing
+   */
   void TestMode (void);
 private:
-  static const uint32_t N_BITS = 32;
-  static const uint32_t MOST_SIGNIFICANT_BIT = 0x80000000;
+  static const uint32_t N_BITS = 32;  //!< /internal the number of bits in the address
+  static const uint32_t MOST_SIGNIFICANT_BIT = 0x80000000; //!< /internal MSB set to 1
 
+  /**
+   * \internal
+   * \brief Create an index number for the network mask
+   * \param mask the mask to index
+   * \returns an index
+   */
   uint32_t MaskToIndex (Ipv4Mask mask) const;
 
+  /**
+   * \internal
+   * \brief This class holds the state for a given network
+   */
   class NetworkState
   {
 public:
-    uint32_t mask;
-    uint32_t shift;
-    uint32_t network;
-    uint32_t addr;
-    uint32_t addrMax;
+    uint32_t mask;      //!< /internal the network mask
+    uint32_t shift;     //!< /internal a shift
+    uint32_t network;   //!< /internal the network
+    uint32_t addr;      //!< /internal the address
+    uint32_t addrMax;   //!< /internal the maximum address
   };
 
-  NetworkState m_netTable[N_BITS];
+  NetworkState m_netTable[N_BITS]; //!< /internal the available networks
 
+  /**
+   * \internal
+   * \brief This class holds the allocated addresses
+   */
   class Entry
   {
 public:
-    uint32_t addrLow;
-    uint32_t addrHigh;
+    uint32_t addrLow;  //!< /internal the lowest allocated address
+    uint32_t addrHigh; //!< /internal the highest allocated address
   };
 
-  std::list<Entry> m_entries;
-  bool m_test;
+  std::list<Entry> m_entries; //!< /internal contained of allocated addresses
+  bool m_test; //!< /internal test mode (if true)
 };
 
 Ipv4AddressGeneratorImpl::Ipv4AddressGeneratorImpl () 
diff -Naur ns-3.18.1/src/internet/model/ipv4-address-generator.h ns-3.19/src/internet/model/ipv4-address-generator.h
--- ns-3.18.1/src/internet/model/ipv4-address-generator.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-address-generator.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,22 +28,103 @@
  *
  * \brief This generator assigns addresses sequentially from a provided
  * network address; used in topology code.
+ *
+ * \note BEWARE: this class acts as a Singleton.
+ * In other terms, two different instances of Ipv4AddressGenerator will
+ * pick IPv4 numbers from the same pool. Changing the network in one of them
+ * will also change the network in the other instances.
+ *
  */
 class Ipv4AddressGenerator {
 public:
+  /**
+   * \brief Initialise the base network, mask and address for the generator
+   *
+   * The first call to NextAddress() or GetAddress() will return the
+   * value passed in.
+   *
+   * \param net The network for the base Ipv4Address
+   * \param mask The network mask of the base Ipv4Address
+   * \param addr The base address used for initialization
+   */
   static void Init (const Ipv4Address net, const Ipv4Mask mask, 
                     const Ipv4Address addr = "0.0.0.1");
 
+  /**
+   * \brief Get the next network according to the given Ipv4Mask
+   *
+   * This operation is a pre-increment, meaning that the internal state
+   * is changed before returning the new network address.
+   *
+   * This also resets the address to the base address that was
+   * used for initialization.
+   *
+   * \param mask The Ipv4Mask used to set the next network
+   * \returns the IPv4 address of the next network
+   */
   static Ipv4Address NextNetwork (const Ipv4Mask mask);
+
+  /**
+   * \brief Get the current network of the given Ipv4Mask
+   *
+   * Does not change the internal state; this just peeks at the current
+   * network
+   *
+   * \param mask The Ipv4Mask for the current network
+   * \returns the IPv4 address of the current network
+   */
   static Ipv4Address GetNetwork (const Ipv4Mask mask);
 
+  /**
+   * \brief Set the address for the given mask
+   *
+   * \param addr The address to set for the current mask
+   * \param mask The Ipv4Mask whose address is to be set
+   */
   static void InitAddress (const Ipv4Address addr, const Ipv4Mask mask);
+
+  /**
+   * \brief Allocate the next Ipv4Address for the configured network and mask
+   *
+   * This operation is a post-increment, meaning that the first address
+   * allocated will be the one that was initially configured.
+   *
+   * \param mask The Ipv4Mask for the current network
+   * \returns the IPv4 address
+   */
   static Ipv4Address NextAddress (const Ipv4Mask mask);
+
+  /**
+   * \brief Get the Ipv4Address that will be allocated upon NextAddress ()
+   *
+   * Does not change the internal state; just is used to peek the next
+   * address that will be allocated upon NextAddress ()
+   *
+   * \param mask The Ipv4Mask for the current network
+   * \returns the IPv4 address
+   */
   static Ipv4Address GetAddress (const Ipv4Mask mask);
 
+  /**
+   * \brief Reset the networks and Ipv4Address to zero
+   */
   static void Reset (void);
+
+  /**
+   * \brief Add the Ipv4Address to the list of IPv4 entries
+   *
+   * Typically, this is used by external address allocators that want
+   * to make use of this class's ability to track duplicates.  AddAllocated
+   * is always called internally for any address generated by NextAddress ()
+   *
+   * \param addr The Ipv4Address to be added to the list of Ipv4 entries
+   * \returns true on success
+   */
   static bool AddAllocated (const Ipv4Address addr);
 
+  /**
+   * \brief Used to turn off fatal errors and assertions, for testing
+   */
   static void TestMode (void);
 };
 
diff -Naur ns-3.18.1/src/internet/model/ipv4.cc ns-3.19/src/internet/model/ipv4.cc
--- ns-3.18.1/src/internet/model/ipv4.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4)
+  ;
 
 TypeId 
 Ipv4::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/ipv4-end-point-demux.cc ns-3.19/src/internet/model/ipv4-end-point-demux.cc
--- ns-3.18.1/src/internet/model/ipv4-end-point-demux.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-end-point-demux.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv4EndPointDemux");
+NS_LOG_COMPONENT_DEFINE ("Ipv4EndPointDemux")
+  ;
 
 Ipv4EndPointDemux::Ipv4EndPointDemux ()
   : m_ephemeral (49152), m_portLast (65535), m_portFirst (49152)
diff -Naur ns-3.18.1/src/internet/model/ipv4-end-point-demux.h ns-3.19/src/internet/model/ipv4-end-point-demux.h
--- ns-3.18.1/src/internet/model/ipv4-end-point-demux.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-end-point-demux.h	2013-12-20 09:44:50.000000000 -0800
@@ -42,43 +42,141 @@
 
 class Ipv4EndPointDemux {
 public:
+  /**
+   * \brief Container of the IPv4 endpoints.
+   */
   typedef std::list<Ipv4EndPoint *> EndPoints;
+
+  /**
+   * \brief Iterator to the container of the IPv4 endpoints.
+   */
   typedef std::list<Ipv4EndPoint *>::iterator EndPointsI;
 
   Ipv4EndPointDemux ();
   ~Ipv4EndPointDemux ();
 
+  /**
+   * \brief Get the entire list of end points registered.
+   * \return list of Ipv4EndPoint
+   */
   EndPoints GetAllEndPoints (void);
+
+  /**
+   * \brief Lookup for port local.
+   * \param port port to test
+   * \return true if a port local is in EndPoints, false otherwise
+   */
   bool LookupPortLocal (uint16_t port);
+
+  /**
+   * \brief Lookup for address and port.
+   * \param addr address to test
+   * \param port port to test
+   * \return true if there is a match in EndPoints, false otherwise
+   */
   bool LookupLocal (Ipv4Address addr, uint16_t port);
+
+  /**
+   * \brief lookup for a match with all the parameters.
+   * \param daddr destination address to test
+   * \param dport destination port to test
+   * \param saddr source address to test
+   * \param sport source port to test
+   * \param incomingInterface the incoming interface
+   * \return list of IPv4EndPoints (could be 0 element)
+   */
   EndPoints Lookup (Ipv4Address daddr, 
                     uint16_t dport, 
                     Ipv4Address saddr, 
                     uint16_t sport,
                     Ptr<Ipv4Interface> incomingInterface);
 
+  /**
+   * \brief simple lookup for a match with all the parameters.
+   * \param daddr destination address to test
+   * \param dport destination port to test
+   * \param saddr source address to test
+   * \param sport source port to test
+   * \return IPv4EndPoint (0 if not found)
+   */
   Ipv4EndPoint *SimpleLookup (Ipv4Address daddr, 
                               uint16_t dport, 
                               Ipv4Address saddr, 
                               uint16_t sport);
 
+  /**
+   * \brief Allocate a Ipv4EndPoint.
+   * \return an empty Ipv4EndPoint instance
+   */
   Ipv4EndPoint *Allocate (void);
+
+  /**
+   * \brief Allocate a Ipv4EndPoint.
+   * \param address IPv4 address
+   * \return an Ipv4EndPoint instance
+   */
   Ipv4EndPoint *Allocate (Ipv4Address address);
+
+  /**
+   * \brief Allocate a Ipv4EndPoint.
+   * \param port local port
+   * \return an Ipv4EndPoint instance
+   */
   Ipv4EndPoint *Allocate (uint16_t port);
+
+  /**
+   * \brief Allocate a Ipv4EndPoint.
+   * \param address local address
+   * \param port local port
+   * \return an Ipv4EndPoint instance
+   */
   Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port);
+
+  /**
+   * \brief Allocate a Ipv4EndPoint.
+   * \param localAddress local address
+   * \param localPort local port
+   * \param peerAddress peer address
+   * \param peerPort peer port
+   * \return an Ipv4EndPoint instance
+   */
   Ipv4EndPoint *Allocate (Ipv4Address localAddress, 
                           uint16_t localPort,
                           Ipv4Address peerAddress, 
                           uint16_t peerPort);
 
+  /**
+   * \brief Remove a end point.
+   * \param endPoint the end point to remove
+   */
   void DeAllocate (Ipv4EndPoint *endPoint);
 
 private:
+
+  /**
+   * \brief Allocate an ephemeral port.
+   * \returns the ephemeral port
+   */
   uint16_t AllocateEphemeralPort (void);
 
+  /**
+   * \brief The ephemeral port.
+   */
   uint16_t m_ephemeral;
+
+  /**
+   * \brief The last ephemeral port.
+   */
   uint16_t m_portLast;
+
+  /**
+   * \brief The first ephemeral port.
+   */
   uint16_t m_portFirst;
+
+  /**
+   * \brief A list of IPv4 end points.
+   */
   EndPoints m_endPoints;
 };
 
diff -Naur ns-3.18.1/src/internet/model/ipv4-end-point.h ns-3.19/src/internet/model/ipv4-end-point.h
--- ns-3.18.1/src/internet/model/ipv4-end-point.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-end-point.h	2013-12-20 09:44:50.000000000 -0800
@@ -46,48 +46,188 @@
 
 class Ipv4EndPoint {
 public:
+  /**
+   * \brief Constructor.
+   * \param address the IPv4 address
+   * \param port the port
+   */
   Ipv4EndPoint (Ipv4Address address, uint16_t port);
   ~Ipv4EndPoint ();
 
+  /**
+   * \brief Get the local address.
+   * \return the local address
+   */
   Ipv4Address GetLocalAddress (void);
+
+  /**
+   * \brief Set the local address.
+   * \param address the address to set
+   */
   void SetLocalAddress (Ipv4Address address);
+
+  /**
+   * \brief Get the local port.
+   * \return the local port
+   */
   uint16_t GetLocalPort (void);
+
+  /**
+   * \brief Get the peer address.
+   * \return the peer address
+   */
   Ipv4Address GetPeerAddress (void);
+
+  /**
+   * \brief Get the peer port.
+   * \return the peer port
+   */
   uint16_t GetPeerPort (void);
 
+  /**
+   * \brief Set the peer informations (address and port).
+   * \param address peer address
+   * \param port peer port
+   */
   void SetPeer (Ipv4Address address, uint16_t port);
 
+  /**
+   * \brief Bind a socket to specific device.
+   *
+   * This method corresponds to using setsockopt() SO_BINDTODEVICE
+   * of real network or BSD sockets.   If set on a socket, this option will
+   * force packets to leave the bound device regardless of the device that
+   * IP routing would naturally choose.  In the receive direction, only
+   * packets received from the bound interface will be delivered.
+   *
+   * This option has no particular relationship to binding sockets to
+   * an address via Socket::Bind ().  It is possible to bind sockets to a
+   * specific IP address on the bound interface by calling both
+   * Socket::Bind (address) and Socket::BindToNetDevice (device), but it
+   * is also possible to bind to mismatching device and address, even if
+   * the socket can not receive any packets as a result.
+   *
+   * \param netdevice Pointer to Netdevice of desired interface
+   */
   void BindToNetDevice (Ptr<NetDevice> netdevice);
+
+  /**
+   * \brief Returns socket's bound netdevice, if any.
+   *
+   * This method corresponds to using getsockopt() SO_BINDTODEVICE
+   * of real network or BSD sockets.
+   *
+   *
+   * \returns Pointer to interface.
+   */
   Ptr<NetDevice> GetBoundNetDevice (void);
 
   // Called from socket implementations to get notified about important events.
+  /**
+   * \brief Set the reception callback.
+   * \param callback callback function
+   */
   void SetRxCallback (Callback<void,Ptr<Packet>, Ipv4Header, uint16_t, Ptr<Ipv4Interface> > callback);
+  /**
+   * \brief Set the ICMP callback.
+   * \param callback callback function
+   */
   void SetIcmpCallback (Callback<void,Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> callback);
+  /**
+   * \brief Set the default destroy callback.
+   * \param callback callback function
+   */
   void SetDestroyCallback (Callback<void> callback);
 
-  // Called from an L4Protocol implementation to notify an endpoint of a
-  // packet reception.
+  /**
+   * \brief Forward the packet to the upper level.
+   *
+   * Called from an L4Protocol implementation to notify an endpoint of a
+   * packet reception.
+   * \param p the packet
+   * \param header the packet header
+   * \param sport source port
+   * \param incomingInterface incoming interface
+   */
   void ForwardUp (Ptr<Packet> p, const Ipv4Header& header, uint16_t sport, 
                   Ptr<Ipv4Interface> incomingInterface);
-  // Called from an L4Protocol implementation to notify an endpoint of
-  // an icmp message reception.
+
+  /**
+   * \brief Forward the ICMP packet to the upper level.
+   *
+   * Called from an L4Protocol implementation to notify an endpoint of
+   * an icmp message reception.
+   *
+   * \param icmpSource source IP address
+   * \param icmpTtl time-to-live
+   * \param icmpType ICMP type
+   * \param icmpCode ICMP code
+   * \param icmpInfo ICMP info
+   */
   void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, 
                     uint8_t icmpType, uint8_t icmpCode,
                     uint32_t icmpInfo);
 
 private:
+  /**
+   * \brief ForwardUp wrapper.
+   * \param p packet
+   * \param header the packet header
+   * \param sport source port
+   * \param incomingInterface incoming interface
+   */
   void DoForwardUp (Ptr<Packet> p, const Ipv4Header& header, uint16_t sport,
                     Ptr<Ipv4Interface> incomingInterface);
-  void DoForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, 
+  /**
+   * \brief ForwardIcmp wrapper.
+   * \param icmpSource source IP address
+   * \param icmpTtl time-to-live
+   * \param icmpType ICMP type
+   * \param icmpCode ICMP code
+   * \param icmpInfo ICMP info
+   */
+  void DoForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
                       uint8_t icmpType, uint8_t icmpCode,
                       uint32_t icmpInfo);
+
+  /**
+   * \brief The local address.
+   */
   Ipv4Address m_localAddr;
+
+  /**
+   * \brief The local port.
+   */
   uint16_t m_localPort;
+
+  /**
+   * \brief The peer address.
+   */
   Ipv4Address m_peerAddr;
+
+  /**
+   * \brief The peer port.
+   */
   uint16_t m_peerPort;
+
+  /**
+   * \brief The NetDevice the EndPoint is bound to (if any).
+   */
   Ptr<NetDevice> m_boundnetdevice;
+
+  /**
+   * \brief The RX callback.
+   */
   Callback<void,Ptr<Packet>, Ipv4Header, uint16_t, Ptr<Ipv4Interface> > m_rxCallback;
+
+  /**
+   * \brief The ICMPv6 callback.
+   */
   Callback<void,Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback;
+
+  /**
+   * \brief The destroy callback.
+   */
   Callback<void> m_destroyCallback;
 };
 
diff -Naur ns-3.18.1/src/internet/model/ipv4-global-routing.cc ns-3.19/src/internet/model/ipv4-global-routing.cc
--- ns-3.18.1/src/internet/model/ipv4-global-routing.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-global-routing.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4GlobalRouting);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4GlobalRouting)
+  ;
 
 TypeId 
 Ipv4GlobalRouting::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/ipv4-global-routing.h ns-3.19/src/internet/model/ipv4-global-routing.h
--- ns-3.18.1/src/internet/model/ipv4-global-routing.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-global-routing.h	2013-12-20 09:44:50.000000000 -0800
@@ -69,15 +69,19 @@
 class Ipv4GlobalRouting : public Ipv4RoutingProtocol
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
-/**
- * \brief Construct an empty Ipv4GlobalRouting routing protocol,
- *
- * The Ipv4GlobalRouting class supports host and network unicast routes.
- * This method initializes the lists containing these routes to empty.
- *
- * \see Ipv4GlobalRouting
- */
+  /**
+   * \brief Construct an empty Ipv4GlobalRouting routing protocol,
+   *
+   * The Ipv4GlobalRouting class supports host and network unicast routes.
+   * This method initializes the lists containing these routes to empty.
+   *
+   * \see Ipv4GlobalRouting
+   */
   Ipv4GlobalRouting ();
   virtual ~Ipv4GlobalRouting ();
 
@@ -94,131 +98,132 @@
   virtual void SetIpv4 (Ptr<Ipv4> ipv4);
   virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;
 
-/**
- * \brief Add a host route to the global routing table.
- *
- * \param dest The Ipv4Address destination for this route.
- * \param nextHop The Ipv4Address of the next hop in the route.
- * \param interface The network interface index used to send packets to the
- * destination.
- *
- * \see Ipv4Address
- */
+  /**
+   * \brief Add a host route to the global routing table.
+   *
+   * \param dest The Ipv4Address destination for this route.
+   * \param nextHop The Ipv4Address of the next hop in the route.
+   * \param interface The network interface index used to send packets to the
+   * destination.
+   *
+   * \see Ipv4Address
+   */
   void AddHostRouteTo (Ipv4Address dest, 
                        Ipv4Address nextHop, 
                        uint32_t interface);
-/**
- * \brief Add a host route to the global routing table.
- *
- * \param dest The Ipv4Address destination for this route.
- * \param interface The network interface index used to send packets to the
- * destination.
- *
- * \see Ipv4Address
- */
+  /**
+   * \brief Add a host route to the global routing table.
+   *
+   * \param dest The Ipv4Address destination for this route.
+   * \param interface The network interface index used to send packets to the
+   * destination.
+   *
+   * \see Ipv4Address
+   */
   void AddHostRouteTo (Ipv4Address dest, 
                        uint32_t interface);
 
-/**
- * \brief Add a network route to the global routing table.
- *
- * \param network The Ipv4Address network for this route.
- * \param networkMask The Ipv4Mask to extract the network.
- * \param nextHop The next hop in the route to the destination network.
- * \param interface The network interface index used to send packets to the
- * destination.
- *
- * \see Ipv4Address
- */
+  /**
+   * \brief Add a network route to the global routing table.
+   *
+   * \param network The Ipv4Address network for this route.
+   * \param networkMask The Ipv4Mask to extract the network.
+   * \param nextHop The next hop in the route to the destination network.
+   * \param interface The network interface index used to send packets to the
+   * destination.
+   *
+   * \see Ipv4Address
+   */
   void AddNetworkRouteTo (Ipv4Address network, 
                           Ipv4Mask networkMask, 
                           Ipv4Address nextHop, 
                           uint32_t interface);
 
-/**
- * \brief Add a network route to the global routing table.
- *
- * \param network The Ipv4Address network for this route.
- * \param networkMask The Ipv4Mask to extract the network.
- * \param interface The network interface index used to send packets to the
- * destination.
- *
- * \see Ipv4Address
- */
+  /**
+   * \brief Add a network route to the global routing table.
+   *
+   * \param network The Ipv4Address network for this route.
+   * \param networkMask The Ipv4Mask to extract the network.
+   * \param interface The network interface index used to send packets to the
+   * destination.
+   *
+   * \see Ipv4Address
+   */
   void AddNetworkRouteTo (Ipv4Address network, 
                           Ipv4Mask networkMask, 
                           uint32_t interface);
 
-/**
- * \brief Add an external route to the global routing table.
- *
- * \param network The Ipv4Address network for this route.
- * \param networkMask The Ipv4Mask to extract the network.
- * \param nextHop The next hop Ipv4Address
- * \param interface The network interface index used to send packets to the
- * destination.
- */
+  /**
+   * \brief Add an external route to the global routing table.
+   *
+   * \param network The Ipv4Address network for this route.
+   * \param networkMask The Ipv4Mask to extract the network.
+   * \param nextHop The next hop Ipv4Address
+   * \param interface The network interface index used to send packets to the
+   * destination.
+   */
   void AddASExternalRouteTo (Ipv4Address network,
                              Ipv4Mask networkMask,
                              Ipv4Address nextHop,
                              uint32_t interface);
 
-/**
- * \brief Get the number of individual unicast routes that have been added
- * to the routing table.
- *
- * \warning The default route counts as one of the routes.
- */
+  /**
+   * \brief Get the number of individual unicast routes that have been added
+   * to the routing table.
+   *
+   * \warning The default route counts as one of the routes.
+   * \returns the number of routes
+   */
   uint32_t GetNRoutes (void) const;
 
-/**
- * \brief Get a route from the global unicast routing table.
- *
- * Externally, the unicast global routing table appears simply as a table with
- * n entries.  The one subtlety of note is that if a default route has been set
- * it will appear as the zeroth entry in the table.  This means that if you
- * add only a default route, the table will have one entry that can be accessed
- * either by explicitly calling GetDefaultRoute () or by calling GetRoute (0).
- * 
- * Similarly, if the default route has been set, calling RemoveRoute (0) will
- * remove the default route.
- *
- * \param i The index (into the routing table) of the route to retrieve.  If
- * the default route has been set, it will occupy index zero.
- * \return If route is set, a pointer to that Ipv4RoutingTableEntry is returned, otherwise
- * a zero pointer is returned.
- *
- * \see Ipv4RoutingTableEntry
- * \see Ipv4GlobalRouting::RemoveRoute
- */
+  /**
+   * \brief Get a route from the global unicast routing table.
+   *
+   * Externally, the unicast global routing table appears simply as a table with
+   * n entries.  The one subtlety of note is that if a default route has been set
+   * it will appear as the zeroth entry in the table.  This means that if you
+   * add only a default route, the table will have one entry that can be accessed
+   * either by explicitly calling GetDefaultRoute () or by calling GetRoute (0).
+   *
+   * Similarly, if the default route has been set, calling RemoveRoute (0) will
+   * remove the default route.
+   *
+   * \param i The index (into the routing table) of the route to retrieve.  If
+   * the default route has been set, it will occupy index zero.
+   * \return If route is set, a pointer to that Ipv4RoutingTableEntry is returned, otherwise
+   * a zero pointer is returned.
+   *
+   * \see Ipv4RoutingTableEntry
+   * \see Ipv4GlobalRouting::RemoveRoute
+   */
   Ipv4RoutingTableEntry *GetRoute (uint32_t i) const;
 
-/**
- * \brief Remove a route from the global unicast routing table.
- *
- * Externally, the unicast global routing table appears simply as a table with
- * n entries.  The one subtlety of note is that if a default route has been set
- * it will appear as the zeroth entry in the table.  This means that if the
- * default route has been set, calling RemoveRoute (0) will remove the
- * default route.
- *
- * \param i The index (into the routing table) of the route to remove.  If
- * the default route has been set, it will occupy index zero.
- *
- * \see Ipv4RoutingTableEntry
- * \see Ipv4GlobalRouting::GetRoute
- * \see Ipv4GlobalRouting::AddRoute
- */
+  /**
+   * \brief Remove a route from the global unicast routing table.
+   *
+   * Externally, the unicast global routing table appears simply as a table with
+   * n entries.  The one subtlety of note is that if a default route has been set
+   * it will appear as the zeroth entry in the table.  This means that if the
+   * default route has been set, calling RemoveRoute (0) will remove the
+   * default route.
+   *
+   * \param i The index (into the routing table) of the route to remove.  If
+   * the default route has been set, it will occupy index zero.
+   *
+   * \see Ipv4RoutingTableEntry
+   * \see Ipv4GlobalRouting::GetRoute
+   * \see Ipv4GlobalRouting::AddRoute
+   */
   void RemoveRoute (uint32_t i);
 
- /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
-  *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
-  */
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model.  Return the number of streams (possibly zero) that
+   * have been assigned.
+   *
+   * \param stream first stream index to use
+   * \return the number of stream indices assigned by this model
+   */
   int64_t AssignStreams (int64_t stream);
 
 protected:
@@ -232,23 +237,34 @@
   /// A uniform random number generator for randomly routing packets among ECMP 
   Ptr<UniformRandomVariable> m_rand;
 
+  /// container of Ipv4RoutingTableEntry (routes to hosts)
   typedef std::list<Ipv4RoutingTableEntry *> HostRoutes;
+  /// const iterator of container of Ipv4RoutingTableEntry (routes to hosts)
   typedef std::list<Ipv4RoutingTableEntry *>::const_iterator HostRoutesCI;
+  /// iterator of container of Ipv4RoutingTableEntry (routes to hosts)
   typedef std::list<Ipv4RoutingTableEntry *>::iterator HostRoutesI;
+
+  /// container of Ipv4RoutingTableEntry (routes to networks)
   typedef std::list<Ipv4RoutingTableEntry *> NetworkRoutes;
+  /// const iterator of container of Ipv4RoutingTableEntry (routes to networks)
   typedef std::list<Ipv4RoutingTableEntry *>::const_iterator NetworkRoutesCI;
+  /// iterator of container of Ipv4RoutingTableEntry (routes to networks)
   typedef std::list<Ipv4RoutingTableEntry *>::iterator NetworkRoutesI;
+
+  /// container of Ipv4RoutingTableEntry (routes to external AS)
   typedef std::list<Ipv4RoutingTableEntry *> ASExternalRoutes;
+  /// const iterator of container of Ipv4RoutingTableEntry (routes to external AS)
   typedef std::list<Ipv4RoutingTableEntry *>::const_iterator ASExternalRoutesCI;
+  /// iterator of container of Ipv4RoutingTableEntry (routes to external AS)
   typedef std::list<Ipv4RoutingTableEntry *>::iterator ASExternalRoutesI;
 
   Ptr<Ipv4Route> LookupGlobal (Ipv4Address dest, Ptr<NetDevice> oif = 0);
 
-  HostRoutes m_hostRoutes;
-  NetworkRoutes m_networkRoutes;
-  ASExternalRoutes m_ASexternalRoutes; // External routes imported
+  HostRoutes m_hostRoutes;             //!< Routes to hosts
+  NetworkRoutes m_networkRoutes;       //!< Routes to networks
+  ASExternalRoutes m_ASexternalRoutes; //!< External routes imported
 
-  Ptr<Ipv4> m_ipv4;
+  Ptr<Ipv4> m_ipv4; //!< associated IPv4 instance
 };
 
 } // Namespace ns3
diff -Naur ns-3.18.1/src/internet/model/ipv4.h ns-3.19/src/internet/model/ipv4.h
--- ns-3.18.1/src/internet/model/ipv4.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4.h	2013-12-20 09:44:50.000000000 -0800
@@ -75,6 +75,10 @@
 class Ipv4 : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   Ipv4 ();
   virtual ~Ipv4 ();
@@ -167,6 +171,7 @@
    *
    * \param address The IP address being considered
    * \param iif The incoming Ipv4 interface index
+   * \returns true if the address is associated with the interface index
    *
    * This method can be used to determine whether a received packet has
    * an acceptable address for local delivery on the host.  The address
@@ -378,13 +383,35 @@
   virtual void DeleteRawSocket (Ptr<Socket> socket) = 0;
 
 
-  static const uint32_t IF_ANY = 0xffffffff;
+  static const uint32_t IF_ANY = 0xffffffff; //!< interface wildcard, meaning any interface
 
 private:
   // Indirect the Ipv4 attributes through private pure virtual methods
+
+  /**
+   * \brief Set or unset the IP forwarding state
+   * \param forward the forwarding state
+   */
   virtual void SetIpForward (bool forward) = 0;
+  /**
+   * \brief Get the IP forwarding state
+   * \returns true if IP is in forwarding state
+   */
   virtual bool GetIpForward (void) const = 0;
+
+  /**
+   * \brief Set or unset the Weak Es Model
+   *
+   * RFC1122 term for whether host accepts datagram with a dest. address on another interface
+   * \param model true for Weak Es Model
+   */
   virtual void SetWeakEsModel (bool model) = 0;
+  /**
+   * \brief Get the Weak Es Model status
+   *
+   * RFC1122 term for whether host accepts datagram with a dest. address on another interface
+   * \returns true for Weak Es Model activated
+   */
   virtual bool GetWeakEsModel (void) const = 0;
 };
 
diff -Naur ns-3.18.1/src/internet/model/ipv4-header.cc ns-3.19/src/internet/model/ipv4-header.cc
--- ns-3.18.1/src/internet/model/ipv4-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4Header);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4Header)
+  ;
 
 Ipv4Header::Ipv4Header ()
   : m_calcChecksum (false),
diff -Naur ns-3.18.1/src/internet/model/ipv4-header.h ns-3.19/src/internet/model/ipv4-header.h
--- ns-3.18.1/src/internet/model/ipv4-header.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -172,6 +172,7 @@
    */
   DscpType GetDscp (void) const;
   /**
+   * \param dscp the dscp
    * \returns std::string of DSCPType
    */
   std::string DscpTypeToString (DscpType dscp) const;
@@ -180,6 +181,7 @@
    */
   EcnType GetEcn (void) const;
   /**
+   * \param ecn the ECNType
    * \returns std::string of ECNType
    */
   std::string EcnTypeToString (EcnType ecn) const;
@@ -220,6 +222,10 @@
    */
   bool IsChecksumOk (void) const;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -228,25 +234,26 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 private:
 
+  /// flags related to IP fragmentation
   enum FlagsE {
     DONT_FRAGMENT = (1<<0),
     MORE_FRAGMENTS = (1<<1)
   };
 
-  bool m_calcChecksum;
+  bool m_calcChecksum; //!< true if the checksum must be calculated
 
-  uint16_t m_payloadSize;
-  uint16_t m_identification;
-  uint32_t m_tos : 8; //Also used as DSCP + ECN value
-  uint32_t m_ttl : 8;
-  uint32_t m_protocol : 8;
-  uint32_t m_flags : 3;
-  uint16_t m_fragmentOffset;
-  Ipv4Address m_source;
-  Ipv4Address m_destination;
-  uint16_t m_checksum;
-  bool m_goodChecksum;
-  uint16_t m_headerSize;
+  uint16_t m_payloadSize; //!< payload size
+  uint16_t m_identification; //!< identification
+  uint32_t m_tos : 8; //!< TOS, also used as DSCP + ECN value
+  uint32_t m_ttl : 8; //!< TTL
+  uint32_t m_protocol : 8;  //!< Protocol
+  uint32_t m_flags : 3; //!< flags
+  uint16_t m_fragmentOffset;  //!< Fragment offset
+  Ipv4Address m_source; //!< source address
+  Ipv4Address m_destination; //!< destination address
+  uint16_t m_checksum; //!< checksum
+  bool m_goodChecksum; //!< true if checksum is correct
+  uint16_t m_headerSize; //!< IP header size
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/ipv4-interface-address.h ns-3.19/src/internet/model/ipv4-interface-address.h
--- ns-3.18.1/src/internet/model/ipv4-interface-address.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-interface-address.h	2013-12-20 09:44:50.000000000 -0800
@@ -42,6 +42,10 @@
 class Ipv4InterfaceAddress 
 {
 public:
+  /**
+   * \enum InterfaceAddressScope_e
+   * \brief Address scope.
+   */
   enum InterfaceAddressScope_e {
     HOST,
     LINK,
@@ -49,39 +53,116 @@
   };
 
   Ipv4InterfaceAddress ();
-  // Configure m_local, m_mask, and m_broadcast from the below constructor
+
+  /**
+   * \brief Configure local address, mask and broadcast address
+   * \param local the local address
+   * \param mask the network mask
+   */
   Ipv4InterfaceAddress (Ipv4Address local, Ipv4Mask mask);
+  /**
+   * Copy constructor
+   * \param o the object to copy
+   */
   Ipv4InterfaceAddress (const Ipv4InterfaceAddress &o);
 
+  /**
+   * \brief Set local address
+   * \param local the address
+   */
   void SetLocal (Ipv4Address local);
+  /**
+   * \brief Get the local address
+   * \returns the local address
+   */
   Ipv4Address GetLocal (void) const;
+  /**
+   * \brief Set the network mask
+   * \param mask the network mask
+   */
   void SetMask (Ipv4Mask mask);
+  /**
+   * \brief Get the network mask
+   * \returns the network mask
+   */
   Ipv4Mask GetMask (void) const;
+  /**
+   * \brief Set the broadcast address
+   * \param broadcast the broadcast address
+   */
   void SetBroadcast (Ipv4Address broadcast);
+  /**
+   * \brief Get the broadcast address
+   * \returns the broadcast address
+   */
   Ipv4Address GetBroadcast (void) const;
  
+  /**
+   * \brief Set the scope.
+   * \param scope the scope of address
+   */
   void SetScope (Ipv4InterfaceAddress::InterfaceAddressScope_e scope);
+
+  /**
+   * \brief Get address scope.
+   * \return scope
+   */
   Ipv4InterfaceAddress::InterfaceAddressScope_e GetScope (void) const;
 
+  /**
+   * \brief Check if the address is a secondary address
+   *
+   * Secondary address is used for multihoming
+   * \returns true if the address is secondary
+   */
   bool IsSecondary (void) const;
+
+  /**
+   * \brief Make the address secondary (used for multihoming)
+   */
   void SetSecondary (void);
+  /**
+   * \brief Make the address primary
+   */
   void SetPrimary (void);
 
 private:
 
-  Ipv4Address m_local;     // Interface address
+  Ipv4Address m_local;     //!< Interface address
   // Note:  m_peer may be added in future when necessary
-  // Ipv4Address m_peer;      // Peer destination address (in Linux:  m_address)
-  Ipv4Mask m_mask;         // Network mask
-  Ipv4Address m_broadcast; // Broadcast address
-
-  InterfaceAddressScope_e m_scope;
-  bool m_secondary;        // For use in multihoming
-
+  // Ipv4Address m_peer;   // Peer destination address (in Linux:  m_address)
+  Ipv4Mask m_mask;         //!< Network mask
+  Ipv4Address m_broadcast; //!< Broadcast address
+
+  InterfaceAddressScope_e m_scope; //!< Address scope
+  bool m_secondary;        //!< For use in multihoming
+
+  /**
+   * \brief Equal to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the operands are equal
+   */
   friend bool operator == (Ipv4InterfaceAddress const &a, Ipv4InterfaceAddress const &b);
+
+  /**
+   * \brief Not equal to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the operands are not equal
+   */
   friend bool operator != (Ipv4InterfaceAddress const &a, Ipv4InterfaceAddress const &b);
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param addr the Ipv4InterfaceAddress
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, const Ipv4InterfaceAddress &addr);
 
 inline bool operator == (const Ipv4InterfaceAddress &a, const Ipv4InterfaceAddress &b)
diff -Naur ns-3.18.1/src/internet/model/ipv4-interface.cc ns-3.19/src/internet/model/ipv4-interface.cc
--- ns-3.18.1/src/internet/model/ipv4-interface.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-interface.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4Interface);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4Interface)
+  ;
 
 TypeId 
 Ipv4Interface::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/ipv4-interface.h ns-3.19/src/internet/model/ipv4-interface.h
--- ns-3.18.1/src/internet/model/ipv4-interface.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -43,20 +43,36 @@
  * specific information (addresses) about an interface.
  *
  * By default, Ipv4 interface are created in the "down" state
- * no IP addresses.  Before becoming useable, the user must 
+ * no IP addresses.  Before becoming usable, the user must
  * add an address of some type and invoke Setup on them.
  */
 class Ipv4Interface  : public Object
 {
 public:
+  /**
+   * \brief Get the type ID
+   * \return type ID
+   */
   static TypeId GetTypeId (void);
 
   Ipv4Interface ();
   virtual ~Ipv4Interface();
 
+  /**
+   * \brief Set node associated with interface.
+   * \param node node
+   */
   void SetNode (Ptr<Node> node); 
+  /**
+   * \brief Set the NetDevice.
+   * \param device NetDevice
+   */
   void SetDevice (Ptr<NetDevice> device);
-  void SetArpCache (Ptr<ArpCache>);
+  /**
+   * \brief Set ARP cache used by this interface
+   * \param arpCache the ARP cache
+   */
+  void SetArpCache (Ptr<ArpCache> arpCache);
 
   /**
    * \returns the underlying NetDevice. This method cannot return zero.
@@ -164,18 +180,36 @@
 protected:
   virtual void DoDispose (void);
 private:
+  /**
+   * \brief Initialize interface.
+   */
   void DoSetup (void);
+
+
+  /**
+   * \brief Container for the Ipv4InterfaceAddresses.
+   */
   typedef std::list<Ipv4InterfaceAddress> Ipv4InterfaceAddressList;
+
+  /**
+   * \brief Container Iterator for the Ipv4InterfaceAddresses.
+   */
   typedef std::list<Ipv4InterfaceAddress>::const_iterator Ipv4InterfaceAddressListCI;
+
+  /**
+   * \brief Const Container Iterator for the Ipv4InterfaceAddresses.
+   */
   typedef std::list<Ipv4InterfaceAddress>::iterator Ipv4InterfaceAddressListI;
 
-  bool m_ifup;
-  bool m_forwarding;  // IN_DEV_FORWARD
-  uint16_t m_metric;
-  Ipv4InterfaceAddressList m_ifaddrs;
-  Ptr<Node> m_node;
-  Ptr<NetDevice> m_device;
-  Ptr<ArpCache> m_cache; 
+
+
+  bool m_ifup; //!< The state of this interface
+  bool m_forwarding;  //!< Forwarding state.
+  uint16_t m_metric;  //!< Interface metric
+  Ipv4InterfaceAddressList m_ifaddrs; //!< Address list
+  Ptr<Node> m_node; //!< The associated node
+  Ptr<NetDevice> m_device; //!< The associated NetDevice
+  Ptr<ArpCache> m_cache; //!< ARP cache
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/ipv4-l3-protocol.cc ns-3.19/src/internet/model/ipv4-l3-protocol.cc
--- ns-3.18.1/src/internet/model/ipv4-l3-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-l3-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -46,7 +46,8 @@
 
 const uint16_t Ipv4L3Protocol::PROT_NUMBER = 0x0800;
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4L3Protocol);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4L3Protocol)
+  ;
 
 TypeId 
 Ipv4L3Protocol::GetTypeId (void)
@@ -687,9 +688,9 @@
     }
 }
 
-/// \todo when should we set ip_id?   check whether we are incrementing
-/// m_identification on packets that may later be dropped in this stack
-/// and whether that deviates from Linux
+// \todo when should we set ip_id?   check whether we are incrementing
+// m_identification on packets that may later be dropped in this stack
+// and whether that deviates from Linux
 Ipv4Header
 Ipv4L3Protocol::BuildHeader (
   Ipv4Address source,
@@ -889,18 +890,20 @@
           return;
         }
       NS_LOG_LOGIC ("Got last fragment, Packet is complete " << *p );
+      ipHeader.SetFragmentOffset (0);
+      ipHeader.SetPayloadSize (p->GetSize () + ipHeader.GetSerializedSize ());
     }
 
-  m_localDeliverTrace (ip, packet, iif);
+  m_localDeliverTrace (ipHeader, p, iif);
 
-  Ptr<IpL4Protocol> protocol = GetProtocol (ip.GetProtocol ());
+  Ptr<IpL4Protocol> protocol = GetProtocol (ipHeader.GetProtocol ());
   if (protocol != 0)
     {
       // we need to make a copy in the unlikely event we hit the
       // RX_ENDPOINT_UNREACH codepath
       Ptr<Packet> copy = p->Copy ();
       enum IpL4Protocol::RxStatus status = 
-        protocol->Receive (p, ip, GetInterface (iif));
+        protocol->Receive (p, ipHeader, GetInterface (iif));
       switch (status) {
         case IpL4Protocol::RX_OK:
         // fall through
@@ -909,8 +912,8 @@
         case IpL4Protocol::RX_CSUM_FAILED:
           break;
         case IpL4Protocol::RX_ENDPOINT_UNREACH:
-          if (ip.GetDestination ().IsBroadcast () == true ||
-              ip.GetDestination ().IsMulticast () == true)
+          if (ipHeader.GetDestination ().IsBroadcast () == true ||
+              ipHeader.GetDestination ().IsMulticast () == true)
             {
               break; // Do not reply to broadcast or multicast
             }
@@ -919,15 +922,15 @@
           for (uint32_t i = 0; i < GetNAddresses (iif); i++)
             {
               Ipv4InterfaceAddress addr = GetAddress (iif, i);
-              if (addr.GetLocal ().CombineMask (addr.GetMask ()) == ip.GetDestination ().CombineMask (addr.GetMask ()) &&
-                  ip.GetDestination ().IsSubnetDirectedBroadcast (addr.GetMask ()))
+              if (addr.GetLocal ().CombineMask (addr.GetMask ()) == ipHeader.GetDestination ().CombineMask (addr.GetMask ()) &&
+                  ipHeader.GetDestination ().IsSubnetDirectedBroadcast (addr.GetMask ()))
                 {
                   subnetDirected = true;
                 }
             }
           if (subnetDirected == false)
             {
-              GetIcmp ()->SendDestUnreachPort (ip, copy);
+              GetIcmp ()->SendDestUnreachPort (ipHeader, copy);
             }
         }
     }
@@ -1092,11 +1095,23 @@
 {
   NS_LOG_FUNCTION (this << i);
   Ptr<Ipv4Interface> interface = GetInterface (i);
-  interface->SetUp ();
 
-  if (m_routingProtocol != 0)
+  // RFC 791, pg.25:
+  //  Every internet module must be able to forward a datagram of 68
+  //  octets without further fragmentation.  This is because an internet
+  //  header may be up to 60 octets, and the minimum fragment is 8 octets.
+  if (interface->GetDevice ()->GetMtu () >= 68)
+    {
+      interface->SetUp ();
+
+      if (m_routingProtocol != 0)
+        {
+          m_routingProtocol->NotifyInterfaceUp (i);
+        }
+    }
+  else
     {
-      m_routingProtocol->NotifyInterfaceUp (i);
+      NS_LOG_LOGIC ("Interface " << int(i) << " is set to be down for IPv4. Reason: not respecting minimum IPv4 MTU (68 octects)");
     }
 }
 
@@ -1392,10 +1407,11 @@
 
   std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin ();
 
-  Ptr<Packet> p = Create<Packet> ();
-  uint16_t lastEndOffset = 0;
+  Ptr<Packet> p = it->first->Copy ();
+  uint16_t lastEndOffset = p->GetSize ();
+  it++;
 
-  for ( it = m_fragments.begin (); it != m_fragments.end (); it++)
+  for ( ; it != m_fragments.end (); it++)
     {
       if ( lastEndOffset > it->second )
         {
diff -Naur ns-3.18.1/src/internet/model/ipv4-l3-protocol.h ns-3.19/src/internet/model/ipv4-l3-protocol.h
--- ns-3.18.1/src/internet/model/ipv4-l3-protocol.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-l3-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -77,8 +77,12 @@
 class Ipv4L3Protocol : public Ipv4
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
-  static const uint16_t PROT_NUMBER;
+  static const uint16_t PROT_NUMBER; //!< Protocol number (0x0800)
 
   Ipv4L3Protocol();
   virtual ~Ipv4L3Protocol ();
@@ -97,6 +101,10 @@
     DROP_FRAGMENT_TIMEOUT /**< Fragment timeout exceeded */
   };
 
+  /**
+   * \brief Set node associated with this stack.
+   * \param node node to set
+   */
   void SetNode (Ptr<Node> node);
 
   // functions defined in base class Ipv4
@@ -182,6 +190,11 @@
   void SendWithHeader (Ptr<Packet> packet, Ipv4Header ipHeader, Ptr<Ipv4Route> route);
 
   uint32_t AddInterface (Ptr<NetDevice> device);
+  /**
+   * \brief Get an interface.
+   * \param i interface index
+   * \return IPv4 interface pointer
+   */
   Ptr<Ipv4Interface> GetInterface (uint32_t i) const;
   uint32_t GetNInterfaces (void) const;
 
@@ -220,7 +233,20 @@
   virtual void NotifyNewAggregate ();
 private:
   friend class Ipv4L3ProtocolTestCase;
+
+  /**
+   * \brief Copy constructor.
+   *
+   * Defined but not implemented to avoid misuse
+   */
   Ipv4L3Protocol(const Ipv4L3Protocol &);
+
+  /**
+   * \brief Copy constructor.
+   *
+   * Defined but not implemented to avoid misuse
+   * \returns the copied object
+   */
   Ipv4L3Protocol &operator = (const Ipv4L3Protocol &);
 
   // class Ipv4 attributes
@@ -229,6 +255,17 @@
   virtual void SetWeakEsModel (bool model);
   virtual bool GetWeakEsModel (void) const;
 
+  /**
+   * \brief Construct an IPv4 header.
+   * \param source source IPv4 address
+   * \param destination destination IPv4 address
+   * \param protocol L4 protocol
+   * \param payloadSize payload size
+   * \param ttl Time to Live
+   * \param tos Type of Service
+   * \param mayFragment true if the packet can be fragmented
+   * \return newly created IPv4 header
+   */
   Ipv4Header BuildHeader (
     Ipv4Address source,
     Ipv4Address destination,
@@ -238,25 +275,65 @@
     uint8_t tos,
     bool mayFragment);
 
+  /**
+   * \brief Send packet with route.
+   * \param route route
+   * \param packet packet to send
+   * \param ipHeader IPv4 header to add to the packet
+   */
   void
   SendRealOut (Ptr<Ipv4Route> route,
                Ptr<Packet> packet,
                Ipv4Header const &ipHeader);
 
+  /**
+   * \brief Forward a packet.
+   * \param rtentry route
+   * \param p packet to forward
+   * \param header IPv4 header to add to the packet
+   */
   void 
   IpForward (Ptr<Ipv4Route> rtentry, 
              Ptr<const Packet> p, 
              const Ipv4Header &header);
 
+  /**
+   * \brief Forward a multicast packet.
+   * \param mrtentry route
+   * \param p packet to forward
+   * \param header IPv6 header to add to the packet
+   */
   void
   IpMulticastForward (Ptr<Ipv4MulticastRoute> mrtentry, 
                       Ptr<const Packet> p, 
                       const Ipv4Header &header);
 
+  /**
+   * \brief Deliver a packet.
+   * \param p packet delivered
+   * \param ip IPv4 header
+   * \param iif input interface packet was received
+   */
   void LocalDeliver (Ptr<const Packet> p, Ipv4Header const&ip, uint32_t iif);
+
+  /**
+   * \brief Fallback when no route is found.
+   * \param p packet
+   * \param ipHeader IPv4 header
+   * \param sockErrno error number
+   */
   void RouteInputError (Ptr<const Packet> p, const Ipv4Header & ipHeader, Socket::SocketErrno sockErrno);
 
+  /**
+   * \brief Add an IPv4 interface to the stack.
+   * \param interface interface to add
+   * \return index of newly added interface
+   */
   uint32_t AddIpv4Interface (Ptr<Ipv4Interface> interface);
+
+  /**
+   * \brief Setup loopback interface.
+   */
   void SetupLoopback (void);
 
   /**
@@ -264,6 +341,13 @@
    * \return Icmpv4L4Protocol pointer
    */
   Ptr<Icmpv4L4Protocol> GetIcmp (void) const;
+
+  /**
+   * \brief Check if an IPv4 address is unicast.
+   * \param ad address
+   * \param interfaceMask the network mask
+   * \return true if the address is unicast
+   */
   bool IsUnicast (Ipv4Address ad, Ipv4Mask interfaceMask) const;
 
   /**
@@ -277,7 +361,7 @@
   /**
    * \brief Process a packet fragment
    * \param packet the packet
-   * \param fragmentSize the size of the fragment
+   * \param ipHeader the IP header
    * \param iif Input Interface
    * \return true is the fragment completed the packet
    */
@@ -291,32 +375,47 @@
    */
   void HandleFragmentsTimeout ( std::pair<uint64_t, uint32_t> key, Ipv4Header & ipHeader, uint32_t iif);
 
+  /**
+   * \brief Container of the IPv4 Interfaces.
+   */
   typedef std::vector<Ptr<Ipv4Interface> > Ipv4InterfaceList;
+  /**
+   * \brief Container of the IPv4 Raw Sockets.
+   */
   typedef std::list<Ptr<Ipv4RawSocketImpl> > SocketList;
-  typedef std::list<Ptr<IpL4Protocol> > L4List_t;
+  /**
+   * \brief Container of the IPv4 L4 instances.
+   */
+   typedef std::list<Ptr<IpL4Protocol> > L4List_t;
 
-  bool m_ipForward;
-  bool m_weakEsModel;
-  L4List_t m_protocols;
-  Ipv4InterfaceList m_interfaces;
-  uint8_t m_defaultTos;
-  uint8_t m_defaultTtl;
-  uint16_t m_identification;
-  Ptr<Node> m_node;
+  bool m_ipForward;      //!< Forwarding packets (i.e. router mode) state.
+  bool m_weakEsModel;    //!< Weak ES model state
+  L4List_t m_protocols;  //!< List of transport protocol.
+  Ipv4InterfaceList m_interfaces; //!< List of IPv4 interfaces.
+  uint8_t m_defaultTos;  //!< Default TOS
+  uint8_t m_defaultTtl;  //!< Default TTL
+  uint16_t m_identification; //!< Identification
+  Ptr<Node> m_node; //!< Node attached to stack.
 
+  /// Trace of sent packets
   TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_sendOutgoingTrace;
+  /// Trace of unicast forwarded packets
   TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_unicastForwardTrace;
+  /// Trace of locally delivered packets
   TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_localDeliverTrace;
 
   // The following two traces pass a packet with an IP header
+  /// Trace of transmitted packets
   TracedCallback<Ptr<const Packet>, Ptr<Ipv4>,  uint32_t> m_txTrace;
+  /// Trace of received packets
   TracedCallback<Ptr<const Packet>, Ptr<Ipv4>, uint32_t> m_rxTrace;
   // <ip-header, payload, reason, ifindex> (ifindex not valid if reason is DROP_NO_ROUTE)
+  /// Trace of dropped packets
   TracedCallback<const Ipv4Header &, Ptr<const Packet>, DropReason, Ptr<Ipv4>, uint32_t> m_dropTrace;
 
-  Ptr<Ipv4RoutingProtocol> m_routingProtocol;
+  Ptr<Ipv4RoutingProtocol> m_routingProtocol; //!< Routing protocol associated with the stack
 
-  SocketList m_sockets;
+  SocketList m_sockets; //!< List of IPv4 raw sockets.
 
   /**
    * \class Fragments
@@ -374,15 +473,14 @@
 
   };
 
+  /// Container of fragments, stored as pairs(src+dst addr, src+dst port) / fragment
   typedef std::map< std::pair<uint64_t, uint32_t>, Ptr<Fragments> > MapFragments_t;
+  /// Container of fragment timeout event, stored as pairs(src+dst addr, src+dst port) / EventId
   typedef std::map< std::pair<uint64_t, uint32_t>, EventId > MapFragmentsTimers_t;
 
-  /**
-   * \brief The hash of fragmented packets.
-   */
-  MapFragments_t       m_fragments;
-  Time                 m_fragmentExpirationTimeout;
-  MapFragmentsTimers_t m_fragmentsTimers;
+  MapFragments_t       m_fragments; //!< Fragmented packets.
+  Time                 m_fragmentExpirationTimeout; //!< Expiration timeout
+  MapFragmentsTimers_t m_fragmentsTimers; //!< Expiration events.
 
 };
 
diff -Naur ns-3.18.1/src/internet/model/ipv4-list-routing.cc ns-3.19/src/internet/model/ipv4-list-routing.cc
--- ns-3.18.1/src/internet/model/ipv4-list-routing.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-list-routing.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4ListRouting);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4ListRouting)
+  ;
 
 TypeId
 Ipv4ListRouting::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/ipv4-list-routing.h ns-3.19/src/internet/model/ipv4-list-routing.h
--- ns-3.18.1/src/internet/model/ipv4-list-routing.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-list-routing.h	2013-12-20 09:44:50.000000000 -0800
@@ -45,6 +45,10 @@
 class Ipv4ListRouting : public Ipv4RoutingProtocol
 {
 public:
+  /**
+   * \brief Get the type ID of this class.
+   * \return type ID
+   */
   static TypeId GetTypeId (void);
 
   Ipv4ListRouting ();
@@ -92,11 +96,25 @@
   void DoDispose (void);
   void DoInitialize (void);
 private:
+  /**
+   * \brief Container identifying an IPv4 Routing Protocol entry in the list.
+   */
   typedef std::pair<int16_t, Ptr<Ipv4RoutingProtocol> > Ipv4RoutingProtocolEntry;
+  /**
+   * \brief Container of the IPv4 Routing Protocols.
+   */
   typedef std::list<Ipv4RoutingProtocolEntry> Ipv4RoutingProtocolList;
-  Ipv4RoutingProtocolList m_routingProtocols;
+  Ipv4RoutingProtocolList m_routingProtocols; //!<  List of routing protocols.
+
+  /**
+   * \brief Compare two routing protocols.
+   * \param a first object to compare
+   * \param b second object to compare
+   * \return true if they are the same, false otherwise
+   */
   static bool Compare (const Ipv4RoutingProtocolEntry& a, const Ipv4RoutingProtocolEntry& b);
-  Ptr<Ipv4> m_ipv4;
+  Ptr<Ipv4> m_ipv4; //!< Ipv4 this protocol is associated with.
+
 
 };
 
diff -Naur ns-3.18.1/src/internet/model/ipv4-packet-info-tag.h ns-3.19/src/internet/model/ipv4-packet-info-tag.h
--- ns-3.18.1/src/internet/model/ipv4-packet-info-tag.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-packet-info-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -43,23 +43,67 @@
 {
 public:
   Ipv4PacketInfoTag ();
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Set the tag's address
+   *
+   * \param addr the address
+   */
   void SetAddress (Ipv4Address addr);
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Get the tag's address
+   *
+   * \returns the address
+   */
   Ipv4Address GetAddress (void) const;
-  // This corresponds to "ipi_spec_dst" in struct in_pktinfo.
-  // Implemented, but not used in the stack yet
+  /**
+   * \brief Set the tag's \a local address
+   *
+   * This corresponds to "ipi_spec_dst" in struct in_pktinfo.
+   * Implemented, but not used in the stack yet
+   * \param addr the address
+   */
   void SetLocalAddress (Ipv4Address addr);
-  // This corresponds to "ipi_spec_dst" in struct in_pktinfo.
-  // Implemented, but not used in the stack yet
+  /**
+   * \brief Get the tag's \a local address
+   *
+   * This corresponds to "ipi_spec_dst" in struct in_pktinfo.
+   * Implemented, but not used in the stack yet
+   * \returns the address
+   */
   Ipv4Address GetLocalAddress (void) const;
+
+  /**
+   * \brief Set the tag's receiving interface
+   *
+   * \param ifindex the interface index
+   */
   void SetRecvIf (uint32_t ifindex);
+  /**
+   * \brief Get the tag's receiving interface
+   *
+   * \returns the interface index
+   */
   uint32_t GetRecvIf (void) const;
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Set the tag's Time to Live
+   * Implemented, but not used in the stack yet
+   * \param ttl the TTL
+   */
   void SetTtl (uint8_t ttl);
-  // Implemented, but not used in the stack yet
+  /**
+   * \brief Get the tag's Time to Live
+   * Implemented, but not used in the stack yet
+   * \returns the TTL
+   */
   uint8_t GetTtl (void) const;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual uint32_t GetSerializedSize (void) const;
@@ -77,12 +121,12 @@
   //                                   address */
   // };
 
-  Ipv4Address m_addr;
-  Ipv4Address m_spec_dst;
-  uint32_t m_ifindex;
+  Ipv4Address m_addr;     //!< Header destination address
+  Ipv4Address m_spec_dst; //!< Local address
+  uint32_t m_ifindex;     //!< interface index
 
-  // Uset for IP_RECVTTL, though not implemented yet.
-  uint8_t m_ttl;
+  // Used for IP_RECVTTL, though not implemented yet.
+  uint8_t m_ttl; //!< Time to Live
 };
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/internet/model/ipv4-packet-probe.cc ns-3.19/src/internet/model/ipv4-packet-probe.cc
--- ns-3.18.1/src/internet/model/ipv4-packet-probe.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-packet-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4PacketProbe);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4PacketProbe)
+  ;
 
 TypeId
 Ipv4PacketProbe::GetTypeId ()
diff -Naur ns-3.18.1/src/internet/model/ipv4-packet-probe.h ns-3.19/src/internet/model/ipv4-packet-probe.h
--- ns-3.18.1/src/internet/model/ipv4-packet-probe.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-packet-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -47,6 +47,10 @@
 class Ipv4PacketProbe : public Probe
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   Ipv4PacketProbe ();
   virtual ~Ipv4PacketProbe ();
@@ -102,7 +106,9 @@
    */
   void TraceSink (Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
 
+  /// Traced Callback: the packet, the Ipv4 object and the interface.
   TracedCallback<Ptr<const Packet>, Ptr<Ipv4>, uint32_t> m_output;
+  /// Traced Callback: the previous packet's size and the actual packet's size.
   TracedCallback<uint32_t, uint32_t> m_outputBytes;
 
   /// The traced packet.
diff -Naur ns-3.18.1/src/internet/model/ipv4-raw-socket-factory.cc ns-3.19/src/internet/model/ipv4-raw-socket-factory.cc
--- ns-3.18.1/src/internet/model/ipv4-raw-socket-factory.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-raw-socket-factory.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4RawSocketFactory);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4RawSocketFactory)
+  ;
 
 TypeId Ipv4RawSocketFactory::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/internet/model/ipv4-raw-socket-factory.h ns-3.19/src/internet/model/ipv4-raw-socket-factory.h
--- ns-3.18.1/src/internet/model/ipv4-raw-socket-factory.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-raw-socket-factory.h	2013-12-20 09:44:50.000000000 -0800
@@ -37,6 +37,10 @@
 class Ipv4RawSocketFactory : public SocketFactory
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
 };
diff -Naur ns-3.18.1/src/internet/model/ipv4-raw-socket-factory-impl.h ns-3.19/src/internet/model/ipv4-raw-socket-factory-impl.h
--- ns-3.18.1/src/internet/model/ipv4-raw-socket-factory-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-raw-socket-factory-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -25,6 +25,12 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup socket
+ *
+ * \class Ipv4RawSocketFactoryImpl
+ * \brief Implementation of IPv4 raw socket factory.
+ */
 class Ipv4RawSocketFactoryImpl : public Ipv4RawSocketFactory
 {
 public:
diff -Naur ns-3.18.1/src/internet/model/ipv4-raw-socket-impl.cc ns-3.19/src/internet/model/ipv4-raw-socket-impl.cc
--- ns-3.18.1/src/internet/model/ipv4-raw-socket-impl.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-raw-socket-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -17,7 +17,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4RawSocketImpl);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4RawSocketImpl)
+  ;
 
 TypeId 
 Ipv4RawSocketImpl::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/ipv4-raw-socket-impl.h ns-3.19/src/internet/model/ipv4-raw-socket-impl.h
--- ns-3.18.1/src/internet/model/ipv4-raw-socket-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-raw-socket-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -13,17 +13,41 @@
 class NetDevice;
 class Node;
 
+/**
+ * \class Ipv4RawSocketImpl
+ * \brief IPv4 raw socket.
+ * \ingroup socket
+ *
+ * A RAW Socket typically is used to access specific IP layers not usually
+ * available through L4 sockets, e.g., ICMP. The implementer should take
+ * particular care to define the Ipv4RawSocketImpl Attributes, and in
+ * particular the Protocol attribute.
+ */
 class Ipv4RawSocketImpl : public Socket
 {
 public:
+  /**
+   * \brief Get the type ID of this class.
+   * \return type ID
+   */
   static TypeId GetTypeId (void);
 
   Ipv4RawSocketImpl ();
 
+  /**
+   * \brief Set the node associated with this socket.
+   * \param node node to set
+   */
   void SetNode (Ptr<Node> node);
 
-  virtual enum Socket::SocketErrno GetErrno (void) const;
+  virtual enum Socket::SocketErrno GetErrno () const;
+
+  /**
+   * \brief Get socket type (NS3_SOCK_RAW)
+   * \return socket type
+   */
   virtual enum Socket::SocketType GetSocketType (void) const;
+
   virtual Ptr<Node> GetNode (void) const;
   virtual int Bind (const Address &address);
   virtual int Bind ();
@@ -43,7 +67,20 @@
   virtual Ptr<Packet> RecvFrom (uint32_t maxSize, uint32_t flags,
                                 Address &fromAddress);
 
+
+  /**
+   * \brief Set protocol field.
+   * \param protocol protocol to set
+   */
   void SetProtocol (uint16_t protocol);
+
+  /**
+   * \brief Forward up to receive method.
+   * \param p packet
+   * \param ipHeader IPv4 header
+   * \param incomingInterface incoming interface
+   * \return true if forwarded, false otherwise
+   */
   bool ForwardUp (Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<Ipv4Interface> incomingInterface);
   virtual bool SetAllowBroadcast (bool allowBroadcast);
   virtual bool GetAllowBroadcast () const;
@@ -51,22 +88,26 @@
 private:
   virtual void DoDispose (void);
 
+  /**
+   * \struct Data
+   * \brief IPv4 raw data and additional information.
+   */
   struct Data {
-    Ptr<Packet> packet;
-    Ipv4Address fromIp;
-    uint16_t fromProtocol;
+    Ptr<Packet> packet;  /**< Packet data */
+    Ipv4Address fromIp;  /**< Source address */
+    uint16_t fromProtocol;   /**< Protocol used */
   };
 
-  enum Socket::SocketErrno m_err;
-  Ptr<Node> m_node;
-  Ipv4Address m_src;
-  Ipv4Address m_dst;
-  uint16_t m_protocol;
-  std::list<struct Data> m_recv;
-  bool m_shutdownSend;
-  bool m_shutdownRecv;
-  uint32_t m_icmpFilter;
-  bool m_iphdrincl;
+  enum Socket::SocketErrno m_err;   //!< Last error number.
+  Ptr<Node> m_node;                 //!< Node
+  Ipv4Address m_src;                //!< Source address.
+  Ipv4Address m_dst;                //!< Destination address.
+  uint16_t m_protocol;              //!< Protocol.
+  std::list<struct Data> m_recv;    //!< Packet waiting to be processed.
+  bool m_shutdownSend;              //!< Flag to shutdown send capability.
+  bool m_shutdownRecv;              //!< Flag to shutdown receive capability.
+  uint32_t m_icmpFilter;            //!< ICMPv4 filter specification
+  bool m_iphdrincl;                 //!< Include IP Header information (a.k.a setsockopt (IP_HDRINCL))
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/ipv4-route.h ns-3.19/src/internet/model/ipv4-route.h
--- ns-3.18.1/src/internet/model/ipv4-route.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-route.h	2013-12-20 09:44:50.000000000 -0800
@@ -89,15 +89,22 @@
 #endif
 
 private:
-  Ipv4Address m_dest;
-  Ipv4Address m_source;
-  Ipv4Address m_gateway;
-  Ptr<NetDevice> m_outputDevice;
+  Ipv4Address m_dest;             //!< Destination address.
+  Ipv4Address m_source;           //!< Source address.
+  Ipv4Address m_gateway;          //!< Gateway address.
+  Ptr<NetDevice> m_outputDevice;  //!< Output device.
 #ifdef NOTYET
   uint32_t m_inputIfIndex;
 #endif
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param route the Ipv4 route
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, Ipv4Route const& route);
 
 /**
@@ -154,14 +161,14 @@
    */
   std::map<uint32_t, uint32_t> GetOutputTtlMap () const;
 
-  static const uint32_t MAX_INTERFACES = 16;  // Maximum number of multicast interfaces on a router
-  static const uint32_t MAX_TTL = 255;  // Maximum time-to-live (TTL)
+  static const uint32_t MAX_INTERFACES = 16;  //!< Maximum number of multicast interfaces on a router
+  static const uint32_t MAX_TTL = 255;  //!< Maximum time-to-live (TTL)
 
 private:
-  Ipv4Address m_group;      // Group 
-  Ipv4Address m_origin;     // Source of packet
-  uint32_t m_parent;        // Source interface
-  std::map<uint32_t, uint32_t> m_ttls;
+  Ipv4Address m_group;      //!< Group
+  Ipv4Address m_origin;     //!< Source of packet
+  uint32_t m_parent;        //!< Source interface
+  std::map<uint32_t, uint32_t> m_ttls; //!< Time to Live container
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/ipv4-routing-protocol.cc ns-3.19/src/internet/model/ipv4-routing-protocol.cc
--- ns-3.18.1/src/internet/model/ipv4-routing-protocol.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-routing-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4RoutingProtocol);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4RoutingProtocol)
+  ;
 
 TypeId Ipv4RoutingProtocol::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/internet/model/ipv4-routing-protocol.h ns-3.19/src/internet/model/ipv4-routing-protocol.h
--- ns-3.18.1/src/internet/model/ipv4-routing-protocol.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-routing-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -50,11 +50,22 @@
 class Ipv4RoutingProtocol : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
+  /// Callback for unicast packets to be forwarded
   typedef Callback<void, Ptr<Ipv4Route>, Ptr<const Packet>, const Ipv4Header &> UnicastForwardCallback;
+
+  /// Callback for multicast packets to be forwarded
   typedef Callback<void, Ptr<Ipv4MulticastRoute>, Ptr<const Packet>, const Ipv4Header &> MulticastForwardCallback;
+
+  /// Callback for packets to be locally delivered
   typedef Callback<void, Ptr<const Packet>, const Ipv4Header &, uint32_t > LocalDeliverCallback;
+
+  /// Callback for routing errors (e.g., no route found)
   typedef Callback<void, Ptr<const Packet>, const Ipv4Header &, Socket::SocketErrno > ErrorCallback;
 
   /**
diff -Naur ns-3.18.1/src/internet/model/ipv4-routing-table-entry.h ns-3.19/src/internet/model/ipv4-routing-table-entry.h
--- ns-3.18.1/src/internet/model/ipv4-routing-table-entry.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-routing-table-entry.h	2013-12-20 09:44:50.000000000 -0800
@@ -135,25 +135,56 @@
                                                    uint32_t interface);
 
 private:
+  /**
+   * \brief Constructor.
+   * \param network network address
+   * \param mask network mask
+   * \param gateway the gateway
+   * \param interface the interface index
+   */
   Ipv4RoutingTableEntry (Ipv4Address network,
                          Ipv4Mask mask,
                          Ipv4Address gateway,
                          uint32_t interface);
+  /**
+   * \brief Constructor.
+   * \param dest destination address
+   * \param mask network mask
+   * \param interface the interface index
+   */
   Ipv4RoutingTableEntry (Ipv4Address dest,
                          Ipv4Mask mask,
                          uint32_t interface);
+  /**
+   * \brief Constructor.
+   * \param dest destination address
+   * \param gateway the gateway
+   * \param interface the interface index
+   */
   Ipv4RoutingTableEntry (Ipv4Address dest,
                          Ipv4Address gateway,
                          uint32_t interface);
+  /**
+   * \brief Constructor.
+   * \param dest destination address
+   * \param interface the interface index
+   */
   Ipv4RoutingTableEntry (Ipv4Address dest,
                          uint32_t interface);
 
-  Ipv4Address m_dest;
-  Ipv4Mask m_destNetworkMask;
-  Ipv4Address m_gateway;
-  uint32_t m_interface;
+  Ipv4Address m_dest;         //!< destination address
+  Ipv4Mask m_destNetworkMask; //!< destination network mask
+  Ipv4Address m_gateway;      //!< gateway
+  uint32_t m_interface;       //!< output interface
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param route the Ipv4 routing table entry
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, Ipv4RoutingTableEntry const& route);
 
 /**
@@ -215,15 +246,29 @@
                                                               std::vector<uint32_t> outputInterfaces);
 
 private:
+  /**
+   * \brief Constructor.
+   * \param origin source address
+   * \param group destination address
+   * \param inputInterface input interface
+   * \param outputInterfaces output interfaces
+   */
   Ipv4MulticastRoutingTableEntry (Ipv4Address origin, Ipv4Address group, 
                                   uint32_t inputInterface, std::vector<uint32_t> outputInterfaces);
 
-  Ipv4Address m_origin;
-  Ipv4Address m_group;
-  uint32_t m_inputInterface;
-  std::vector<uint32_t> m_outputInterfaces;
+  Ipv4Address m_origin;   //!< source address
+  Ipv4Address m_group;    //!< destination address
+  uint32_t m_inputInterface;    //!< input interface
+  std::vector<uint32_t> m_outputInterfaces;   //!< output interfaces
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param route the Ipv4 multicast routing table entry
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, Ipv4MulticastRoutingTableEntry const& route);
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/ipv4-static-routing.cc ns-3.19/src/internet/model/ipv4-static-routing.cc
--- ns-3.18.1/src/internet/model/ipv4-static-routing.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-static-routing.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4StaticRouting);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4StaticRouting)
+  ;
 
 TypeId
 Ipv4StaticRouting::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/ipv4-static-routing.h ns-3.19/src/internet/model/ipv4-static-routing.h
--- ns-3.18.1/src/internet/model/ipv4-static-routing.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv4-static-routing.h	2013-12-20 09:44:50.000000000 -0800
@@ -69,6 +69,10 @@
 class Ipv4StaticRouting : public Ipv4RoutingProtocol
 {
 public:
+  /**
+   * \brief The interface Id associated with this class.
+   * \return type identifier
+   */
   static TypeId GetTypeId (void);
 
   Ipv4StaticRouting ();
@@ -177,6 +181,7 @@
  * to the routing table.
  *
  * \warning The default route counts as one of the routes.
+ * \return number of entries
  */
   uint32_t GetNRoutes (void) const;
 
@@ -308,6 +313,7 @@
  * to the routing table.
  *
  * \warning The default multicast route counts as one of the routes.
+ * \return number of entries
  */
   uint32_t GetNMulticastRoutes (void) const;
 
@@ -375,23 +381,63 @@
   virtual void DoDispose (void);
 
 private:
+  /// Container for the network routes
   typedef std::list<std::pair <Ipv4RoutingTableEntry *, uint32_t> > NetworkRoutes;
+
+  /// Const Iterator for container for the network routes
   typedef std::list<std::pair <Ipv4RoutingTableEntry *, uint32_t> >::const_iterator NetworkRoutesCI;
+
+  /// Iterator for container for the network routes
   typedef std::list<std::pair <Ipv4RoutingTableEntry *, uint32_t> >::iterator NetworkRoutesI;
 
+  /// Container for the multicast routes
   typedef std::list<Ipv4MulticastRoutingTableEntry *> MulticastRoutes;
+
+  /// Const Iterator for container for the multicast routes
   typedef std::list<Ipv4MulticastRoutingTableEntry *>::const_iterator MulticastRoutesCI;
+
+  /// Iterator for container for the multicast routes
   typedef std::list<Ipv4MulticastRoutingTableEntry *>::iterator MulticastRoutesI;
 
+  /**
+   * \brief Lookup in the forwarding table for destination.
+   * \param dest destination address
+   * \param oif output interface if any (put 0 otherwise)
+   * \return Ipv4Route to route the packet to reach dest address
+   */
   Ptr<Ipv4Route> LookupStatic (Ipv4Address dest, Ptr<NetDevice> oif = 0);
+
+  /**
+   * \brief Lookup in the multicast forwarding table for destination.
+   * \param origin source address
+   * \param group group multicast address
+   * \param interface interface index
+   * \return Ipv4MulticastRoute to route the packet to reach dest address
+   */
   Ptr<Ipv4MulticastRoute> LookupStatic (Ipv4Address origin, Ipv4Address group,
                                         uint32_t interface);
 
+  /**
+   * \brief Choose the source address to use with destination address.
+   * \param interface interface index
+   * \param dest IPv4 destination address
+   * \return IPv4 source address to use
+   */
   Ipv4Address SourceAddressSelection (uint32_t interface, Ipv4Address dest);
 
+  /**
+   * \brief the forwarding table for network.
+   */
   NetworkRoutes m_networkRoutes;
+
+  /**
+   * \brief the forwarding table for multicast.
+   */
   MulticastRoutes m_multicastRoutes;
 
+  /**
+   * \brief Ipv4 reference.
+   */
   Ptr<Ipv4> m_ipv4;
 };
 
diff -Naur ns-3.18.1/src/internet/model/ipv6-address-generator.cc ns-3.19/src/internet/model/ipv6-address-generator.cc
--- ns-3.18.1/src/internet/model/ipv6-address-generator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-address-generator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,54 +28,163 @@
 
 namespace ns3 {
 
+/**
+ * \internal
+ * \ingroup address
+ *
+ * \brief Implementation class of Ipv6AddressGenerator
+ * This generator assigns addresses sequentially from a provided
+ * network address; used in topology code. It also keeps track of all
+ * addresses assigned to perform duplicate detection.
+ *
+ */
 class Ipv6AddressGeneratorImpl
 {
 public:
   Ipv6AddressGeneratorImpl ();
   virtual ~Ipv6AddressGeneratorImpl ();
 
+  /**
+   * \internal
+   * \brief Initialise the base network and interfaceId for the generator
+   *
+   * The first call to NextAddress() or GetAddress() will return the
+   * value passed in.
+   *
+   * \param net The network for the base Ipv6Address
+   * \param prefix The prefix of the base Ipv6Address
+   * \param interfaceId The base interface ID used for initialization
+   */
   void Init (const Ipv6Address net, const Ipv6Prefix prefix,
              const Ipv6Address interfaceId);
 
-  Ipv6Address GetNetwork (const Ipv6Prefix prefix) const;
+  /**
+   * \internal
+   * \brief Get the next network according to the given Ipv6Prefix
+   *
+   * This operation is a pre-increment, meaning that the internal state
+   * is changed before returning the new network address.
+   *
+   * This also resets the interface ID to the base interface ID that was
+   * used for initialization.
+   *
+   * \param prefix The Ipv6Prefix used to set the next network
+   * \returns the IPv6 address of the next network
+   */
   Ipv6Address NextNetwork (const Ipv6Prefix prefix);
 
+  /**
+   * \internal
+   * \brief Get the current network of the given Ipv6Prefix
+   *
+   * Does not change the internal state; this just peeks at the current
+   * network
+   *
+   * \param prefix The Ipv6Prefix for the current network
+   * \returns the IPv6 address of the current network
+   */
+  Ipv6Address GetNetwork (const Ipv6Prefix prefix) const;
+
+  /**
+   * \internal
+   * \brief Set the interfaceId for the given Ipv6Prefix
+   *
+   * \param interfaceId The interfaceId to set for the current Ipv6Prefix
+   * \param prefix The Ipv6Prefix whose address is to be set
+   */
   void InitAddress (const Ipv6Address interfaceId, const Ipv6Prefix prefix);
+
+  /**
+   * \internal
+   * \brief Get the Ipv6Address that will be allocated upon NextAddress ()
+   *
+   * Does not change the internal state; just is used to peek the next
+   * address that will be allocated upon NextAddress ()
+   *
+   * \param prefix The Ipv6Prefix for the current network
+   * \returns the IPv6 address
+   */
   Ipv6Address GetAddress (const Ipv6Prefix prefix) const;
+
+  /**
+   * \internal
+   * \brief Allocate the next Ipv6Address for the configured network and prefix
+   *
+   * This operation is a post-increment, meaning that the first address
+   * allocated will be the one that was initially configured.
+   *
+   * \param prefix The Ipv6Prefix for the current network
+   * \returns the IPv6 address
+   */
   Ipv6Address NextAddress (const Ipv6Prefix prefix);
 
+  /**
+   * \internal
+   * \brief Reset the networks and Ipv6Address to zero
+   */
   void Reset (void);
+
+  /**
+   * \internal
+   * \brief Add the Ipv6Address to the list of IPv6 entries
+   *
+   * Typically, this is used by external address allocators that want
+   * to make use of this class's ability to track duplicates.  AddAllocated
+   * is always called internally for any address generated by NextAddress ()
+   *
+   * \param addr The Ipv6Address to be added to the list of Ipv6 entries
+   * \returns true on success
+   */
   bool AddAllocated (const Ipv6Address addr);
 
+  /**
+   * \internal
+   * \brief Used to turn off fatal errors and assertions, for testing
+   */
   void TestMode (void);
+
 private:
-  static const uint32_t N_BITS = 128;
-  static const uint32_t MOST_SIGNIFICANT_BIT = 0x80;
+  static const uint32_t N_BITS = 128; //!< /internal the number of bits in the address
+  static const uint32_t MOST_SIGNIFICANT_BIT = 0x80; //!< /internal MSB set to 1
 
+  /**
+   * \internal
+   * \brief Create an index number for the prefix
+   * \param prefix the prefix to index
+   * \returns an index
+   */
   uint32_t PrefixToIndex (Ipv6Prefix prefix) const;
 
+  /**
+   * \internal
+   * \brief This class holds the state for a given network
+   */
   class NetworkState
   {
 public:
-    uint8_t prefix[16];
-    uint32_t shift;
-    uint8_t network[16];
-    uint8_t addr[16];
-    uint8_t addrMax[16];
+    uint8_t prefix[16];  //!< /internal the network prefix
+    uint32_t shift;      //!< /internal a shift
+    uint8_t network[16]; //!< /internal the network
+    uint8_t addr[16];    //!< /internal the address
+    uint8_t addrMax[16]; //!< /internal the maximum address
   };
 
-  NetworkState m_netTable[N_BITS];
+  NetworkState m_netTable[N_BITS]; //!< /internal the available networks
 
+  /**
+   * \internal
+   * \brief This class holds the allocated addresses
+   */
   class Entry
   {
 public:
-    uint8_t addrLow[16];
-    uint8_t addrHigh[16];
+    uint8_t addrLow[16];  //!< /internal the lowest allocated address
+    uint8_t addrHigh[16]; //!< /internal the highest allocated address
   };
 
-  std::list<Entry> m_entries;
-  Ipv6Address m_base;
-  bool m_test;
+  std::list<Entry> m_entries; //!< /internal contained of allocated addresses
+  Ipv6Address m_base; //!< /internal base address
+  bool m_test; //!< /internal test mode (if true)
 };
 
 Ipv6AddressGeneratorImpl::Ipv6AddressGeneratorImpl ()
diff -Naur ns-3.18.1/src/internet/model/ipv6-address-generator.h ns-3.19/src/internet/model/ipv6-address-generator.h
--- ns-3.18.1/src/internet/model/ipv6-address-generator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-address-generator.h	2013-12-20 09:44:50.000000000 -0800
@@ -50,6 +50,12 @@
  * The interface ID is often an EUI-64 address derived from the MAC address,
  * but can also be a pseudo-random value (\RFC{3041}).  This implementation
  * does not generate EUI-64-based interface IDs.
+ *
+ * \note BEWARE: this class acts as a Singleton.
+ * In other terms, two different instances of Ipv6AddressGenerator will
+ * pick IPv6 numbers from the same pool. Changing the network in one of them
+ * will also change the network in the other instances.
+ *
  */
 class Ipv6AddressGenerator
 {
@@ -68,7 +74,7 @@
                     const Ipv6Address interfaceId = "::1");
 
   /**
-   * \brief Get the next network acoording to the given Ipv6Prefix
+   * \brief Get the next network according to the given Ipv6Prefix
    *
    * This operation is a pre-increment, meaning that the internal state
    * is changed before returning the new network address.
@@ -77,6 +83,7 @@
    * used for initialization.
    *
    * \param prefix The Ipv6Prefix used to set the next network
+   * \returns the IPv6 address of the next network
    */
   static Ipv6Address NextNetwork (const Ipv6Prefix prefix);
 
@@ -87,6 +94,7 @@
    * network
    *
    * \param prefix The Ipv6Prefix for the current network
+   * \returns the IPv6 address of the current network
    */
   static Ipv6Address GetNetwork (const Ipv6Prefix prefix);
 
@@ -103,18 +111,20 @@
    *
    * This operation is a post-increment, meaning that the first address
    * allocated will be the one that was initially configured.
-   * .
+   *
    * \param prefix The Ipv6Prefix for the current network
+   * \returns the IPv6 address
    */
   static Ipv6Address NextAddress (const Ipv6Prefix prefix);
 
   /**
-   * \brief Get the Ipv6Address that will be allocated upon NextAddress()
+   * \brief Get the Ipv6Address that will be allocated upon NextAddress ()
    *
    * Does not change the internal state; just is used to peek the next
    * address that will be allocated upon NextAddress ()
    *
    * \param prefix The Ipv6Prefix for the current network
+   * \returns the IPv6 address
    */
   static Ipv6Address GetAddress (const Ipv6Prefix prefix);
 
@@ -128,9 +138,10 @@
    *
    * Typically, this is used by external address allocators that want
    * to make use of this class's ability to track duplicates.  AddAllocated
-   * is always called internally for any address generated by NextAddress()
+   * is always called internally for any address generated by NextAddress ()
    *
    * \param addr The Ipv6Address to be added to the list of Ipv6 entries
+   * \returns true on success
    */
   static bool AddAllocated (const Ipv6Address addr);
 
diff -Naur ns-3.18.1/src/internet/model/ipv6.cc ns-3.19/src/internet/model/ipv6.cc
--- ns-3.18.1/src/internet/model/ipv6.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 namespace ns3 
 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6)
+  ;
 
 TypeId Ipv6::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-end-point.cc ns-3.19/src/internet/model/ipv6-end-point.cc
--- ns-3.18.1/src/internet/model/ipv6-end-point.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-end-point.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6EndPoint");
+NS_LOG_COMPONENT_DEFINE ("Ipv6EndPoint")
+  ;
 
 Ipv6EndPoint::Ipv6EndPoint (Ipv6Address addr, uint16_t port)
   : m_localAddr (addr),
@@ -95,7 +96,7 @@
   m_peerPort = port;
 }
 
-void Ipv6EndPoint::SetRxCallback (Callback<void, Ptr<Packet>, Ipv6Header, uint16_t> callback)
+void Ipv6EndPoint::SetRxCallback (Callback<void, Ptr<Packet>, Ipv6Header, uint16_t, Ptr<Ipv6Interface> > callback)
 {
   m_rxCallback = callback;
 }
@@ -110,11 +111,12 @@
   m_destroyCallback = callback;
 }
 
-void Ipv6EndPoint::ForwardUp (Ptr<Packet> p, Ipv6Header header, uint16_t port)
+void Ipv6EndPoint::ForwardUp (Ptr<Packet> p, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface)
 {
   if (!m_rxCallback.IsNull ())
     {
-      m_rxCallback (p, header, port);
+      Simulator::ScheduleNow (&Ipv6EndPoint::DoForwardUp, this, p, header, port,
+                              incomingInterface);
     }
 }
 
@@ -128,9 +130,9 @@
     }
 }
 
-void Ipv6EndPoint::DoForwardUp (Ptr<Packet> p, Ipv6Header header, uint16_t sport)
+void Ipv6EndPoint::DoForwardUp (Ptr<Packet> p, Ipv6Header header, uint16_t sport, Ptr<Ipv6Interface> incomingInterface)
 {
-  m_rxCallback (p, header, sport);
+  m_rxCallback (p, header, sport, incomingInterface);
 }
 
 void Ipv6EndPoint::DoForwardIcmp (Ipv6Address src, uint8_t ttl, uint8_t type, 
diff -Naur ns-3.18.1/src/internet/model/ipv6-end-point-demux.cc ns-3.19/src/internet/model/ipv6-end-point-demux.cc
--- ns-3.18.1/src/internet/model/ipv6-end-point-demux.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-end-point-demux.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6EndPointDemux");
+NS_LOG_COMPONENT_DEFINE ("Ipv6EndPointDemux")
+  ;
 
 Ipv6EndPointDemux::Ipv6EndPointDemux ()
   : m_ephemeral (49152),
diff -Naur ns-3.18.1/src/internet/model/ipv6-end-point-demux.h ns-3.19/src/internet/model/ipv6-end-point-demux.h
--- ns-3.18.1/src/internet/model/ipv6-end-point-demux.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-end-point-demux.h	2013-12-20 09:44:50.000000000 -0800
@@ -37,17 +37,17 @@
 class Ipv6EndPointDemux
 {
 public:
-  typedef std::list<Ipv6EndPoint *>EndPoints;
-  typedef std::list<Ipv6EndPoint *>::iterator EndPointsI;
-
   /**
-   * \brief Constructor.
+   * \brief Container of the IPv6 endpoints.
    */
-  Ipv6EndPointDemux ();
+  typedef std::list<Ipv6EndPoint *>EndPoints;
 
   /**
-   * \brief Destructor.
+   * \brief Iterator to the container of the IPv6 endpoints.
    */
+  typedef std::list<Ipv6EndPoint *>::iterator EndPointsI;
+
+  Ipv6EndPointDemux ();
   ~Ipv6EndPointDemux ();
 
   /**
@@ -72,7 +72,7 @@
    * \param src source address to test
    * \param sport source port to test
    * \param incomingInterface the incoming interface
-   * \return list en IPv6EndPoints (could be 0 element)
+   * \return list of IPv6EndPoints (could be 0 element)
    */
   EndPoints Lookup (Ipv6Address dst, uint16_t dport, Ipv6Address src, uint16_t sport, Ptr<Ipv6Interface> incomingInterface);
 
diff -Naur ns-3.18.1/src/internet/model/ipv6-end-point.h ns-3.19/src/internet/model/ipv6-end-point.h
--- ns-3.18.1/src/internet/model/ipv6-end-point.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-end-point.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,6 +27,7 @@
 #include "ns3/callback.h"
 #include "ns3/ipv6-header.h"
 #include "ns3/net-device.h"
+#include "ns3/ipv6-interface.h"
 
 namespace ns3
 {
@@ -35,8 +36,14 @@
 class Packet;
 
 /**
- * \class Ipv6EndPoint
- * \brief An IPv6 end point, four tuples identification.
+ * \brief A representation of an internet IPv6 endpoint/connection
+ *
+ * This class provides an internet four-tuple (source and destination ports
+ * and addresses).  These are used in the ns3::Ipv6EndPointDemux as targets
+ * of lookups.  The class also has a callback for notification to higher
+ * layers that a packet from a lower layer was received.  In the ns3
+ * internet-stack, these notifications are automatically registered to be
+ * received by the corresponding socket.
  */
 class Ipv6EndPoint
 {
@@ -48,9 +55,6 @@
    */
   Ipv6EndPoint (Ipv6Address addr, uint16_t port);
 
-  /**
-   * \brief Destructor.
-   */
   ~Ipv6EndPoint ();
 
   /**
@@ -113,7 +117,6 @@
    * the socket can not receive any packets as a result.
    *
    * \param netdevice Pointer to Netdevice of desired interface
-   * \returns nothing
    */
   void BindToNetDevice (Ptr<NetDevice> netdevice);
 
@@ -132,7 +135,7 @@
    * \brief Set the reception callback.
    * \param callback callback function
    */
-  void SetRxCallback (Callback<void, Ptr<Packet>, Ipv6Header, uint16_t> callback);
+  void SetRxCallback (Callback<void, Ptr<Packet>, Ipv6Header, uint16_t, Ptr<Ipv6Interface> > callback);
 
   /**
    * \brief Set the ICMP callback.
@@ -148,16 +151,23 @@
 
   /**
    * \brief Forward the packet to the upper level.
+   *
+   * Called from an L4Protocol implementation to notify an endpoint of a
+   * packet reception.
+   *
    * \param p the packet
-   * \param srcAddr source address
-   * \param dstAddr source address
+   * \param header the packet header
    * \param port source port
+   * \param incomingInterface incoming interface
    */
-  void ForwardUp (Ptr<Packet> p, Ipv6Header header, uint16_t port);
+  void ForwardUp (Ptr<Packet> p, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface);
 
   /**
-   * \brief Function called from an L4Protocol implementation
-   * to notify an endpoint of an icmp message reception.
+   * \brief Forward the ICMP packet to the upper level.
+   *
+   * Called from an L4Protocol implementation to notify an endpoint of
+   * an icmp message reception.
+   *
    * \param src source IPv6 address
    * \param ttl time-to-live
    * \param type ICMPv6 type
@@ -171,11 +181,11 @@
   /**
    * \brief ForwardUp wrapper.
    * \param p packet
-   * \param saddr source IPv6 address
-   * \param daddr dest IPv6 address
+   * \param header the packet header
    * \param sport source port
+   * \param incomingInterface incoming interface
    */
-  void DoForwardUp (Ptr<Packet> p, Ipv6Header header, uint16_t sport);
+  void DoForwardUp (Ptr<Packet> p, Ipv6Header header, uint16_t sport, Ptr<Ipv6Interface> incomingInterface);
 
   /**
    * \brief ForwardIcmp wrapper.
@@ -216,7 +226,7 @@
   /**
    * \brief The RX callback.
    */
-  Callback<void, Ptr<Packet>, Ipv6Header, uint16_t> m_rxCallback;
+  Callback<void, Ptr<Packet>, Ipv6Header, uint16_t, Ptr<Ipv6Interface> > m_rxCallback;
 
   /**
    * \brief The ICMPv6 callback.
diff -Naur ns-3.18.1/src/internet/model/ipv6-extension.cc ns-3.19/src/internet/model/ipv6-extension.cc
--- ns-3.18.1/src/internet/model/ipv6-extension.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-extension.cc	2013-12-20 09:44:50.000000000 -0800
@@ -44,7 +44,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6Extension);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6Extension)
+  ;
 
 TypeId Ipv6Extension::GetTypeId ()
 {
@@ -182,7 +183,8 @@
   return 1;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionHopByHop);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionHopByHop)
+  ;
 
 TypeId Ipv6ExtensionHopByHop::GetTypeId ()
 {
@@ -234,7 +236,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionDestination);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionDestination)
+  ;
 
 TypeId Ipv6ExtensionDestination::GetTypeId ()
 {
@@ -286,7 +289,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionFragment);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionFragment)
+  ;
 
 TypeId Ipv6ExtensionFragment::GetTypeId ()
 {
@@ -506,6 +510,7 @@
         {
           moreFragment = true;
           currentFragmentablePartSize = maxFragmentablePartSize;
+          currentFragmentablePartSize -= currentFragmentablePartSize % 8;
         }
       else
         {
@@ -513,10 +518,8 @@
           currentFragmentablePartSize = p->GetSize () - offset;
         }
 
-      currentFragmentablePartSize -= currentFragmentablePartSize % 8;
 
       fragmentHeader.SetNextHeader (nextHeader);
-      fragmentHeader.SetLength (currentFragmentablePartSize);
       fragmentHeader.SetOffset (offset);
       fragmentHeader.SetMoreFragment (moreFragment);
       fragmentHeader.SetIdentification (identification);
@@ -704,7 +707,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRouting);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRouting)
+  ;
 
 TypeId Ipv6ExtensionRouting::GetTypeId ()
 {
@@ -789,7 +793,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRoutingDemux);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRoutingDemux)
+  ;
 
 TypeId Ipv6ExtensionRoutingDemux::GetTypeId ()
 {
@@ -851,7 +856,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionLooseRouting);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionLooseRouting)
+  ;
 
 TypeId Ipv6ExtensionLooseRouting::GetTypeId ()
 {
@@ -1004,7 +1010,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionESP);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionESP)
+  ;
 
 TypeId Ipv6ExtensionESP::GetTypeId ()
 {
@@ -1042,7 +1049,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionAH);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionAH)
+  ;
 
 TypeId Ipv6ExtensionAH::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-extension-demux.cc ns-3.19/src/internet/model/ipv6-extension-demux.cc
--- ns-3.18.1/src/internet/model/ipv6-extension-demux.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-extension-demux.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 namespace ns3
 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionDemux);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionDemux)
+  ;
 
 TypeId Ipv6ExtensionDemux::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-extension-demux.h ns-3.19/src/internet/model/ipv6-extension-demux.h
--- ns-3.18.1/src/internet/model/ipv6-extension-demux.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-extension-demux.h	2013-12-20 09:44:50.000000000 -0800
@@ -86,6 +86,10 @@
   virtual void DoDispose ();
 
 private:
+
+  /**
+   * \brief Container of the IPv6 Extensions.
+   */
   typedef std::list<Ptr<Ipv6Extension> > Ipv6ExtensionList_t;
 
   /**
diff -Naur ns-3.18.1/src/internet/model/ipv6-extension.h ns-3.19/src/internet/model/ipv6-extension.h
--- ns-3.18.1/src/internet/model/ipv6-extension.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-extension.h	2013-12-20 09:44:50.000000000 -0800
@@ -381,7 +381,6 @@
    * \brief Process the timeout for packet fragments
    * \param key representing the packet fragments
    * \param ipHeader the IP header of the original packet
-   * \param iif Input Interface
    */
   void HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> key, Ipv6Header & ipHeader);
 
@@ -401,6 +400,9 @@
    */
   void CancelTimeout ();
 
+  /**
+   * \brief Container for the packet fragments.
+   */
   typedef std::map<std::pair<Ipv6Address, uint32_t>, Ptr<Fragments> > MapFragments_t;
 
   /**
@@ -521,6 +523,9 @@
   virtual void DoDispose ();
 
 private:
+  /**
+   * \brief Container for the extension routing.
+   */
   typedef std::list<Ptr<Ipv6ExtensionRouting> > Ipv6ExtensionRoutingList_t;
 
   /**
diff -Naur ns-3.18.1/src/internet/model/ipv6-extension-header.cc ns-3.19/src/internet/model/ipv6-extension-header.cc
--- ns-3.18.1/src/internet/model/ipv6-extension-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-extension-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,9 +26,11 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6ExtensionHeader");
+NS_LOG_COMPONENT_DEFINE ("Ipv6ExtensionHeader")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionHeader)
+  ;
 
 TypeId Ipv6ExtensionHeader::GetTypeId ()
 {
@@ -199,7 +201,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionHopByHopHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionHopByHopHeader)
+  ;
 
 TypeId Ipv6ExtensionHopByHopHeader::GetTypeId ()
 {
@@ -254,7 +257,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionDestinationHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionDestinationHeader)
+  ;
 
 TypeId Ipv6ExtensionDestinationHeader::GetTypeId ()
 {
@@ -309,7 +313,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionFragmentHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionFragmentHeader)
+  ;
 
 TypeId Ipv6ExtensionFragmentHeader::GetTypeId ()
 {
@@ -329,6 +334,7 @@
   : m_offset (0),
     m_identification (0)
 {
+  SetLength (0);
 }
 
 Ipv6ExtensionFragmentHeader::~Ipv6ExtensionFragmentHeader ()
@@ -383,7 +389,7 @@
   Buffer::Iterator i = start;
 
   i.WriteU8 (GetNextHeader ());
-  i.WriteU8 ((GetLength () >> 3) - 1);
+  i.WriteU8 (0);
   i.WriteHtonU16 (m_offset);
   i.WriteHtonU32 (m_identification);
 }
@@ -393,14 +399,16 @@
   Buffer::Iterator i = start;
 
   SetNextHeader (i.ReadU8 ());
-  SetLength ((i.ReadU8 () + 1) << 3);
+  i.ReadU8();
+  SetLength (0);
   m_offset = i.ReadNtohU16 ();
   m_identification = i.ReadNtohU32 ();
 
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRoutingHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRoutingHeader)
+  ;
 
 TypeId Ipv6ExtensionRoutingHeader::GetTypeId ()
 {
@@ -479,7 +487,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionLooseRoutingHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionLooseRoutingHeader)
+  ;
 
 TypeId Ipv6ExtensionLooseRoutingHeader::GetTypeId ()
 {
@@ -586,7 +595,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionESPHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionESPHeader)
+  ;
 
 TypeId Ipv6ExtensionESPHeader::GetTypeId ()
 {
@@ -632,7 +642,8 @@
   return 0;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionAHHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionAHHeader)
+  ;
 
 TypeId Ipv6ExtensionAHHeader::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-extension-header.h ns-3.19/src/internet/model/ipv6-extension-header.h
--- ns-3.18.1/src/internet/model/ipv6-extension-header.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-extension-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -196,6 +196,7 @@
   /**
    * \brief Calculate padding.
    * \param alignment alignment
+   * \return the number of pad bytes
    */
   uint32_t CalculatePad (Ipv6OptionHeader::Alignment alignment) const;
 
diff -Naur ns-3.18.1/src/internet/model/ipv6.h ns-3.19/src/internet/model/ipv6.h
--- ns-3.18.1/src/internet/model/ipv6.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6.h	2013-12-20 09:44:50.000000000 -0800
@@ -79,6 +79,10 @@
 class Ipv6 : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   /**
diff -Naur ns-3.18.1/src/internet/model/ipv6-header.cc ns-3.19/src/internet/model/ipv6-header.cc
--- ns-3.18.1/src/internet/model/ipv6-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6Header);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6Header)
+  ;
 
 Ipv6Header::Ipv6Header ()
   : m_version (6),
diff -Naur ns-3.18.1/src/internet/model/ipv6-interface-address.cc ns-3.19/src/internet/model/ipv6-interface-address.cc
--- ns-3.18.1/src/internet/model/ipv6-interface-address.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-interface-address.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6InterfaceAddress");
+NS_LOG_COMPONENT_DEFINE ("Ipv6InterfaceAddress")
+  ;
 
 Ipv6InterfaceAddress::Ipv6InterfaceAddress () 
   : m_address (Ipv6Address ()),
@@ -139,8 +140,22 @@
 
 std::ostream& operator<< (std::ostream& os, const Ipv6InterfaceAddress &addr)
 {
-  os << "address=" << addr.GetAddress () << "; prefix=" <<
-  addr.GetPrefix () << "; scope=" << addr.GetScope ();
+  os << "address: " << addr.GetAddress () << addr.GetPrefix () << "; scope: ";
+  switch (addr.GetScope ())
+  {
+    case Ipv6InterfaceAddress::HOST:
+      os << "HOST";
+      break;
+    case Ipv6InterfaceAddress::LINKLOCAL:
+      os << "LINK-LOCAL";
+      break;
+    case Ipv6InterfaceAddress::GLOBAL:
+      os << "GLOBAL";
+      break;
+    default:
+      os << "UNKNOWN";
+      break;
+  }
   return os;
 }
 
diff -Naur ns-3.18.1/src/internet/model/ipv6-interface-address.h ns-3.19/src/internet/model/ipv6-interface-address.h
--- ns-3.18.1/src/internet/model/ipv6-interface-address.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-interface-address.h	2013-12-20 09:44:50.000000000 -0800
@@ -53,7 +53,7 @@
 
   /**
    * \enum Scope_e
-   * \brief Scope of address.
+   * \brief Address scope.
    */
   enum Scope_e
   {
@@ -179,7 +179,22 @@
    */
   Scope_e m_scope;
 
+  /**
+   * \brief Equal to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the operands are equal
+   */
   friend bool operator == (Ipv6InterfaceAddress const& a, Ipv6InterfaceAddress const& b);
+
+  /**
+   * \brief Not equal to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the operands are not equal
+   */
   friend bool operator != (Ipv6InterfaceAddress const& a, Ipv6InterfaceAddress const& b);
 
   /**
@@ -188,6 +203,13 @@
   uint32_t m_nsDadUid;
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param addr the Ipv6InterfaceAddress
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, const Ipv6InterfaceAddress &addr);
 
 /* follow Ipv4InterfaceAddress way, maybe not inline them */
diff -Naur ns-3.18.1/src/internet/model/ipv6-interface.cc ns-3.19/src/internet/model/ipv6-interface.cc
--- ns-3.18.1/src/internet/model/ipv6-interface.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-interface.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,9 +34,11 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6Interface");
+NS_LOG_COMPONENT_DEFINE ("Ipv6Interface")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6Interface);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6Interface)
+  ;
 
 TypeId Ipv6Interface::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-interface.h ns-3.19/src/internet/model/ipv6-interface.h
--- ns-3.18.1/src/internet/model/ipv6-interface.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -42,7 +42,7 @@
  * \brief The IPv6 representation of a network interface
  *
  * By default IPv6 interfaces are created in the "down" state
- * with IP "fe80::1" and a /64 prefix. Before becoming useable,
+ * with IP "fe80::1" and a /64 prefix. Before becoming usable,
  * the user must invoke SetUp on them once the final IPv6 address
  * and mask has been set.
  */
@@ -257,8 +257,19 @@
   virtual void DoDispose ();
 
 private:
+  /**
+   * \brief Container for the Ipv6InterfaceAddresses.
+   */
   typedef std::list<Ipv6InterfaceAddress> Ipv6InterfaceAddressList;
+
+  /**
+   * \brief Container Iterator for the Ipv6InterfaceAddresses.
+   */
   typedef std::list<Ipv6InterfaceAddress>::iterator Ipv6InterfaceAddressListI;
+
+  /**
+   * \brief Const Container Iterator for the Ipv6InterfaceAddresses.
+   */
   typedef std::list<Ipv6InterfaceAddress>::const_iterator Ipv6InterfaceAddressListCI;
 
   /**
diff -Naur ns-3.18.1/src/internet/model/ipv6-l3-protocol.cc ns-3.19/src/internet/model/ipv6-l3-protocol.cc
--- ns-3.18.1/src/internet/model/ipv6-l3-protocol.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-l3-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -49,9 +49,11 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6L3Protocol);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6L3Protocol)
+  ;
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6L3Protocol");
+NS_LOG_COMPONENT_DEFINE ("Ipv6L3Protocol")
+  ;
 
 const uint16_t Ipv6L3Protocol::PROT_NUMBER = 0x86DD;
 
@@ -484,11 +486,23 @@
   NS_LOG_FUNCTION (this << i);
   Ptr<Ipv6Interface> interface = GetInterface (i);
 
-  interface->SetUp ();
+  // RFC 2460, Section 5, pg. 24:
+  //  IPv6 requires that every link in the internet have an MTU of 1280
+  //  octets or greater.  On any link that cannot convey a 1280-octet
+  //  packet in one piece, link-specific fragmentation and reassembly must
+  //  be provided at a layer below IPv6.
+  if (interface->GetDevice ()->GetMtu () >= 1280)
+    {
+      interface->SetUp ();
 
-  if (m_routingProtocol != 0)
+      if (m_routingProtocol != 0)
+        {
+          m_routingProtocol->NotifyInterfaceUp (i);
+        }
+    }
+  else
     {
-      m_routingProtocol->NotifyInterfaceUp (i);
+      NS_LOG_LOGIC ("Interface " << int(i) << " is set to be down for IPv6. Reason: not respecting minimum IPv6 MTU (1280 octects)");
     }
 }
 
diff -Naur ns-3.18.1/src/internet/model/ipv6-l3-protocol.h ns-3.19/src/internet/model/ipv6-l3-protocol.h
--- ns-3.18.1/src/internet/model/ipv6-l3-protocol.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-l3-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -94,7 +94,7 @@
   virtual ~Ipv6L3Protocol ();
 
   /**
-   * \brief Set node for this stack.
+   * \brief Set node associated with this stack.
    * \param node node to set
    */
   void SetNode (Ptr<Node> node);
@@ -217,6 +217,7 @@
   /**
    * \brief Get interface index which is on a specified net device.
    * \param device net device
+   * \returns the interface index
    */
   int32_t GetInterfaceForDevice (Ptr<const NetDevice> device) const;
 
@@ -224,6 +225,7 @@
    * \brief Add an address on interface.
    * \param i interface index
    * \param address to add
+   * \returns true if the operation succeeded
    */
   bool AddAddress (uint32_t i, Ipv6InterfaceAddress address);
 
@@ -246,6 +248,7 @@
    * \brief Remove an address from an interface.
    * \param interfaceIndex interface index
    * \param addressIndex address index on the interface
+   * \returns true if the operation succeeded
    */
   bool RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex);
 
@@ -255,7 +258,7 @@
    * \param address Ipv6Address to be removed from the interface
    * \returns true if the operation succeeded
    */
-  bool RemoveAddress (uint32_t interface, Ipv6Address address);
+  bool RemoveAddress (uint32_t interfaceIndex, Ipv6Address address);
 
   /**
    * \brief Set metric for an interface.
@@ -288,6 +291,7 @@
   /**
    * \brief Is specified interface up ?
    * \param i interface index
+   * \returns true if the interface is up
    */
   bool IsUp (uint32_t i) const;
 
@@ -306,6 +310,7 @@
   /**
    * \brief Is interface allows forwarding ?
    * \param i interface index
+   * \returns true if the interface is forwarding
    */
   bool IsForwarding (uint32_t i) const;
 
@@ -380,11 +385,29 @@
   friend class Ipv6L3ProtocolTestCase;
   friend class Ipv6ExtensionLooseRouting;
 
+  /**
+   * \brief Container of the IPv6 Interfaces.
+   */
   typedef std::list<Ptr<Ipv6Interface> > Ipv6InterfaceList;
+
+  /**
+   * \brief Container of the IPv6 Raw Sockets.
+   */
   typedef std::list<Ptr<Ipv6RawSocketImpl> > SocketList;
+
+  /**
+   * \brief Container of the IPv6 L4 instances.
+   */
   typedef std::list<Ptr<IpL4Protocol> > L4List_t;
 
+  /**
+   * \brief Container of the IPv6 Autoconfigured addresses.
+   */
   typedef std::list< Ptr<Ipv6AutoconfiguredPrefix> > Ipv6AutoconfiguredPrefixList;
+
+  /**
+   * \brief Iterator of the container of the IPv6 Autoconfigured addresses.
+   */
   typedef std::list< Ptr<Ipv6AutoconfiguredPrefix> >::iterator Ipv6AutoconfiguredPrefixListI;
 
   /**
@@ -404,15 +427,18 @@
 
   /**
    * \brief Copy constructor.
-   * \param o object to copy
+   *
+   * Defined but not implemented to avoid misuse
    */
-  Ipv6L3Protocol (const Ipv6L3Protocol& o);
+  Ipv6L3Protocol (const Ipv6L3Protocol&);
 
   /**
    * \brief Copy constructor.
-   * \param o object to copy
+   *
+   * Defined but not implemented to avoid misuse
+   * \returns the copied object
    */
-  Ipv6L3Protocol &operator = (const Ipv6L3Protocol& o);
+  Ipv6L3Protocol &operator = (const Ipv6L3Protocol&);
 
   /**
    * \brief Construct an IPv6 header.
@@ -421,6 +447,7 @@
    * \param protocol L4 protocol
    * \param payloadSize payload size
    * \param hopLimit Hop limit
+   * \param tclass Tclass
    * \return newly created IPv6 header
    */
   Ipv6Header BuildHeader (Ipv6Address src, Ipv6Address dst, uint8_t protocol,
@@ -444,7 +471,7 @@
   void IpForward (Ptr<const NetDevice> idev, Ptr<Ipv6Route> rtentry, Ptr<const Packet> p, const Ipv6Header& header);
 
   /**
-   * \brief Forward a packet in multicast.
+   * \brief Forward a multicast packet.
    * \param idev Pointer to ingress network device
    * \param mrtentry route 
    * \param p packet to forward
diff -Naur ns-3.18.1/src/internet/model/ipv6-list-routing.cc ns-3.19/src/internet/model/ipv6-list-routing.cc
--- ns-3.18.1/src/internet/model/ipv6-list-routing.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-list-routing.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6ListRouting);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6ListRouting)
+  ;
 
 TypeId
 Ipv6ListRouting::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/ipv6-list-routing.h ns-3.19/src/internet/model/ipv6-list-routing.h
--- ns-3.18.1/src/internet/model/ipv6-list-routing.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-list-routing.h	2013-12-20 09:44:50.000000000 -0800
@@ -118,7 +118,14 @@
   virtual void DoDispose (void);
 
 private:
+  /**
+   * \brief Container identifying an IPv6 Routing Protocol entry in the list.
+   */
   typedef std::pair<int16_t, Ptr<Ipv6RoutingProtocol> > Ipv6RoutingProtocolEntry;
+
+  /**
+   * \brief Container of the IPv6 Routing Protocols.
+   */
   typedef std::list<Ipv6RoutingProtocolEntry> Ipv6RoutingProtocolList;
 
   /**
@@ -129,15 +136,8 @@
    */
   static bool Compare (const Ipv6RoutingProtocolEntry& a, const Ipv6RoutingProtocolEntry& b);
 
-  /**
-   * \brief List of routing protocols.
-   */
-  Ipv6RoutingProtocolList m_routingProtocols;
-
-  /**
-   * \brief Ipv6 reference.
-   */
-  Ptr<Ipv6> m_ipv6;
+  Ipv6RoutingProtocolList m_routingProtocols; //!<  List of routing protocols.
+  Ptr<Ipv6> m_ipv6;  //!< Ipv6 this protocol is associated with.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/ipv6-option.cc ns-3.19/src/internet/model/ipv6-option.cc
--- ns-3.18.1/src/internet/model/ipv6-option.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-option.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 namespace ns3
 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6Option);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6Option)
+  ;
 
 TypeId Ipv6Option::GetTypeId ()
 {
@@ -55,7 +56,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPad1);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPad1)
+  ;
 
 TypeId Ipv6OptionPad1::GetTypeId ()
 {
@@ -99,7 +101,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPadn);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPadn)
+  ;
 
 TypeId Ipv6OptionPadn::GetTypeId ()
 {
@@ -143,7 +146,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionJumbogram);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionJumbogram)
+  ;
 
 TypeId Ipv6OptionJumbogram::GetTypeId ()
 {
@@ -187,7 +191,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionRouterAlert);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionRouterAlert)
+  ;
 
 TypeId Ipv6OptionRouterAlert::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-option-demux.cc ns-3.19/src/internet/model/ipv6-option-demux.cc
--- ns-3.18.1/src/internet/model/ipv6-option-demux.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-option-demux.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 namespace ns3
 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionDemux);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionDemux)
+  ;
 
 TypeId Ipv6OptionDemux::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-option-demux.h ns-3.19/src/internet/model/ipv6-option-demux.h
--- ns-3.18.1/src/internet/model/ipv6-option-demux.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-option-demux.h	2013-12-20 09:44:50.000000000 -0800
@@ -86,6 +86,9 @@
   virtual void DoDispose ();
 
 private:
+  /**
+   * \brief Container of the IPv6 Options types.
+   */
   typedef std::list<Ptr<Ipv6Option> > Ipv6OptionList_t;
 
   /**
diff -Naur ns-3.18.1/src/internet/model/ipv6-option-header.cc ns-3.19/src/internet/model/ipv6-option-header.cc
--- ns-3.18.1/src/internet/model/ipv6-option-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-option-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,9 +26,11 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6OptionHeader");
+NS_LOG_COMPONENT_DEFINE ("Ipv6OptionHeader")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionHeader)
+  ;
 
 TypeId Ipv6OptionHeader::GetTypeId ()
 {
@@ -116,7 +118,8 @@
   return (Alignment){ 1,0};
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPad1Header);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPad1Header)
+  ;
 
 TypeId Ipv6OptionPad1Header::GetTypeId ()
 {
@@ -167,7 +170,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPadnHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPadnHeader)
+  ;
 
 TypeId Ipv6OptionPadnHeader::GetTypeId ()
 {
@@ -227,7 +231,8 @@
   return GetSerializedSize ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionJumbogramHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionJumbogramHeader)
+  ;
 
 TypeId Ipv6OptionJumbogramHeader::GetTypeId ()
 {
@@ -298,7 +303,8 @@
   return (Alignment){ 4,2}; //4n+2
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionRouterAlertHeader);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionRouterAlertHeader)
+  ;
 
 TypeId Ipv6OptionRouterAlertHeader::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-packet-info-tag.h ns-3.19/src/internet/model/ipv6-packet-info-tag.h
--- ns-3.18.1/src/internet/model/ipv6-packet-info-tag.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-packet-info-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -45,22 +45,70 @@
 {
 public:
   Ipv6PacketInfoTag ();
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \brief Set the tag's address
+   *
+   * \param addr the address
+   */
   void SetAddress (Ipv6Address addr);
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Get the tag's address
+   *
+   * \returns the address
+   */
   Ipv6Address GetAddress (void) const;
+
+  /**
+   * \brief Set the tag's receiving interface
+   *
+   * \param ifindex the interface index
+   */
   void SetRecvIf (uint32_t ifindex);
+
+  /**
+   * \brief Get the tag's receiving interface
+   *
+   * \returns the interface index
+   */
   uint32_t GetRecvIf (void) const;
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Set the tag's Hop Limit
+   *
+   * \param ttl the hop limit
+   */
   void SetHoplimit (uint8_t ttl);
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Get the tag's Hop Limit
+   *
+   * \returns the Hop Limit
+   */
   uint8_t GetHoplimit (void) const;
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Set the tag's Traffic Class
+   *
+   * \param tclass the Traffic Class
+   */
   void SetTrafficClass (uint8_t tclass);
-  // Implemented, but not used in the stack yet
+
+  /**
+   * \brief Get the tag's Traffic Class
+   *
+   * \returns the Traffic Class
+   */
   uint8_t GetTrafficClass (void) const;
 
-  static TypeId GetTypeId (void);
+  // inherited functions, no doc necessary
   virtual TypeId GetInstanceTypeId (void) const;
   virtual uint32_t GetSerializedSize (void) const;
   virtual void Serialize (TagBuffer i) const;
@@ -83,10 +131,10 @@
    *  3.  the arriving hop limit, and
    *  4.  the arriving traffic class value.
   */
-  Ipv6Address m_addr;
-  uint8_t m_ifindex;
-  uint8_t m_hoplimit;
-  uint8_t m_tclass;
+  Ipv6Address m_addr;  //!< the packet address (src or dst)
+  uint8_t m_ifindex;   //!< the Interface index
+  uint8_t m_hoplimit;  //!< the Hop Limit
+  uint8_t m_tclass;    //!< the Traffic Class
 };
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/internet/model/ipv6-packet-probe.cc ns-3.19/src/internet/model/ipv6-packet-probe.cc
--- ns-3.18.1/src/internet/model/ipv6-packet-probe.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-packet-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -33,7 +33,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6PacketProbe);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6PacketProbe)
+  ;
 
 TypeId
 Ipv6PacketProbe::GetTypeId ()
diff -Naur ns-3.18.1/src/internet/model/ipv6-packet-probe.h ns-3.19/src/internet/model/ipv6-packet-probe.h
--- ns-3.18.1/src/internet/model/ipv6-packet-probe.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-packet-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -48,7 +48,12 @@
 class Ipv6PacketProbe : public Probe
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
+
   Ipv6PacketProbe ();
   virtual ~Ipv6PacketProbe ();
 
@@ -103,7 +108,9 @@
    */
   void TraceSink (Ptr<const Packet> packet, Ptr<Ipv6> ipv6, uint32_t interface);
 
+  /// Traced Callback: the packet, the Ipv6 object and the interface.
   TracedCallback<Ptr<const Packet>, Ptr<Ipv6>, uint32_t> m_output;
+  /// Traced Callback: the previous packet's size and the actual packet's size.
   TracedCallback<uint32_t, uint32_t> m_outputBytes;
 
   /// The traced packet.
diff -Naur ns-3.18.1/src/internet/model/ipv6-pmtu-cache.cc ns-3.19/src/internet/model/ipv6-pmtu-cache.cc
--- ns-3.18.1/src/internet/model/ipv6-pmtu-cache.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-pmtu-cache.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6PmtuCache);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6PmtuCache)
+  ;
 
 TypeId Ipv6PmtuCache::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-pmtu-cache.h ns-3.19/src/internet/model/ipv6-pmtu-cache.h
--- ns-3.18.1/src/internet/model/ipv6-pmtu-cache.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-pmtu-cache.h	2013-12-20 09:44:50.000000000 -0800
@@ -108,7 +108,11 @@
    */
   std::map<Ipv6Address, uint32_t> m_pathMtu;
 
+  /**
+   * \brief Container of the IPv6 PMTU data (Ipv6 destination address and expiration event).
+   */
   typedef std::map<Ipv6Address, EventId> ::iterator pathMtuTimerIter;
+
   /**
    * \brief Path MTU Expiration table
    */
diff -Naur ns-3.18.1/src/internet/model/ipv6-raw-socket-factory.cc ns-3.19/src/internet/model/ipv6-raw-socket-factory.cc
--- ns-3.18.1/src/internet/model/ipv6-raw-socket-factory.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-raw-socket-factory.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6RawSocketFactory);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6RawSocketFactory)
+  ;
 
 TypeId Ipv6RawSocketFactory::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-raw-socket-factory-impl.h ns-3.19/src/internet/model/ipv6-raw-socket-factory-impl.h
--- ns-3.18.1/src/internet/model/ipv6-raw-socket-factory-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-raw-socket-factory-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,6 +27,8 @@
 {
 
 /**
+ * \ingroup socket
+ *
  * \class Ipv6RawSocketFactoryImpl
  * \brief Implementation of IPv6 raw socket factory.
  */
diff -Naur ns-3.18.1/src/internet/model/ipv6-raw-socket-impl.cc ns-3.19/src/internet/model/ipv6-raw-socket-impl.cc
--- ns-3.18.1/src/internet/model/ipv6-raw-socket-impl.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-raw-socket-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,10 +38,12 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6RawSocketImpl");
+NS_LOG_COMPONENT_DEFINE ("Ipv6RawSocketImpl")
+  ;
 
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6RawSocketImpl);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6RawSocketImpl)
+  ;
 
 TypeId Ipv6RawSocketImpl::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-raw-socket-impl.h ns-3.19/src/internet/model/ipv6-raw-socket-impl.h
--- ns-3.18.1/src/internet/model/ipv6-raw-socket-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-raw-socket-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -36,6 +36,7 @@
 /**
  * \class Ipv6RawSocketImpl
  * \brief IPv6 raw socket.
+ * \ingroup socket
  *
  * A RAW Socket typically is used to access specific IP layers not usually
  * available through L4 sockets, e.g., ICMP. The implementer should take
@@ -70,26 +71,15 @@
    */
   static TypeId GetTypeId ();
 
-  /**
-   * \brief Constructor.
-   */
   Ipv6RawSocketImpl ();
-
-  /**
-   * \brief Destructor.
-   */
   virtual ~Ipv6RawSocketImpl ();
 
   /**
-   * \brief Set the node.
+   * \brief Set the node associated with this socket.
    * \param node node to set
    */
   void SetNode (Ptr<Node> node);
 
-  /**
-   * \brief Get last error number.
-   * \return error number
-   */
   virtual enum Socket::SocketErrno GetErrno () const;
 
   /**
@@ -98,108 +88,24 @@
    */
   virtual enum Socket::SocketType GetSocketType () const;
 
-  /**
-   * \brief Get node.
-   * \return node associated with this raw socket.
-   */
   virtual Ptr<Node> GetNode () const;
 
-  /**
-   * \brief Bind the socket to address.
-   * \param address bind to this address
-   * \return 0 if success, -1 otherwise
-   */
   virtual int Bind (const Address& address);
-
-  /**
-   * \brief Bind socket.
-   * \return 0 if success, -1 otherwise
-   */
   virtual int Bind ();
   virtual int Bind6 ();
 
-  /**
-   * \brief Get socket address.
-   * \param address socket address if method success
-   * \return 0 if success, -1 otherwise
-   */
   virtual int GetSockName (Address& address) const;
 
-  /**
-   * \brief Close the socket.
-   * \return 0 if success, -1 otherwise
-   */
   virtual int Close ();
-
-  /**
-   * \brief Shutdown send capability.
-   * \return 0 if success, -1 otherwise
-   */
   virtual int ShutdownSend ();
-
-  /**
-   * \brief Shutdown receive capability.
-   * \return 0 if success, -1 otherwise
-   */
   virtual int ShutdownRecv ();
-
-  /**
-   * \brief Connect to address.
-   * \param address address
-   * \return 0 if success, -1 otherwise
-   */
   virtual int Connect (const Address& address);
-
-  /**
-   * \brief Listen.
-   * \return 0 if success, -1 otherwise
-   */
   virtual int Listen ();
-
-  /**
-   * \brief Get TX size available.
-   * \return TX size
-   */
   virtual uint32_t GetTxAvailable () const;
-
-  /**
-   * \brief Get RX size available.
-   * \return RX size
-   */
   virtual uint32_t GetRxAvailable () const;
-
-  /**
-   * \brief Send a packet.
-   * \param p packet to send
-   * \param flags additionnal flags
-   * \return 0 if success, -1 otherwise
-   */
   virtual int Send (Ptr<Packet> p, uint32_t flags);
-
-  /**
-   * \brief Send a packet.
-   * \param p packet to send
-   * \param flags additionnal flags
-   * \param toAddress destination address
-   * \return 0 if success, -1 otherwise
-   */
   virtual int SendTo (Ptr<Packet> p, uint32_t flags, const Address& toAddress);
-
-  /**
-   * \brief Receive packet.
-   * \param maxSize maximum size
-   * \param flags additionnal flags
-   * \return packet received
-   */
   virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags);
-
-  /**
-   * \brief Receive packet.
-   * \param maxSize maximum size
-   * \param flags additionnal flags
-   * \param fromAddress source address
-   * \return packet received
-   */
   virtual Ptr<Packet> RecvFrom (uint32_t maxSize, uint32_t flags, Address& fromAddress);
 
   /**
@@ -232,26 +138,26 @@
 
   /**
    * \brief Set the filter to pass one ICMPv6 type
-   * \param the ICMPv6 type to pass
+   * \param type the ICMPv6 type to pass
    */
   void Icmpv6FilterSetPass(uint8_t type);
 
   /**
    * \brief Set the filter to block one ICMPv6 type
-   * \param the ICMPv6 type to block
+   * \param type the ICMPv6 type to block
    */
   void Icmpv6FilterSetBlock(uint8_t type);
 
   /**
    * \brief Ask the filter about the status of one ICMPv6 type
-   * \param the ICMPv6 type
+   * \param type the ICMPv6 type
    * \return true if the ICMP type is passing through
    */
   bool Icmpv6FilterWillPass(uint8_t type);
 
   /**
    * \brief Ask the filter about the status of one ICMPv6 type
-   * \param the ICMPv6 type
+   * \param type the ICMPv6 type
    * \return true if the ICMP type is being blocked
    */
   bool Icmpv6FilterWillBlock(uint8_t type);
@@ -319,7 +225,7 @@
    */
   typedef struct
   {
-    uint32_t icmpv6Filt[8];
+    uint32_t icmpv6Filt[8]; //!< ICMPv6 filter specification
   } icmpv6Filter;
 
   /**
diff -Naur ns-3.18.1/src/internet/model/ipv6-route.h ns-3.19/src/internet/model/ipv6-route.h
--- ns-3.18.1/src/internet/model/ipv6-route.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-route.h	2013-12-20 09:44:50.000000000 -0800
@@ -123,6 +123,13 @@
   Ptr<NetDevice> m_outputDevice;
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param route the Ipv6 route
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, Ipv6Route const& route);
 
 /**
@@ -231,6 +238,13 @@
   std::map<uint32_t, uint32_t> m_ttls;
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param route the Ipv6 multicast route
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, Ipv6MulticastRoute const& route);
 
 } /* namespace ns3 */
diff -Naur ns-3.18.1/src/internet/model/ipv6-routing-protocol.cc ns-3.19/src/internet/model/ipv6-routing-protocol.cc
--- ns-3.18.1/src/internet/model/ipv6-routing-protocol.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-routing-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 namespace ns3 
 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv6RoutingProtocol);
+NS_OBJECT_ENSURE_REGISTERED (Ipv6RoutingProtocol)
+  ;
 
 TypeId Ipv6RoutingProtocol::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ipv6-routing-protocol.h ns-3.19/src/internet/model/ipv6-routing-protocol.h
--- ns-3.18.1/src/internet/model/ipv6-routing-protocol.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-routing-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -54,11 +54,22 @@
 class Ipv6RoutingProtocol : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
+  /// Callback for unicast packets to be forwarded
   typedef Callback<void, Ptr<const NetDevice>, Ptr<Ipv6Route>, Ptr<const Packet>, const Ipv6Header &> UnicastForwardCallback;
+
+  /// Callback for multicast packets to be forwarded
   typedef Callback<void, Ptr<const NetDevice>, Ptr<Ipv6MulticastRoute>, Ptr<const Packet>, const Ipv6Header &> MulticastForwardCallback;
+
+  /// Callback for packets to be locally delivered
   typedef Callback<void, Ptr<const Packet>, const Ipv6Header &, uint32_t > LocalDeliverCallback;
+
+  /// Callback for routing errors (e.g., no route found)
   typedef Callback<void, Ptr<const Packet>, const Ipv6Header &, Socket::SocketErrno > ErrorCallback;
 
   /**
diff -Naur ns-3.18.1/src/internet/model/ipv6-routing-table-entry.cc ns-3.19/src/internet/model/ipv6-routing-table-entry.cc
--- ns-3.18.1/src/internet/model/ipv6-routing-table-entry.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-routing-table-entry.cc	2013-12-20 09:44:50.000000000 -0800
@@ -208,36 +208,36 @@
   if (route.IsDefault ())
     {
       NS_ASSERT (route.IsGateway ());
-      os << "default out =" << route.GetInterface () << ", next hop =" << route.GetGateway ();
+      os << "default out: " << route.GetInterface () << ", next hop: " << route.GetGateway ();
     }
   else if (route.IsHost ())
     {
       if (route.IsGateway ())
         {
-          os << "host ="<< route.GetDest () <<
-          ", out =" << route.GetInterface () <<
-          ", next hop =" << route.GetGateway ();
+          os << "host: "<< route.GetDest () <<
+          ", out: " << route.GetInterface () <<
+          ", next hop: " << route.GetGateway ();
         }
       else
         {
-          os << "host =" << route.GetDest () <<
-          ", out =" << route.GetInterface ();
+          os << "host: " << route.GetDest () <<
+          ", out: " << route.GetInterface ();
         }
     }
   else if (route.IsNetwork ())
     {
       if (route.IsGateway ())
         {
-          os << "network =" << route.GetDestNetwork () <<
-          ", mask =" << route.GetDestNetworkPrefix () <<
-          ",out =" << route.GetInterface () <<
-          ", next hop =" << route.GetGateway ();
+          os << "network: " << route.GetDestNetwork () <<
+          "/ " << int(route.GetDestNetworkPrefix ().GetPrefixLength ()) <<
+          ", out: " << route.GetInterface () <<
+          ", next hop: " << route.GetGateway ();
         }
       else
         {
-          os << "network =" << route.GetDestNetwork () <<
-          ", mask =" << route.GetDestNetworkPrefix () <<
-          ",out =" << route.GetInterface ();
+          os << "network: " << route.GetDestNetwork () <<
+          "/" << int(route.GetDestNetworkPrefix ().GetPrefixLength ()) <<
+          ", out: " << route.GetInterface ();
         }
     }
   else
@@ -314,10 +314,10 @@
 
 std::ostream& operator<< (std::ostream& os, Ipv6MulticastRoutingTableEntry const& route)
 {
-  os << "origin =" << route.GetOrigin () <<
-  ", group =" << route.GetGroup () <<
-  ", input interface =" << route.GetInputInterface () <<
-  ", output interfaces =";
+  os << "origin: " << route.GetOrigin () <<
+  ", group: " << route.GetGroup () <<
+  ", input interface: " << route.GetInputInterface () <<
+  ", output interfaces: ";
 
   for (uint32_t i = 0; i < route.GetNOutputInterfaces (); ++i)
     {
diff -Naur ns-3.18.1/src/internet/model/ipv6-routing-table-entry.h ns-3.19/src/internet/model/ipv6-routing-table-entry.h
--- ns-3.18.1/src/internet/model/ipv6-routing-table-entry.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-routing-table-entry.h	2013-12-20 09:44:50.000000000 -0800
@@ -260,6 +260,13 @@
 
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param route the Ipv6 routing table entry
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, Ipv6RoutingTableEntry const& route);
 
 /**
@@ -364,6 +371,13 @@
   std::vector<uint32_t> m_outputInterfaces;
 };
 
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param route the Ipv6 multicast routing table entry
+ * \returns the reference to the output stream
+ */
 std::ostream& operator<< (std::ostream& os, Ipv6MulticastRoutingTableEntry const& route);
 
 } /* namespace ns3 */
diff -Naur ns-3.18.1/src/internet/model/ipv6-static-routing.cc ns-3.19/src/internet/model/ipv6-static-routing.cc
--- ns-3.18.1/src/internet/model/ipv6-static-routing.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-static-routing.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,14 +25,17 @@
 #include "ns3/simulator.h"
 #include "ns3/ipv6-route.h"
 #include "ns3/net-device.h"
+#include "ns3/names.h"
 
 #include "ipv6-static-routing.h"
 #include "ipv6-routing-table-entry.h"
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Ipv6StaticRouting");
-NS_OBJECT_ENSURE_REGISTERED (Ipv6StaticRouting);
+NS_LOG_COMPONENT_DEFINE ("Ipv6StaticRouting")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (Ipv6StaticRouting)
+  ;
 
 TypeId Ipv6StaticRouting::GetTypeId ()
 {
@@ -78,18 +81,48 @@
 void
 Ipv6StaticRouting::PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << stream);
   std::ostream* os = stream->GetStream ();
+
+  *os << "Node: " << m_ipv6->GetObject<Node> ()->GetId ()
+      << " Time: " << Simulator::Now ().GetSeconds () << "s "
+      << "Ipv6StaticRouting table" << std::endl;
+
   if (GetNRoutes () > 0)
     {
-      *os << "Node: " << m_ipv6->GetObject<Node> ()->GetId ()
-          << " Time: " << Simulator::Now ().GetSeconds () << "s "
-          << "Ipv6StaticRouting table" << std::endl;
-
+      *os << "Destination                    Next Hop                   Flag Met Ref Use If" << std::endl;
       for (uint32_t j = 0; j < GetNRoutes (); j++)
         {
+          std::ostringstream dest, gw, mask, flags;
           Ipv6RoutingTableEntry route = GetRoute (j);
-          *os << route << std::endl;
+          dest << route.GetDest () << "/" << int(route.GetDestNetworkPrefix ().GetPrefixLength ());
+          *os << std::setiosflags (std::ios::left) << std::setw (31) << dest.str ();
+          gw << route.GetGateway ();
+          *os << std::setiosflags (std::ios::left) << std::setw (27) << gw.str ();
+          flags << "U";
+          if (route.IsHost ())
+            {
+              flags << "H";
+            }
+          else if (route.IsGateway ())
+            {
+              flags << "G";
+            }
+          *os << std::setiosflags (std::ios::left) << std::setw (5) << flags.str ();
+          *os << std::setiosflags (std::ios::left) << std::setw (4) << GetMetric (j);
+          // Ref ct not implemented
+          *os << "-" << "   ";
+          // Use not implemented
+          *os << "-" << "   ";
+          if (Names::FindName (m_ipv6->GetNetDevice (route.GetInterface ())) != "")
+            {
+              *os << Names::FindName (m_ipv6->GetNetDevice (route.GetInterface ()));
+            }
+          else
+            {
+              *os << route.GetInterface ();
+            }
+          *os << std::endl;
         }
     }
 }
@@ -722,12 +755,12 @@
   else /* default route */
     {
       /* this case is mainly used by configuring default route following RA processing,
-       * in case of multipe prefix in RA, the first will configured default route
+       * in case of multiple prefix in RA, the first will configured default route
        */
 
       /* for the moment, all default route has the same metric
        * so according to the longest prefix algorithm,
-       * the default route choosen will be the last added
+       * the default route chosen will be the last added
        */
       SetDefaultRoute (nextHop, interface, prefixToUse);
     }
diff -Naur ns-3.18.1/src/internet/model/ipv6-static-routing.h ns-3.19/src/internet/model/ipv6-static-routing.h
--- ns-3.18.1/src/internet/model/ipv6-static-routing.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ipv6-static-routing.h	2013-12-20 09:44:50.000000000 -0800
@@ -48,9 +48,22 @@
 /**
  * \ingroup ipv6StaticRouting
  * \class Ipv6StaticRouting
- * \brief Static routing protocol for IP version 6 stack.
+ *
+ * \brief Static routing protocol for IP version 6 stacks.
+ *
+ * This class provides a basic set of methods for inserting static
+ * unicast and multicast routes into the Ipv6 routing system.
+ * This particular protocol is designed to be inserted into an
+ * Ipv6ListRouting protocol but can be used also as a standalone
+ * protocol.
+ *
+ * The Ipv6StaticRouting class inherits from the abstract base class
+ * Ipv6RoutingProtocol that defines the interface methods that a routing
+ * protocol must support.
+ *
  * \see Ipv6RoutingProtocol
  * \see Ipv6ListRouting
+ * \see Ipv6ListRouting::AddRoutingProtocol
  */
 class Ipv6StaticRouting : public Ipv6RoutingProtocol
 {
@@ -61,14 +74,7 @@
    */
   static TypeId GetTypeId ();
 
-  /**
-   * \brief Constructor.
-   */
   Ipv6StaticRouting ();
-
-  /**
-   * \brief Destructor.
-   */
   virtual ~Ipv6StaticRouting ();
 
   /**
@@ -205,6 +211,7 @@
    * \param origin IPv6 address of the source
    * \param group the multicast group address.
    * \param inputInterface the input interface index
+   * \return true on success
    */
   bool RemoveMulticastRoute (Ipv6Address origin, Ipv6Address group, uint32_t inputInterface);
 
@@ -250,12 +257,22 @@
   virtual void DoDispose ();
 
 private:
+  /// Container for the network routes
   typedef std::list<std::pair <Ipv6RoutingTableEntry *, uint32_t> > NetworkRoutes;
+
+  /// Const Iterator for container for the network routes
   typedef std::list<std::pair <Ipv6RoutingTableEntry *, uint32_t> >::const_iterator NetworkRoutesCI;
+
+  /// Iterator for container for the network routes
   typedef std::list<std::pair <Ipv6RoutingTableEntry *, uint32_t> >::iterator NetworkRoutesI;
 
+  /// Container for the multicast routes
   typedef std::list<Ipv6MulticastRoutingTableEntry *> MulticastRoutes;
+
+  /// Const Iterator for container for the multicast routes
   typedef std::list<Ipv6MulticastRoutingTableEntry *>::const_iterator MulticastRoutesCI;
+
+  /// Iterator for container for the multicast routes
   typedef std::list<Ipv6MulticastRoutingTableEntry *>::iterator MulticastRoutesI;
 
   /**
diff -Naur ns-3.18.1/src/internet/model/loopback-net-device.cc ns-3.19/src/internet/model/loopback-net-device.cc
--- ns-3.18.1/src/internet/model/loopback-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/loopback-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LoopbackNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (LoopbackNetDevice)
+  ;
 
 TypeId 
 LoopbackNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/loopback-net-device.h ns-3.19/src/internet/model/loopback-net-device.h
--- ns-3.18.1/src/internet/model/loopback-net-device.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/loopback-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -38,6 +38,10 @@
 class LoopbackNetDevice : public NetDevice
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   LoopbackNetDevice ();
 
@@ -72,13 +76,30 @@
 protected:
   virtual void DoDispose (void);
 private:
+  /**
+   * Receive a packet from tge Loopback NetDevice.
+   *
+   * \param packet a reference to the received packet
+   * \param protocol the protocol
+   * \param to destination address
+   * \param from source address
+   */
   void Receive (Ptr<Packet> packet, uint16_t protocol, Mac48Address to, Mac48Address from);
+
+  /**
+   * The callback used to notify higher layers that a packet has been received.
+   */
   NetDevice::ReceiveCallback m_rxCallback;
+
+  /**
+   * The callback used to notify higher layers that a packet has been received in promiscuous mode.
+   */
   NetDevice::PromiscReceiveCallback m_promiscCallback;
-  Ptr<Node> m_node;
-  uint16_t m_mtu;
-  uint32_t m_ifIndex;
-  Mac48Address m_address;
+
+  Ptr<Node> m_node; //!< the node this NetDevice is associated with
+  uint16_t m_mtu; //!< device MTU
+  uint32_t m_ifIndex; //!< interface index
+  Mac48Address m_address; //!< NetDevice MAC address
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/ndisc-cache.cc ns-3.19/src/internet/model/ndisc-cache.cc
--- ns-3.18.1/src/internet/model/ndisc-cache.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ndisc-cache.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,9 +30,11 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("NdiscCache");
+NS_LOG_COMPONENT_DEFINE ("NdiscCache")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (NdiscCache);
+NS_OBJECT_ENSURE_REGISTERED (NdiscCache)
+  ;
 
 TypeId NdiscCache::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/internet/model/ndisc-cache.h ns-3.19/src/internet/model/ndisc-cache.h
--- ns-3.18.1/src/internet/model/ndisc-cache.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/ndisc-cache.h	2013-12-20 09:44:50.000000000 -0800
@@ -412,20 +412,29 @@
   };
 
 private:
+  /**
+   * \brief Neighbor Discovery Cache container
+   */
   typedef sgi::hash_map<Ipv6Address, NdiscCache::Entry *, Ipv6AddressHash> Cache;
+  /**
+   * \brief Neighbor Discovery Cache container iterator
+   */
   typedef sgi::hash_map<Ipv6Address, NdiscCache::Entry *, Ipv6AddressHash>::iterator CacheI;
 
   /**
    * \brief Copy constructor.
-   * \param a cache to copy
+   *
+   * Not implemented to avoid misuse
    */
-  NdiscCache (NdiscCache const &a);
+  NdiscCache (NdiscCache const &);
 
   /**
-   * \brief Equal operator.
-   * \param a cache to copy
+   * \brief Copy constructor.
+   *
+   * Not implemented to avoid misuse
+   * \returns
    */
-  NdiscCache& operator= (NdiscCache const &a);
+  NdiscCache& operator= (NdiscCache const &);
 
   /**
    * \brief Dispose this object.
diff -Naur ns-3.18.1/src/internet/model/nsc-sysctl.cc ns-3.19/src/internet/model/nsc-sysctl.cc
--- ns-3.18.1/src/internet/model/nsc-sysctl.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/nsc-sysctl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,9 +23,19 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup nsctcp
+ *
+ * This object represent the underlying nsc stack attributes and
+ * provide a ns-3-like system to access them though sysctls
+ */
 class NscStackStringAccessor : public AttributeAccessor
 {
 public:
+  /**
+   * \brief Constructor
+   * \param name name of the attribute
+   */
   NscStackStringAccessor (std::string name) : m_name (name) {}
 
   virtual bool Set (ObjectBase * object, const AttributeValue &val) const;
@@ -33,7 +43,7 @@
   virtual bool HasGetter (void) const;
   virtual bool HasSetter (void) const;
 private:
-  std::string m_name;
+  std::string m_name; //!< name of the attribute
 };
 
 bool NscStackStringAccessor::HasGetter (void) const
@@ -142,7 +152,8 @@
     }
 }
 
-NS_OBJECT_ENSURE_REGISTERED (Ns3NscStack);
+NS_OBJECT_ENSURE_REGISTERED (Ns3NscStack)
+  ;
 
 TypeId
 Ns3NscStack::Ns3NscStack::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/nsc-sysctl.h ns-3.19/src/internet/model/nsc-sysctl.h
--- ns-3.18.1/src/internet/model/nsc-sysctl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/nsc-sysctl.h	2013-12-20 09:44:50.000000000 -0800
@@ -25,20 +25,42 @@
 
 namespace ns3 {
 
-// This object represents the underlying nsc stack,
-// which is aggregated to a Node object, and which provides access to the
-// sysctls of the nsc stack through attributes.
+/**
+ * \ingroup nsctcp
+ *
+ * This object represents the underlying nsc stack,
+ * which is aggregated to a Node object, and which provides access to the
+ * sysctls of the nsc stack through attributes.
+ */
 class Ns3NscStack : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
+  /**
+   * \brief Set the underlying stack
+   * \param stack the stack
+   */
   void SetStack (INetStack *stack) { m_stack = stack; }
 
 private:
   friend class NscStackStringAccessor;
+  /**
+   * \brief Set an attribute
+   * \param name the attribute name
+   * \param value the attribute value
+   */
   void Set (std::string name, std::string value);
+  /**
+   * \brief Get an attribute
+   * \param name the attribute name
+   * \returns the attribute value
+   */
   std::string Get (std::string name) const;
-  INetStack *m_stack;
+  INetStack *m_stack; //!< the underlying stack
 };
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/nsc-tcp-l4-protocol.cc ns-3.19/src/internet/model/nsc-tcp-l4-protocol.cc
--- ns-3.18.1/src/internet/model/nsc-tcp-l4-protocol.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/nsc-tcp-l4-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -49,21 +49,51 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (NscTcpL4Protocol);
+NS_OBJECT_ENSURE_REGISTERED (NscTcpL4Protocol)
+  ;
 
 /* see http://www.iana.org/assignments/protocol-numbers */
 const uint8_t NscTcpL4Protocol::PROT_NUMBER = 6;
 
+/**
+ * \ingroup nsctcp
+ * \brief Nsc interface implementation class.
+ */
 class NscInterfaceImpl : public ISendCallback, public IInterruptCallback 
 {
 public:
+  /**
+   * Constructor
+   * \param prot the NSC TCP protocol
+   */
   NscInterfaceImpl (Ptr<NscTcpL4Protocol> prot);
 private:
+  /**
+   * \brief Invoked by NSCs 'ethernet driver' to re-inject a packet into ns-3.
+   *
+   * A packet is an octet soup consisting of an IP Header, TCP Header
+   * and user payload, if any
+   *
+   * \param data the data
+   * \param datalen the data length
+   */
   virtual void send_callback (const void *data, int datalen);
+  /**
+   * \brief Called by the NSC stack whenever something of interest has happened
+   *
+   * Examples: when data arrives on a socket, a listen socket
+   * has a new connection pending, etc.
+   */
   virtual void wakeup ();
+  /**
+   * \brief Called by the Linux stack RNG initialization
+   *
+   * Its also used by the cradle code to add a timestamp to
+   * printk/printf/debug output.
+   */
   virtual void gettime (unsigned int *, unsigned int *);
 private:
-  Ptr<NscTcpL4Protocol> m_prot;
+  Ptr<NscTcpL4Protocol> m_prot; //!< the NSC TCP protocol
 };
 
 NscInterfaceImpl::NscInterfaceImpl (Ptr<NscTcpL4Protocol> prot)
@@ -112,9 +142,16 @@
   return tid;
 }
 
+/**
+ * \brief External Random number generator
+ *
+ * \todo make it random...
+ *
+ * \returns a random number
+ */
 int external_rand ()
 {
-  return 1;   /// \todo
+  return 1;
 }
 
 NscTcpL4Protocol::NscTcpL4Protocol ()
@@ -384,7 +421,7 @@
 
 void NscTcpL4Protocol::wakeup ()
 {
-  /// \todo
+  // \todo
   // this should schedule a timer to read from all tcp sockets now... this is
   // an indication that data might be waiting on the socket
 
@@ -450,7 +487,7 @@
           // IP address of the subnet but this was found to fail for
           // some use cases in /30 subnets.
 
-          /// \todo \bugid{1398} NSC's limitation to single-interface nodes
+          // \todo \bugid{1398} NSC's limitation to single-interface nodes
           m_nscStack->add_default_gateway (addrOss.str ().c_str ());
         }
     }
diff -Naur ns-3.18.1/src/internet/model/nsc-tcp-l4-protocol.h ns-3.19/src/internet/model/nsc-tcp-l4-protocol.h
--- ns-3.18.1/src/internet/model/nsc-tcp-l4-protocol.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/nsc-tcp-l4-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -45,18 +45,39 @@
  */
 class NscTcpL4Protocol : public IpL4Protocol {
 public:
-  static const uint8_t PROT_NUMBER;
-  static TypeId GetTypeId (void);
+  static const uint8_t PROT_NUMBER; //!< protocol number (0x6)
   /**
-   * \brief Constructor
+   * \brief Get the type ID.
+   * \return the object TypeId
    */
+  static TypeId GetTypeId (void);
+
   NscTcpL4Protocol ();
   virtual ~NscTcpL4Protocol ();
 
+  /**
+   * Set node associated with this stack
+   * \param node the node
+   */
   void SetNode (Ptr<Node> node);
+
+  /**
+   * Set the NSC library to be used
+   * \param lib the library path
+   */
   void SetNscLibrary (const std::string &lib);
+
+  /**
+   * Get the NSC library being used
+   * \returns the library path
+   */
   std::string GetNscLibrary (void) const;
   virtual int GetProtocolNumber (void) const;
+
+  /**
+   * Get the NSC version
+   * \returns the NSC version
+   */
   virtual int GetVersion (void) const;
 
   /**
@@ -65,27 +86,54 @@
    */
   Ptr<Socket> CreateSocket (void);
 
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (void);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param address address to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address address);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (uint16_t port);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param address address to use
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param localAddress local address to use
+   * \param localPort local port to use
+   * \param peerAddress remote address to use
+   * \param peerPort remote port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
                           Ipv4Address peerAddress, uint16_t peerPort);
 
-  void DeAllocate (Ipv4EndPoint *endPoint);
 
   /**
-   * \brief Receive a packet up the protocol stack
-   * \param p The Packet to dump the contents into
-   * \param header IPv4 Header information
-   * \param incomingInterface The Ipv4Interface it was received on
+   * \brief Remove an IPv4 Endpoint.
+   * \param endPoint the end point to remove
    */
+  void DeAllocate (Ipv4EndPoint *endPoint);
+
   virtual IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                            Ipv4Header const &header,
-                                            Ptr<Ipv4Interface> incomingInterface);
+                                          Ipv4Header const &header,
+                                          Ptr<Ipv4Interface> incomingInterface);
   virtual IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                                 Ipv6Header const &header,
-                                                 Ptr<Ipv6Interface> interface);
+                                          Ipv6Header const &header,
+                                          Ptr<Ipv6Interface> interface);
 
   // From IpL4Protocol
   virtual void SetDownTarget (IpL4Protocol::DownTargetCallback cb);
@@ -97,38 +145,73 @@
   virtual void DoDispose (void);
   virtual void NotifyNewAggregate ();
 private:
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and not implemented to avoid misuse
+   */
   NscTcpL4Protocol (NscTcpL4Protocol const &);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and not implemented to avoid misuse
+   * \returns
+   */
   NscTcpL4Protocol& operator= (NscTcpL4Protocol const &);
 
   // NSC callbacks.
   // NSC invokes these hooks to interact with the simulator.
   // In any case, these methods are only to be called by NSC.
-  //
-  // send_callback is invoked by NSCs 'ethernet driver' to re-inject
-  // a packet (i.e. an octet soup consisting of an IP Header, TCP Header
-  // and user payload, if any), into ns-3.
+
+  /**
+   * \brief Invoked by NSCs 'ethernet driver' to re-inject a packet into ns-3.
+   *
+   * A packet is an octet soup consisting of an IP Header, TCP Header
+   * and user payload, if any
+   *
+   * \param data the data
+   * \param datalen the data length
+   */
   void send_callback (const void *data, int datalen);
-  // This is called by the NSC stack whenever something of interest
-  // has happened, e.g. when data arrives on a socket, a listen socket
-  // has a new connection pending, etc.
+  /**
+   * \brief Called by the NSC stack whenever something of interest has happened
+   *
+   * Examples: when data arrives on a socket, a listen socket
+   * has a new connection pending, etc.
+   */
   void wakeup ();
-  // This is called by the Linux stack RNG initialization.
-  // Its also used by the cradle code to add a timestamp to
-  // printk/printf/debug output.
+  /**
+   * \brief Called by the Linux stack RNG initialization
+   *
+   * Its also used by the cradle code to add a timestamp to
+   * printk/printf/debug output.
+   * \param sec seconds
+   * \param usec microseconds
+   */
   void gettime (unsigned int *sec, unsigned int *usec);
+  /**
+   * \brief Add an interface
+   *
+   * Actually NSC only supports one interface per node (\bugid{1398})
+   */
   void AddInterface (void);
+
+  /**
+   * \brief Provide a "soft" interrupt to NSC
+   */
   void SoftInterrupt (void);
   friend class NscInterfaceImpl;
   friend class NscTcpSocketImpl;
-  Ptr<Node> m_node;
-  Ipv4EndPointDemux *m_endPoints;
-  INetStack* m_nscStack;
-  NscInterfaceImpl *m_nscInterface;
-  void *m_dlopenHandle;
-  std::string m_nscLibrary;
-  Timer m_softTimer;
-  std::vector<Ptr<NscTcpSocketImpl> > m_sockets;
-  IpL4Protocol::DownTargetCallback m_downTarget;
+
+  Ptr<Node> m_node; //!< the node this stack is associated with
+  Ipv4EndPointDemux *m_endPoints; //!< A list of IPv4 end points.
+  INetStack* m_nscStack; //!< the NSC stack.
+  NscInterfaceImpl *m_nscInterface; //!< the NSC Interface.
+  void *m_dlopenHandle; //!< dynamic library handle.
+  std::string m_nscLibrary; //!< path to the NSC library.
+  Timer m_softTimer; //!< Soft interrupt timer
+  std::vector<Ptr<NscTcpSocketImpl> > m_sockets; //!< list of sockets
+  IpL4Protocol::DownTargetCallback m_downTarget; //!< Callback to send packets over IPv4
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/nsc-tcp-socket-factory-impl.h ns-3.19/src/internet/model/nsc-tcp-socket-factory-impl.h
--- ns-3.18.1/src/internet/model/nsc-tcp-socket-factory-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/nsc-tcp-socket-factory-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -47,6 +47,10 @@
   NscTcpSocketFactoryImpl ();
   virtual ~NscTcpSocketFactoryImpl ();
 
+  /**
+   * \brief Set the associated TCP L4 protocol.
+   * \param tcp the TCP L4 protocol
+   */
   void SetTcp (Ptr<NscTcpL4Protocol> tcp);
 
   virtual Ptr<Socket> CreateSocket (void);
@@ -54,7 +58,7 @@
 protected:
   virtual void DoDispose (void);
 private:
-  Ptr<NscTcpL4Protocol> m_tcp;
+  Ptr<NscTcpL4Protocol> m_tcp; //!< the associated TCP L4 protocol
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/nsc-tcp-socket-impl.cc ns-3.19/src/internet/model/nsc-tcp-socket-impl.cc
--- ns-3.18.1/src/internet/model/nsc-tcp-socket-impl.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/nsc-tcp-socket-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -47,7 +47,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (NscTcpSocketImpl);
+NS_OBJECT_ENSURE_REGISTERED (NscTcpSocketImpl)
+  ;
 
 TypeId
 NscTcpSocketImpl::GetTypeId ()
diff -Naur ns-3.18.1/src/internet/model/nsc-tcp-socket-impl.h ns-3.19/src/internet/model/nsc-tcp-socket-impl.h
--- ns-3.18.1/src/internet/model/nsc-tcp-socket-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/nsc-tcp-socket-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -53,15 +53,34 @@
 class NscTcpSocketImpl : public TcpSocket
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   /**
    * Create an unbound tcp socket.
    */
   NscTcpSocketImpl ();
+
+  /**
+   * Clone a TCP socket, for use upon receiving a connection request in LISTEN state
+   *
+   * \param sock the original Tcp Socket
+   */
   NscTcpSocketImpl (const NscTcpSocketImpl& sock);
   virtual ~NscTcpSocketImpl ();
 
+  /**
+   * \brief Set the associated node.
+   * \param node the node
+   */
   void SetNode (Ptr<Node> node);
+
+  /**
+   * \brief Set the associated TCP L4 protocol.
+   * \param tcp the TCP L4 protocol
+   */
   void SetTcp (Ptr<NscTcpL4Protocol> tcp);
 
   virtual enum SocketErrno GetErrno (void) const;
@@ -87,22 +106,68 @@
   virtual bool GetAllowBroadcast () const;
 
 private:
+  /**
+   * \brief Called by NscTcpSocketImpl::ForwardUp()
+   *
+   * Actually performs the ForwardUp operations
+   */
   void NSCWakeup (void);
   friend class Tcp;
   // invoked by Tcp class
+  /**
+   * Finish the binding process
+   * \returns 0 on success, -1 on failure
+   */
   int FinishBind (void);
+  /**
+   * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+   *
+   * \param p the incoming packet
+   * \param header the packet's IPv4 header
+   * \param port the incoming port
+   * \param incomingInterface the incoming interface
+   */
   void ForwardUp (Ptr<Packet> p, Ipv4Header header, uint16_t port, 
                   Ptr<Ipv4Interface> incomingInterface);
+  /**
+   * \brief Kill this socket by zeroing its attributes (IPv4)
+   *
+   * This is a callback function configured to m_endpoint in
+   * SetupCallback(), invoked when the endpoint is destroyed.
+   */
   void Destroy (void);
   //methods for state
+  /**
+   * \brief Send all the pending data
+   * \returns true on success
+   */
   bool SendPendingData (void);
+  /**
+   * \brief Read all the pending data
+   * \returns true on success
+   */
   bool ReadPendingData (void);
+  /**
+   * \brief Accept an incoming connection
+   * \returns true on success
+   */
   bool Accept (void);
+  /**
+   * \brief Complete the Fork operations (after a connection has been accepted)
+   */
   void CompleteFork (void);
+
+  /**
+   * \brief Called when a connection is in Established state
+   */
   void ConnectionSucceeded ();
 
   // Manage data tx/rx
-  /// \todo This should be virtual and overridden
+  // \todo This should be virtual and overridden
+  /**
+   * \brief Copy self
+   * \returns a copy of self
+   */
   Ptr<NscTcpSocketImpl> Copy ();
 
   // attribute related
@@ -112,7 +177,15 @@
   virtual uint32_t GetRcvBufSize (void) const;
   virtual void SetSegSize (uint32_t size);
   virtual uint32_t GetSegSize (void) const;
+  /**
+   * \brief Set the Advertised Window size
+   * \param window the window size
+   */
   virtual void SetAdvWin (uint32_t window);
+  /**
+   * \brief Get the Advertised Window size
+   * \returns the window size
+   */
   virtual uint32_t GetAdvWin (void) const;
   virtual void SetSSThresh (uint32_t threshold);
   virtual uint32_t GetSSThresh (void) const;
@@ -131,57 +204,62 @@
   virtual void SetPersistTimeout (Time timeout);
   virtual Time GetPersistTimeout (void) const;
 
+  /**
+   * \brief Translate between a NSC error and a ns-3 error code
+   * \param err NSC error
+   * \returns ns-3 error code
+   */
   enum Socket::SocketErrno GetNativeNs3Errno (int err) const;
-  uint32_t m_delAckMaxCount;
-  Time m_delAckTimeout;
-  bool m_noDelay;
-
-  Ipv4EndPoint *m_endPoint;
-  Ptr<Node> m_node;
-  Ptr<NscTcpL4Protocol> m_tcp;
-  Ipv4Address m_remoteAddress;
-  uint16_t m_remotePort;
+  uint32_t m_delAckMaxCount;  //!< Number of packet to fire an ACK before delay timeout
+  Time m_delAckTimeout;       //!< Time to delay an ACK
+  bool m_noDelay;             //!< Disable ACk delay
+
+  Ipv4EndPoint *m_endPoint;     //!< the IPv4 endpoint
+  Ptr<Node> m_node;             //!< the associated node
+  Ptr<NscTcpL4Protocol> m_tcp;  //!< the associated TCP L4 protocol
+  Ipv4Address m_remoteAddress;  //!< peer IP address
+  uint16_t m_remotePort;        //!< peer port
   //these two are so that the socket/endpoint cloning works
-  Ipv4Address m_localAddress;
-  uint16_t m_localPort;
-  InetSocketAddress m_peerAddress;
-  enum SocketErrno m_errno;
-  bool m_shutdownSend;
-  bool m_shutdownRecv;
-  bool m_connected;
+  Ipv4Address m_localAddress;   //!< local address
+  uint16_t m_localPort;         //!< local port
+  InetSocketAddress m_peerAddress; //!< peer IP and port
+  enum SocketErrno m_errno;     //!< last error number
+  bool m_shutdownSend;          //!< Send no longer allowed
+  bool m_shutdownRecv;          //!< Receive no longer allowed
+  bool m_connected;             //!< Connection established
 
   //manage the state information
-  TracedValue<TcpStates_t> m_state;
-  bool m_closeOnEmpty;
+  TracedValue<TcpStates_t> m_state; //!< state information
+  bool m_closeOnEmpty;              //!< true if socket will close when buffer is empty
 
   //needed to queue data when in SYN_SENT state
-  std::queue<Ptr<Packet> > m_txBuffer;
-  uint32_t m_txBufferSize;
+  std::queue<Ptr<Packet> > m_txBuffer; //!< transmission buffer
+  uint32_t m_txBufferSize;             //!< transmission buffer size
 
   // Window management
-  uint32_t                       m_segmentSize;          //SegmentSize
-  uint32_t                       m_rxWindowSize;
-  uint32_t                       m_advertisedWindowSize; //Window to advertise
-  TracedValue<uint32_t>          m_cWnd;                 //Congestion window
-  uint32_t                       m_ssThresh;             //Slow Start Threshold
-  uint32_t                       m_initialCWnd;          //Initial cWnd value
+  uint32_t                       m_segmentSize;          //!< SegmentSize
+  uint32_t                       m_rxWindowSize;         //!< Receive window size
+  uint32_t                       m_advertisedWindowSize; //!< Window to advertise
+  TracedValue<uint32_t>          m_cWnd;                 //!< Congestion window
+  uint32_t                       m_ssThresh;             //!< Slow Start Threshold
+  uint32_t                       m_initialCWnd;          //!< Initial cWnd value
 
   // Round trip time estimation
-  Time m_lastMeasuredRtt;
+  Time m_lastMeasuredRtt; //!< Last measured RTT
 
   // Timer-related members
-  Time              m_cnTimeout; 
-  uint32_t          m_cnCount;
-  Time              m_persistTimeout; 
+  Time              m_cnTimeout;       //!< Timeout for connection retry
+  uint32_t          m_cnCount;         //!< Count of remaining connection retries
+  Time              m_persistTimeout;  //!< Time between sending 1-byte probes
 
   // Temporary queue for delivering data to application
-  std::queue<Ptr<Packet> > m_deliveryQueue;
-  uint32_t m_rxAvailable;
-  INetStreamSocket* m_nscTcpSocket;
+  std::queue<Ptr<Packet> > m_deliveryQueue; //!< receive buffer
+  uint32_t m_rxAvailable;                   //!< receive buffer available size
+  INetStreamSocket* m_nscTcpSocket;         //!< the real NSC TCP socket
 
   // Attributes
-  uint32_t m_sndBufSize;   // buffer limit for the outgoing queue
-  uint32_t m_rcvBufSize;   // maximum receive socket buffer size
+  uint32_t m_sndBufSize;   //!< buffer limit for the outgoing queue
+  uint32_t m_rcvBufSize;   //!< maximum receive socket buffer size
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/pending-data.h ns-3.19/src/internet/model/pending-data.h
--- ns-3.18.1/src/internet/model/pending-data.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/pending-data.h	2013-12-20 09:44:50.000000000 -0800
@@ -41,17 +41,48 @@
 class PendingData {
 public:
   PendingData ();
+  /**
+   * Constructor
+   * \param s size
+   * \param d data
+   * \param msg message size
+   * \param resp response size
+   */
   PendingData (uint32_t s, uint8_t* d = NULL, uint32_t msg = 0, uint32_t resp = 0);
-  PendingData (const std::string&); // Construct from string
-  PendingData (uint8_t*, uint32_t&, Packet*); // Construct from serialized buffer
-  PendingData (const PendingData&);   // Copy constructor
+  /**
+   * Constructor from string
+   * \param s string
+   */
+  PendingData (const std::string& s); // Construct from string
+
+  /**
+   * Copy constructor
+   * \param o object to copy
+   */
+  PendingData (const PendingData& o);   // Copy constructor
   virtual ~PendingData ();     // Destructor
+
+  /**
+   * Returns the size of the pending data
+   * \returns size of pending data
+   */
   uint32_t Size () const { return size; }
-  // Serialization
-  uint8_t*  Serialize (uint8_t*, uint32_t&); // Serialize to a buffer
-  uint8_t*  Construct (uint8_t*, uint32_t&); // Construct from buffer
-  virtual void Clear (); // Remove all associated data
-  virtual void Add (uint32_t s, const uint8_t* d = 0); // Add some data to end
+
+  /**
+   * \brief Remove all associated data
+   */
+  virtual void Clear ();
+
+  /**
+   * \brief Add some data to end
+   * \param s the data size.
+   * \param d the data to store.
+   */
+  virtual void Add (uint32_t s, const uint8_t* d = 0); //
+  /**
+   * \brief Add some data to end
+   * \param p packet containing the data.
+   */
   virtual void Add (Ptr<Packet> p);
   /**
    * This method returns the number of bytes in the PendingData buffer
@@ -89,9 +120,24 @@
    * \return seqOffset-seqFront
    */
   virtual uint32_t OffsetFromSeq (const SequenceNumber32& seqFront, const SequenceNumber32& seqOffset);
-  virtual Ptr<Packet> CopyFromOffset (uint32_t, uint32_t);  // Size, offset, ret packet
-  // Copy data, size, offset specified by sequence difference
-  virtual Ptr<Packet> CopyFromSeq (uint32_t, const SequenceNumber32&, const SequenceNumber32&);
+
+  /**
+   * \brief Copy data starting from a give offset
+   * \param s size of data to copy
+   * \param o offset
+   * \returns a packet containing the requested data
+   */
+  virtual Ptr<Packet> CopyFromOffset  (uint32_t s, uint32_t o);  // Size, offset, ret packet
+  /**
+   * \brief Copy data starting from a give offset
+   * \param s size of data to copy
+   * \param f Front sequence
+   * \param o Offset sequence
+   *
+   * \see PendingData::OffsetFromSeq()
+   * \returns a packet containing the requested data
+   */
+  virtual Ptr<Packet> CopyFromSeq (uint32_t s, const SequenceNumber32& f, const SequenceNumber32& o);
   /**
    * Permits object to clear any pending data between seqFront and 
    * seqOffset - 1).  Callers should check the return value to determine
@@ -102,15 +148,35 @@
    * \return number of bytes from the front that were removed from the buffer
    */
   virtual uint32_t RemoveToSeq (const SequenceNumber32& seqFront, const SequenceNumber32& seqOffset);
-  PendingData*   Copy () const;          // Create a copy of this header
-  PendingData*   CopyS (uint32_t);         // Copy with new size
-  PendingData*   CopySD (uint32_t, uint8_t*); // Copy with new size, new data
+
+  /**
+   * \brief Create a copy of self
+   * \returns copy of pending data
+   */
+  PendingData*   Copy () const;
+  /**
+   * \brief Create a copy of self with new size
+   *
+   * Assumes no associated data
+   * \param s new size
+   * \returns copy of pending data
+   */
+  PendingData*   CopyS (uint32_t s);         // Copy
+  /**
+   * \brief Create a copy of self with new size, new data
+   *
+   * Assumes no associated data
+   * \param s new size
+   * \param d new data
+   * \returns copy of pending data
+   */
+  PendingData*   CopySD (uint32_t s, uint8_t* d);
 public:
-  uint32_t size;        // Number of data bytes
-  std::vector<Ptr<Packet> > data;         // Corresponding data (may be null)
+  uint32_t size;        //!< Number of data bytes
+  std::vector<Ptr<Packet> > data;         //!< Corresponding data (may be null)
   // The next two fields allow simulated applications to exchange some info
-  uint32_t msgSize;     // Total size of message
-  uint32_t responseSize; // Size of response requested
+  uint32_t msgSize;     //!< Total size of message
+  uint32_t responseSize; //!< Size of response requested
 };
 
 } //namepsace ns3
diff -Naur ns-3.18.1/src/internet/model/rtt-estimator.cc ns-3.19/src/internet/model/rtt-estimator.cc
--- ns-3.18.1/src/internet/model/rtt-estimator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/rtt-estimator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RttEstimator);
+NS_OBJECT_ENSURE_REGISTERED (RttEstimator)
+  ;
 
 TypeId 
 RttEstimator::GetTypeId (void)
@@ -231,7 +232,8 @@
 //-----------------------------------------------------------------------------
 // Mean-Deviation Estimator
 
-NS_OBJECT_ENSURE_REGISTERED (RttMeanDeviation);
+NS_OBJECT_ENSURE_REGISTERED (RttMeanDeviation)
+  ;
 
 TypeId 
 RttMeanDeviation::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/rtt-estimator.h ns-3.19/src/internet/model/rtt-estimator.h
--- ns-3.18.1/src/internet/model/rtt-estimator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/rtt-estimator.h	2013-12-20 09:44:50.000000000 -0800
@@ -39,15 +39,26 @@
  */
 class RttHistory {
 public:
+  /**
+   * \brief Constructor - builds an RttHistory with the given parameters
+   * \param s First sequence number in packet sent
+   * \param c Number of bytes sent
+   * \param t Time this one was sent
+   */
   RttHistory (SequenceNumber32 s, uint32_t c, Time t);
+  /**
+   * \brief Copy constructor
+   * \param h the object to copy
+   */
   RttHistory (const RttHistory& h); // Copy constructor
 public:
-  SequenceNumber32  seq;  // First sequence number in packet sent
-  uint32_t        count;  // Number of bytes sent
-  Time            time;   // Time this one was sent
-  bool            retx;   // True if this has been retransmitted
+  SequenceNumber32  seq;  //!< First sequence number in packet sent
+  uint32_t        count;  //!< Number of bytes sent
+  Time            time;   //!< Time this one was sent
+  bool            retx;   //!< True if this has been retransmitted
 };
 
+/// Container for RttHistory objects
 typedef std::deque<RttHistory> RttHistory_t;
 
 /**
@@ -57,10 +68,18 @@
  */
 class RttEstimator : public Object {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   RttEstimator();
-  RttEstimator (const RttEstimator&); 
+  /**
+   * \brief Copy constructor
+   * \param r the object to copy
+   */
+  RttEstimator (const RttEstimator& r);
 
   virtual ~RttEstimator();
 
@@ -97,6 +116,10 @@
    */
   virtual Time RetransmitTimeout () = 0;
 
+  /**
+   * \brief Copy object
+   * \returns a copy of itself
+   */
   virtual Ptr<RttEstimator> Copy () const = 0;
 
   /**
@@ -139,16 +162,16 @@
   Time GetCurrentEstimate (void) const;
 
 private:
-  SequenceNumber32 m_next;    // Next expected sequence to be sent
-  RttHistory_t m_history;     // List of sent packet
-  uint16_t m_maxMultiplier;
-  Time m_initialEstimatedRtt;
+  SequenceNumber32 m_next;    //!< Next expected sequence to be sent
+  RttHistory_t m_history;     //!< List of sent packet
+  uint16_t m_maxMultiplier;   //!< Maximum RTO Multiplier
+  Time m_initialEstimatedRtt; //!< Initial RTT estimation
 
 protected:
-  Time         m_currentEstimatedRtt;     // Current estimate
-  Time         m_minRto;                  // minimum value of the timeout
-  uint32_t     m_nSamples;                // Number of samples
-  uint16_t     m_multiplier;              // RTO Multiplier
+  Time         m_currentEstimatedRtt;     //!< Current estimate
+  Time         m_minRto;                  //!< minimum value of the timeout
+  uint32_t     m_nSamples;                //!< Number of samples
+  uint16_t     m_multiplier;              //!< RTO Multiplier
 };
 
 /**
@@ -163,11 +186,19 @@
  */
 class RttMeanDeviation : public RttEstimator {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   RttMeanDeviation ();
 
-  RttMeanDeviation (const RttMeanDeviation&);
+  /**
+   * \brief Copy constructor
+   * \param r the object to copy
+   */
+  RttMeanDeviation (const RttMeanDeviation& r);
 
   virtual TypeId GetInstanceTypeId (void) const;
 
@@ -186,7 +217,7 @@
   Ptr<RttEstimator> Copy () const;
 
   /**
-   * \brief Resets sthe estimator.
+   * \brief Resets the estimator.
    */
   void Reset ();
 
@@ -197,8 +228,8 @@
   void Gain (double g);
 
 private:
-  double       m_gain;       // Filter gain
-  Time         m_variance;   // Current variance
+  double       m_gain;       //!< Filter gain
+  Time         m_variance;   //!< Current variance
 };
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/internet/model/sim_interface.h ns-3.19/src/internet/model/sim_interface.h
--- ns-3.18.1/src/internet/model/sim_interface.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/sim_interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -24,49 +24,122 @@
 
 #define NSC_VERSION 0x000500
 
+/**
+ * \ingroup nsctcp
+ * \brief Struct interface to NSC stack
+ */
 struct INetStack
 {
   virtual ~INetStack() {}
 
+  /**
+   * \brief Initialize the stack
+   * \param hz timer_interrupt frequency
+   */
   virtual void init (int hz) = 0;
 
+  /**
+   * \brief Deliver complete packet to the NSC network stack
+   * \param if_id interface ID
+   * \param data data
+   * \param datalen data length
+   */
   virtual void if_receive_packet (int if_id, const void *data, int datalen) = 0;
-
+  /**
+   * \brief Send complete packet to the NSC network stack
+   * \param data data
+   * \param datalen data length
+   */
   virtual void if_send_packet (const void *data, int datalen) = 0;
+  /**
+   * \brief Signal the completion of send procedure to the NSC network stack
+   * \param if_id interface ID
+   */
   virtual void if_send_finish (int if_id) = 0;
 
+  /**
+   * \brief Attach an interface to the stack
+   * \param addr address
+   * \param mask network mask
+   * \param mtu MTU
+   */
   virtual void if_attach (const char *addr, const char *mask, int mtu) = 0;
+  /**
+   * \brief Add a default gateway to the interface
+   * \param addr gateway address
+   */
   virtual void add_default_gateway (const char *addr) = 0;
 
-  /** Purely for debugging/diagnostic purposes. This returns the internal id
-   * of the stack instance.
+  /**
+   * \brief Returns the internal id of the stack instance.
+   *
+   * Purely for debugging/diagnostic purposes.
+   * \return internal stack id
    */
   virtual int get_id () = 0;
 
-  /** Should return a short one-word name of the stack. Eg. Linux 2.4.x ->
+  /**
+   * \brief Return a short one-word name of the stack
+   *
+   * Should return a short one-word name of the stack. Eg. Linux 2.4.x ->
    * linux24, FreeBSD 5.x -> freebsd5. This can be used to identify output
-   * from a stack, for example a packet trace file. */
+   * from a stack, for example a packet trace file.
+   * \return short one-word name of the stack
+   */
   virtual const char *get_name () = 0;
 
-  /** This is used so the simulator can call the stack timer_interrupt function
+  /**
+   * \brief Get the timer_interrupt frequency
+   *
+   * This is used so the simulator can call the stack timer_interrupt function
    * the correct amount of times per second. For example, lwip has a hz of 10,
    * which it returns here to say that it's timer_interrupt should be called
    * 10 times a second. FreeBSD uses 100, as does Linux 2.4, while Linux 2.6
    * uses 1000. (This is often configurable in the kernel in question, also.)
+   *
+   * \return frequency
    */
   virtual int get_hz () = 0;
 
+  /**
+   * \brief The stack timer_interrupt function
+   */
   virtual void timer_interrupt () = 0;
+
+  /**
+   * \brief Increment the time ticks
+   */
   virtual void increment_ticks () = 0;
 
+  /**
+   * \brief Set the buffer size
+   */
   virtual void buffer_size (int size) = 0;
 
+  /**
+   * \brief Create a new UDP socket
+   */
   virtual struct INetDatagramSocket *new_udp_socket () { return NULL; }
+  /**
+   * \brief Create a new TCP socket
+   */
   virtual struct INetStreamSocket *new_tcp_socket () { return NULL; }
+  /**
+   * \brief Create a new SCTP socket
+   */
   virtual struct INetStreamSocket *new_sctp_socket () { return NULL; }
 
   // The following I've made optional to implement for now. Eases
   // integration of new features.
+  /**
+   * \brief use sysctl to modify system parameters
+   * \param sysctl_name name of the parameter to modify
+   * \param oldval old value
+   * \param oldlenp old value length
+   * \param newval new value
+   * \param newlen new value length
+   * \returns
+   */
   virtual int sysctl (const char *sysctl_name, void *oldval, size_t *oldlenp,
                       void *newval, size_t newlen)
   {
@@ -77,6 +150,12 @@
   // to convert the string-value to something that the stack can handle.
   // The idea here is that this is a front-end to the sysctl(2) call,
   // much like the sysctl(8) program.
+  /**
+   * \brief Set system parameters using sysctl
+   * \param name name of the parameter to modify
+   * \param value new value
+   * \returns
+   */
   virtual int sysctl_set (const char *name, const char *value)
   {
     return -1;
@@ -85,45 +164,81 @@
   // same as above, cradle code is expected to convert the sysctl value
   // into a string.
   // returns length of the string in value, i.e. retval > len: 'output truncated'.
+  /**
+   * \brief Get system parameters using sysctl
+   * \param name name of the parameter to modify
+   * \param value value
+   * \param len value length
+   * \returns length of the string in value, i.e. retval > len: 'output truncated'.
+   */
   virtual int sysctl_get (const char *name, char *value, size_t len)
   {
     return -1;
   }
 
-  // this tells the cradle code to put the name of sysctl number 'idx'
-  // into name[].
-  // The idea is that this can be used to get a list of all available sysctls:
-  // char buf[256]
-  // for (i=0; sysctl_getnum(i, buf, sizeof(buf)) > 0 ;i++)
-  //    puts(buf);
-  // returns -1 if idx is out of range and the length of the sysctl name otherwise.
+  /**
+   * \brief Tell the cradle code to put the name of sysctl number 'idx' into name[].
+   *
+   * The idea is that this can be used to get a list of all available sysctls:
+   * \verbatim
+     char buf[256]
+     for (i=0; sysctl_getnum(i, buf, sizeof(buf)) > 0 ;i++)
+        puts(buf);
+     \endverbatim
+   *
+   * \param idx index
+   * \param name sysctl name
+   * \param len sysctl length
+   * \returns -1 if idx is out of range and the length of the sysctl name otherwise.
+   */
   virtual int sysctl_getnum (size_t idx, char *name, size_t len)
   {
     return -1;
   }
 
+  /**
+   * \brief Show the NSC configuration
+   */
   virtual void show_config ()
   {
     ;
   }
 
-  /* Optional functions used to get and set variables for this stack */
+  /**
+   * \brief Optional function to get variables for this stack
+   * \param var the variable
+   * \param result the result
+   * \param result_len result length
+   * \returns true on success
+   */
   virtual bool get_var (const char *var, char *result, int result_len)
   {
     return false;
   }
 
+  /**
+   * \brief Optional function to set variables for this stack
+   * \param var the variable
+   * \param val the new value
+   * \returns true on success
+   */
   virtual bool set_var (const char *var, const char *val)
   {
     return false;
   }
 
-  /** The level of debugging or diagnostic information to print out. This
-   * normally means kernel messages printed out during initialisation but
-   * may also include extra debugging messages that are part of NSC. */
+  /**
+   * \brief Set the level of debugging or diagnostic information to print out.
+   *
+   * This normally means kernel messages printed out during initialisation but
+   * may also include extra debugging messages that are part of NSC.
+   *
+   * \param level debugging/diagnostic level
+   */
   virtual void set_diagnostic (int level) {}
 
-  /** Simple interface to support sending any textual command to a stack
+  /**
+   * \brief Simple interface to support sending any textual command to a stack
    *
    * @returns 0 on success
    */
@@ -133,62 +248,173 @@
   }
 };
 
+/**
+ * \ingroup nsctcp
+ * \brief Struct interface to NSC Stream (i.e., TCP) Sockets
+ */
 struct INetStreamSocket
 {
   virtual ~INetStreamSocket() {}
 
+  /**
+   * \brief Connect to a remote peer
+   */
   virtual void connect (const char *, int) = 0;
+  /**
+   * \brief Disconnect from a remote peer
+   */
   virtual void disconnect () = 0;
+  /**
+   * \brief Put the socket in Listening state on a port
+   */
   virtual void listen (int) = 0;
+  /**
+   * \brief Accept an incoming connection
+   */
   virtual int accept (INetStreamSocket **) = 0;
+  /**
+   * \brief Send some data
+   * \param data the data
+   * \param datalen data length
+   * \return the number of data sent or -1 on error
+   */
   virtual int send_data (const void *data, int datalen) = 0;
+  /**
+   * \brief Read some data
+   * \param buf the buffer to store the data
+   * \param buflen buffer length
+   * \return the number of data read or -1 on error
+   */
   virtual int read_data (void *buf, int *buflen) = 0;
-  /* We need to pass the option name in as a string here. The reason for
+  /**
+   * \brief Set the socket options
+   *
+   * We need to pass the option name in as a string here. The reason for
    * this is that different operating systems you compile on will have
-   * different numbers defined for the constants SO_SNDBUF and so on. */
+   * different numbers defined for the constants SO_SNDBUF and so on.
+   *
+   * \param optname name of the option
+   * \param val option value
+   * \param valsize size of the option value
+   * \returns
+   */
   virtual int setsockopt (char *optname, void *val, size_t valsize) = 0;
+  /**
+   * \brief Print the socket state
+   */
   virtual void print_state (FILE *) = 0;
+  /**
+   * \brief Check the connection state
+   * \returns true if socket is in connected state
+   */
   virtual bool is_connected () = 0;
+  /**
+   * \brief Check the listening state
+   * \returns true if socket is in listening state
+   */
   virtual bool is_listening () = 0;
-
+  /**
+   * \brief Get the peer name
+   *
+   * \note not implemented
+   *
+   * \param sa sockaddr structure to fill
+   * \param salen sockaddr structure length
+   * \returns -1 on error (always returns -1)
+   */
   virtual int getpeername (struct sockaddr *sa, size_t *salen) {
     return -1;
   }
+  /**
+   * \brief Get the socket local name
+   *
+   * \note not implemented
+   *
+   * \param sa sockaddr structure to fill
+   * \param salen sockaddr structure length
+   * \returns -1 on error (always returns -1)
+   */
   virtual int getsockname (struct sockaddr *sa, size_t *salen) {
     return -1;
   }
-  /* Optional functions used to get and set variables for this TCP
-   * connection. */
+  /**
+   * \brief Optional function used to get variables for this TCP connection.
+   *
+   * \note not implemented
+   *
+   * \param var variable requested
+   * \param result result result
+   * \param result_len result length
+   * \return always false
+   */
   virtual bool get_var (const char *var, char *result, int result_len)
   {
     return false;
   }
-
+  /**
+   * \brief Optional function used to set variables for this TCP connection.
+   *
+   * \note not implemented
+   *
+   * \param var variable to set
+   * \param val value to set
+   * \return always false
+   */
   virtual bool set_var (const char *var, const char *val)
   {
     return false;
   }
 };
 
+/**
+ * \ingroup nsctcp
+ * \brief Struct interface to NSC Datagram (i.e., UDP) Sockets
+ */
 struct INetDatagramSocket
 {
   virtual ~INetDatagramSocket() {}
 
+  /**
+   * \brief Set the destination address and port
+   */
   virtual void set_destination (const char *, int) = 0;
+  /**
+   * \brief Send a datagram
+   * \param data the data
+   * \param datalen data length
+   */
   virtual void send_data (const void *data, int datalen) = 0;
 };
+
+/**
+ * \ingroup nsctcp
+ * \brief Struct interface to NSC send capabilities
+ */
 struct ISendCallback
 {
   virtual ~ISendCallback() {}
 
+  /**
+   * \brief Invoked by NSCs 'ethernet driver' to re-inject a packet into ns-3.
+   */
   virtual void send_callback (const void *data, int datalen) = 0;
 };
 
+/**
+ * \ingroup nsctcp
+ * \brief Struct interface to NSC soft interrupt capabilities
+ */
 struct IInterruptCallback
 {
   virtual ~IInterruptCallback() {}
 
+  /**
+   * \brief Called by the NSC stack whenever something of interest has happened
+   */
   virtual void wakeup () = 0;
+  /**
+   * \brief Get the actual time
+   */
   virtual void gettime (unsigned int *, unsigned int *) = 0;
 };
 
diff -Naur ns-3.18.1/src/internet/model/tcp-header.cc ns-3.19/src/internet/model/tcp-header.cc
--- ns-3.18.1/src/internet/model/tcp-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpHeader);
+NS_OBJECT_ENSURE_REGISTERED (TcpHeader)
+  ;
 
 TcpHeader::TcpHeader ()
   : m_sourcePort (0),
diff -Naur ns-3.18.1/src/internet/model/tcp-header.h ns-3.19/src/internet/model/tcp-header.h
--- ns-3.18.1/src/internet/model/tcp-header.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -122,29 +122,69 @@
   uint16_t GetUrgentPointer () const;
 
   /**
-   * \param source the ip source to use in the underlying
-   *        ip packet.
-   * \param destination the ip destination to use in the
-   *        underlying ip packet.
-   * \param protocol the protocol number to use in the underlying
-   *        ip packet.
+   * \brief Initialize the TCP checksum.
    *
    * If you want to use tcp checksums, you should call this
    * method prior to adding the header to a packet.
+   *
+   * \param source the IP source to use in the underlying
+   *        IP packet.
+   * \param destination the IP destination to use in the
+   *        underlying IP packet.
+   * \param protocol the protocol number to use in the underlying
+   *        IP packet.
+   *
    */
   void InitializeChecksum (Ipv4Address source, 
                            Ipv4Address destination,
                            uint8_t protocol);
+
+  /**
+   * \brief Initialize the TCP checksum.
+   *
+   * If you want to use tcp checksums, you should call this
+   * method prior to adding the header to a packet.
+   *
+   * \param source the IP source to use in the underlying
+   *        IP packet.
+   * \param destination the IP destination to use in the
+   *        underlying IP packet.
+   * \param protocol the protocol number to use in the underlying
+   *        IP packet.
+   *
+   */
   void InitializeChecksum (Ipv6Address source, 
                            Ipv6Address destination,
                            uint8_t protocol);
+
+  /**
+   * \brief Initialize the TCP checksum.
+   *
+   * If you want to use tcp checksums, you should call this
+   * method prior to adding the header to a packet.
+   *
+   * \param source the IP source to use in the underlying
+   *        IP packet.
+   * \param destination the IP destination to use in the
+   *        underlying IP packet.
+   * \param protocol the protocol number to use in the underlying
+   *        IP packet.
+   *
+   */
   void InitializeChecksum (Address source, 
                            Address destination,
                            uint8_t protocol);
 
+  /**
+   * \brief TCP flag field values
+   */
   typedef enum { NONE = 0, FIN = 1, SYN = 2, RST = 4, PSH = 8, ACK = 16, 
                  URG = 32, ECE = 64, CWR = 128} Flags_t;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -159,22 +199,27 @@
   bool IsChecksumOk (void) const;
 
 private:
+  /**
+   * \brief Calculate the header checksum
+   * \param size packet size
+   * \returns the checksum
+   */
   uint16_t CalculateHeaderChecksum (uint16_t size) const;
-  uint16_t m_sourcePort;
-  uint16_t m_destinationPort;
-  SequenceNumber32 m_sequenceNumber;
-  SequenceNumber32 m_ackNumber;
-  uint8_t m_length; // really a uint4_t
-  uint8_t m_flags;      // really a uint6_t
-  uint16_t m_windowSize;
-  uint16_t m_urgentPointer;
-
-  Address m_source;
-  Address m_destination;
-  uint8_t m_protocol;
+  uint16_t m_sourcePort;        //!< Source port
+  uint16_t m_destinationPort;   //!< Destination port
+  SequenceNumber32 m_sequenceNumber;  //!< Sequence number
+  SequenceNumber32 m_ackNumber;       //!< ACK number
+  uint8_t m_length;             //!< Length (really a uint4_t)
+  uint8_t m_flags;              //!< Flags (really a uint6_t)
+  uint16_t m_windowSize;        //!< Window size
+  uint16_t m_urgentPointer;     //!< Urgent pointer
+
+  Address m_source;       //!< Source IP address
+  Address m_destination;  //!< Destination IP address
+  uint8_t m_protocol;     //!< Protocol number
 
-  bool m_calcChecksum;
-  bool m_goodChecksum;
+  bool m_calcChecksum;    //!< Flag to calculate checksum
+  bool m_goodChecksum;    //!< Flag to indicate that checksum is correct
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-l4-protocol.cc ns-3.19/src/internet/model/tcp-l4-protocol.cc
--- ns-3.18.1/src/internet/model/tcp-l4-protocol.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-l4-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -51,7 +51,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpL4Protocol);
+NS_OBJECT_ENSURE_REGISTERED (TcpL4Protocol)
+  ;
 
 //TcpL4Protocol stuff----------------------------------------------------------
 
@@ -506,7 +507,7 @@
     }
   NS_ASSERT_MSG (endPoints.size () == 1, "Demux returned more than one endpoint");
   NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" forwarding up to endpoint/socket");
-  (*endPoints.begin ())->ForwardUp (packet, ipHeader, tcpHeader.GetSourcePort ());
+  (*endPoints.begin ())->ForwardUp (packet, ipHeader, tcpHeader.GetSourcePort (), interface);
   return IpL4Protocol::RX_OK;
 }
 
diff -Naur ns-3.18.1/src/internet/model/tcp-l4-protocol.h ns-3.19/src/internet/model/tcp-l4-protocol.h
--- ns-3.18.1/src/internet/model/tcp-l4-protocol.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-l4-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -55,43 +55,123 @@
 
 class TcpL4Protocol : public IpL4Protocol {
 public:
-  static TypeId GetTypeId (void);
-  static const uint8_t PROT_NUMBER;
   /**
-   * \brief Constructor
+   * \brief Get the type ID.
+   * \return the object TypeId
    */
+  static TypeId GetTypeId (void);
+  static const uint8_t PROT_NUMBER; //!< protocol number (0x6)
+
   TcpL4Protocol ();
   virtual ~TcpL4Protocol ();
 
+  /**
+   * Set node associated with this stack
+   * \param node the node
+   */
   void SetNode (Ptr<Node> node);
 
   virtual int GetProtocolNumber (void) const;
 
   /**
+   * \brief Create a TCP socket
    * \return A smart Socket pointer to a TcpSocket allocated by this instance
    * of the TCP protocol
    */
   Ptr<Socket> CreateSocket (void);
+  /**
+   * \brief Create a TCP socket
+   * \return A smart Socket pointer to a TcpSocket allocated by this instance
+   * of the TCP protocol
+   *
+   * \warning using a socketTypeId other than TCP is a bad idea.
+   *
+   * \param socketTypeId the socket TypeId
+   */
   Ptr<Socket> CreateSocket (TypeId socketTypeId);
 
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (void);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param address address to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address address);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (uint16_t port);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param address address to use
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param localAddress local address to use
+   * \param localPort local port to use
+   * \param peerAddress remote address to use
+   * \param peerPort remote port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
                           Ipv4Address peerAddress, uint16_t peerPort);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (void);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \param address address to use
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (Ipv6Address address);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (uint16_t port);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \param address address to use
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (Ipv6Address address, uint16_t port);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \param localAddress local address to use
+   * \param localPort local port to use
+   * \param peerAddress remote address to use
+   * \param peerPort remote port to use
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (Ipv6Address localAddress, uint16_t localPort,
                            Ipv6Address peerAddress, uint16_t peerPort);
 
+  /**
+   * \brief Remove an IPv4 Endpoint.
+   * \param endPoint the end point to remove
+   */
   void DeAllocate (Ipv4EndPoint *endPoint);
+  /**
+   * \brief Remove an IPv6 Endpoint.
+   * \param endPoint the end point to remove
+   */
   void DeAllocate (Ipv6EndPoint *endPoint);
 
   /**
-   * \brief Send a packet via TCP
+   * \brief Send a packet via TCP (IPv4)
    * \param packet The packet to send
    * \param saddr The source Ipv4Address
    * \param daddr The destination Ipv4Address
@@ -102,33 +182,27 @@
   void Send (Ptr<Packet> packet,
              Ipv4Address saddr, Ipv4Address daddr, 
              uint16_t sport, uint16_t dport, Ptr<NetDevice> oif = 0);
+  /**
+   * \brief Send a packet via TCP (IPv6)
+   * \param packet The packet to send
+   * \param saddr The source Ipv4Address
+   * \param daddr The destination Ipv4Address
+   * \param sport The source port number
+   * \param dport The destination port number
+   * \param oif The output interface bound. Defaults to null (unspecified).
+   */
   void Send (Ptr<Packet> packet,
              Ipv6Address saddr, Ipv6Address daddr, 
              uint16_t sport, uint16_t dport, Ptr<NetDevice> oif = 0);
-  /**
-   * \brief Receive a packet up the protocol stack
-   * \param p The Packet to dump the contents into
-   * \param header IPv4 Header information
-   * \param incomingInterface The Ipv4Interface it was received on
-   */
+
+
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                                 Ipv4Header const &header,
-                                                 Ptr<Ipv4Interface> incomingInterface);
+                                               Ipv4Header const &header,
+                                               Ptr<Ipv4Interface> incomingInterface);
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                                 Ipv6Header const &header,
-                                                 Ptr<Ipv6Interface> interface);
+                                               Ipv6Header const &header,
+                                               Ptr<Ipv6Interface> incomingInterface);
 
-  /**
-   * \brief Receive an ICMP packet
-   * \param icmpSource The IP address of the source of the packet.
-   * \param icmpTtl The time to live from the IP header
-   * \param icmpType The type of the message from the ICMP header
-   * \param icmpCode The message code from the ICMP header
-   * \param icmpInfo 32-bit integer carrying informational value of varying semantics.
-   * \param payloadSource The IP source address from the IP header of the packet
-   * \param payloadDestination The IP destination address from the IP header of the packet
-   * \param payload Payload of the ICMP packet
-   */
   virtual void ReceiveIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
                             uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
                             Ipv4Address payloadSource,Ipv4Address payloadDestination,
@@ -153,23 +227,35 @@
    */
   virtual void NotifyNewAggregate ();
 private:
-  Ptr<Node> m_node;
-  Ipv4EndPointDemux *m_endPoints;
-  Ipv6EndPointDemux *m_endPoints6;
-  TypeId m_rttTypeId;
-  TypeId m_socketTypeId;
+  Ptr<Node> m_node; //!< the node this stack is associated with
+  Ipv4EndPointDemux *m_endPoints; //!< A list of IPv4 end points.
+  Ipv6EndPointDemux *m_endPoints6; //!< A list of IPv6 end points.
+  TypeId m_rttTypeId; //!< The RTT Estimator TypeId
+  TypeId m_socketTypeId; //!< The socket TypeId
 private:
   friend class TcpSocketBase;
   void SendPacket (Ptr<Packet>, const TcpHeader &,
                    Ipv4Address, Ipv4Address, Ptr<NetDevice> oif = 0);
   void SendPacket (Ptr<Packet>, const TcpHeader &,
                    Ipv6Address, Ipv6Address, Ptr<NetDevice> oif = 0);
-  TcpL4Protocol (const TcpL4Protocol &o);
-  TcpL4Protocol &operator = (const TcpL4Protocol &o);
 
-  std::vector<Ptr<TcpSocketBase> > m_sockets;
-  IpL4Protocol::DownTargetCallback m_downTarget;
-  IpL4Protocol::DownTargetCallback6 m_downTarget6;
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and not implemented to avoid misuse
+   */
+  TcpL4Protocol (const TcpL4Protocol &);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and not implemented to avoid misuse
+   * \returns
+   */
+  TcpL4Protocol &operator = (const TcpL4Protocol &);
+
+  std::vector<Ptr<TcpSocketBase> > m_sockets;      //!< list of sockets
+  IpL4Protocol::DownTargetCallback m_downTarget;   //!< Callback to send packets over IPv4
+  IpL4Protocol::DownTargetCallback6 m_downTarget6; //!< Callback to send packets over IPv6
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-newreno.cc ns-3.19/src/internet/model/tcp-newreno.cc
--- ns-3.18.1/src/internet/model/tcp-newreno.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-newreno.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpNewReno);
+NS_OBJECT_ENSURE_REGISTERED (TcpNewReno)
+  ;
 
 TypeId
 TcpNewReno::GetTypeId (void)
@@ -80,7 +81,7 @@
 {
 }
 
-/** We initialize m_cWnd from this function, after attributes initialized */
+/* We initialize m_cWnd from this function, after attributes initialized */
 int
 TcpNewReno::Listen (void)
 {
@@ -89,7 +90,7 @@
   return TcpSocketBase::Listen ();
 }
 
-/** We initialize m_cWnd from this function, after attributes initialized */
+/* We initialize m_cWnd from this function, after attributes initialized */
 int
 TcpNewReno::Connect (const Address & address)
 {
@@ -98,7 +99,7 @@
   return TcpSocketBase::Connect (address);
 }
 
-/** Limit the size of in-flight data by cwnd and receiver's rxwin */
+/* Limit the size of in-flight data by cwnd and receiver's rxwin */
 uint32_t
 TcpNewReno::Window (void)
 {
@@ -112,7 +113,7 @@
   return CopyObject<TcpNewReno> (this);
 }
 
-/** New ACK (up to seqnum seq) received. Increase cwnd and call TcpSocketBase::NewAck() */
+/* New ACK (up to seqnum seq) received. Increase cwnd and call TcpSocketBase::NewAck() */
 void
 TcpNewReno::NewAck (const SequenceNumber32& seq)
 {
@@ -157,7 +158,7 @@
   TcpSocketBase::NewAck (seq);
 }
 
-/** Cut cwnd and enter fast recovery mode upon triple dupack */
+/* Cut cwnd and enter fast recovery mode upon triple dupack */
 void
 TcpNewReno::DupAck (const TcpHeader& t, uint32_t count)
 {
@@ -186,7 +187,7 @@
     };
 }
 
-/** Retransmit timeout */
+/* Retransmit timeout */
 void
 TcpNewReno::Retransmit (void)
 {
diff -Naur ns-3.18.1/src/internet/model/tcp-newreno.h ns-3.19/src/internet/model/tcp-newreno.h
--- ns-3.18.1/src/internet/model/tcp-newreno.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-newreno.h	2013-12-20 09:44:50.000000000 -0800
@@ -36,11 +36,19 @@
 class TcpNewReno : public TcpSocketBase
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   /**
    * Create an unbound tcp socket.
    */
   TcpNewReno (void);
+  /**
+   * \brief Copy constructor
+   * \param sock the object to copy
+   */
   TcpNewReno (const TcpNewReno& sock);
   virtual ~TcpNewReno (void);
 
@@ -62,16 +70,19 @@
   virtual void     SetInitialCwnd (uint32_t cwnd);
   virtual uint32_t GetInitialCwnd (void) const;
 private:
-  void InitializeCwnd (void);            // set m_cWnd when connection starts
+  /**
+   * \brief Set the congestion window when connection starts
+   */
+  void InitializeCwnd (void);
 
 protected:
-  TracedValue<uint32_t>  m_cWnd;         //< Congestion window
-  uint32_t               m_ssThresh;     //< Slow Start Threshold
-  uint32_t               m_initialCWnd;  //< Initial cWnd value
-  SequenceNumber32       m_recover;      //< Previous highest Tx seqnum for fast recovery
-  uint32_t               m_retxThresh;   //< Fast Retransmit threshold
-  bool                   m_inFastRec;    //< currently in fast recovery
-  bool                   m_limitedTx;    //< perform limited transmit
+  TracedValue<uint32_t>  m_cWnd;         //!< Congestion window
+  uint32_t               m_ssThresh;     //!< Slow Start Threshold
+  uint32_t               m_initialCWnd;  //!< Initial cWnd value
+  SequenceNumber32       m_recover;      //!< Previous highest Tx seqnum for fast recovery
+  uint32_t               m_retxThresh;   //!< Fast Retransmit threshold
+  bool                   m_inFastRec;    //!< currently in fast recovery
+  bool                   m_limitedTx;    //!< perform limited transmit
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-reno.cc ns-3.19/src/internet/model/tcp-reno.cc
--- ns-3.18.1/src/internet/model/tcp-reno.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-reno.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpReno);
+NS_OBJECT_ENSURE_REGISTERED (TcpReno)
+  ;
 
 TypeId
 TcpReno::GetTypeId (void)
@@ -72,7 +73,7 @@
 {
 }
 
-/** We initialize m_cWnd from this function, after attributes initialized */
+/* We initialize m_cWnd from this function, after attributes initialized */
 int
 TcpReno::Listen (void)
 {
@@ -81,7 +82,7 @@
   return TcpSocketBase::Listen ();
 }
 
-/** We initialize m_cWnd from this function, after attributes initialized */
+/* We initialize m_cWnd from this function, after attributes initialized */
 int
 TcpReno::Connect (const Address & address)
 {
@@ -90,7 +91,7 @@
   return TcpSocketBase::Connect (address);
 }
 
-/** Limit the size of in-flight data by cwnd and receiver's rxwin */
+/* Limit the size of in-flight data by cwnd and receiver's rxwin */
 uint32_t
 TcpReno::Window (void)
 {
@@ -104,7 +105,7 @@
   return CopyObject<TcpReno> (this);
 }
 
-/** New ACK (up to seqnum seq) received. Increase cwnd and call TcpSocketBase::NewAck() */
+/* New ACK (up to seqnum seq) received. Increase cwnd and call TcpSocketBase::NewAck() */
 void
 TcpReno::NewAck (const SequenceNumber32& seq)
 {
diff -Naur ns-3.18.1/src/internet/model/tcp-reno.h ns-3.19/src/internet/model/tcp-reno.h
--- ns-3.18.1/src/internet/model/tcp-reno.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-reno.h	2013-12-20 09:44:50.000000000 -0800
@@ -38,11 +38,19 @@
 class TcpReno : public TcpSocketBase
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   /**
    * Create an unbound tcp socket.
    */
   TcpReno (void);
+  /**
+   * \brief Copy constructor
+   * \param sock the object to copy
+   */
   TcpReno (const TcpReno& sock);
   virtual ~TcpReno (void);
 
@@ -64,14 +72,17 @@
   virtual void     SetInitialCwnd (uint32_t cwnd);
   virtual uint32_t GetInitialCwnd (void) const;
 private:
-  void InitializeCwnd (void);            // set m_cWnd when connection starts
+  /**
+   * \brief Set the congestion window when connection starts
+   */
+  void InitializeCwnd (void);
 
 protected:
-  TracedValue<uint32_t>  m_cWnd;         //< Congestion window
-  uint32_t               m_ssThresh;     //< Slow Start Threshold
-  uint32_t               m_initialCWnd;  //< Initial cWnd value
-  uint32_t               m_retxThresh;   //< Fast Retransmit threshold
-  bool                   m_inFastRec;    //< currently in fast recovery
+  TracedValue<uint32_t>  m_cWnd;         //!< Congestion window
+  uint32_t               m_ssThresh;     //!< Slow Start Threshold
+  uint32_t               m_initialCWnd;  //!< Initial cWnd value
+  uint32_t               m_retxThresh;   //!< Fast Retransmit threshold
+  bool                   m_inFastRec;    //!< currently in fast recovery
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-rfc793.cc ns-3.19/src/internet/model/tcp-rfc793.cc
--- ns-3.18.1/src/internet/model/tcp-rfc793.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-rfc793.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpRfc793);
+NS_OBJECT_ENSURE_REGISTERED (TcpRfc793)
+  ;
 
 TypeId
 TcpRfc793::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/tcp-rfc793.h ns-3.19/src/internet/model/tcp-rfc793.h
--- ns-3.18.1/src/internet/model/tcp-rfc793.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-rfc793.h	2013-12-20 09:44:50.000000000 -0800
@@ -39,11 +39,19 @@
 class TcpRfc793 : public TcpSocketBase
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   /**
    * Create an unbound tcp socket.
    */
   TcpRfc793 (void);
+  /**
+   * \brief Copy constructor
+   * \param sock the object to copy
+   */
   TcpRfc793 (const TcpRfc793& sock);
   virtual ~TcpRfc793 (void);
 
diff -Naur ns-3.18.1/src/internet/model/tcp-rx-buffer.h ns-3.19/src/internet/model/tcp-rx-buffer.h
--- ns-3.18.1/src/internet/model/tcp-rx-buffer.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-rx-buffer.h	2013-12-20 09:44:50.000000000 -0800
@@ -40,20 +40,67 @@
 class TcpRxBuffer : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
+  /**
+   * \brief Constructor
+   * \param n initial Sequence number to be received
+   */
   TcpRxBuffer (uint32_t n = 0);
   virtual ~TcpRxBuffer ();
 
   // Accessors
+  /**
+   * \brief Get Next Rx Sequence number
+   * \returns Next Rx Sequence number
+   */
   SequenceNumber32 NextRxSequence (void) const;
+  /**
+   * \brief Get the lowest sequence number that this TcpRxBuffer cannot accept
+   * \returns the lowest sequence number that this TcpRxBuffer cannot accept
+   */
   SequenceNumber32 MaxRxSequence (void) const;
+  /**
+   * \brief Increment the Next Sequence number
+   */
   void IncNextRxSequence (void);
+  /**
+   * \brief Set the Next Sequence number
+   * \param s the Sequence number
+   */
   void SetNextRxSequence (const SequenceNumber32& s);
+  /**
+   * \brief Set the FIN Sequence number (i.e., the one closing the connection)
+   * \param s the Sequence number
+   */
   void SetFinSequence (const SequenceNumber32& s);
+  /**
+   * \brief Get the Maximum buffer size
+   * \returns the Maximum buffer size
+   */
   uint32_t MaxBufferSize (void) const;
+  /**
+   * \brief Set the Maximum buffer size
+   * \param s the Maximum buffer size
+   */
   void SetMaxBufferSize (uint32_t s);
+  /**
+   * \brief Get the actual buffer occupancy
+   * \returns buffer occupancy (in bytes)
+   */
   uint32_t Size (void) const;
+  /**
+   * \brief Get the actual number of bytes available to be read
+   * \returns size of available data (in bytes)
+   */
   uint32_t Available () const;
+  /**
+   * \brief Check if the buffer did receive all the data (and the connection is closed)
+   * \returns true if all data have been received
+   */
   bool Finished (void);
 
   /**
@@ -63,6 +110,8 @@
    * removing data from the buffer that overlaps the tail of the inputted
    * packet
    *
+   * \param p packet
+   * \param tcph packet's TCP header
    * \return True when success, false otherwise.
    */
   bool Add (Ptr<Packet> p, TcpHeader const& tcph);
@@ -70,18 +119,21 @@
   /**
    * Extract data from the head of the buffer as indicated by nextRxSeq.
    * The extracted data is going to be forwarded to the application.
+   *
+   * \param maxSize maximum number of bytes to extract
+   * \returns a packet
    */
   Ptr<Packet> Extract (uint32_t maxSize);
 public:
+  /// container for data stored in the buffer
   typedef std::map<SequenceNumber32, Ptr<Packet> >::iterator BufIterator;
-  TracedValue<SequenceNumber32> m_nextRxSeq; //< Seqnum of the first missing byte in data (RCV.NXT)
-  SequenceNumber32 m_finSeq;                 //< Seqnum of the FIN packet
-  bool m_gotFin;                             //< Did I received FIN packet?
-  uint32_t m_size;                           //< Number of total data bytes in the buffer, not necessarily contiguous
-  uint32_t m_maxBuffer;                      //< Upper bound of the number of data bytes in buffer (RCV.WND)
-  uint32_t m_availBytes;                     //< Number of bytes available to read, i.e. contiguous block at head
-  std::map<SequenceNumber32, Ptr<Packet> > m_data;
-  //< Corresponding data (may be null)
+  TracedValue<SequenceNumber32> m_nextRxSeq; //!< Seqnum of the first missing byte in data (RCV.NXT)
+  SequenceNumber32 m_finSeq;                 //!< Seqnum of the FIN packet
+  bool m_gotFin;                             //!< Did I received FIN packet?
+  uint32_t m_size;                           //!< Number of total data bytes in the buffer, not necessarily contiguous
+  uint32_t m_maxBuffer;                      //!< Upper bound of the number of data bytes in buffer (RCV.WND)
+  uint32_t m_availBytes;                     //!< Number of bytes available to read, i.e. contiguous block at head
+  std::map<SequenceNumber32, Ptr<Packet> > m_data; //!< Corresponding data (may be null)
 };
 
 } //namepsace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-socket-base.cc ns-3.19/src/internet/model/tcp-socket-base.cc
--- ns-3.18.1/src/internet/model/tcp-socket-base.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-socket-base.cc	2013-12-20 09:44:50.000000000 -0800
@@ -54,7 +54,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpSocketBase);
+NS_OBJECT_ENSURE_REGISTERED (TcpSocketBase)
+  ;
 
 TypeId
 TcpSocketBase::GetTypeId (void)
@@ -210,42 +211,42 @@
   CancelAllTimers ();
 }
 
-/** Associate a node with this TCP socket */
+/* Associate a node with this TCP socket */
 void
 TcpSocketBase::SetNode (Ptr<Node> node)
 {
   m_node = node;
 }
 
-/** Associate the L4 protocol (e.g. mux/demux) with this socket */
+/* Associate the L4 protocol (e.g. mux/demux) with this socket */
 void
 TcpSocketBase::SetTcp (Ptr<TcpL4Protocol> tcp)
 {
   m_tcp = tcp;
 }
 
-/** Set an RTT estimator with this socket */
+/* Set an RTT estimator with this socket */
 void
 TcpSocketBase::SetRtt (Ptr<RttEstimator> rtt)
 {
   m_rtt = rtt;
 }
 
-/** Inherit from Socket class: Returns error code */
+/* Inherit from Socket class: Returns error code */
 enum Socket::SocketErrno
 TcpSocketBase::GetErrno (void) const
 {
   return m_errno;
 }
 
-/** Inherit from Socket class: Returns socket type, NS3_SOCK_STREAM */
+/* Inherit from Socket class: Returns socket type, NS3_SOCK_STREAM */
 enum Socket::SocketType
 TcpSocketBase::GetSocketType (void) const
 {
   return NS3_SOCK_STREAM;
 }
 
-/** Inherit from Socket class: Returns associated node */
+/* Inherit from Socket class: Returns associated node */
 Ptr<Node>
 TcpSocketBase::GetNode (void) const
 {
@@ -253,7 +254,7 @@
   return m_node;
 }
 
-/** Inherit from Socket class: Bind socket to an end-point in TcpL4Protocol */
+/* Inherit from Socket class: Bind socket to an end-point in TcpL4Protocol */
 int
 TcpSocketBase::Bind (void)
 {
@@ -282,7 +283,7 @@
   return SetupCallback ();
 }
 
-/** Inherit from Socket class: Bind socket (with specific address) to an end-point in TcpL4Protocol */
+/* Inherit from Socket class: Bind socket (with specific address) to an end-point in TcpL4Protocol */
 int
 TcpSocketBase::Bind (const Address &address)
 {
@@ -352,7 +353,7 @@
   return SetupCallback ();
 }
 
-/** Inherit from Socket class: Initiate connection to a remote address:port */
+/* Inherit from Socket class: Initiate connection to a remote address:port */
 int
 TcpSocketBase::Connect (const Address & address)
 {
@@ -424,7 +425,7 @@
   return DoConnect ();
 }
 
-/** Inherit from Socket class: Listen on the endpoint for an incoming connection */
+/* Inherit from Socket class: Listen on the endpoint for an incoming connection */
 int
 TcpSocketBase::Listen (void)
 {
@@ -441,7 +442,7 @@
   return 0;
 }
 
-/** Inherit from Socket class: Kill this socket and signal the peer (if any) */
+/* Inherit from Socket class: Kill this socket and signal the peer (if any) */
 int
 TcpSocketBase::Close (void)
 {
@@ -468,7 +469,7 @@
   return DoClose ();
 }
 
-/** Inherit from Socket class: Signal a termination of send */
+/* Inherit from Socket class: Signal a termination of send */
 int
 TcpSocketBase::ShutdownSend (void)
 {
@@ -502,7 +503,7 @@
   return 0;
 }
 
-/** Inherit from Socket class: Signal a termination of receive */
+/* Inherit from Socket class: Signal a termination of receive */
 int
 TcpSocketBase::ShutdownRecv (void)
 {
@@ -511,7 +512,7 @@
   return 0;
 }
 
-/** Inherit from Socket class: Send a packet. Parameter flags is not used.
+/* Inherit from Socket class: Send a packet. Parameter flags is not used.
     Packet has no TCP header. Invoked by upper-layer application */
 int
 TcpSocketBase::Send (Ptr<Packet> p, uint32_t flags)
@@ -546,15 +547,15 @@
     }
 }
 
-/** Inherit from Socket class: In TcpSocketBase, it is same as Send() call */
+/* Inherit from Socket class: In TcpSocketBase, it is same as Send() call */
 int
 TcpSocketBase::SendTo (Ptr<Packet> p, uint32_t flags, const Address &address)
 {
   return Send (p, flags); // SendTo() and Send() are the same
 }
 
-/** Inherit from Socket class: Return data to upper-layer application. Parameter flags
-    is not used. Data is returned as a packet of size no larger than maxSize */
+/* Inherit from Socket class: Return data to upper-layer application. Parameter flags
+   is not used. Data is returned as a packet of size no larger than maxSize */
 Ptr<Packet>
 TcpSocketBase::Recv (uint32_t maxSize, uint32_t flags)
 {
@@ -581,7 +582,7 @@
   return outPacket;
 }
 
-/** Inherit from Socket class: Recv and return the remote's address */
+/* Inherit from Socket class: Recv and return the remote's address */
 Ptr<Packet>
 TcpSocketBase::RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress)
 {
@@ -606,7 +607,7 @@
   return packet;
 }
 
-/** Inherit from Socket class: Get the max number of bytes an app can send */
+/* Inherit from Socket class: Get the max number of bytes an app can send */
 uint32_t
 TcpSocketBase::GetTxAvailable (void) const
 {
@@ -614,7 +615,7 @@
   return m_txBuffer.Available ();
 }
 
-/** Inherit from Socket class: Get the max number of bytes an app can read */
+/* Inherit from Socket class: Get the max number of bytes an app can read */
 uint32_t
 TcpSocketBase::GetRxAvailable (void) const
 {
@@ -622,7 +623,7 @@
   return m_rxBuffer.Available ();
 }
 
-/** Inherit from Socket class: Return local address:port */
+/* Inherit from Socket class: Return local address:port */
 int
 TcpSocketBase::GetSockName (Address &address) const
 {
@@ -644,7 +645,7 @@
   return 0;
 }
 
-/** Inherit from Socket class: Bind this socket to the specified NetDevice */
+/* Inherit from Socket class: Bind this socket to the specified NetDevice */
 void
 TcpSocketBase::BindToNetDevice (Ptr<NetDevice> netdevice)
 {
@@ -668,7 +669,7 @@
   return;
 }
 
-/** Clean up after Bind. Set up callback functions in the end-point. */
+/* Clean up after Bind. Set up callback functions in the end-point. */
 int
 TcpSocketBase::SetupCallback (void)
 {
@@ -694,7 +695,7 @@
   return 0;
 }
 
-/** Perform the real connection tasks: Send SYN if allowed, RST if invalid */
+/* Perform the real connection tasks: Send SYN if allowed, RST if invalid */
 int
 TcpSocketBase::DoConnect (void)
 {
@@ -716,7 +717,7 @@
   return 0;
 }
 
-/** Do the action to close the socket. Usually send a packet with appropriate
+/* Do the action to close the socket. Usually send a packet with appropriate
     flags depended on the current m_state. */
 int
 TcpSocketBase::DoClose (void)
@@ -759,7 +760,7 @@
   return 0;
 }
 
-/** Peacefully close the socket by notifying the upper layer and deallocate end point */
+/* Peacefully close the socket by notifying the upper layer and deallocate end point */
 void
 TcpSocketBase::CloseAndNotify (void)
 {
@@ -780,7 +781,7 @@
 }
 
 
-/** Tell if a sequence number range is out side the range that my rx buffer can
+/* Tell if a sequence number range is out side the range that my rx buffer can
     accpet */
 bool
 TcpSocketBase::OutOfRange (SequenceNumber32 head, SequenceNumber32 tail) const
@@ -799,7 +800,7 @@
   return (tail < m_rxBuffer.NextRxSequence () || m_rxBuffer.MaxRxSequence () <= head);
 }
 
-/** Function called by the L3 protocol when it received a packet to pass on to
+/* Function called by the L3 protocol when it received a packet to pass on to
     the TCP. This function is registered as the "RxCallback" function in
     SetupCallback(), which invoked by Bind(), and CompleteFork() */
 void
@@ -810,7 +811,7 @@
 }
 
 void
-TcpSocketBase::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port)
+TcpSocketBase::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface)
 {
   DoForwardUp (packet, header, port);
 }
@@ -841,7 +842,7 @@
     }
 }
 
-/** The real function to handle the incoming packet from lower layers. This is
+/* The real function to handle the incoming packet from lower layers. This is
     wrapped by ForwardUp() so that this function can be overloaded by daughter
     classes. */
 void
@@ -1035,7 +1036,7 @@
     }
 }
 
-/** Received a packet upon ESTABLISHED state. This function is mimicking the
+/* Received a packet upon ESTABLISHED state. This function is mimicking the
     role of tcp_rcv_established() in tcp_input.c in Linux kernel. */
 void
 TcpSocketBase::ProcessEstablished (Ptr<Packet> packet, const TcpHeader& tcpHeader)
@@ -1081,7 +1082,7 @@
     }
 }
 
-/** Process the newly received ACK */
+/* Process the newly received ACK */
 void
 TcpSocketBase::ReceivedAck (Ptr<Packet> packet, const TcpHeader& tcpHeader)
 {
@@ -1118,7 +1119,7 @@
     }
 }
 
-/** Received a packet upon LISTEN state. */
+/* Received a packet upon LISTEN state. */
 void
 TcpSocketBase::ProcessListen (Ptr<Packet> packet, const TcpHeader& tcpHeader,
                               const Address& fromAddress, const Address& toAddress)
@@ -1148,7 +1149,7 @@
                           packet, tcpHeader, fromAddress, toAddress);
 }
 
-/** Received a packet upon SYN_SENT */
+/* Received a packet upon SYN_SENT */
 void
 TcpSocketBase::ProcessSynSent (Ptr<Packet> packet, const TcpHeader& tcpHeader)
 {
@@ -1206,7 +1207,7 @@
     }
 }
 
-/** Received a packet upon SYN_RCVD */
+/* Received a packet upon SYN_RCVD */
 void
 TcpSocketBase::ProcessSynRcvd (Ptr<Packet> packet, const TcpHeader& tcpHeader,
                                const Address& fromAddress, const Address& toAddress)
@@ -1296,7 +1297,7 @@
     }
 }
 
-/** Received a packet upon CLOSE_WAIT, FIN_WAIT_1, or FIN_WAIT_2 states */
+/* Received a packet upon CLOSE_WAIT, FIN_WAIT_1, or FIN_WAIT_2 states */
 void
 TcpSocketBase::ProcessWait (Ptr<Packet> packet, const TcpHeader& tcpHeader)
 {
@@ -1367,7 +1368,7 @@
     }
 }
 
-/** Received a packet upon CLOSING */
+/* Received a packet upon CLOSING */
 void
 TcpSocketBase::ProcessClosing (Ptr<Packet> packet, const TcpHeader& tcpHeader)
 {
@@ -1399,7 +1400,7 @@
     }
 }
 
-/** Received a packet upon LAST_ACK */
+/* Received a packet upon LAST_ACK */
 void
 TcpSocketBase::ProcessLastAck (Ptr<Packet> packet, const TcpHeader& tcpHeader)
 {
@@ -1435,7 +1436,7 @@
     }
 }
 
-/** Peer sent me a FIN. Remember its sequence in rx buffer. */
+/* Peer sent me a FIN. Remember its sequence in rx buffer. */
 void
 TcpSocketBase::PeerClose (Ptr<Packet> p, const TcpHeader& tcpHeader)
 {
@@ -1472,7 +1473,7 @@
   DoPeerClose (); // Change state, respond with ACK
 }
 
-/** Received a in-sequence FIN. Close down this socket. */
+/* Received a in-sequence FIN. Close down this socket. */
 void
 TcpSocketBase::DoPeerClose (void)
 {
@@ -1510,7 +1511,7 @@
     }
 }
 
-/** Kill this socket. This is a callback function configured to m_endpoint in
+/* Kill this socket. This is a callback function configured to m_endpoint in
    SetupCallback(), invoked when the endpoint is destroyed. */
 void
 TcpSocketBase::Destroy (void)
@@ -1531,7 +1532,7 @@
   CancelAllTimers ();
 }
 
-/** Kill this socket. This is a callback function configured to m_endpoint in
+/* Kill this socket. This is a callback function configured to m_endpoint in
    SetupCallback(), invoked when the endpoint is destroyed. */
 void
 TcpSocketBase::Destroy6 (void)
@@ -1552,7 +1553,7 @@
   CancelAllTimers ();
 }
 
-/** Send an empty packet with specified TCP flags */
+/* Send an empty packet with specified TCP flags */
 void
 TcpSocketBase::SendEmptyPacket (uint8_t flags)
 {
@@ -1667,7 +1668,7 @@
     }
 }
 
-/** This function closes the endpoint completely. Called upon RST_TX action. */
+/* This function closes the endpoint completely. Called upon RST_TX action. */
 void
 TcpSocketBase::SendRST (void)
 {
@@ -1677,7 +1678,7 @@
   DeallocateEndPoint ();
 }
 
-/** Deallocate the end point and cancel all the timers */
+/* Deallocate the end point and cancel all the timers */
 void
 TcpSocketBase::DeallocateEndPoint (void)
 {
@@ -1709,7 +1710,7 @@
     }
 }
 
-/** Configure the endpoint to a local address. Called by Connect() if Bind() didn't specify one. */
+/* Configure the endpoint to a local address. Called by Connect() if Bind() didn't specify one. */
 int
 TcpSocketBase::SetupEndpoint ()
 {
@@ -1770,7 +1771,7 @@
   return 0;
 }
 
-/** This function is called only if a SYN received in LISTEN state. After
+/* This function is called only if a SYN received in LISTEN state. After
    TcpSocketBase cloned, allocate a new end point to handle the incoming
    connection and send a SYN+ACK to complete the handshake. */
 void
@@ -1820,7 +1821,7 @@
     }
 }
 
-/** Extract at most maxSize bytes from the TxBuffer at sequence seq, add the
+/* Extract at most maxSize bytes from the TxBuffer at sequence seq, add the
     TCP header, and send to TcpL4Protocol */
 uint32_t
 TcpSocketBase::SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck)
@@ -1926,7 +1927,7 @@
   return sz;
 }
 
-/** Send as much pending data as possible according to the Tx window. Note that
+/* Send as much pending data as possible according to the Tx window. Note that
  *  this function did not implement the PSH flag
  */
 bool
@@ -2071,7 +2072,7 @@
     }
 }
 
-/** Called by ForwardUp() to estimate RTT */
+/* Called by ForwardUp() to estimate RTT */
 void
 TcpSocketBase::EstimateRtt (const TcpHeader& tcpHeader)
 {
@@ -2281,7 +2282,7 @@
   m_timewaitEvent.Cancel ();
 }
 
-/** Move TCP to Time_Wait state and schedule a transition to Closed state */
+/* Move TCP to Time_Wait state and schedule a transition to Closed state */
 void
 TcpSocketBase::TimeWait ()
 {
@@ -2294,7 +2295,7 @@
                                          &TcpSocketBase::CloseAndNotify, this);
 }
 
-/** Below are the attribute get/set functions */
+/* Below are the attribute get/set functions */
 
 void
 TcpSocketBase::SetSndBufSize (uint32_t size)
@@ -2418,13 +2419,13 @@
   return false;
 }
 
-/** Placeholder function for future extension that reads more from the TCP header */
+/* Placeholder function for future extension that reads more from the TCP header */
 void
 TcpSocketBase::ReadOptions (const TcpHeader&)
 {
 }
 
-/** Placeholder function for future extension that changes the TCP header */
+/* Placeholder function for future extension that changes the TCP header */
 void
 TcpSocketBase::AddOptions (TcpHeader&)
 {
diff -Naur ns-3.18.1/src/internet/model/tcp-socket-base.h ns-3.19/src/internet/model/tcp-socket-base.h
--- ns-3.18.1/src/internet/model/tcp-socket-base.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-socket-base.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,6 +31,7 @@
 #include "ns3/ipv4-header.h"
 #include "ns3/ipv4-interface.h"
 #include "ns3/ipv6-header.h"
+#include "ns3/ipv6-interface.h"
 #include "ns3/event-id.h"
 #include "tcp-tx-buffer.h"
 #include "tcp-rx-buffer.h"
@@ -61,6 +62,11 @@
 class TcpSocketBase : public TcpSocket
 {
 public:
+  /**
+   * Get the type ID.
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   /**
    * Create an unbound TCP socket
@@ -69,13 +75,30 @@
 
   /**
    * Clone a TCP socket, for use upon receiving a connection request in LISTEN state
+   *
+   * \param sock the original Tcp Socket
    */
   TcpSocketBase (const TcpSocketBase& sock);
   virtual ~TcpSocketBase (void);
 
   // Set associated Node, TcpL4Protocol, RttEstimator to this socket
+
+  /**
+   * \brief Set the associated node.
+   * \param node the node
+   */
   virtual void SetNode (Ptr<Node> node);
+
+  /**
+   * \brief Set the associated TCP L4 protocol.
+   * \param tcp the TCP L4 protocol
+   */
   virtual void SetTcp (Ptr<TcpL4Protocol> tcp);
+
+  /**
+   * \brief Set the associated RTT estimator.
+   * \param rtt the RTT estimator
+   */
   virtual void SetRtt (Ptr<RttEstimator> rtt);
 
   // Necessary implementations of null functions from ns3::Socket
@@ -101,6 +124,8 @@
 
 protected:
   // Implementing ns3::TcpSocket -- Attribute get/set
+  // inherited, no need to doc
+
   virtual void     SetSndBufSize (uint32_t size);
   virtual uint32_t GetSndBufSize (void) const;
   virtual void     SetRcvBufSize (uint32_t size);
@@ -126,120 +151,455 @@
   virtual bool     SetAllowBroadcast (bool allowBroadcast);
   virtual bool     GetAllowBroadcast (void) const;
 
+
+
   // Helper functions: Connection set up
-  int SetupCallback (void);        // Common part of the two Bind(), i.e. set callback and remembering local addr:port
-  int DoConnect (void);            // Sending a SYN packet to make a connection if the state allows
-  void ConnectionSucceeded (void); // Schedule-friendly wrapper for Socket::NotifyConnectionSucceeded()
-  int SetupEndpoint (void);        // Configure m_endpoint for local addr for given remote addr
-  int SetupEndpoint6 (void);       // Configure m_endpoint6 for local addr for given remote addr
-  void CompleteFork (Ptr<Packet>, const TcpHeader&, const Address& fromAddress, const Address& toAdress);
+
+  /**
+   * \brief Common part of the two Bind(), i.e. set callback and remembering local addr:port
+   *
+   * \returns 0 on success, -1 on failure
+   */
+  int SetupCallback (void);
+
+  /**
+   * \brief Perform the real connection tasks: Send SYN if allowed, RST if invalid
+   *
+   * \returns 0 on success
+   */
+  int DoConnect (void);
+
+  /**
+   * \brief Schedule-friendly wrapper for Socket::NotifyConnectionSucceeded()
+   */
+  void ConnectionSucceeded (void);
+
+  /**
+   * \brief Configure the endpoint to a local address. Called by Connect() if Bind() didn't specify one.
+   *
+   * \returns 0 on success
+   */
+  int SetupEndpoint (void);
+
+  /**
+   * \brief Configure the endpoint v6 to a local address. Called by Connect() if Bind() didn't specify one.
+   *
+   * \returns 0 on success
+   */
+  int SetupEndpoint6 (void);
+
+  /**
+   * \brief Complete a connection by forking the socket
+   *
+   * This function is called only if a SYN received in LISTEN state. After
+   * TcpSocketBase cloned, allocate a new end point to handle the incoming
+   * connection and send a SYN+ACK to complete the handshake.
+   *
+   * \param p the packet triggering the fork
+   * \param tcpHeader the TCP header of the triggering packet
+   * \param fromAddress the address of the remote host
+   * \param toAddress the address the connection is directed to
+   */
+  void CompleteFork (Ptr<Packet> p, const TcpHeader& tcpHeader, const Address& fromAddress, const Address& toAddress);
+
+
 
   // Helper functions: Transfer operation
+
+  /**
+   * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+   *
+   * \param packet the incoming packet
+   * \param header the packet's IPv4 header
+   * \param port the incoming port
+   * \param incomingInterface the incoming interface
+   */
   void ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port, Ptr<Ipv4Interface> incomingInterface);
-  void ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port);
+
+  /**
+   * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+   *
+   * \param packet the incoming packet
+   * \param header the packet's IPv6 header
+   * \param port the incoming port
+   * \param incomingInterface the incoming interface
+   */
+  void ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface);
+
+  /**
+   * \brief Called by TcpSocketBase::ForwardUp().
+   *
+   * \param packet the incoming packet
+   * \param header the packet's IPv4 header
+   * \param port the incoming port
+   * \param incomingInterface the incoming interface
+   */
   virtual void DoForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port, Ptr<Ipv4Interface> incomingInterface); //Get a pkt from L3
-  virtual void DoForwardUp (Ptr<Packet> packet, Ipv6Header header, uint16_t port); // Ipv6 version
+
+  /**
+   * \brief Called by TcpSocketBase::ForwardUp6().
+   *
+   * \param packet the incoming packet
+   * \param header the packet's IPv6 header
+   * \param port the incoming port
+   */
+  virtual void DoForwardUp (Ptr<Packet> packet, Ipv6Header header, uint16_t port);
+
+  /**
+   * \brief Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
+   *
+   * \param icmpSource the ICMP source address
+   * \param icmpTtl the ICMP Time to Live
+   * \param icmpType the ICMP Type
+   * \param icmpCode the ICMP Code
+   * \param icmpInfo the ICMP Info
+   */
   void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
-  void ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);  
-  bool SendPendingData (bool withAck = false); // Send as much as the window allows
-  uint32_t SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck); // Send a data packet
-  void SendEmptyPacket (uint8_t flags); // Send a empty packet that carries a flag, e.g. ACK
-  void SendRST (void); // Send reset and tear down this socket
-  bool OutOfRange (SequenceNumber32 head, SequenceNumber32 tail) const; // Check if a sequence number range is within the rx window
+
+  /**
+   * \brief Called by the L3 protocol when it received an ICMPv6 packet to pass on to TCP.
+   *
+   * \param icmpSource the ICMP source address
+   * \param icmpTtl the ICMP Time to Live
+   * \param icmpType the ICMP Type
+   * \param icmpCode the ICMP Code
+   * \param icmpInfo the ICMP Info
+   */
+  void ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
+
+  /**
+   * \brief Send as much pending data as possible according to the Tx window.
+   *
+   * Note that this function did not implement the PSH flag.
+   *
+   * \param withAck forces an ACK to be sent
+   * \returns true if some data have been sent
+   */
+  bool SendPendingData (bool withAck = false);
+
+  /**
+   * \brief Extract at most maxSize bytes from the TxBuffer at sequence seq, add the
+   *        TCP header, and send to TcpL4Protocol
+   *
+   * \param seq the sequence number
+   * \param maxSize the maximum data block to be transmitted (in bytes)
+   * \param withAck forces an ACK to be sent
+   * \returns the number of bytes sent
+   */
+  uint32_t SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck);
+
+  /**
+   * \brief Send a empty packet that carries a flag, e.g. ACK
+   *
+   * \param flags the packet's flags
+   */
+  void SendEmptyPacket (uint8_t flags);
+
+  /**
+   * \brief Send reset and tear down this socket
+   */
+  void SendRST (void);
+
+  /**
+   * \brief Check if a sequence number range is within the rx window
+   *
+   * \param head start of the Sequence window
+   * \param tail end of the Sequence window
+   * \returns true if it is in range
+   */
+  bool OutOfRange (SequenceNumber32 head, SequenceNumber32 tail) const;
+
 
   // Helper functions: Connection close
-  int DoClose (void); // Close a socket by sending RST, FIN, or FIN+ACK, depend on the current state
-  void CloseAndNotify (void); // To CLOSED state, notify upper layer, and deallocate end point
-  void Destroy (void); // Kill this socket by zeroing its attributes
-  void Destroy6 (void); // Kill this socket by zeroing its attributes
-  void DeallocateEndPoint (void); // Deallocate m_endPoint
-  void PeerClose (Ptr<Packet>, const TcpHeader&); // Received a FIN from peer, notify rx buffer
-  void DoPeerClose (void); // FIN is in sequence, notify app and respond with a FIN
-  void CancelAllTimers (void); // Cancel all timer when endpoint is deleted
-  void TimeWait (void);  // Move from CLOSING or FIN_WAIT_2 to TIME_WAIT state
+
+  /**
+   * \brief Close a socket by sending RST, FIN, or FIN+ACK, depend on the current state
+   *
+   * \returns 0 on success
+   */
+  int DoClose (void);
+
+  /**
+   * \brief Peacefully close the socket by notifying the upper layer and deallocate end point
+   */
+  void CloseAndNotify (void);
+
+  /**
+   * \brief Kill this socket by zeroing its attributes (IPv4)
+   *
+   * This is a callback function configured to m_endpoint in
+   * SetupCallback(), invoked when the endpoint is destroyed.
+   */
+  void Destroy (void);
+
+  /**
+   * \brief Kill this socket by zeroing its attributes (IPv6)
+   *
+   * This is a callback function configured to m_endpoint in
+   * SetupCallback(), invoked when the endpoint is destroyed.
+   */
+  void Destroy6 (void);
+
+  /**
+   * \brief Deallocate m_endPoint
+   */
+  void DeallocateEndPoint (void);
+
+  /**
+   * \brief Received a FIN from peer, notify rx buffer
+   *
+   * \param p the packet
+   * \param tcpHeader the packet's TCP header
+   */
+  void PeerClose (Ptr<Packet> p, const TcpHeader& tcpHeader);
+
+  /**
+   * \brief FIN is in sequence, notify app and respond with a FIN
+   */
+  void DoPeerClose (void);
+
+  /**
+   * \brief Cancel all timer when endpoint is deleted
+   */
+  void CancelAllTimers (void);
+
+  /**
+   * \brief Move from CLOSING or FIN_WAIT_2 to TIME_WAIT state
+   */
+  void TimeWait (void);
 
   // State transition functions
-  void ProcessEstablished (Ptr<Packet>, const TcpHeader&); // Received a packet upon ESTABLISHED state
-  void ProcessListen (Ptr<Packet>, const TcpHeader&, const Address&, const Address&); // Process the newly received ACK
-  void ProcessSynSent (Ptr<Packet>, const TcpHeader&); // Received a packet upon SYN_SENT
-  void ProcessSynRcvd (Ptr<Packet>, const TcpHeader&, const Address&, const Address&); // Received a packet upon SYN_RCVD
-  void ProcessWait (Ptr<Packet>, const TcpHeader&); // Received a packet upon CLOSE_WAIT, FIN_WAIT_1, FIN_WAIT_2
-  void ProcessClosing (Ptr<Packet>, const TcpHeader&); // Received a packet upon CLOSING
-  void ProcessLastAck (Ptr<Packet>, const TcpHeader&); // Received a packet upon LAST_ACK
+
+  /**
+   * \brief Received a packet upon ESTABLISHED state.
+   *
+   * This function is mimicking the role of tcp_rcv_established() in tcp_input.c in Linux kernel.
+   *
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   */
+  void ProcessEstablished (Ptr<Packet> packet, const TcpHeader& tcpHeader); // Received a packet upon ESTABLISHED state
+
+  /**
+   * \brief Received a packet upon LISTEN state.
+   *
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   * \param fromAddress the source address
+   * \param toAddress the destination address
+   */
+  void ProcessListen (Ptr<Packet> packet, const TcpHeader& tcpHeader,
+                      const Address& fromAddress, const Address& toAddress);
+
+  /**
+   * \brief Received a packet upon SYN_SENT
+   *
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   */
+  void ProcessSynSent (Ptr<Packet> packet, const TcpHeader& tcpHeader);
+
+  /**
+   * \brief Received a packet upon SYN_RCVD.
+   *
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   * \param fromAddress the source address
+   * \param toAddress the destination address
+   */
+  void ProcessSynRcvd (Ptr<Packet> packet, const TcpHeader& tcpHeader,
+                       const Address& fromAddress, const Address& toAddress);
+
+  /**
+   * \brief Received a packet upon CLOSE_WAIT, FIN_WAIT_1, FIN_WAIT_2
+   *
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   */
+  void ProcessWait (Ptr<Packet> packet, const TcpHeader& tcpHeader);
+
+  /**
+   * \brief Received a packet upon CLOSING
+   *
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   */
+  void ProcessClosing (Ptr<Packet> packet, const TcpHeader& tcpHeader);
+
+  /**
+   * \brief Received a packet upon LAST_ACK
+   *
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   */
+  void ProcessLastAck (Ptr<Packet> packet, const TcpHeader& tcpHeader);
 
   // Window management
-  virtual uint32_t UnAckDataCount (void);       // Return count of number of unacked bytes
-  virtual uint32_t BytesInFlight (void);        // Return total bytes in flight
-  virtual uint32_t Window (void);               // Return the max possible number of unacked bytes
-  virtual uint32_t AvailableWindow (void);      // Return unfilled portion of window
-  virtual uint16_t AdvertisedWindowSize (void); // The amount of Rx window announced to the peer
+
+  /**
+   * \brief Return count of number of unacked bytes
+   * \returns count of number of unacked bytes
+   */
+  virtual uint32_t UnAckDataCount (void);
+
+  /**
+   * \brief Return total bytes in flight
+   * \returns total bytes in flight
+   */
+  virtual uint32_t BytesInFlight (void);
+
+  /**
+   * \brief Return the max possible number of unacked bytes
+   * \returns the max possible number of unacked bytes
+   */
+  virtual uint32_t Window (void);
+
+  /**
+   * \brief Return unfilled portion of window
+   * \return unfilled portion of window
+   */
+  virtual uint32_t AvailableWindow (void);
+
+  /**
+   * \brief The amount of Rx window announced to the peer
+   * \returns size of Rx window announced to the peer
+   */
+  virtual uint16_t AdvertisedWindowSize (void);
+
 
   // Manage data tx/rx
-  virtual Ptr<TcpSocketBase> Fork (void) = 0; // Call CopyObject<> to clone me
-  virtual void ReceivedAck (Ptr<Packet>, const TcpHeader&); // Received an ACK packet
-  virtual void ReceivedData (Ptr<Packet>, const TcpHeader&); // Recv of a data, put into buffer, call L7 to get it if necessary
-  virtual void EstimateRtt (const TcpHeader&); // RTT accounting
-  virtual void NewAck (SequenceNumber32 const& seq); // Update buffers w.r.t. ACK
-  virtual void DupAck (const TcpHeader& t, uint32_t count) = 0; // Received dupack
-  virtual void ReTxTimeout (void); // Call Retransmit() upon RTO event
-  virtual void Retransmit (void); // Halving cwnd and call DoRetransmit()
-  virtual void DelAckTimeout (void);  // Action upon delay ACK timeout, i.e. send an ACK
-  virtual void LastAckTimeout (void); // Timeout at LAST_ACK, close the connection
-  virtual void PersistTimeout (void); // Send 1 byte probe to get an updated window size
-  virtual void DoRetransmit (void); // Retransmit the oldest packet
-  virtual void ReadOptions (const TcpHeader&); // Read option from incoming packets
-  virtual void AddOptions (TcpHeader&); // Add option to outgoing packets
+
+  /**
+   * \brief Call CopyObject<> to clone me
+   * \returns a copy of the socket
+   */
+  virtual Ptr<TcpSocketBase> Fork (void) = 0;
+
+  /**
+   * \brief Received an ACK packet
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   */
+  virtual void ReceivedAck (Ptr<Packet> packet, const TcpHeader& tcpHeader);
+
+  /**
+   * \brief Recv of a data, put into buffer, call L7 to get it if necessary
+   * \param packet the packet
+   * \param tcpHeader the packet's TCP header
+   */
+  virtual void ReceivedData (Ptr<Packet> packet, const TcpHeader& tcpHeader);
+
+  /**
+   * \brief Take into account the packet for RTT estimation
+   * \param tcpHeader the packet's TCP header
+   */
+  virtual void EstimateRtt (const TcpHeader& tcpHeader);
+
+  /**
+   * \brief Update buffers w.r.t. ACK
+   * \param seq the sequence number
+   */
+  virtual void NewAck (SequenceNumber32 const& seq);
+
+  /**
+   * \brief Received dupack (duplicate ACK)
+   * \param tcpHeader the packet's TCP header
+   * \param count counter of duplicate ACKs
+   */
+  virtual void DupAck (const TcpHeader& tcpHeader, uint32_t count) = 0;
+
+  /**
+   * \brief Call Retransmit() upon RTO event
+   */
+  virtual void ReTxTimeout (void);
+
+  /**
+   * \brief Halving cwnd and call DoRetransmit()
+   */
+  virtual void Retransmit (void);
+
+  /**
+   * \brief Action upon delay ACK timeout, i.e. send an ACK
+   */
+  virtual void DelAckTimeout (void);
+
+  /**
+   * \brief Timeout at LAST_ACK, close the connection
+   */
+  virtual void LastAckTimeout (void);
+
+  /**
+   * \brief Send 1 byte probe to get an updated window size
+   */
+  virtual void PersistTimeout (void);
+
+  /**
+   * \brief Retransmit the oldest packet
+   */
+  virtual void DoRetransmit (void);
+
+  /**
+   * \brief Read option from incoming packets
+   * \param tcpHeader the packet's TCP header
+   */
+  virtual void ReadOptions (const TcpHeader& tcpHeader);
+
+  /**
+   * \brief Add option to outgoing packets
+   * \param tcpHeader the packet's TCP header
+   */
+  virtual void AddOptions (TcpHeader& tcpHeader);
+
 
 protected:
   // Counters and events
-  EventId           m_retxEvent;       //< Retransmission event
-  EventId           m_lastAckEvent;    //< Last ACK timeout event
-  EventId           m_delAckEvent;     //< Delayed ACK timeout event
-  EventId           m_persistEvent;    //< Persist event: Send 1 byte to probe for a non-zero Rx window
-  EventId           m_timewaitEvent;   //< TIME_WAIT expiration event: Move this socket to CLOSED state
-  uint32_t          m_dupAckCount;     //< Dupack counter
-  uint32_t          m_delAckCount;     //< Delayed ACK counter
-  uint32_t          m_delAckMaxCount;  //< Number of packet to fire an ACK before delay timeout
-  bool              m_noDelay;         //< Set to true to disable Nagle's algorithm
-  uint32_t          m_cnCount;         //< Count of remaining connection retries
-  uint32_t          m_cnRetries;       //< Number of connection retries before giving up
-  TracedValue<Time> m_rto;             //< Retransmit timeout
-  TracedValue<Time> m_lastRtt;         //< Last RTT sample collected
-  Time              m_delAckTimeout;   //< Time to delay an ACK
-  Time              m_persistTimeout;  //< Time between sending 1-byte probes
-  Time              m_cnTimeout;       //< Timeout for connection retry
+  EventId           m_retxEvent;       //!< Retransmission event
+  EventId           m_lastAckEvent;    //!< Last ACK timeout event
+  EventId           m_delAckEvent;     //!< Delayed ACK timeout event
+  EventId           m_persistEvent;    //!< Persist event: Send 1 byte to probe for a non-zero Rx window
+  EventId           m_timewaitEvent;   //!< TIME_WAIT expiration event: Move this socket to CLOSED state
+  uint32_t          m_dupAckCount;     //!< Dupack counter
+  uint32_t          m_delAckCount;     //!< Delayed ACK counter
+  uint32_t          m_delAckMaxCount;  //!< Number of packet to fire an ACK before delay timeout
+  bool              m_noDelay;         //!< Set to true to disable Nagle's algorithm
+  uint32_t          m_cnCount;         //!< Count of remaining connection retries
+  uint32_t          m_cnRetries;       //!< Number of connection retries before giving up
+  TracedValue<Time> m_rto;             //!< Retransmit timeout
+  TracedValue<Time> m_lastRtt;         //!< Last RTT sample collected
+  Time              m_delAckTimeout;   //!< Time to delay an ACK
+  Time              m_persistTimeout;  //!< Time between sending 1-byte probes
+  Time              m_cnTimeout;       //!< Timeout for connection retry
 
   // Connections to other layers of TCP/IP
-  Ipv4EndPoint*       m_endPoint;
-  Ipv6EndPoint*       m_endPoint6;
-  Ptr<Node>           m_node;
-  Ptr<TcpL4Protocol>  m_tcp;
-  Callback<void, Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback;
-  Callback<void, Ipv6Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback6;
+  Ipv4EndPoint*       m_endPoint;   //!< the IPv4 endpoint
+  Ipv6EndPoint*       m_endPoint6;  //!< the IPv6 endpoint
+  Ptr<Node>           m_node;       //!< the associated node
+  Ptr<TcpL4Protocol>  m_tcp;        //!< the associated TCP L4 protocol
+  Callback<void, Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback;  //!< ICMP callback
+  Callback<void, Ipv6Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback6; //!< ICMPv6 callback
 
-  // Round trip time estimation
-  Ptr<RttEstimator> m_rtt;
+  Ptr<RttEstimator> m_rtt; //!< Round trip time estimator
 
   // Rx and Tx buffer management
-  TracedValue<SequenceNumber32> m_nextTxSequence; //< Next seqnum to be sent (SND.NXT), ReTx pushes it back
-  TracedValue<SequenceNumber32> m_highTxMark;     //< Highest seqno ever sent, regardless of ReTx
-  TcpRxBuffer                   m_rxBuffer;       //< Rx buffer (reordering buffer)
-  TcpTxBuffer                   m_txBuffer;       //< Tx buffer
+  TracedValue<SequenceNumber32> m_nextTxSequence; //!< Next seqnum to be sent (SND.NXT), ReTx pushes it back
+  TracedValue<SequenceNumber32> m_highTxMark;     //!< Highest seqno ever sent, regardless of ReTx
+  TcpRxBuffer                   m_rxBuffer;       //!< Rx buffer (reordering buffer)
+  TcpTxBuffer                   m_txBuffer;       //!< Tx buffer
 
   // State-related attributes
-  TracedValue<TcpStates_t> m_state;         //< TCP state
-  enum SocketErrno         m_errno;         //< Socket error code
-  bool                     m_closeNotified; //< Told app to close socket
-  bool                     m_closeOnEmpty;  //< Close socket upon tx buffer emptied
-  bool                     m_shutdownSend;  //< Send no longer allowed
-  bool                     m_shutdownRecv;  //< Receive no longer allowed
-  bool                     m_connected;     //< Connection established
-  double                   m_msl;           //< Max segment lifetime
+  TracedValue<TcpStates_t> m_state;         //!< TCP state
+  enum SocketErrno         m_errno;         //!< Socket error code
+  bool                     m_closeNotified; //!< Told app to close socket
+  bool                     m_closeOnEmpty;  //!< Close socket upon tx buffer emptied
+  bool                     m_shutdownSend;  //!< Send no longer allowed
+  bool                     m_shutdownRecv;  //!< Receive no longer allowed
+  bool                     m_connected;     //!< Connection established
+  double                   m_msl;           //!< Max segment lifetime
 
   // Window management
-  uint32_t              m_segmentSize; //< Segment size
-  uint16_t              m_maxWinSize;  //< Maximum window size to advertise
-  TracedValue<uint32_t> m_rWnd;        //< Flow control window at remote side
+  uint32_t              m_segmentSize; //!< Segment size
+  uint16_t              m_maxWinSize;  //!< Maximum window size to advertise
+  TracedValue<uint32_t> m_rWnd;        //!< Flow control window at remote side
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-socket.cc ns-3.19/src/internet/model/tcp-socket.cc
--- ns-3.18.1/src/internet/model/tcp-socket.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-socket.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpSocket);
+NS_OBJECT_ENSURE_REGISTERED (TcpSocket)
+  ;
 
 const char* const TcpSocket::TcpStateName[LAST_STATE] = { "CLOSED", "LISTEN", "SYN_SENT", "SYN_RCVD", "ESTABLISHED", "CLOSE_WAIT", "LAST_ACK", "FIN_WAIT_1", "FIN_WAIT_2", "CLOSING", "TIME_WAIT" };
 
diff -Naur ns-3.18.1/src/internet/model/tcp-socket-factory.cc ns-3.19/src/internet/model/tcp-socket-factory.cc
--- ns-3.18.1/src/internet/model/tcp-socket-factory.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-socket-factory.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpSocketFactory);
+NS_OBJECT_ENSURE_REGISTERED (TcpSocketFactory)
+  ;
 
 TypeId
 TcpSocketFactory::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/tcp-socket-factory.h ns-3.19/src/internet/model/tcp-socket-factory.h
--- ns-3.18.1/src/internet/model/tcp-socket-factory.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-socket-factory.h	2013-12-20 09:44:50.000000000 -0800
@@ -46,6 +46,11 @@
 class TcpSocketFactory : public SocketFactory
 {
 public:
+  /**
+   * Get the type ID.
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
 };
diff -Naur ns-3.18.1/src/internet/model/tcp-socket-factory-impl.h ns-3.19/src/internet/model/tcp-socket-factory-impl.h
--- ns-3.18.1/src/internet/model/tcp-socket-factory-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-socket-factory-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -46,6 +46,10 @@
   TcpSocketFactoryImpl ();
   virtual ~TcpSocketFactoryImpl ();
 
+  /**
+   * \brief Set the associated TCP L4 protocol.
+   * \param tcp the TCP L4 protocol
+   */
   void SetTcp (Ptr<TcpL4Protocol> tcp);
 
   virtual Ptr<Socket> CreateSocket (void);
@@ -53,7 +57,7 @@
 protected:
   virtual void DoDispose (void);
 private:
-  Ptr<TcpL4Protocol> m_tcp;
+  Ptr<TcpL4Protocol> m_tcp; //!< the associated TCP L4 protocol
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-socket.h ns-3.19/src/internet/model/tcp-socket.h
--- ns-3.18.1/src/internet/model/tcp-socket.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-socket.h	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,9 @@
 class Node;
 class Packet;
 
-/* Names of the 11 TCP states */
+/**
+ * \brief Names of the 11 TCP states
+ */
 typedef enum {
   CLOSED,       // 0
   LISTEN,       // 1
@@ -62,37 +64,164 @@
 class TcpSocket : public Socket
 {
 public:
+  /**
+   * Get the type ID.
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
  
   TcpSocket (void);
   virtual ~TcpSocket (void);
 
-  // Literal names of TCP states for use in log messages */
+  /**
+   * \brief Literal names of TCP states for use in log messages
+   */
   static const char* const TcpStateName[LAST_STATE];
 
 private:
   // Indirect the attribute setting and getting through private virtual methods
+
+  /**
+   * \brief Set the send buffer size.
+   * \param size the buffer size (in bytes)
+   */
   virtual void SetSndBufSize (uint32_t size) = 0;
+
+  /**
+   * \brief Get the send buffer size.
+   * \returns the buffer size (in bytes)
+   */
   virtual uint32_t GetSndBufSize (void) const = 0;
+
+  /**
+   * \brief Set the receive buffer size.
+   * \param size the buffer size (in bytes)
+   */
   virtual void SetRcvBufSize (uint32_t size) = 0;
+
+  /**
+   * \brief Get the receive buffer size.
+   * \returns the buffer size (in bytes)
+   */
   virtual uint32_t GetRcvBufSize (void) const = 0;
+
+  /**
+   * \brief Set the segment size.
+   * \param size the segment size (in bytes)
+   */
   virtual void SetSegSize (uint32_t size) = 0;
+
+  /**
+   * \brief Get the segment size.
+   * \returns the segment size (in bytes)
+   */
   virtual uint32_t GetSegSize (void) const = 0;
+
+  /**
+   * \brief Set the Slow Start Threshold.
+   * \param threshold the Slow Start Threshold (in bytes)
+   */
   virtual void SetSSThresh (uint32_t threshold) = 0;
+
+  /**
+   * \brief Get the Slow Start Threshold.
+   * \returns the Slow Start Threshold (in bytes)
+   */
   virtual uint32_t GetSSThresh (void) const = 0;
-  virtual void SetInitialCwnd (uint32_t count) = 0;
+
+  /**
+   * \brief Set the initial Congestion Window.
+   * \param cwnd the initial congestion window (in bytes)
+   */
+  virtual void SetInitialCwnd (uint32_t cwnd) = 0;
+
+  /**
+   * \brief Get the initial Congestion Window.
+   * \returns the initial congestion window (in bytes)
+   */
   virtual uint32_t GetInitialCwnd (void) const = 0;
+
+  /**
+   * \brief Set the connection timeout.
+   * \param timeout the connection timeout
+   */
   virtual void SetConnTimeout (Time timeout) = 0;
+
+  /**
+   * \brief Get the connection timeout.
+   * \returns the connection timeout
+   */
   virtual Time GetConnTimeout (void) const = 0;
+
+  /**
+   * \brief Set the number of connection retries before giving up.
+   * \param count the number of connection retries
+   */
   virtual void SetConnCount (uint32_t count) = 0;
+
+  /**
+   * \brief Get the number of connection retries before giving up.
+   * \returns the number of connection retries
+   */
   virtual uint32_t GetConnCount (void) const = 0;
+
+  /**
+   * \brief Set the time to delay an ACK.
+   * \param timeout the time to delay an ACK
+   */
   virtual void SetDelAckTimeout (Time timeout) = 0;
+
+  /**
+   * \brief Get the time to delay an ACK.
+   * \returns the time to delay an ACK
+   */
   virtual Time GetDelAckTimeout (void) const = 0;
+
+  /**
+   * \brief Set the number of packet to fire an ACK before delay timeout.
+   * \param count the umber of packet to fire an ACK before delay timeout
+   */
   virtual void SetDelAckMaxCount (uint32_t count) = 0;
+
+  /**
+   * \brief Get the number of packet to fire an ACK before delay timeout.
+   * \returns the number of packet to fire an ACK before delay timeout
+   */
   virtual uint32_t GetDelAckMaxCount (void) const = 0;
+
+  /**
+   * \brief Enable/Disable Nagle's algorithm.
+   * \param noDelay true to DISABLE Nagle's algorithm
+   */
   virtual void SetTcpNoDelay (bool noDelay) = 0;
+
+  /**
+   * \brief Check if Nagle's algorithm is enabled or not.
+   * \returns true if Nagle's algorithm is DISABLED
+   */
   virtual bool GetTcpNoDelay (void) const = 0;
+
+  /**
+   * \brief Set the timout for persistent connection
+   *
+   * When the timout expires, send 1-byte data to probe for the window
+   * size at the receiver when the local knowledge tells that the
+   * receiver has zero window size
+   *
+   * \param timeout the persistent timout
+   */
   virtual void SetPersistTimeout (Time timeout) = 0;
+
+  /**
+   * \brief Get the timout for persistent connection
+   *
+   * When the timout expires, send 1-byte data to probe for the window
+   * size at the receiver when the local knowledge tells that the
+   * receiver has zero window size
+   *
+   * \returns the persistent timout
+   */
   virtual Time GetPersistTimeout (void) const = 0;
 
 };
diff -Naur ns-3.18.1/src/internet/model/tcp-tahoe.cc ns-3.19/src/internet/model/tcp-tahoe.cc
--- ns-3.18.1/src/internet/model/tcp-tahoe.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-tahoe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TcpTahoe);
+NS_OBJECT_ENSURE_REGISTERED (TcpTahoe)
+  ;
 
 TypeId
 TcpTahoe::GetTypeId (void)
@@ -71,7 +72,7 @@
 {
 }
 
-/** We initialize m_cWnd from this function, after attributes initialized */
+/* We initialize m_cWnd from this function, after attributes initialized */
 int
 TcpTahoe::Listen (void)
 {
@@ -80,7 +81,7 @@
   return TcpSocketBase::Listen ();
 }
 
-/** We initialize m_cWnd from this function, after attributes initialized */
+/* We initialize m_cWnd from this function, after attributes initialized */
 int
 TcpTahoe::Connect (const Address & address)
 {
@@ -89,7 +90,7 @@
   return TcpSocketBase::Connect (address);
 }
 
-/** Limit the size of in-flight data by cwnd and receiver's rxwin */
+/* Limit the size of in-flight data by cwnd and receiver's rxwin */
 uint32_t
 TcpTahoe::Window (void)
 {
@@ -103,7 +104,7 @@
   return CopyObject<TcpTahoe> (this);
 }
 
-/** New ACK (up to seqnum seq) received. Increase cwnd and call TcpSocketBase::NewAck() */
+/* New ACK (up to seqnum seq) received. Increase cwnd and call TcpSocketBase::NewAck() */
 void
 TcpTahoe::NewAck (SequenceNumber32 const& seq)
 {
@@ -127,7 +128,7 @@
   TcpSocketBase::NewAck (seq);           // Complete newAck processing
 }
 
-/** Cut down ssthresh upon triple dupack */
+/* Cut down ssthresh upon triple dupack */
 void
 TcpTahoe::DupAck (const TcpHeader& t, uint32_t count)
 {
@@ -147,7 +148,7 @@
     }
 }
 
-/** Retransmit timeout */
+/* Retransmit timeout */
 void TcpTahoe::Retransmit (void)
 {
   NS_LOG_FUNCTION (this);
diff -Naur ns-3.18.1/src/internet/model/tcp-tahoe.h ns-3.19/src/internet/model/tcp-tahoe.h
--- ns-3.18.1/src/internet/model/tcp-tahoe.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-tahoe.h	2013-12-20 09:44:50.000000000 -0800
@@ -42,11 +42,19 @@
 class TcpTahoe : public TcpSocketBase
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   /**
    * Create an unbound tcp socket.
    */
   TcpTahoe (void);
+  /**
+   * \brief Copy constructor
+   * \param sock the object to copy
+   */
   TcpTahoe (const TcpTahoe& sock);
   virtual ~TcpTahoe (void);
 
@@ -68,13 +76,16 @@
   virtual void     SetInitialCwnd (uint32_t cwnd);
   virtual uint32_t GetInitialCwnd (void) const;
 private:
-  void InitializeCwnd (void);            // set m_cWnd when connection starts
+  /**
+   * \brief Set the congestion window when connection starts
+   */
+  void InitializeCwnd (void);
 
 protected:
-  TracedValue<uint32_t>  m_cWnd;         //< Congestion window
-  uint32_t               m_ssThresh;     //< Slow Start Threshold
-  uint32_t               m_initialCWnd;  //< Initial cWnd value
-  uint32_t               m_retxThresh;   //< Fast Retransmit threshold
+  TracedValue<uint32_t>  m_cWnd;         //!< Congestion window
+  uint32_t               m_ssThresh;     //!< Slow Start Threshold
+  uint32_t               m_initialCWnd;  //!< Initial cWnd value
+  uint32_t               m_retxThresh;   //!< Fast Retransmit threshold
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-tx-buffer.h ns-3.19/src/internet/model/tcp-tx-buffer.h
--- ns-3.18.1/src/internet/model/tcp-tx-buffer.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-tx-buffer.h	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,15 @@
 class TcpTxBuffer : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
+  /**
+   * \brief Constructor
+   * \param n initial Sequence number to be transmitted
+   */
   TcpTxBuffer (uint32_t n = 0);
   virtual ~TcpTxBuffer (void);
 
@@ -48,31 +56,37 @@
 
   /**
    * Returns the first byte's sequence number
+   * \returns the first byte's sequence number
    */
   SequenceNumber32 HeadSequence (void) const;
 
   /**
    * Returns the last byte's sequence number + 1
+   * \returns the last byte's sequence number + 1
    */
   SequenceNumber32 TailSequence (void) const;
 
   /**
    * Returns total number of bytes in this Tx buffer
+   * \returns total number of bytes in this Tx buffer
    */
   uint32_t Size (void) const;
 
   /**
    * Returns the Tx window size
+   * \returns the Tx window size (in bytes)
    */
   uint32_t MaxBufferSize (void) const;
 
   /**
    * Set the Tx window size
+   * \param n Tx window size (in bytes)
    */
   void SetMaxBufferSize (uint32_t n);
 
   /**
    * Returns the available capacity in this Tx window
+   * \returns available capacity in this Tx window
    */
   uint32_t Available (void) const;
 
@@ -86,17 +100,23 @@
 
   /**
    * Returns the number of bytes from the buffer in the range [seq, tailSequence)
+   * \param seq initial sequence number
+   * \returns the number of bytes from the buffer in the range
    */
   uint32_t SizeFromSequence (const SequenceNumber32& seq) const;
 
   /**
    * Copy data of size numBytes into a packet, data from the range [seq, seq+numBytes)
+   * \param numBytes number of bytes to copy
+   * \param seq start sequence number to extract
+   * \returns a packet
    */
   Ptr<Packet> CopyFromSequence (uint32_t numBytes, const SequenceNumber32& seq);
 
   /**
    * Set the m_firstByteSeq to seq. Supposed to be called only when the
    * connection is just set up and we did not send any data out yet.
+   * \param seq The sequence number of the head byte
    */
   void SetHeadSequence (const SequenceNumber32& seq);
 
@@ -108,12 +128,13 @@
   void DiscardUpTo (const SequenceNumber32& seq);
 
 private:
+  /// container for data stored in the buffer
   typedef std::list<Ptr<Packet> >::iterator BufIterator;
 
-  TracedValue<SequenceNumber32> m_firstByteSeq; //< Sequence number of the first byte in data (SND.UNA)
-  uint32_t m_size;                              //< Number of data bytes
-  uint32_t m_maxBuffer;                         //< Max number of data bytes in buffer (SND.WND)
-  std::list<Ptr<Packet> > m_data;               //< Corresponding data (may be null)
+  TracedValue<SequenceNumber32> m_firstByteSeq; //!< Sequence number of the first byte in data (SND.UNA)
+  uint32_t m_size;                              //!< Number of data bytes
+  uint32_t m_maxBuffer;                         //!< Max number of data bytes in buffer (SND.WND)
+  std::list<Ptr<Packet> > m_data;               //!< Corresponding data (may be null)
 };
 
 } // namepsace ns3
diff -Naur ns-3.18.1/src/internet/model/tcp-westwood.cc ns-3.19/src/internet/model/tcp-westwood.cc
--- ns-3.18.1/src/internet/model/tcp-westwood.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-westwood.cc	2013-12-20 09:44:50.000000000 -0800
@@ -46,7 +46,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED(TcpWestwood);
+NS_OBJECT_ENSURE_REGISTERED(TcpWestwood)
+  ;
 
 TypeId
 TcpWestwood::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/tcp-westwood.h ns-3.19/src/internet/model/tcp-westwood.h
--- ns-3.18.1/src/internet/model/tcp-westwood.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/tcp-westwood.h	2013-12-20 09:44:50.000000000 -0800
@@ -62,18 +62,32 @@
 class TcpWestwood : public TcpSocketBase
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   TcpWestwood (void);
+  /**
+   * \brief Copy constructor
+   * \param sock the object to copy
+   */
   TcpWestwood (const TcpWestwood& sock);
   virtual ~TcpWestwood (void);
 
+  /**
+   * \brief Protocol variant (Westwood or Westwood+)
+   */
   enum ProtocolType 
   {
     WESTWOOD,
     WESTWOODPLUS
   };
 
+  /**
+   * \brief Filter type (None or Tustin)
+   */
   enum FilterType 
   {
     NONE,
@@ -85,17 +99,11 @@
   virtual int Listen (void);
 
 protected:
-  /**
-   * Limit the size of outstanding data based on the cwnd and the receiver's advertised window
-   *
-   * \return the max. possible number of unacked bytes
-   */  
-  virtual uint32_t Window (void);
-
-  /**
-   * Call CopyObject<TcpWestwood> to clone me
-   */  
-  virtual Ptr<TcpSocketBase> Fork (void);
+  virtual uint32_t Window (void); // Return the max possible number of unacked bytes
+  virtual Ptr<TcpSocketBase> Fork (void); // Call CopyObject<TcpTahoe> to clone me
+  virtual void NewAck (SequenceNumber32 const& seq); // Inc cwnd and call NewAck() of parent
+  virtual void DupAck (const TcpHeader& t, uint32_t count);  // Treat 3 dupack as timeout
+  virtual void Retransmit (void); // Retransmit time out
 
   /**
    * Process the newly received ACK
@@ -106,58 +114,17 @@
   virtual void ReceivedAck (Ptr<Packet> packet, const TcpHeader& tcpHeader);
   
   /**
-   * Adjust the cwnd based on the current congestion control phase,
-   * and then call the TcpSocketBase::NewAck() to complete the processing
-   *
-   * \param seq the acknowledgment number
-   */  
-  virtual void NewAck (SequenceNumber32 const& seq);
-
-  /**
-   * Adjust the cwnd using the currently estimated bandwidth,
-   * retransmit the missing packet, and enter fast recovery if 3 DUPACKs are received
-   *
-   * \param header the TCP header of the ACK packet
-   * \param count the number of DUPACKs
-   */  
-  virtual void DupAck (const TcpHeader& header, uint32_t count);
-
-  /**
-   * Upon an RTO event, adjust the cwnd using the currently estimated bandwidth,
-   * retransmit the missing packet, and exit fast recovery
-   */  
-  virtual void Retransmit (void);
-
-  /**
    * Estimate the RTT, record the minimum value,
    * and run a clock on the RTT to trigger Westwood+ bandwidth sampling
+   * \param header the packet header
    */
   virtual void EstimateRtt (const TcpHeader& header);
 
   // Implementing ns3::TcpSocket -- Attribute get/set
-  /**
-   * \param size the segment size to be used in a connection
-   */  
-  virtual void SetSegSize (uint32_t size);
-
-  /**
-   * \param the slow-start threshold
-   */  
-  virtual void SetSSThresh (uint32_t threshold);
-
-  /**
-   * \return the slow-start threshold
-   */  
+  virtual void     SetSegSize (uint32_t size);
+  virtual void     SetSSThresh (uint32_t threshold);
   virtual uint32_t GetSSThresh (void) const;
-
-  /**
-   * \param cwnd the initial cwnd
-   */  
-  virtual void SetInitialCwnd (uint32_t cwnd);
-
-  /**
-   * \return the initial cwnd
-   */ 
+  virtual void     SetInitialCwnd (uint32_t cwnd);
   virtual uint32_t GetInitialCwnd (void) const;
 
 private:
@@ -196,24 +163,24 @@
   void Filtering (void);
 
 protected:
-  TracedValue<uint32_t>  m_cWnd;                   //< Congestion window
-  uint32_t               m_ssThresh;               //< Slow Start Threshold
-  uint32_t               m_initialCWnd;            //< Initial cWnd value
-  bool                   m_inFastRec;              //< Currently in fast recovery if TRUE
-
-  TracedValue<double>    m_currentBW;              //< Current value of the estimated BW
-  double                 m_lastSampleBW;           //< Last bandwidth sample
-  double                 m_lastBW;                 //< Last bandwidth sample after being filtered
-  Time                   m_minRtt;                 //< Minimum RTT
-  double                 m_lastAck;                //< The time last ACK was received
-  SequenceNumber32       m_prevAckNo;              //< Previously received ACK number
-  int                    m_accountedFor;           //< The number of received DUPACKs
-  enum ProtocolType      m_pType;                  //< 0 for Westwood, 1 for Westwood+
-  enum FilterType        m_fType;                  //< 0 for none, 1 for Tustin
-
-  int                    m_ackedSegments;          //< The number of segments ACKed between RTTs
-  bool                   m_IsCount;                //< Start keeping track of m_ackedSegments for Westwood+ if TRUE
-  EventId                m_bwEstimateEvent;        //< The BW estimation event for Westwood+
+  TracedValue<uint32_t>  m_cWnd;                   //!< Congestion window
+  uint32_t               m_ssThresh;               //!< Slow Start Threshold
+  uint32_t               m_initialCWnd;            //!< Initial cWnd value
+  bool                   m_inFastRec;              //!< Currently in fast recovery if TRUE
+
+  TracedValue<double>    m_currentBW;              //!< Current value of the estimated BW
+  double                 m_lastSampleBW;           //!< Last bandwidth sample
+  double                 m_lastBW;                 //!< Last bandwidth sample after being filtered
+  Time                   m_minRtt;                 //!< Minimum RTT
+  double                 m_lastAck;                //!< The time last ACK was received
+  SequenceNumber32       m_prevAckNo;              //!< Previously received ACK number
+  int                    m_accountedFor;           //!< The number of received DUPACKs
+  enum ProtocolType      m_pType;                  //!< 0 for Westwood, 1 for Westwood+
+  enum FilterType        m_fType;                  //!< 0 for none, 1 for Tustin
+
+  int                    m_ackedSegments;          //!< The number of segments ACKed between RTTs
+  bool                   m_IsCount;                //!< Start keeping track of m_ackedSegments for Westwood+ if TRUE
+  EventId                m_bwEstimateEvent;        //!< The BW estimation event for Westwood+
 
 };
 
diff -Naur ns-3.18.1/src/internet/model/udp-header.cc ns-3.19/src/internet/model/udp-header.cc
--- ns-3.18.1/src/internet/model/udp-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UdpHeader);
+NS_OBJECT_ENSURE_REGISTERED (UdpHeader)
+  ;
 
 /* The magic values below are used only for debugging.
  * They can be used to easily detect memory corruption
@@ -32,7 +33,8 @@
 UdpHeader::UdpHeader ()
   : m_sourcePort (0xfffd),
     m_destinationPort (0xfffd),
-    m_payloadSize (0xfffd),
+    m_payloadSize (0),
+    m_checksum (0),
     m_calcChecksum (false),
     m_goodChecksum (true)
 {
@@ -107,7 +109,7 @@
 
   WriteTo (it, m_source);
   WriteTo (it, m_destination);
-  if (Ipv4Address::IsMatchingType(m_source))
+  if (Ipv4Address::IsMatchingType (m_source))
     {
       it.WriteU8 (0); /* protocol */
       it.WriteU8 (m_protocol); /* protocol */
@@ -115,7 +117,7 @@
       it.WriteU8 (size & 0xff); /* length */
       hdrSize = 12;
     }
-  else if (Ipv6Address::IsMatchingType(m_source))
+  else if (Ipv6Address::IsMatchingType (m_source))
     {
       it.WriteU16 (0);
       it.WriteU8 (size >> 8); /* length */
@@ -137,6 +139,17 @@
   return m_goodChecksum; 
 }
 
+void
+UdpHeader::ForceChecksum (uint16_t checksum)
+{
+  m_checksum = checksum;
+}
+
+void
+UdpHeader::ForcePayloadSize (uint16_t payloadSize)
+{
+  m_payloadSize = payloadSize;
+}
 
 TypeId 
 UdpHeader::GetTypeId (void)
@@ -174,18 +187,33 @@
 
   i.WriteHtonU16 (m_sourcePort);
   i.WriteHtonU16 (m_destinationPort);
-  i.WriteHtonU16 (start.GetSize ());
-  i.WriteU16 (0);
+  if (m_payloadSize == 0)
+    {
+      i.WriteHtonU16 (start.GetSize ());
+    }
+  else
+    {
+      i.WriteHtonU16 (m_payloadSize);
+    }
 
-  if (m_calcChecksum)
+  if ( m_checksum == 0)
     {
-      uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
-      i = start;
-      uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
+      i.WriteU16 (0);
 
-      i = start;
-      i.Next (6);
-      i.WriteU16 (checksum);
+      if (m_calcChecksum)
+        {
+          uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
+          i = start;
+          uint16_t checksum = i.CalculateIpChecksum (start.GetSize (), headerChecksum);
+
+          i = start;
+          i.Next (6);
+          i.WriteU16 (checksum);
+        }
+    }
+  else
+    {
+      i.WriteU16 (m_checksum);
     }
 }
 uint32_t
@@ -195,9 +223,9 @@
   m_sourcePort = i.ReadNtohU16 ();
   m_destinationPort = i.ReadNtohU16 ();
   m_payloadSize = i.ReadNtohU16 () - GetSerializedSize ();
-  i.Next (2);
+  m_checksum = i.ReadU16 ();
 
-  if(m_calcChecksum)
+  if (m_calcChecksum)
     {
       uint16_t headerChecksum = CalculateHeaderChecksum (start.GetSize ());
       i = start;
@@ -209,5 +237,10 @@
   return GetSerializedSize ();
 }
 
+uint16_t
+UdpHeader::GetChecksum ()
+{
+  return m_checksum;
+}
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/udp-header.h ns-3.19/src/internet/model/udp-header.h
--- ns-3.18.1/src/internet/model/udp-header.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -114,6 +114,10 @@
                            Ipv6Address destination,
                            uint8_t protocol);
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
   virtual void Print (std::ostream &os) const;
@@ -127,17 +131,58 @@
    */
   bool IsChecksumOk (void) const;
 
+  /**
+   * \brief Force the UDP checksum to a given value.
+   *
+   * This might be useful for test purposes or to
+   * restore the UDP checksum when the UDP header
+   * has been compressed (e.g., in 6LoWPAN).
+   * Note that, normally, the header checksum is
+   * calculated on the fly when the packet is
+   * serialized.
+   *
+   * When this option is used, the UDP checksum is written in
+   * the header, regardless of the global ChecksumEnabled option.
+   *
+   * \note The checksum value must be a big endian number.
+   *
+   * \param checksum the checksum to use (big endian).
+   */
+  void ForceChecksum (uint16_t checksum);
+
+  /**
+   * \brief Force the UDP payload length to a given value.
+   *
+   * This might be useful when forging a packet for test
+   * purposes.
+   *
+   * \param payloadSize the payload length to use.
+   */
+  void ForcePayloadSize (uint16_t payloadSize);
+
+  /**
+   * \brief Return the checksum (only known after a Deserialize)
+   * \return The checksum for this UdpHeader
+   */
+  uint16_t GetChecksum ();
+
 private:
+  /**
+   * \brief Calculate the header checksum
+   * \param size packet size
+   * \returns the checksum
+   */
   uint16_t CalculateHeaderChecksum (uint16_t size) const;
-  uint16_t m_sourcePort;
-  uint16_t m_destinationPort;
-  uint16_t m_payloadSize;
-
-  Address m_source;
-  Address m_destination;
-  uint8_t m_protocol;
-  bool m_calcChecksum;
-  bool m_goodChecksum;
+  uint16_t m_sourcePort;      //!< Source port
+  uint16_t m_destinationPort; //!< Destination port
+  uint16_t m_payloadSize;     //!< Payload size
+
+  Address m_source;           //!< Source IP address
+  Address m_destination;      //!< Destination IP address
+  uint8_t m_protocol;         //!< Protocol number
+  uint16_t m_checksum;        //!< Forced Checksum value
+  bool m_calcChecksum;        //!< Flag to calculate checksum
+  bool m_goodChecksum;        //!< Flag to indicate that checksum is correct
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/udp-l4-protocol.cc ns-3.19/src/internet/model/udp-l4-protocol.cc
--- ns-3.18.1/src/internet/model/udp-l4-protocol.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-l4-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -44,7 +44,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UdpL4Protocol);
+NS_OBJECT_ENSURE_REGISTERED (UdpL4Protocol)
+  ;
 
 /* see http://www.iana.org/assignments/protocol-numbers */
 const uint8_t UdpL4Protocol::PROT_NUMBER = 17;
@@ -402,7 +403,7 @@
   for (Ipv6EndPointDemux::EndPointsI endPoint = endPoints.begin ();
        endPoint != endPoints.end (); endPoint++)
     {
-      (*endPoint)->ForwardUp (packet->Copy (), header, udpHeader.GetSourcePort ());
+      (*endPoint)->ForwardUp (packet->Copy (), header, udpHeader.GetSourcePort (), interface);
     }
   return IpL4Protocol::RX_OK;
 }
diff -Naur ns-3.18.1/src/internet/model/udp-l4-protocol.h ns-3.19/src/internet/model/udp-l4-protocol.h
--- ns-3.18.1/src/internet/model/udp-l4-protocol.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-l4-protocol.h	2013-12-20 09:44:50.000000000 -0800
@@ -47,12 +47,20 @@
  */
 class UdpL4Protocol : public IpL4Protocol {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
-  static const uint8_t PROT_NUMBER;
+  static const uint8_t PROT_NUMBER; //!< protocol number (0x11)
 
   UdpL4Protocol ();
   virtual ~UdpL4Protocol ();
 
+  /**
+   * Set node associated with this stack
+   * \param node the node
+   */
   void SetNode (Ptr<Node> node);
 
   virtual int GetProtocolNumber (void) const;
@@ -63,25 +71,90 @@
    */
   Ptr<Socket> CreateSocket (void);
 
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (void);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param address address to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address address);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (uint16_t port);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param address address to use
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address address, uint16_t port);
+  /**
+   * \brief Allocate an IPv4 Endpoint
+   * \param localAddress local address to use
+   * \param localPort local port to use
+   * \param peerAddress remote address to use
+   * \param peerPort remote port to use
+   * \return the Endpoint
+   */
   Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
                           Ipv4Address peerAddress, uint16_t peerPort);
+
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (void);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \param address address to use
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (Ipv6Address address);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (uint16_t port);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \param address address to use
+   * \param port port to use
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (Ipv6Address address, uint16_t port);
+  /**
+   * \brief Allocate an IPv6 Endpoint
+   * \param localAddress local address to use
+   * \param localPort local port to use
+   * \param peerAddress remote address to use
+   * \param peerPort remote port to use
+   * \return the Endpoint
+   */
   Ipv6EndPoint *Allocate6 (Ipv6Address localAddress, uint16_t localPort,
-                          Ipv6Address peerAddress, uint16_t peerPort);
+                           Ipv6Address peerAddress, uint16_t peerPort);
 
+  /**
+   * \brief Remove an IPv4 Endpoint.
+   * \param endPoint the end point to remove
+   */
   void DeAllocate (Ipv4EndPoint *endPoint);
+  /**
+   * \brief Remove an IPv6 Endpoint.
+   * \param endPoint the end point to remove
+   */
   void DeAllocate (Ipv6EndPoint *endPoint);
 
   // called by UdpSocket.
   /**
-   * \brief Send a packet via UDP
+   * \brief Send a packet via UDP (IPv4)
    * \param packet The packet to send
    * \param saddr The source Ipv4Address
    * \param daddr The destination Ipv4Address
@@ -91,40 +164,50 @@
   void Send (Ptr<Packet> packet,
              Ipv4Address saddr, Ipv4Address daddr, 
              uint16_t sport, uint16_t dport);
+  /**
+   * \brief Send a packet via UDP (IPv4)
+   * \param packet The packet to send
+   * \param saddr The source Ipv4Address
+   * \param daddr The destination Ipv4Address
+   * \param sport The source port number
+   * \param dport The destination port number
+   * \param route The route
+   */
   void Send (Ptr<Packet> packet,
              Ipv4Address saddr, Ipv4Address daddr, 
              uint16_t sport, uint16_t dport, Ptr<Ipv4Route> route);
+  /**
+   * \brief Send a packet via UDP (IPv6)
+   * \param packet The packet to send
+   * \param saddr The source Ipv4Address
+   * \param daddr The destination Ipv4Address
+   * \param sport The source port number
+   * \param dport The destination port number
+   */
   void Send (Ptr<Packet> packet,
              Ipv6Address saddr, Ipv6Address daddr, 
              uint16_t sport, uint16_t dport);
+  /**
+   * \brief Send a packet via UDP (IPv6)
+   * \param packet The packet to send
+   * \param saddr The source Ipv4Address
+   * \param daddr The destination Ipv4Address
+   * \param sport The source port number
+   * \param dport The destination port number
+   * \param route The route
+   */
   void Send (Ptr<Packet> packet,
              Ipv6Address saddr, Ipv6Address daddr, 
              uint16_t sport, uint16_t dport, Ptr<Ipv6Route> route);
-  /**
-   * \brief Receive a packet up the protocol stack
-   * \param p The Packet to dump the contents into
-   * \param header IPv4 Header information
-   * \param interface the interface from which the packet is coming.
-   */
+
   // inherited from Ipv4L4Protocol
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                                 Ipv4Header const &header,
-                                                 Ptr<Ipv4Interface> interface);
+                                               Ipv4Header const &header,
+                                               Ptr<Ipv4Interface> interface);
   virtual enum IpL4Protocol::RxStatus Receive (Ptr<Packet> p,
-                                                 Ipv6Header const &header,
-                                                 Ptr<Ipv6Interface> interface);
+                                               Ipv6Header const &header,
+                                               Ptr<Ipv6Interface> interface);
 
-  /**
-   * \brief Receive an ICMP packet
-   * \param icmpSource The IP address of the source of the packet.
-   * \param icmpTtl The time to live from the IP header
-   * \param icmpType The type of the message from the ICMP header
-   * \param icmpCode The message code from the ICMP header
-   * \param icmpInfo 32-bit integer carrying informational value of varying semantics.
-   * \param payloadSource The IP source address from the IP header of the packet
-   * \param payloadDestination The IP destination address from the IP header of the packet
-   * \param payload Payload of the ICMP packet
-   */
   virtual void ReceiveIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
                             uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo,
                             Ipv4Address payloadSource,Ipv4Address payloadDestination,
@@ -149,14 +232,28 @@
    */
   virtual void NotifyNewAggregate ();
 private:
-  Ptr<Node> m_node;
-  Ipv4EndPointDemux *m_endPoints;
-  Ipv6EndPointDemux *m_endPoints6;
-  UdpL4Protocol (const UdpL4Protocol &o);
-  UdpL4Protocol &operator = (const UdpL4Protocol &o);
-  std::vector<Ptr<UdpSocketImpl> > m_sockets;
-  IpL4Protocol::DownTargetCallback m_downTarget;
-  IpL4Protocol::DownTargetCallback6 m_downTarget6;
+  Ptr<Node> m_node; //!< the node this stack is associated with
+  Ipv4EndPointDemux *m_endPoints; //!< A list of IPv4 end points.
+  Ipv6EndPointDemux *m_endPoints6; //!< A list of IPv6 end points.
+
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and not implemented to avoid misuse
+   */
+  UdpL4Protocol (const UdpL4Protocol &);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and not implemented to avoid misuse
+   * \returns
+   */
+  UdpL4Protocol &operator = (const UdpL4Protocol &);
+
+  std::vector<Ptr<UdpSocketImpl> > m_sockets;      //!< list of sockets
+  IpL4Protocol::DownTargetCallback m_downTarget;   //!< Callback to send packets over IPv4
+  IpL4Protocol::DownTargetCallback6 m_downTarget6; //!< Callback to send packets over IPv6
+
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/udp-socket.cc ns-3.19/src/internet/model/udp-socket.cc
--- ns-3.18.1/src/internet/model/udp-socket.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-socket.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UdpSocket);
+NS_OBJECT_ENSURE_REGISTERED (UdpSocket)
+  ;
 
 TypeId
 UdpSocket::GetTypeId (void)
diff -Naur ns-3.18.1/src/internet/model/udp-socket-factory.cc ns-3.19/src/internet/model/udp-socket-factory.cc
--- ns-3.18.1/src/internet/model/udp-socket-factory.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-socket-factory.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UdpSocketFactory);
+NS_OBJECT_ENSURE_REGISTERED (UdpSocketFactory)
+  ;
 
 TypeId UdpSocketFactory::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/internet/model/udp-socket-factory.h ns-3.19/src/internet/model/udp-socket-factory.h
--- ns-3.18.1/src/internet/model/udp-socket-factory.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-socket-factory.h	2013-12-20 09:44:50.000000000 -0800
@@ -40,6 +40,10 @@
 class UdpSocketFactory : public SocketFactory
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
 };
diff -Naur ns-3.18.1/src/internet/model/udp-socket-factory-impl.h ns-3.19/src/internet/model/udp-socket-factory-impl.h
--- ns-3.18.1/src/internet/model/udp-socket-factory-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-socket-factory-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -57,6 +57,10 @@
   UdpSocketFactoryImpl ();
   virtual ~UdpSocketFactoryImpl ();
 
+  /**
+   * \brief Set the associated UDP L4 protocol.
+   * \param udp the UDP L4 protocol
+   */
   void SetUdp (Ptr<UdpL4Protocol> udp);
 
   /**
@@ -71,7 +75,7 @@
 protected:
   virtual void DoDispose (void);
 private:
-  Ptr<UdpL4Protocol> m_udp;
+  Ptr<UdpL4Protocol> m_udp; //!< the associated UDP L4 protocol
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/model/udp-socket.h ns-3.19/src/internet/model/udp-socket.h
--- ns-3.18.1/src/internet/model/udp-socket.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-socket.h	2013-12-20 09:44:50.000000000 -0800
@@ -46,6 +46,11 @@
 class UdpSocket : public Socket
 {
 public:
+  /**
+   * Get the type ID.
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
  
   UdpSocket (void);
@@ -99,15 +104,67 @@
 
 private:
   // Indirect the attribute setting and getting through private virtual methods
+  /**
+   * \brief Set the receiving buffer size
+   * \param size the buffer size
+   */
   virtual void SetRcvBufSize (uint32_t size) = 0;
+  /**
+   * \brief Get the receiving buffer size
+   * \returns the buffer size
+   */
   virtual uint32_t GetRcvBufSize (void) const = 0;
+  /**
+   * \brief Set the IP multicast TTL
+   * \param ipTtl the IP multicast TTL
+   */
   virtual void SetIpMulticastTtl (uint8_t ipTtl) = 0;
+  /**
+   * \brief Get the IP multicast TTL
+   * \returns the IP multicast TTL
+   */
   virtual uint8_t GetIpMulticastTtl (void) const = 0;
+  /**
+   * \brief Set the IP multicast interface
+   * \param ipIf the IP multicast interface
+   */
   virtual void SetIpMulticastIf (int32_t ipIf) = 0;
+  /**
+   * \brief Get the IP multicast interface
+   * \returns the IP multicast interface
+   */
   virtual int32_t GetIpMulticastIf (void) const = 0;
+  /**
+   * \brief Set the IP multicast loop capability
+   *
+   * This means that the socket will receive the packets
+   * sent by itself on a multicast address.
+   * Equivalent to setsockopt  IP_MULTICAST_LOOP
+   *
+   * \param loop the IP multicast loop capability
+   */
   virtual void SetIpMulticastLoop (bool loop) = 0;
+  /**
+   * \brief Get the IP multicast loop capability
+   *
+   * This means that the socket will receive the packets
+   * sent by itself on a multicast address.
+   * Equivalent to setsockopt  IP_MULTICAST_LOOP
+   *
+   * \returns the IP multicast loop capability
+   */
   virtual bool GetIpMulticastLoop (void) const = 0;
+  /**
+   * \brief Set the MTU discover capability
+   *
+   * \param discover the MTU discover capability
+   */
   virtual void SetMtuDiscover (bool discover) = 0;
+  /**
+   * \brief Get the MTU discover capability
+   *
+   * \returns the MTU discover capability
+   */
   virtual bool GetMtuDiscover (void) const = 0;
 };
 
diff -Naur ns-3.18.1/src/internet/model/udp-socket-impl.cc ns-3.19/src/internet/model/udp-socket-impl.cc
--- ns-3.18.1/src/internet/model/udp-socket-impl.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-socket-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,7 @@
 #include "ns3/udp-socket-factory.h"
 #include "ns3/trace-source-accessor.h"
 #include "ns3/ipv4-packet-info-tag.h"
+#include "ns3/ipv6-packet-info-tag.h"
 #include "udp-socket-impl.h"
 #include "udp-l4-protocol.h"
 #include "ipv4-end-point.h"
@@ -42,9 +43,13 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UdpSocketImpl);
+NS_OBJECT_ENSURE_REGISTERED (UdpSocketImpl)
+  ;
 
-static const uint32_t MAX_IPV4_UDP_DATAGRAM_SIZE = 65507;
+// The correct maximum UDP message size is 65507, as determined by the following formula:
+// 0xffff - (sizeof(IP Header) + sizeof(UDP Header)) = 65535-(20+8) = 65507
+// \todo MAX_IPV4_UDP_DATAGRAM_SIZE is correct only for IPv4
+static const uint32_t MAX_IPV4_UDP_DATAGRAM_SIZE = 65507; //!< Maximum UDP datagram size
 
 // Add attributes generic to all UdpSockets to base class UdpSocket
 TypeId
@@ -243,6 +248,11 @@
         {
           m_endPoint = m_udp->Allocate (ipv4, port);
         }
+      if (0 == m_endPoint)
+        {
+          m_errno = port ? ERROR_ADDRINUSE : ERROR_ADDRNOTAVAIL;
+          return -1;
+        }
     }
   else if (Inet6SocketAddress::IsMatchingType (address))
     {
@@ -265,6 +275,11 @@
         {
           m_endPoint6 = m_udp->Allocate6 (ipv6, port);
         }
+      if (0 == m_endPoint6)
+        {
+          m_errno = port ? ERROR_ADDRINUSE : ERROR_ADDRNOTAVAIL;
+          return -1;
+        }
     }
   else
     {
@@ -735,9 +750,9 @@
 }
 
 
-//  maximum message size for UDP broadcast is limited by MTU
+// maximum message size for UDP broadcast is limited by MTU
 // size of underlying link; we are not checking that now.
-/// \todo Check MTU size of underlying link
+// \todo Check MTU size of underlying link
 uint32_t
 UdpSocketImpl::GetTxAvailable (void) const
 {
@@ -951,7 +966,7 @@
 }
 
 void 
-UdpSocketImpl::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port)
+UdpSocketImpl::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface)
 {
   NS_LOG_FUNCTION (this << packet << header.GetSourceAddress () << port);
 
@@ -960,6 +975,14 @@
       return;
     }
 
+  // Should check via getsockopt ()..
+  if (IsRecvPktInfo ())
+    {
+      Ipv6PacketInfoTag tag;
+      packet->RemovePacketTag (tag);
+      tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
+      packet->AddPacketTag (tag);
+    }
 
   //Check only version 6 options
   if (IsIpv6RecvTclass ())
diff -Naur ns-3.18.1/src/internet/model/udp-socket-impl.h ns-3.19/src/internet/model/udp-socket-impl.h
--- ns-3.18.1/src/internet/model/udp-socket-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/model/udp-socket-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -50,6 +50,10 @@
 class UdpSocketImpl : public UdpSocket
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
   /**
    * Create an unbound udp socket.
@@ -57,7 +61,15 @@
   UdpSocketImpl ();
   virtual ~UdpSocketImpl ();
 
+  /**
+   * \brief Set the associated node.
+   * \param node the node
+   */
   void SetNode (Ptr<Node> node);
+  /**
+   * \brief Set the associated UDP L4 protocol.
+   * \param udp the UDP L4 protocol
+   */
   void SetUdp (Ptr<UdpL4Protocol> udp);
 
   virtual enum SocketErrno GetErrno (void) const;
@@ -101,48 +113,128 @@
 
   friend class UdpSocketFactory;
   // invoked by Udp class
+
+  /**
+   * Finish the binding process
+   * \returns 0 on success, -1 on failure
+   */
   int FinishBind (void);
-  void ForwardUp (Ptr<Packet> p, Ipv4Header header, uint16_t port, 
-                  Ptr<Ipv4Interface> incomingInterface);
-  void ForwardUp6 (Ptr<Packet> p, Ipv6Header header, uint16_t port);
+
+  /**
+   * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+   *
+   * \param packet the incoming packet
+   * \param header the packet's IPv4 header
+   * \param port the incoming port
+   * \param incomingInterface the incoming interface
+   */
+  void ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port, Ptr<Ipv4Interface> incomingInterface);
+
+  /**
+   * \brief Called by the L3 protocol when it received a packet to pass on to TCP.
+   *
+   * \param packet the incoming packet
+   * \param header the packet's IPv6 header
+   * \param port the incoming port
+   * \param incomingInterface the incoming interface
+   */
+  void ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface);
+
+  /**
+   * \brief Kill this socket by zeroing its attributes (IPv4)
+   *
+   * This is a callback function configured to m_endpoint in
+   * SetupCallback(), invoked when the endpoint is destroyed.
+   */
   void Destroy (void);
+
+  /**
+   * \brief Kill this socket by zeroing its attributes (IPv6)
+   *
+   * This is a callback function configured to m_endpoint in
+   * SetupCallback(), invoked when the endpoint is destroyed.
+   */
   void Destroy6 (void);
+
+  /**
+   * \brief Send a packet
+   * \param p packet
+   * \returns 0 on success, -1 on failure
+   */
   int DoSend (Ptr<Packet> p);
+  /**
+   * \brief Send a packet to a specific destination
+   * \param p packet
+   * \param daddr destination address
+   * \returns 0 on success, -1 on failure
+   */
   int DoSendTo (Ptr<Packet> p, const Address &daddr);
+  /**
+   * \brief Send a packet to a specific destination and port (IPv4)
+   * \param p packet
+   * \param daddr destination address
+   * \param dport destination port
+   * \returns 0 on success, -1 on failure
+   */
   int DoSendTo (Ptr<Packet> p, Ipv4Address daddr, uint16_t dport);
+  /**
+   * \brief Send a packet to a specific destination and port (IPv6)
+   * \param p packet
+   * \param daddr destination address
+   * \param dport destination port
+   * \returns 0 on success, -1 on failure
+   */
   int DoSendTo (Ptr<Packet> p, Ipv6Address daddr, uint16_t dport);
-  void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, 
-                    uint8_t icmpType, uint8_t icmpCode,
-                    uint32_t icmpInfo);
-  void ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl, 
-                     uint8_t icmpType, uint8_t icmpCode,
-                     uint32_t icmpInfo);
-
-  Ipv4EndPoint *m_endPoint;
-  Ipv6EndPoint *m_endPoint6;
-  Ptr<Node> m_node;
-  Ptr<UdpL4Protocol> m_udp;
-  Address m_defaultAddress;
-  uint16_t m_defaultPort;
-  TracedCallback<Ptr<const Packet> > m_dropTrace;
-
-  enum SocketErrno m_errno;
-  bool m_shutdownSend;
-  bool m_shutdownRecv;
-  bool m_connected;
-  bool m_allowBroadcast;
 
-  std::queue<Ptr<Packet> > m_deliveryQueue;
-  uint32_t m_rxAvailable;
+  /**
+   * \brief Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
+   *
+   * \param icmpSource the ICMP source address
+   * \param icmpTtl the ICMP Time to Live
+   * \param icmpType the ICMP Type
+   * \param icmpCode the ICMP Code
+   * \param icmpInfo the ICMP Info
+   */
+  void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
+
+  /**
+   * \brief Called by the L3 protocol when it received an ICMPv6 packet to pass on to TCP.
+   *
+   * \param icmpSource the ICMP source address
+   * \param icmpTtl the ICMP Time to Live
+   * \param icmpType the ICMP Type
+   * \param icmpCode the ICMP Code
+   * \param icmpInfo the ICMP Info
+   */
+  void ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
+
+  // Connections to other layers of TCP/IP
+  Ipv4EndPoint*       m_endPoint;   //!< the IPv4 endpoint
+  Ipv6EndPoint*       m_endPoint6;  //!< the IPv6 endpoint
+  Ptr<Node>           m_node;       //!< the associated node
+  Ptr<UdpL4Protocol> m_udp;         //!< the associated UDP L4 protocol
+  Callback<void, Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback;  //!< ICMP callback
+  Callback<void, Ipv6Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback6; //!< ICMPv6 callback
+
+  Address m_defaultAddress; //!< Default address
+  uint16_t m_defaultPort;   //!< Default port
+  TracedCallback<Ptr<const Packet> > m_dropTrace; //!< Trace for dropped packets
+
+  enum SocketErrno         m_errno;           //!< Socket error code
+  bool                     m_shutdownSend;    //!< Send no longer allowed
+  bool                     m_shutdownRecv;    //!< Receive no longer allowed
+  bool                     m_connected;       //!< Connection established
+  bool                     m_allowBroadcast;  //!< Allow send broadcast packets
+
+  std::queue<Ptr<Packet> > m_deliveryQueue; //!< Queue for incoming packets
+  uint32_t m_rxAvailable;                   //!< Number of available bytes to be received
 
   // Socket attributes
-  uint32_t m_rcvBufSize;
-  uint8_t m_ipMulticastTtl;
-  int32_t m_ipMulticastIf;
-  bool m_ipMulticastLoop;
-  bool m_mtuDiscover;
-  Callback<void, Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback;
-  Callback<void, Ipv6Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback6;
+  uint32_t m_rcvBufSize;    //!< Receive buffer size
+  uint8_t m_ipMulticastTtl; //!< Multicast TTL
+  int32_t m_ipMulticastIf;  //!< Multicast Interface
+  bool m_ipMulticastLoop;   //!< Allow multicast loop
+  bool m_mtuDiscover;       //!< Allow MTU discovery
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/internet/test/error-channel.cc ns-3.19/src/internet/test/error-channel.cc
--- ns-3.18.1/src/internet/test/error-channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/test/error-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -18,7 +18,7 @@
  * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
  */
 #include "error-channel.h"
-#include "error-net-device.h"
+#include "ns3/simple-net-device.h"
 #include "ns3/simulator.h"
 #include "ns3/packet.h"
 #include "ns3/node.h"
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ErrorChannel);
+NS_OBJECT_ENSURE_REGISTERED (ErrorChannel)
+  ;
 
 TypeId 
 ErrorChannel::GetTypeId (void)
@@ -62,12 +63,12 @@
 void
 ErrorChannel::Send (Ptr<Packet> p, uint16_t protocol,
                     Mac48Address to, Mac48Address from,
-                    Ptr<ErrorNetDevice> sender)
+                    Ptr<SimpleNetDevice> sender)
 {
   NS_LOG_FUNCTION (p << protocol << to << from << sender);
-  for (std::vector<Ptr<ErrorNetDevice> >::const_iterator i = m_devices.begin (); i != m_devices.end (); ++i)
+  for (std::vector<Ptr<SimpleNetDevice> >::const_iterator i = m_devices.begin (); i != m_devices.end (); ++i)
     {
-      Ptr<ErrorNetDevice> tmp = *i;
+      Ptr<SimpleNetDevice> tmp = *i;
       if (tmp == sender)
         {
           continue;
@@ -75,20 +76,20 @@
       if( !jumping || jumpingState%2 )
         {
           Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), Seconds (0),
-                                      &ErrorNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+                                      &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
           jumpingState++;
         }
       else
         {
           Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), jumpingTime,
-                                      &ErrorNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+                                      &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
           jumpingState++;
         }
     }
 }
 
 void 
-ErrorChannel::Add (Ptr<ErrorNetDevice> device)
+ErrorChannel::Add (Ptr<SimpleNetDevice> device)
 {
   m_devices.push_back (device);
 }
@@ -104,7 +105,8 @@
   return m_devices[i];
 }
 
-NS_OBJECT_ENSURE_REGISTERED (ErrorModel);
+NS_OBJECT_ENSURE_REGISTERED (BinaryErrorModel)
+  ;
 
 TypeId BinaryErrorModel::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/internet/test/error-channel.h ns-3.19/src/internet/test/error-channel.h
--- ns-3.18.1/src/internet/test/error-channel.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/test/error-channel.h	2013-12-20 09:44:50.000000000 -0800
@@ -20,7 +20,7 @@
 #ifndef ERROR_CHANNEL_H
 #define ERROR_CHANNEL_H
 
-#include "ns3/channel.h"
+#include "ns3/simple-channel.h"
 #include "ns3/error-model.h"
 #include "ns3/mac48-address.h"
 #include "ns3/nstime.h"
@@ -28,23 +28,23 @@
 
 namespace ns3 {
 
-class ErrorNetDevice;
+class SimpleNetDevice;
 class Packet;
 
 /**
  * \ingroup channel
  * \brief A Error channel, introducing deterministic delays on even/odd packets. Used for testing
  */
-class ErrorChannel : public Channel
+class ErrorChannel : public SimpleChannel
 {
 public:
   static TypeId GetTypeId (void);
   ErrorChannel ();
 
-  void Send (Ptr<Packet> p, uint16_t protocol, Mac48Address to, Mac48Address from,
-	     Ptr<ErrorNetDevice> sender);
+  virtual void Send (Ptr<Packet> p, uint16_t protocol, Mac48Address to, Mac48Address from,
+                     Ptr<SimpleNetDevice> sender);
 
-  void Add (Ptr<ErrorNetDevice> device);
+  virtual void Add (Ptr<SimpleNetDevice> device);
 
   // inherited from ns3::Channel
   virtual uint32_t GetNDevices (void) const;
@@ -63,7 +63,7 @@
 void SetJumpingMode(bool mode);
 
 private:
-  std::vector<Ptr<ErrorNetDevice> > m_devices;
+  std::vector<Ptr<SimpleNetDevice> > m_devices;
   Time jumpingTime;
   uint8_t jumpingState;
   bool jumping;
diff -Naur ns-3.18.1/src/internet/test/error-net-device.cc ns-3.19/src/internet/test/error-net-device.cc
--- ns-3.18.1/src/internet/test/error-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/test/error-net-device.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,255 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Universita' di Firenze, Italy
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
- */
-#include "error-net-device.h"
-#include "error-channel.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/log.h"
-#include "ns3/pointer.h"
-#include "ns3/error-model.h"
-#include "ns3/trace-source-accessor.h"
-
-NS_LOG_COMPONENT_DEFINE ("ErrorNetDevice");
-
-namespace ns3 {
-
-NS_OBJECT_ENSURE_REGISTERED (ErrorNetDevice);
-
-TypeId 
-ErrorNetDevice::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ErrorNetDevice")
-    .SetParent<NetDevice> ()
-    .AddConstructor<ErrorNetDevice> ()
-    .AddAttribute ("ReceiveErrorModel",
-                   "The receiver error model used to simulate packet loss",
-                   PointerValue (),
-                   MakePointerAccessor (&ErrorNetDevice::m_receiveErrorModel),
-                   MakePointerChecker<ErrorModel> ())
-    .AddTraceSource ("PhyRxDrop",
-                     "Trace source indicating a packet has been dropped by the device during reception",
-                     MakeTraceSourceAccessor (&ErrorNetDevice::m_phyRxDropTrace))
-    ;
-  return tid;
-}
-
-ErrorNetDevice::ErrorNetDevice ()
-  : m_channel (0),
-    m_node (0),
-    m_mtu (0xffff),
-    m_ifIndex (0)
-{}
-
-void 
-ErrorNetDevice::Receive (Ptr<Packet> packet, uint16_t protocol,
-			  Mac48Address to, Mac48Address from)
-{
-  NS_LOG_FUNCTION (packet << protocol << to << from << *packet);
-  NetDevice::PacketType packetType;
-
-  if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (packet) )
-    {
-      m_phyRxDropTrace (packet);
-      return;
-    }
-
-  if (to == m_address)
-    {
-      packetType = NetDevice::PACKET_HOST;
-    }
-  else if (to.IsBroadcast ())
-    {
-      packetType = NetDevice::PACKET_HOST;
-    }
-  else if (to.IsGroup ())
-    {
-      packetType = NetDevice::PACKET_MULTICAST;
-    }
-  else 
-    {
-      packetType = NetDevice::PACKET_OTHERHOST;
-    }
-  m_rxCallback (this, packet, protocol, from);
-  if (!m_promiscCallback.IsNull ())
-    {
-      m_promiscCallback (this, packet, protocol, from, to, packetType);
-    }
-}
-
-void 
-ErrorNetDevice::SetChannel (Ptr<ErrorChannel> channel)
-{
-  m_channel = channel;
-  m_channel->Add (this);
-}
-
-void
-ErrorNetDevice::SetReceiveErrorModel (Ptr<ErrorModel> em)
-{
-  m_receiveErrorModel = em;
-}
-
-void 
-ErrorNetDevice::SetIfIndex(const uint32_t index)
-{
-  m_ifIndex = index;
-}
-uint32_t 
-ErrorNetDevice::GetIfIndex(void) const
-{
-  return m_ifIndex;
-}
-Ptr<Channel> 
-ErrorNetDevice::GetChannel (void) const
-{
-  return m_channel;
-}
-void
-ErrorNetDevice::SetAddress (Address address)
-{
-  m_address = Mac48Address::ConvertFrom(address);
-}
-Address 
-ErrorNetDevice::GetAddress (void) const
-{
-  //
-  // Implicit conversion from Mac48Address to Address
-  //
-  return m_address;
-}
-bool 
-ErrorNetDevice::SetMtu (const uint16_t mtu)
-{
-  m_mtu = mtu;
-  return true;
-}
-uint16_t 
-ErrorNetDevice::GetMtu (void) const
-{
-  return m_mtu;
-}
-bool 
-ErrorNetDevice::IsLinkUp (void) const
-{
-  return true;
-}
-void 
-ErrorNetDevice::AddLinkChangeCallback (Callback<void> callback)
-{}
-bool 
-ErrorNetDevice::IsBroadcast (void) const
-{
-  return true;
-}
-Address
-ErrorNetDevice::GetBroadcast (void) const
-{
-  return Mac48Address ("ff:ff:ff:ff:ff:ff");
-}
-bool 
-ErrorNetDevice::IsMulticast (void) const
-{
-  return false;
-}
-Address 
-ErrorNetDevice::GetMulticast (Ipv4Address multicastGroup) const
-{
-  return Mac48Address::GetMulticast (multicastGroup);
-}
-
-Address ErrorNetDevice::GetMulticast (Ipv6Address addr) const
-{
-  return Mac48Address::GetMulticast (addr);
-}
-
-bool 
-ErrorNetDevice::IsPointToPoint (void) const
-{
-  return false;
-}
-
-bool 
-ErrorNetDevice::IsBridge (void) const
-{
-  return false;
-}
-
-bool 
-ErrorNetDevice::Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber)
-{
-  NS_LOG_FUNCTION (packet << dest << protocolNumber << *packet);
-  Mac48Address to = Mac48Address::ConvertFrom (dest);
-  m_channel->Send (packet, protocolNumber, to, m_address, this);
-  return true;
-}
-bool 
-ErrorNetDevice::SendFrom(Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber)
-{
-  NS_LOG_FUNCTION (packet << source << dest << protocolNumber << *packet);
-  Mac48Address to = Mac48Address::ConvertFrom (dest);
-  Mac48Address from = Mac48Address::ConvertFrom (source);
-  m_channel->Send (packet, protocolNumber, to, from, this);
-  return true;
-}
-
-Ptr<Node> 
-ErrorNetDevice::GetNode (void) const
-{
-  return m_node;
-}
-void 
-ErrorNetDevice::SetNode (Ptr<Node> node)
-{
-  m_node = node;
-}
-bool 
-ErrorNetDevice::NeedsArp (void) const
-{
-  return false;
-}
-void 
-ErrorNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
-{
-  m_rxCallback = cb;
-}
-
-void
-ErrorNetDevice::DoDispose (void)
-{
-  m_channel = 0;
-  m_node = 0;
-  m_receiveErrorModel = 0;
-  NetDevice::DoDispose ();
-}
-
-
-void
-ErrorNetDevice::SetPromiscReceiveCallback (PromiscReceiveCallback cb)
-{
-  m_promiscCallback = cb;
-}
-
-bool
-ErrorNetDevice::SupportsSendFrom (void) const
-{
-  return true;
-}
-
-} // namespace ns3
diff -Naur ns-3.18.1/src/internet/test/error-net-device.h ns-3.19/src/internet/test/error-net-device.h
--- ns-3.18.1/src/internet/test/error-net-device.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/test/error-net-device.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,117 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Universita' di Firenze, Italy
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
- */
-#ifndef ERROR_NET_DEVICE_H
-#define ERROR_NET_DEVICE_H
-
-#include "ns3/net-device.h"
-#include "ns3/mac48-address.h"
-#include <stdint.h>
-#include <string>
-#include "ns3/traced-callback.h"
-
-namespace ns3 {
-
-class ErrorChannel;
-class Node;
-class ErrorModel;
-
-/**
- * \ingroup netdevice
- *
- * This device does not have a helper and assumes 48-bit mac addressing;
- * the default address assigned to each device is zero, so you must 
- * assign a real address to use it.  There is also the possibility to
- * add an ErrorModel if you want to force losses on the device.
- * 
- * \brief Error net device for Error things and testing
- */
-class ErrorNetDevice : public NetDevice
-{
-public:
-  static TypeId GetTypeId (void);
-  ErrorNetDevice ();
-
-  void Receive (Ptr<Packet> packet, uint16_t protocol, Mac48Address to, Mac48Address from);
-  void SetChannel (Ptr<ErrorChannel> channel);
-
-  /**
-   * Attach a receive ErrorModel to the ErrorNetDevice.
-   *
-   * The ErrorNetDevice may optionally include an ErrorModel in
-   * the packet receive chain.
-   *
-   * \see ErrorModel
-   * \param em Ptr to the ErrorModel.
-   */
-  void SetReceiveErrorModel(Ptr<ErrorModel> em);
-
-  // inherited from NetDevice base class.
-  virtual void SetIfIndex(const uint32_t index);
-  virtual uint32_t GetIfIndex(void) const;
-  virtual Ptr<Channel> GetChannel (void) const;
-  virtual void SetAddress (Address address);
-  virtual Address GetAddress (void) const;
-  virtual bool SetMtu (const uint16_t mtu);
-  virtual uint16_t GetMtu (void) const;
-  virtual bool IsLinkUp (void) const;
-  virtual void AddLinkChangeCallback (Callback<void> callback);
-  virtual bool IsBroadcast (void) const;
-  virtual Address GetBroadcast (void) const;
-  virtual bool IsMulticast (void) const;
-  virtual Address GetMulticast (Ipv4Address multicastGroup) const;
-  virtual bool IsPointToPoint (void) const;
-  virtual bool IsBridge (void) const;
-  virtual bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
-  virtual bool SendFrom(Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
-  virtual Ptr<Node> GetNode (void) const;
-  virtual void SetNode (Ptr<Node> node);
-  virtual bool NeedsArp (void) const;
-  virtual void SetReceiveCallback (NetDevice::ReceiveCallback cb);
-
-  virtual Address GetMulticast (Ipv6Address addr) const;
-
-  virtual void SetPromiscReceiveCallback (PromiscReceiveCallback cb);
-  virtual bool SupportsSendFrom (void) const;
-
-protected:
-  virtual void DoDispose (void);
-private:
-  Ptr<ErrorChannel> m_channel;
-  NetDevice::ReceiveCallback m_rxCallback;
-  NetDevice::PromiscReceiveCallback m_promiscCallback;
-  Ptr<Node> m_node;
-  uint16_t m_mtu;
-  uint32_t m_ifIndex;
-  Mac48Address m_address;
-  Ptr<ErrorModel> m_receiveErrorModel;
-  /**
-   * The trace source fired when the phy layer drops a packet it has received
-   * due to the error model being active.  Although ErrorNetDevice doesn't
-   * really have a Phy model, we choose this trace source name for alignment
-   * with other trace sources.
-   *
-   * \see class CallBackTraceSource
-   */
-  TracedCallback<Ptr<const Packet> > m_phyRxDropTrace;
-};
-
-} // namespace ns3
-
-#endif /* Error_NET_DEVICE_H */
diff -Naur ns-3.18.1/src/internet/test/ipv4-fragmentation-test.cc ns-3.19/src/internet/test/ipv4-fragmentation-test.cc
--- ns-3.18.1/src/internet/test/ipv4-fragmentation-test.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/test/ipv4-fragmentation-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,7 @@
 #include "ns3/udp-socket-factory.h"
 #include "ns3/simulator.h"
 #include "error-channel.h"
-#include "error-net-device.h"
+#include "ns3/simple-net-device.h"
 #include "ns3/drop-tail-queue.h"
 #include "ns3/socket.h"
 #include "ns3/udp-socket.h"
@@ -264,10 +264,10 @@
   // Receiver Node
   Ptr<Node> serverNode = CreateObject<Node> ();
   AddInternetStack (serverNode);
-  Ptr<ErrorNetDevice> serverDev;
+  Ptr<SimpleNetDevice> serverDev;
   Ptr<BinaryErrorModel> serverDevErrorModel = CreateObject<BinaryErrorModel> ();
   {
-    serverDev = CreateObject<ErrorNetDevice> ();
+    serverDev = CreateObject<SimpleNetDevice> ();
     serverDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
     serverDev->SetMtu(1500);
     serverDev->SetReceiveErrorModel(serverDevErrorModel);
@@ -284,10 +284,10 @@
   // Sender Node
   Ptr<Node> clientNode = CreateObject<Node> ();
   AddInternetStack (clientNode);
-  Ptr<ErrorNetDevice> clientDev;
+  Ptr<SimpleNetDevice> clientDev;
   Ptr<BinaryErrorModel> clientDevErrorModel = CreateObject<BinaryErrorModel> ();
   {
-    clientDev = CreateObject<ErrorNetDevice> ();
+    clientDev = CreateObject<SimpleNetDevice> ();
     clientDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
     clientDev->SetMtu(1000);
     clientDev->SetReceiveErrorModel(clientDevErrorModel);
diff -Naur ns-3.18.1/src/internet/test/ipv6-fragmentation-test.cc ns-3.19/src/internet/test/ipv6-fragmentation-test.cc
--- ns-3.18.1/src/internet/test/ipv6-fragmentation-test.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/test/ipv6-fragmentation-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,7 @@
 #include "ns3/udp-socket-factory.h"
 #include "ns3/simulator.h"
 #include "error-channel.h"
-#include "error-net-device.h"
+#include "ns3/simple-net-device.h"
 #include "ns3/drop-tail-queue.h"
 #include "ns3/socket.h"
 #include "ns3/udp-socket.h"
@@ -270,10 +270,10 @@
   // Receiver Node
   Ptr<Node> serverNode = CreateObject<Node> ();
   AddInternetStack (serverNode);
-  Ptr<ErrorNetDevice> serverDev;
+  Ptr<SimpleNetDevice> serverDev;
   Ptr<BinaryErrorModel> serverDevErrorModel = CreateObject<BinaryErrorModel> ();
   {
-    serverDev = CreateObject<ErrorNetDevice> ();
+    serverDev = CreateObject<SimpleNetDevice> ();
     serverDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
     serverDev->SetMtu (1500);
     serverDev->SetReceiveErrorModel (serverDevErrorModel);
@@ -290,12 +290,12 @@
   // Sender Node
   Ptr<Node> clientNode = CreateObject<Node> ();
   AddInternetStack (clientNode);
-  Ptr<ErrorNetDevice> clientDev;
+  Ptr<SimpleNetDevice> clientDev;
   Ptr<BinaryErrorModel> clientDevErrorModel = CreateObject<BinaryErrorModel> ();
   {
-    clientDev = CreateObject<ErrorNetDevice> ();
+    clientDev = CreateObject<SimpleNetDevice> ();
     clientDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
-    clientDev->SetMtu (1000);
+    clientDev->SetMtu (1500);
     clientDev->SetReceiveErrorModel (clientDevErrorModel);
     clientDevErrorModel->Disable ();
     clientNode->AddDevice (clientDev);
@@ -315,7 +315,7 @@
 
 
   // some small packets, some rather big ones
-  uint32_t packetSizes[5] = {1000, 2000, 5000, 10000, 65000};
+  uint32_t packetSizes[5] = {2000, 2500, 5000, 10000, 65000};
 
   // using the alphabet
   uint8_t fillData[78];
diff -Naur ns-3.18.1/src/internet/wscript ns-3.19/src/internet/wscript
--- ns-3.18.1/src/internet/wscript	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/internet/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -206,7 +206,6 @@
         'test/ipv4-fragmentation-test.cc',
         'test/ipv4-forwarding-test.cc',
         'test/error-channel.cc',
-        'test/error-net-device.cc',
         'test/ipv4-test.cc',
         'test/ipv6-extension-header-test-suite.cc',
         'test/ipv6-list-routing-test-suite.cc',
diff -Naur ns-3.18.1/src/lte/bindings/modulegen__gcc_ILP32.py ns-3.19/src/lte/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/lte/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -354,6 +354,10 @@
     module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::QosBearerType_e [enumeration]
     module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapProvider [class]
+    module.add_class('LteAnrSapProvider', allow_subclassing=True)
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapUser [class]
+    module.add_class('LteAnrSapUser', allow_subclassing=True)
     ## lte-as-sap.h (module 'lte'): ns3::LteAsSapProvider [class]
     module.add_class('LteAsSapProvider', allow_subclassing=True)
     ## lte-as-sap.h (module 'lte'): ns3::LteAsSapUser [class]
@@ -386,6 +390,10 @@
     module.add_class('LteFlowId_t')
     ## lte-global-pathloss-database.h (module 'lte'): ns3::LteGlobalPathlossDatabase [class]
     module.add_class('LteGlobalPathlossDatabase', allow_subclassing=True)
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapProvider [class]
+    module.add_class('LteHandoverManagementSapProvider', allow_subclassing=True)
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapUser [class]
+    module.add_class('LteHandoverManagementSapUser', allow_subclassing=True)
     ## lte-mac-sap.h (module 'lte'): ns3::LteMacSapProvider [class]
     module.add_class('LteMacSapProvider', allow_subclassing=True)
     ## lte-mac-sap.h (module 'lte'): ns3::LteMacSapProvider::ReportBufferStatusParameters [struct]
@@ -426,6 +434,8 @@
     module.add_class('CarrierFreqEutra', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellAccessRelatedInfo [struct]
     module.add_class('CellAccessRelatedInfo', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo [struct]
+    module.add_class('CellSelectionInfo', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellsToAddMod [struct]
     module.add_class('CellsToAddMod', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CgiInfo [struct]
@@ -891,7 +901,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-fading-loss-model.h (module 'lte'): ns3::TraceFadingLossModel [class]
@@ -906,8 +916,6 @@
     module.add_class('UeManager', parent=root_module['ns3::Object'])
     ## lte-enb-rrc.h (module 'lte'): ns3::UeManager::State [enumeration]
     module.add_enum('State', ['INITIAL_RANDOM_ACCESS', 'CONNECTION_SETUP', 'CONNECTION_REJECTED', 'CONNECTED_NORMALLY', 'CONNECTION_RECONFIGURATION', 'CONNECTION_REESTABLISHMENT', 'HANDOVER_PREPARATION', 'HANDOVER_JOINING', 'HANDOVER_PATH_SWITCH', 'HANDOVER_LEAVING', 'NUM_STATES'], outer_class=root_module['ns3::UeManager'])
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure [class]
-    module.add_class('UeMeasure', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## ff-mac-common.h (module 'lte'): ns3::VendorSpecificValue [struct]
@@ -1060,10 +1068,12 @@
     module.add_class('LteAmc', parent=root_module['ns3::Object'])
     ## lte-amc.h (module 'lte'): ns3::LteAmc::AmcModel [enumeration]
     module.add_enum('AmcModel', ['PiroEW2010', 'MiErrorModel'], outer_class=root_module['ns3::LteAmc'])
+    ## lte-anr.h (module 'lte'): ns3::LteAnr [class]
+    module.add_class('LteAnr', parent=root_module['ns3::Object'])
     ## lte-control-messages.h (module 'lte'): ns3::LteControlMessage [class]
     module.add_class('LteControlMessage', parent=root_module['ns3::SimpleRefCount< ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >'])
     ## lte-control-messages.h (module 'lte'): ns3::LteControlMessage::MessageType [enumeration]
-    module.add_enum('MessageType', ['DL_DCI', 'UL_DCI', 'DL_CQI', 'UL_CQI', 'BSR', 'DL_HARQ', 'RACH_PREAMBLE', 'RAR', 'MIB'], outer_class=root_module['ns3::LteControlMessage'])
+    module.add_enum('MessageType', ['DL_DCI', 'UL_DCI', 'DL_CQI', 'UL_CQI', 'BSR', 'DL_HARQ', 'RACH_PREAMBLE', 'RAR', 'MIB', 'SIB1'], outer_class=root_module['ns3::LteControlMessage'])
     ## lte-enb-mac.h (module 'lte'): ns3::LteEnbMac [class]
     module.add_class('LteEnbMac', parent=root_module['ns3::Object'])
     ## lte-enb-rrc.h (module 'lte'): ns3::LteEnbRrc [class]
@@ -1074,6 +1084,8 @@
     module.add_class('LteEnbRrcProtocolIdeal', parent=root_module['ns3::Object'])
     ## lte-rrc-protocol-real.h (module 'lte'): ns3::LteEnbRrcProtocolReal [class]
     module.add_class('LteEnbRrcProtocolReal', parent=root_module['ns3::Object'])
+    ## lte-handover-algorithm.h (module 'lte'): ns3::LteHandoverAlgorithm [class]
+    module.add_class('LteHandoverAlgorithm', parent=root_module['ns3::Object'])
     ## lte-harq-phy.h (module 'lte'): ns3::LteHarqPhy [class]
     module.add_class('LteHarqPhy', parent=root_module['ns3::SimpleRefCount< ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >'])
     ## lte-helper.h (module 'lte'): ns3::LteHelper [class]
@@ -1124,10 +1136,12 @@
     module.add_class('LteUeMac', parent=root_module['ns3::Object'])
     ## lte-ue-phy.h (module 'lte'): ns3::LteUePhy [class]
     module.add_class('LteUePhy', parent=root_module['ns3::LtePhy'])
+    ## lte-ue-phy.h (module 'lte'): ns3::LteUePhy::State [enumeration]
+    module.add_enum('State', ['CELL_SEARCH', 'SYNCHRONIZED', 'NUM_STATES'], outer_class=root_module['ns3::LteUePhy'])
     ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc [class]
     module.add_class('LteUeRrc', parent=root_module['ns3::Object'])
     ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc::State [enumeration]
-    module.add_enum('State', ['IDLE_CELL_SELECTION', 'IDLE_WAIT_SYSTEM_INFO', 'IDLE_CAMPED_NORMALLY', 'IDLE_RANDOM_ACCESS', 'IDLE_CONNECTING', 'CONNECTED_NORMALLY', 'CONNECTED_REESTABLISHING', 'CONNECTED_HANDOVER', 'NUM_STATES'], outer_class=root_module['ns3::LteUeRrc'])
+    module.add_enum('State', ['IDLE_START', 'IDLE_CELL_SEARCH', 'IDLE_WAIT_MIB_SIB1', 'IDLE_WAIT_MIB', 'IDLE_WAIT_SIB1', 'IDLE_CAMPED_NORMALLY', 'IDLE_WAIT_SIB2', 'IDLE_RANDOM_ACCESS', 'IDLE_CONNECTING', 'CONNECTED_NORMALLY', 'CONNECTED_HANDOVER', 'CONNECTED_PHY_PROBLEM', 'CONNECTED_REESTABLISHING', 'NUM_STATES'], outer_class=root_module['ns3::LteUeRrc'])
     ## lte-rrc-protocol-ideal.h (module 'lte'): ns3::LteUeRrcProtocolIdeal [class]
     module.add_class('LteUeRrcProtocolIdeal', parent=root_module['ns3::Object'])
     ## lte-rrc-protocol-real.h (module 'lte'): ns3::LteUeRrcProtocolReal [class]
@@ -1142,14 +1156,14 @@
     module.add_class('MibLteControlMessage', parent=root_module['ns3::LteControlMessage'])
     ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
     module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation [class]
-    module.add_class('NeighbourRelation', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
     module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
     ## nix-vector.h (module 'network'): ns3::NixVector [class]
     module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    ## no-op-handover-algorithm.h (module 'lte'): ns3::NoOpHandoverAlgorithm [class]
+    module.add_class('NoOpHandoverAlgorithm', parent=root_module['ns3::LteHandoverAlgorithm'])
     ## node.h (module 'network'): ns3::Node [class]
     module.add_class('Node', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable [class]
@@ -1170,6 +1184,8 @@
     module.add_class('PhyStatsCalculator', parent=root_module['ns3::LteStatsCalculator'])
     ## phy-tx-stats-calculator.h (module 'lte'): ns3::PhyTxStatsCalculator [class]
     module.add_class('PhyTxStatsCalculator', parent=root_module['ns3::LteStatsCalculator'])
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::PointToPointEpcHelper [class]
+    module.add_class('PointToPointEpcHelper', parent=root_module['ns3::EpcHelper'])
     ## pointer.h (module 'core'): ns3::PointerChecker [class]
     module.add_class('PointerChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## pointer.h (module 'core'): ns3::PointerValue [class]
@@ -1198,6 +1214,8 @@
     module.add_class('RrcUlCcchMessage', parent=root_module['ns3::RrcAsn1Header'])
     ## lte-rrc-header.h (module 'lte'): ns3::RrcUlDcchMessage [class]
     module.add_class('RrcUlDcchMessage', parent=root_module['ns3::RrcAsn1Header'])
+    ## lte-control-messages.h (module 'lte'): ns3::Sib1LteControlMessage [class]
+    module.add_class('Sib1LteControlMessage', parent=root_module['ns3::LteControlMessage'])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel [class]
     module.add_class('SpectrumChannel', import_from_module='ns.spectrum', parent=root_module['ns3::Channel'])
     ## lte-vendor-specific-parameters.h (module 'lte'): ns3::SrsCqiRntiVsp [class]
@@ -1234,6 +1252,10 @@
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## virtual-net-device.h (module 'virtual-net-device'): ns3::VirtualNetDevice [class]
     module.add_class('VirtualNetDevice', import_from_module='ns.virtual_net_device', parent=root_module['ns3::NetDevice'])
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): ns3::A2A4RsrqHandoverAlgorithm [class]
+    module.add_class('A2A4RsrqHandoverAlgorithm', parent=root_module['ns3::LteHandoverAlgorithm'])
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): ns3::A3RsrpHandoverAlgorithm [class]
+    module.add_class('A3RsrpHandoverAlgorithm', parent=root_module['ns3::LteHandoverAlgorithm'])
     ## address.h (module 'network'): ns3::AddressChecker [class]
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
@@ -1664,6 +1686,8 @@
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3LogicalChannelConfigListElement_s_methods(root_module, root_module['ns3::LogicalChannelConfigListElement_s'])
+    register_Ns3LteAnrSapProvider_methods(root_module, root_module['ns3::LteAnrSapProvider'])
+    register_Ns3LteAnrSapUser_methods(root_module, root_module['ns3::LteAnrSapUser'])
     register_Ns3LteAsSapProvider_methods(root_module, root_module['ns3::LteAsSapProvider'])
     register_Ns3LteAsSapUser_methods(root_module, root_module['ns3::LteAsSapUser'])
     register_Ns3LteEnbCmacSapProvider_methods(root_module, root_module['ns3::LteEnbCmacSapProvider'])
@@ -1680,6 +1704,8 @@
     register_Ns3LteFfConverter_methods(root_module, root_module['ns3::LteFfConverter'])
     register_Ns3LteFlowId_t_methods(root_module, root_module['ns3::LteFlowId_t'])
     register_Ns3LteGlobalPathlossDatabase_methods(root_module, root_module['ns3::LteGlobalPathlossDatabase'])
+    register_Ns3LteHandoverManagementSapProvider_methods(root_module, root_module['ns3::LteHandoverManagementSapProvider'])
+    register_Ns3LteHandoverManagementSapUser_methods(root_module, root_module['ns3::LteHandoverManagementSapUser'])
     register_Ns3LteMacSapProvider_methods(root_module, root_module['ns3::LteMacSapProvider'])
     register_Ns3LteMacSapProviderReportBufferStatusParameters_methods(root_module, root_module['ns3::LteMacSapProvider::ReportBufferStatusParameters'])
     register_Ns3LteMacSapProviderTransmitPduParameters_methods(root_module, root_module['ns3::LteMacSapProvider::TransmitPduParameters'])
@@ -1699,6 +1725,7 @@
     register_Ns3LteRrcSapCarrierBandwidthEutra_methods(root_module, root_module['ns3::LteRrcSap::CarrierBandwidthEutra'])
     register_Ns3LteRrcSapCarrierFreqEutra_methods(root_module, root_module['ns3::LteRrcSap::CarrierFreqEutra'])
     register_Ns3LteRrcSapCellAccessRelatedInfo_methods(root_module, root_module['ns3::LteRrcSap::CellAccessRelatedInfo'])
+    register_Ns3LteRrcSapCellSelectionInfo_methods(root_module, root_module['ns3::LteRrcSap::CellSelectionInfo'])
     register_Ns3LteRrcSapCellsToAddMod_methods(root_module, root_module['ns3::LteRrcSap::CellsToAddMod'])
     register_Ns3LteRrcSapCgiInfo_methods(root_module, root_module['ns3::LteRrcSap::CgiInfo'])
     register_Ns3LteRrcSapDrbToAddMod_methods(root_module, root_module['ns3::LteRrcSap::DrbToAddMod'])
@@ -1895,7 +1922,6 @@
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
     register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
     register_Ns3UeManager_methods(root_module, root_module['ns3::UeManager'])
-    register_Ns3UeMeasure_methods(root_module, root_module['ns3::UeMeasure'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3VendorSpecificValue_methods(root_module, root_module['ns3::VendorSpecificValue'])
     register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
@@ -1965,11 +1991,13 @@
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3LteAmc_methods(root_module, root_module['ns3::LteAmc'])
+    register_Ns3LteAnr_methods(root_module, root_module['ns3::LteAnr'])
     register_Ns3LteControlMessage_methods(root_module, root_module['ns3::LteControlMessage'])
     register_Ns3LteEnbMac_methods(root_module, root_module['ns3::LteEnbMac'])
     register_Ns3LteEnbRrc_methods(root_module, root_module['ns3::LteEnbRrc'])
     register_Ns3LteEnbRrcProtocolIdeal_methods(root_module, root_module['ns3::LteEnbRrcProtocolIdeal'])
     register_Ns3LteEnbRrcProtocolReal_methods(root_module, root_module['ns3::LteEnbRrcProtocolReal'])
+    register_Ns3LteHandoverAlgorithm_methods(root_module, root_module['ns3::LteHandoverAlgorithm'])
     register_Ns3LteHarqPhy_methods(root_module, root_module['ns3::LteHarqPhy'])
     register_Ns3LteHelper_methods(root_module, root_module['ns3::LteHelper'])
     register_Ns3LteHexGridEnbTopologyHelper_methods(root_module, root_module['ns3::LteHexGridEnbTopologyHelper'])
@@ -2001,9 +2029,9 @@
     register_Ns3MacStatsCalculator_methods(root_module, root_module['ns3::MacStatsCalculator'])
     register_Ns3MibLteControlMessage_methods(root_module, root_module['ns3::MibLteControlMessage'])
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
-    register_Ns3NeighbourRelation_methods(root_module, root_module['ns3::NeighbourRelation'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
+    register_Ns3NoOpHandoverAlgorithm_methods(root_module, root_module['ns3::NoOpHandoverAlgorithm'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
     register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
@@ -2014,6 +2042,7 @@
     register_Ns3PhyRxStatsCalculator_methods(root_module, root_module['ns3::PhyRxStatsCalculator'])
     register_Ns3PhyStatsCalculator_methods(root_module, root_module['ns3::PhyStatsCalculator'])
     register_Ns3PhyTxStatsCalculator_methods(root_module, root_module['ns3::PhyTxStatsCalculator'])
+    register_Ns3PointToPointEpcHelper_methods(root_module, root_module['ns3::PointToPointEpcHelper'])
     register_Ns3PointerChecker_methods(root_module, root_module['ns3::PointerChecker'])
     register_Ns3PointerValue_methods(root_module, root_module['ns3::PointerValue'])
     register_Ns3PssFfMacScheduler_methods(root_module, root_module['ns3::PssFfMacScheduler'])
@@ -2028,6 +2057,7 @@
     register_Ns3RrcDlDcchMessage_methods(root_module, root_module['ns3::RrcDlDcchMessage'])
     register_Ns3RrcUlCcchMessage_methods(root_module, root_module['ns3::RrcUlCcchMessage'])
     register_Ns3RrcUlDcchMessage_methods(root_module, root_module['ns3::RrcUlDcchMessage'])
+    register_Ns3Sib1LteControlMessage_methods(root_module, root_module['ns3::Sib1LteControlMessage'])
     register_Ns3SpectrumChannel_methods(root_module, root_module['ns3::SpectrumChannel'])
     register_Ns3SrsCqiRntiVsp_methods(root_module, root_module['ns3::SrsCqiRntiVsp'])
     register_Ns3StringChecker_methods(root_module, root_module['ns3::StringChecker'])
@@ -2046,6 +2076,8 @@
     register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
     register_Ns3VirtualNetDevice_methods(root_module, root_module['ns3::VirtualNetDevice'])
+    register_Ns3A2A4RsrqHandoverAlgorithm_methods(root_module, root_module['ns3::A2A4RsrqHandoverAlgorithm'])
+    register_Ns3A3RsrpHandoverAlgorithm_methods(root_module, root_module['ns3::A3RsrpHandoverAlgorithm'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3BsrLteControlMessage_methods(root_module, root_module['ns3::BsrLteControlMessage'])
@@ -3143,10 +3175,10 @@
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('std::list< ns3::EpcS1apSapMme::ErabSetupItem >', 'erabSetupList')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::InitialUeMessage(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t imsi, uint16_t ecgi) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::InitialUeMessage(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t stmsi, uint16_t ecgi) [member function]
     cls.add_method('InitialUeMessage', 
                    'void', 
-                   [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('uint64_t', 'imsi'), param('uint16_t', 'ecgi')], 
+                   [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('uint64_t', 'stmsi'), param('uint16_t', 'ecgi')], 
                    is_pure_virtual=True, is_virtual=True)
     ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::PathSwitchRequest(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem, std::allocator<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem> > erabToBeSwitchedInDownlinkList) [member function]
     cls.add_method('PathSwitchRequest', 
@@ -3609,6 +3641,16 @@
     cls.add_constructor([])
     ## lte-common.h (module 'lte'): ns3::EutranMeasurementMapping::EutranMeasurementMapping(ns3::EutranMeasurementMapping const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::EutranMeasurementMapping const &', 'arg0')])
+    ## lte-common.h (module 'lte'): static int8_t ns3::EutranMeasurementMapping::ActualA3Offset2IeValue(double a3OffsetDb) [member function]
+    cls.add_method('ActualA3Offset2IeValue', 
+                   'int8_t', 
+                   [param('double', 'a3OffsetDb')], 
+                   is_static=True)
+    ## lte-common.h (module 'lte'): static uint8_t ns3::EutranMeasurementMapping::ActualHysteresis2IeValue(double hysteresisDb) [member function]
+    cls.add_method('ActualHysteresis2IeValue', 
+                   'uint8_t', 
+                   [param('double', 'hysteresisDb')], 
+                   is_static=True)
     ## lte-common.h (module 'lte'): static uint8_t ns3::EutranMeasurementMapping::Db2RsrqRange(double db) [member function]
     cls.add_method('Db2RsrqRange', 
                    'uint8_t', 
@@ -3619,6 +3661,26 @@
                    'uint8_t', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::IeValue2ActualA3Offset(int8_t a3OffsetIeValue) [member function]
+    cls.add_method('IeValue2ActualA3Offset', 
+                   'double', 
+                   [param('int8_t', 'a3OffsetIeValue')], 
+                   is_static=True)
+    ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::IeValue2ActualHysteresis(uint8_t hysteresisIeValue) [member function]
+    cls.add_method('IeValue2ActualHysteresis', 
+                   'double', 
+                   [param('uint8_t', 'hysteresisIeValue')], 
+                   is_static=True)
+    ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::IeValue2ActualQQualMin(int8_t qQualMinIeValue) [member function]
+    cls.add_method('IeValue2ActualQQualMin', 
+                   'double', 
+                   [param('int8_t', 'qQualMinIeValue')], 
+                   is_static=True)
+    ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::IeValue2ActualQRxLevMin(int8_t qRxLevMinIeValue) [member function]
+    cls.add_method('IeValue2ActualQRxLevMin', 
+                   'double', 
+                   [param('int8_t', 'qRxLevMinIeValue')], 
+                   is_static=True)
     ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::QuantizeRsrp(double v) [member function]
     cls.add_method('QuantizeRsrp', 
                    'double', 
@@ -4939,10 +5001,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -5210,6 +5273,50 @@
     cls.add_instance_attribute('m_qosBearerType', 'ns3::LogicalChannelConfigListElement_s::QosBearerType_e', is_const=False)
     return
 
+def register_Ns3LteAnrSapProvider_methods(root_module, cls):
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapProvider::LteAnrSapProvider() [constructor]
+    cls.add_constructor([])
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapProvider::LteAnrSapProvider(ns3::LteAnrSapProvider const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteAnrSapProvider const &', 'arg0')])
+    ## lte-anr-sap.h (module 'lte'): void ns3::LteAnrSapProvider::AddNeighbourRelation(uint16_t cellId) [member function]
+    cls.add_method('AddNeighbourRelation', 
+                   'void', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-anr-sap.h (module 'lte'): bool ns3::LteAnrSapProvider::GetNoHo(uint16_t cellId) const [member function]
+    cls.add_method('GetNoHo', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## lte-anr-sap.h (module 'lte'): bool ns3::LteAnrSapProvider::GetNoRemove(uint16_t cellId) const [member function]
+    cls.add_method('GetNoRemove', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## lte-anr-sap.h (module 'lte'): bool ns3::LteAnrSapProvider::GetNoX2(uint16_t cellId) const [member function]
+    cls.add_method('GetNoX2', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## lte-anr-sap.h (module 'lte'): void ns3::LteAnrSapProvider::ReportUeMeas(ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('ReportUeMeas', 
+                   'void', 
+                   [param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3LteAnrSapUser_methods(root_module, cls):
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapUser::LteAnrSapUser() [constructor]
+    cls.add_constructor([])
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapUser::LteAnrSapUser(ns3::LteAnrSapUser const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteAnrSapUser const &', 'arg0')])
+    ## lte-anr-sap.h (module 'lte'): uint8_t ns3::LteAnrSapUser::AddUeMeasReportConfigForAnr(ns3::LteRrcSap::ReportConfigEutra reportConfig) [member function]
+    cls.add_method('AddUeMeasReportConfigForAnr', 
+                   'uint8_t', 
+                   [param('ns3::LteRrcSap::ReportConfigEutra', 'reportConfig')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3LteAsSapProvider_methods(root_module, cls):
     ## lte-as-sap.h (module 'lte'): ns3::LteAsSapProvider::LteAsSapProvider() [constructor]
     cls.add_constructor([])
@@ -5225,16 +5332,26 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::ForceCampedOnEnb(uint16_t cellId, uint16_t earfcn) [member function]
+    ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::ForceCampedOnEnb(uint16_t cellId, uint16_t dlEarfcn) [member function]
     cls.add_method('ForceCampedOnEnb', 
                    'void', 
-                   [param('uint16_t', 'cellId'), param('uint16_t', 'earfcn')], 
+                   [param('uint16_t', 'cellId'), param('uint16_t', 'dlEarfcn')], 
                    is_pure_virtual=True, is_virtual=True)
     ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::SendData(ns3::Ptr<ns3::Packet> packet, uint8_t bid) [member function]
     cls.add_method('SendData', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('uint8_t', 'bid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::SetCsgWhiteList(uint32_t csgId) [member function]
+    cls.add_method('SetCsgWhiteList', 
+                   'void', 
+                   [param('uint32_t', 'csgId')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::StartCellSelection(uint16_t dlEarfcn) [member function]
+    cls.add_method('StartCellSelection', 
+                   'void', 
+                   [param('uint16_t', 'dlEarfcn')], 
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3LteAsSapUser_methods(root_module, cls):
@@ -5451,6 +5568,11 @@
                    'void', 
                    [param('uint16_t', 'rnti'), param('uint16_t', 'srsCi')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## lte-enb-cphy-sap.h (module 'lte'): void ns3::LteEnbCphySapProvider::SetSystemInformationBlockType1(ns3::LteRrcSap::SystemInformationBlockType1 sib1) [member function]
+    cls.add_method('SetSystemInformationBlockType1', 
+                   'void', 
+                   [param('ns3::LteRrcSap::SystemInformationBlockType1', 'sib1')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## lte-enb-cphy-sap.h (module 'lte'): void ns3::LteEnbCphySapProvider::SetTransmissionMode(uint16_t rnti, uint8_t txMode) [member function]
     cls.add_method('SetTransmissionMode', 
                    'void', 
@@ -5586,6 +5708,35 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3LteHandoverManagementSapProvider_methods(root_module, cls):
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapProvider::LteHandoverManagementSapProvider() [constructor]
+    cls.add_constructor([])
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapProvider::LteHandoverManagementSapProvider(ns3::LteHandoverManagementSapProvider const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteHandoverManagementSapProvider const &', 'arg0')])
+    ## lte-handover-management-sap.h (module 'lte'): void ns3::LteHandoverManagementSapProvider::ReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('ReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3LteHandoverManagementSapUser_methods(root_module, cls):
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapUser::LteHandoverManagementSapUser() [constructor]
+    cls.add_constructor([])
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapUser::LteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteHandoverManagementSapUser const &', 'arg0')])
+    ## lte-handover-management-sap.h (module 'lte'): uint8_t ns3::LteHandoverManagementSapUser::AddUeMeasReportConfigForHandover(ns3::LteRrcSap::ReportConfigEutra reportConfig) [member function]
+    cls.add_method('AddUeMeasReportConfigForHandover', 
+                   'uint8_t', 
+                   [param('ns3::LteRrcSap::ReportConfigEutra', 'reportConfig')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-handover-management-sap.h (module 'lte'): void ns3::LteHandoverManagementSapUser::TriggerHandover(uint16_t rnti, uint16_t targetCellId) [member function]
+    cls.add_method('TriggerHandover', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('uint16_t', 'targetCellId')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3LteMacSapProvider_methods(root_module, cls):
     ## lte-mac-sap.h (module 'lte'): ns3::LteMacSapProvider::LteMacSapProvider() [constructor]
     cls.add_constructor([])
@@ -5864,6 +6015,17 @@
     cls.add_instance_attribute('plmnIdentityInfo', 'ns3::LteRrcSap::PlmnIdentityInfo', is_const=False)
     return
 
+def register_Ns3LteRrcSapCellSelectionInfo_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo::CellSelectionInfo() [constructor]
+    cls.add_constructor([])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo::CellSelectionInfo(ns3::LteRrcSap::CellSelectionInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::CellSelectionInfo const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo::qQualMin [variable]
+    cls.add_instance_attribute('qQualMin', 'int8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo::qRxLevMin [variable]
+    cls.add_instance_attribute('qRxLevMin', 'int8_t', is_const=False)
+    return
+
 def register_Ns3LteRrcSapCellsToAddMod_methods(root_module, cls):
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellsToAddMod::CellsToAddMod() [constructor]
     cls.add_constructor([])
@@ -6276,10 +6438,10 @@
     return
 
 def register_Ns3LteRrcSapReportConfigEutra_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::ReportConfigEutra() [constructor]
-    cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::ReportConfigEutra(ns3::LteRrcSap::ReportConfigEutra const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LteRrcSap::ReportConfigEutra const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::ReportConfigEutra() [constructor]
+    cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::a3Offset [variable]
     cls.add_instance_attribute('a3Offset', 'int8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::hysteresis [variable]
@@ -6504,6 +6666,8 @@
     cls.add_constructor([param('ns3::LteRrcSap::SystemInformationBlockType1 const &', 'arg0')])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SystemInformationBlockType1::cellAccessRelatedInfo [variable]
     cls.add_instance_attribute('cellAccessRelatedInfo', 'ns3::LteRrcSap::CellAccessRelatedInfo', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SystemInformationBlockType1::cellSelectionInfo [variable]
+    cls.add_instance_attribute('cellSelectionInfo', 'ns3::LteRrcSap::CellSelectionInfo', is_const=False)
     return
 
 def register_Ns3LteRrcSapSystemInformationBlockType2_methods(root_module, cls):
@@ -6712,8 +6876,18 @@
                    'void', 
                    [param('uint8_t', 'txMode')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::SyncronizeWithEnb(uint16_t cellId, uint16_t dlEarfcn) [member function]
-    cls.add_method('SyncronizeWithEnb', 
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::StartCellSearch(uint16_t dlEarfcn) [member function]
+    cls.add_method('StartCellSearch', 
+                   'void', 
+                   [param('uint16_t', 'dlEarfcn')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::SynchronizeWithEnb(uint16_t cellId) [member function]
+    cls.add_method('SynchronizeWithEnb', 
+                   'void', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::SynchronizeWithEnb(uint16_t cellId, uint16_t dlEarfcn) [member function]
+    cls.add_method('SynchronizeWithEnb', 
                    'void', 
                    [param('uint16_t', 'cellId'), param('uint16_t', 'dlEarfcn')], 
                    is_pure_virtual=True, is_virtual=True)
@@ -6724,10 +6898,15 @@
     cls.add_constructor([])
     ## lte-ue-cphy-sap.h (module 'lte'): ns3::LteUeCphySapUser::LteUeCphySapUser(ns3::LteUeCphySapUser const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LteUeCphySapUser const &', 'arg0')])
-    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapUser::RecvMasterInformationBlock(ns3::LteRrcSap::MasterInformationBlock mib) [member function]
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapUser::RecvMasterInformationBlock(uint16_t cellId, ns3::LteRrcSap::MasterInformationBlock mib) [member function]
     cls.add_method('RecvMasterInformationBlock', 
                    'void', 
-                   [param('ns3::LteRrcSap::MasterInformationBlock', 'mib')], 
+                   [param('uint16_t', 'cellId'), param('ns3::LteRrcSap::MasterInformationBlock', 'mib')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapUser::RecvSystemInformationBlockType1(uint16_t cellId, ns3::LteRrcSap::SystemInformationBlockType1 sib1) [member function]
+    cls.add_method('RecvSystemInformationBlockType1', 
+                   'void', 
+                   [param('uint16_t', 'cellId'), param('ns3::LteRrcSap::SystemInformationBlockType1', 'sib1')], 
                    is_pure_virtual=True, is_virtual=True)
     ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapUser::ReportUeMeasurements(ns3::LteUeCphySapUser::UeMeasurementsParameters params) [member function]
     cls.add_method('ReportUeMeasurements', 
@@ -6812,11 +6991,6 @@
                    'void', 
                    [param('ns3::LteUeRrcSapProvider::CompleteSetupParameters', 'params')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-rrc-sap.h (module 'lte'): void ns3::LteUeRrcSapProvider::RecvMasterInformationBlock(ns3::LteRrcSap::MasterInformationBlock msg) [member function]
-    cls.add_method('RecvMasterInformationBlock', 
-                   'void', 
-                   [param('ns3::LteRrcSap::MasterInformationBlock', 'msg')], 
-                   is_pure_virtual=True, is_virtual=True)
     ## lte-rrc-sap.h (module 'lte'): void ns3::LteUeRrcSapProvider::RecvRrcConnectionReconfiguration(ns3::LteRrcSap::RrcConnectionReconfiguration msg) [member function]
     cls.add_method('RecvRrcConnectionReconfiguration', 
                    'void', 
@@ -6852,11 +7026,6 @@
                    'void', 
                    [param('ns3::LteRrcSap::SystemInformation', 'msg')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-rrc-sap.h (module 'lte'): void ns3::LteUeRrcSapProvider::RecvSystemInformationBlockType1(ns3::LteRrcSap::SystemInformationBlockType1 msg) [member function]
-    cls.add_method('RecvSystemInformationBlockType1', 
-                   'void', 
-                   [param('ns3::LteRrcSap::SystemInformationBlockType1', 'msg')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3LteUeRrcSapProviderCompleteSetupParameters_methods(root_module, cls):
@@ -8833,10 +9002,10 @@
     cls.add_method('SetBid', 
                    'void', 
                    [param('uint8_t', 'bid')])
-    ## eps-bearer-tag.h (module 'lte'): void ns3::EpsBearerTag::SetRnti(uint16_t tid) [member function]
+    ## eps-bearer-tag.h (module 'lte'): void ns3::EpsBearerTag::SetRnti(uint16_t rnti) [member function]
     cls.add_method('SetRnti', 
                    'void', 
-                   [param('uint16_t', 'tid')])
+                   [param('uint16_t', 'rnti')])
     return
 
 def register_Ns3Header_methods(root_module, cls):
@@ -9262,11 +9431,6 @@
                    'void', 
                    [param('ns3::LteRrcSap::SystemInformation', 'msg')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-rrc-sap.h (module 'lte'): void ns3::LteEnbRrcSapUser::SendSystemInformationBlockType1(ns3::LteRrcSap::SystemInformationBlockType1 msg) [member function]
-    cls.add_method('SendSystemInformationBlockType1', 
-                   'void', 
-                   [param('ns3::LteRrcSap::SystemInformationBlockType1', 'msg')], 
-                   is_pure_virtual=True, is_virtual=True)
     ## lte-rrc-sap.h (module 'lte'): void ns3::LteEnbRrcSapUser::SetupUe(uint16_t rnti, ns3::LteEnbRrcSapUser::SetupUeParameters params) [member function]
     cls.add_method('SetupUe', 
                    'void', 
@@ -9438,18 +9602,18 @@
                    'void', 
                    [param('ns3::TagBuffer', 'i')], 
                    is_const=True, is_virtual=True)
-    ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetLayer(uint8_t lcid) [member function]
+    ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetLayer(uint8_t layer) [member function]
     cls.add_method('SetLayer', 
                    'void', 
-                   [param('uint8_t', 'lcid')])
+                   [param('uint8_t', 'layer')])
     ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetLcid(uint8_t lcid) [member function]
     cls.add_method('SetLcid', 
                    'void', 
                    [param('uint8_t', 'lcid')])
-    ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetRnti(uint16_t tid) [member function]
+    ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetRnti(uint16_t rnti) [member function]
     cls.add_method('SetRnti', 
                    'void', 
-                   [param('uint16_t', 'tid')])
+                   [param('uint16_t', 'rnti')])
     return
 
 def register_Ns3LteRlcAmHeader_methods(root_module, cls):
@@ -11203,6 +11367,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -11213,6 +11382,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -11228,6 +11402,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -11253,6 +11432,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -11467,30 +11651,34 @@
     cls.add_method('GetErabList', 
                    'std::vector< ns3::EpcX2Sap::ErabToBeSetupItem >', 
                    [])
-    ## lte-enb-rrc.h (module 'lte'): uint64_t ns3::UeManager::GetImsi() [member function]
+    ## lte-enb-rrc.h (module 'lte'): uint64_t ns3::UeManager::GetImsi() const [member function]
     cls.add_method('GetImsi', 
                    'uint64_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-enb-rrc.h (module 'lte'): ns3::LteRrcSap::RadioResourceConfigDedicated ns3::UeManager::GetRadioResourceConfigForHandoverPreparationInfo() [member function]
     cls.add_method('GetRadioResourceConfigForHandoverPreparationInfo', 
                    'ns3::LteRrcSap::RadioResourceConfigDedicated', 
                    [])
-    ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetRnti() [member function]
+    ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetRnti() const [member function]
     cls.add_method('GetRnti', 
                    'uint16_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-enb-rrc.h (module 'lte'): ns3::LteRrcSap::RrcConnectionReconfiguration ns3::UeManager::GetRrcConnectionReconfigurationForHandover() [member function]
     cls.add_method('GetRrcConnectionReconfigurationForHandover', 
                    'ns3::LteRrcSap::RrcConnectionReconfiguration', 
                    [])
-    ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetSrsConfigurationIndex() [member function]
+    ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetSrsConfigurationIndex() const [member function]
     cls.add_method('GetSrsConfigurationIndex', 
                    'uint16_t', 
-                   [])
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeManager::State ns3::UeManager::GetState() [member function]
+                   [], 
+                   is_const=True)
+    ## lte-enb-rrc.h (module 'lte'): ns3::UeManager::State ns3::UeManager::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::UeManager::State', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-enb-rrc.h (module 'lte'): static ns3::TypeId ns3::UeManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -11592,19 +11780,6 @@
                    visibility='protected', is_virtual=True)
     return
 
-def register_Ns3UeMeasure_methods(root_module, cls):
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::UeMeasure() [constructor]
-    cls.add_constructor([])
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::UeMeasure(ns3::UeMeasure const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::UeMeasure const &', 'arg0')])
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::m_cellId [variable]
-    cls.add_instance_attribute('m_cellId', 'uint16_t', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::m_rsrp [variable]
-    cls.add_instance_attribute('m_rsrp', 'uint8_t', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::m_rsrq [variable]
-    cls.add_instance_attribute('m_rsrq', 'uint8_t', is_const=False)
-    return
-
 def register_Ns3UniformRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::UniformRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -12757,23 +12932,28 @@
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::ActivateEpsBearer(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi, ns3::Ptr<ns3::EpcTft> tft, ns3::EpsBearer bearer) [member function]
     cls.add_method('ActivateEpsBearer', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')])
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddUe(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi) [member function]
     cls.add_method('AddUe', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddX2Interface(ns3::Ptr<ns3::Node> enbNode1, ns3::Ptr<ns3::Node> enbNode2) [member function]
     cls.add_method('AddX2Interface', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode1'), param('ns3::Ptr< ns3::Node >', 'enbNode2')])
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode1'), param('ns3::Ptr< ns3::Node >', 'enbNode2')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): ns3::Ipv4InterfaceContainer ns3::EpcHelper::AssignUeIpv4Address(ns3::NetDeviceContainer ueDevices) [member function]
     cls.add_method('AssignUeIpv4Address', 
                    'ns3::Ipv4InterfaceContainer', 
-                   [param('ns3::NetDeviceContainer', 'ueDevices')])
+                   [param('ns3::NetDeviceContainer', 'ueDevices')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -12782,7 +12962,8 @@
     ## epc-helper.h (module 'lte'): ns3::Ptr<ns3::Node> ns3::EpcHelper::GetPgwNode() [member function]
     cls.add_method('GetPgwNode', 
                    'ns3::Ptr< ns3::Node >', 
-                   [])
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): static ns3::TypeId ns3::EpcHelper::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -12791,7 +12972,8 @@
     ## epc-helper.h (module 'lte'): ns3::Ipv4Address ns3::EpcHelper::GetUeDefaultGatewayAddress() [member function]
     cls.add_method('GetUeDefaultGatewayAddress', 
                    'ns3::Ipv4Address', 
-                   [])
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3EpcMme_methods(root_module, cls):
@@ -12803,10 +12985,10 @@
     cls.add_method('AddBearer', 
                    'void', 
                    [param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')])
-    ## epc-mme.h (module 'lte'): void ns3::EpcMme::AddEnb(uint16_t egci, ns3::Ipv4Address enbS1UAddr, ns3::EpcS1apSapEnb * enbS1apSap) [member function]
+    ## epc-mme.h (module 'lte'): void ns3::EpcMme::AddEnb(uint16_t ecgi, ns3::Ipv4Address enbS1UAddr, ns3::EpcS1apSapEnb * enbS1apSap) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('uint16_t', 'egci'), param('ns3::Ipv4Address', 'enbS1UAddr'), param('ns3::EpcS1apSapEnb *', 'enbS1apSap')])
+                   [param('uint16_t', 'ecgi'), param('ns3::Ipv4Address', 'enbS1UAddr'), param('ns3::EpcS1apSapEnb *', 'enbS1apSap')])
     ## epc-mme.h (module 'lte'): void ns3::EpcMme::AddUe(uint64_t imsi) [member function]
     cls.add_method('AddUe', 
                    'void', 
@@ -12971,10 +13153,14 @@
     cls.add_method('ActivateEpsBearer', 
                    'void', 
                    [param('ns3::EpsBearer', 'bearer'), param('ns3::Ptr< ns3::EpcTft >', 'tft')])
-    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::Connect(uint16_t cellId, uint16_t earfcn) [member function]
+    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [])
+    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::Connect(uint16_t cellId, uint16_t dlEarfcn) [member function]
     cls.add_method('Connect', 
                    'void', 
-                   [param('uint16_t', 'cellId'), param('uint16_t', 'earfcn')])
+                   [param('uint16_t', 'cellId'), param('uint16_t', 'dlEarfcn')])
     ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::Disconnect() [member function]
     cls.add_method('Disconnect', 
                    'void', 
@@ -12988,6 +13174,16 @@
     cls.add_method('GetAsSapUser', 
                    'ns3::LteAsSapUser *', 
                    [])
+    ## epc-ue-nas.h (module 'lte'): uint32_t ns3::EpcUeNas::GetCsgId() const [member function]
+    cls.add_method('GetCsgId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## epc-ue-nas.h (module 'lte'): ns3::EpcUeNas::State ns3::EpcUeNas::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'ns3::EpcUeNas::State', 
+                   [], 
+                   is_const=True)
     ## epc-ue-nas.h (module 'lte'): static ns3::TypeId ns3::EpcUeNas::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -13001,6 +13197,10 @@
     cls.add_method('SetAsSapProvider', 
                    'void', 
                    [param('ns3::LteAsSapProvider *', 's')])
+    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::SetCsgId(uint32_t csgId) [member function]
+    cls.add_method('SetCsgId', 
+                   'void', 
+                   [param('uint32_t', 'csgId')])
     ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::SetDevice(ns3::Ptr<ns3::NetDevice> dev) [member function]
     cls.add_method('SetDevice', 
                    'void', 
@@ -13013,6 +13213,10 @@
     cls.add_method('SetImsi', 
                    'void', 
                    [param('uint64_t', 'imsi')])
+    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::StartCellSelection(uint16_t dlEarfcn) [member function]
+    cls.add_method('StartCellSelection', 
+                   'void', 
+                   [param('uint16_t', 'dlEarfcn')])
     return
 
 def register_Ns3EpcX2_methods(root_module, cls):
@@ -14743,6 +14947,46 @@
                    is_static=True)
     return
 
+def register_Ns3LteAnr_methods(root_module, cls):
+    ## lte-anr.h (module 'lte'): ns3::LteAnr::LteAnr(ns3::LteAnr const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteAnr const &', 'arg0')])
+    ## lte-anr.h (module 'lte'): ns3::LteAnr::LteAnr(uint16_t servingCellId) [constructor]
+    cls.add_constructor([param('uint16_t', 'servingCellId')])
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::AddNeighbourRelation(uint16_t cellId) [member function]
+    cls.add_method('AddNeighbourRelation', 
+                   'void', 
+                   [param('uint16_t', 'cellId')])
+    ## lte-anr.h (module 'lte'): ns3::LteAnrSapProvider * ns3::LteAnr::GetLteAnrSapProvider() [member function]
+    cls.add_method('GetLteAnrSapProvider', 
+                   'ns3::LteAnrSapProvider *', 
+                   [], 
+                   is_virtual=True)
+    ## lte-anr.h (module 'lte'): static ns3::TypeId ns3::LteAnr::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::RemoveNeighbourRelation(uint16_t cellId) [member function]
+    cls.add_method('RemoveNeighbourRelation', 
+                   'void', 
+                   [param('uint16_t', 'cellId')])
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::SetLteAnrSapUser(ns3::LteAnrSapUser * s) [member function]
+    cls.add_method('SetLteAnrSapUser', 
+                   'void', 
+                   [param('ns3::LteAnrSapUser *', 's')], 
+                   is_virtual=True)
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3LteControlMessage_methods(root_module, cls):
     ## lte-control-messages.h (module 'lte'): ns3::LteControlMessage::LteControlMessage(ns3::LteControlMessage const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LteControlMessage const &', 'arg0')])
@@ -14824,6 +15068,10 @@
     cls.add_constructor([param('ns3::LteEnbRrc const &', 'arg0')])
     ## lte-enb-rrc.h (module 'lte'): ns3::LteEnbRrc::LteEnbRrc() [constructor]
     cls.add_constructor([])
+    ## lte-enb-rrc.h (module 'lte'): uint8_t ns3::LteEnbRrc::AddUeMeasReportConfig(ns3::LteRrcSap::ReportConfigEutra config) [member function]
+    cls.add_method('AddUeMeasReportConfig', 
+                   'uint8_t', 
+                   [param('ns3::LteRrcSap::ReportConfigEutra', 'config')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::AddX2Neighbour(uint16_t cellId) [member function]
     cls.add_method('AddX2Neighbour', 
                    'void', 
@@ -14844,6 +15092,10 @@
     cls.add_method('GetEpcX2SapUser', 
                    'ns3::EpcX2SapUser *', 
                    [])
+    ## lte-enb-rrc.h (module 'lte'): ns3::LteAnrSapUser * ns3::LteEnbRrc::GetLteAnrSapUser() [member function]
+    cls.add_method('GetLteAnrSapUser', 
+                   'ns3::LteAnrSapUser *', 
+                   [])
     ## lte-enb-rrc.h (module 'lte'): ns3::LteEnbCmacSapUser * ns3::LteEnbRrc::GetLteEnbCmacSapUser() [member function]
     cls.add_method('GetLteEnbCmacSapUser', 
                    'ns3::LteEnbCmacSapUser *', 
@@ -14856,6 +15108,10 @@
     cls.add_method('GetLteEnbRrcSapProvider', 
                    'ns3::LteEnbRrcSapProvider *', 
                    [])
+    ## lte-enb-rrc.h (module 'lte'): ns3::LteHandoverManagementSapUser * ns3::LteEnbRrc::GetLteHandoverManagementSapUser() [member function]
+    cls.add_method('GetLteHandoverManagementSapUser', 
+                   'ns3::LteHandoverManagementSapUser *', 
+                   [])
     ## lte-enb-rrc.h (module 'lte'): ns3::EpcEnbS1SapUser * ns3::LteEnbRrc::GetS1SapUser() [member function]
     cls.add_method('GetS1SapUser', 
                    'ns3::EpcEnbS1SapUser *', 
@@ -14894,6 +15150,10 @@
     cls.add_method('SetCellId', 
                    'void', 
                    [param('uint16_t', 'm_cellId')])
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetCsgId(uint32_t csgId, bool csgIndication) [member function]
+    cls.add_method('SetCsgId', 
+                   'void', 
+                   [param('uint32_t', 'csgId'), param('bool', 'csgIndication')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetEpcX2SapProvider(ns3::EpcX2SapProvider * s) [member function]
     cls.add_method('SetEpcX2SapProvider', 
                    'void', 
@@ -14902,6 +15162,10 @@
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetLteAnrSapProvider(ns3::LteAnrSapProvider * s) [member function]
+    cls.add_method('SetLteAnrSapProvider', 
+                   'void', 
+                   [param('ns3::LteAnrSapProvider *', 's')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetLteEnbCmacSapProvider(ns3::LteEnbCmacSapProvider * s) [member function]
     cls.add_method('SetLteEnbCmacSapProvider', 
                    'void', 
@@ -14914,6 +15178,10 @@
     cls.add_method('SetLteEnbRrcSapUser', 
                    'void', 
                    [param('ns3::LteEnbRrcSapUser *', 's')])
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetLteHandoverManagementSapProvider(ns3::LteHandoverManagementSapProvider * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapProvider', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapProvider *', 's')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetLteMacSapProvider(ns3::LteMacSapProvider * s) [member function]
     cls.add_method('SetLteMacSapProvider', 
                    'void', 
@@ -15007,6 +15275,38 @@
                    [param('uint16_t', 'rnti'), param('ns3::LteUeRrcSapProvider *', 'p')])
     return
 
+def register_Ns3LteHandoverAlgorithm_methods(root_module, cls):
+    ## lte-handover-algorithm.h (module 'lte'): ns3::LteHandoverAlgorithm::LteHandoverAlgorithm(ns3::LteHandoverAlgorithm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteHandoverAlgorithm const &', 'arg0')])
+    ## lte-handover-algorithm.h (module 'lte'): ns3::LteHandoverAlgorithm::LteHandoverAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## lte-handover-algorithm.h (module 'lte'): ns3::LteHandoverManagementSapProvider * ns3::LteHandoverAlgorithm::GetLteHandoverManagementSapProvider() [member function]
+    cls.add_method('GetLteHandoverManagementSapProvider', 
+                   'ns3::LteHandoverManagementSapProvider *', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-handover-algorithm.h (module 'lte'): static ns3::TypeId ns3::LteHandoverAlgorithm::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## lte-handover-algorithm.h (module 'lte'): void ns3::LteHandoverAlgorithm::SetLteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapUser', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapUser *', 's')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-handover-algorithm.h (module 'lte'): void ns3::LteHandoverAlgorithm::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## lte-handover-algorithm.h (module 'lte'): void ns3::LteHandoverAlgorithm::DoReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('DoReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3LteHarqPhy_methods(root_module, cls):
     ## lte-harq-phy.h (module 'lte'): ns3::LteHarqPhy::LteHarqPhy(ns3::LteHarqPhy const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LteHarqPhy const &', 'arg0')])
@@ -15083,6 +15383,14 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::NetDeviceContainer ueDevices) [member function]
+    cls.add_method('Attach', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'ueDevices')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::Ptr<ns3::NetDevice> ueDevice) [member function]
+    cls.add_method('Attach', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueDevice')])
     ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::NetDeviceContainer ueDevices, ns3::Ptr<ns3::NetDevice> enbDevice) [member function]
     cls.add_method('Attach', 
                    'void', 
@@ -15160,6 +15468,11 @@
     cls.add_method('EnableUlTxPhyTraces', 
                    'void', 
                    [])
+    ## lte-helper.h (module 'lte'): std::string ns3::LteHelper::GetHandoverAlgorithmType() const [member function]
+    cls.add_method('GetHandoverAlgorithmType', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
     ## lte-helper.h (module 'lte'): ns3::Ptr<ns3::RadioBearerStatsCalculator> ns3::LteHelper::GetPdcpStats() [member function]
     cls.add_method('GetPdcpStats', 
                    'ns3::Ptr< ns3::RadioBearerStatsCalculator >', 
@@ -15214,6 +15527,14 @@
     cls.add_method('SetFadingModelAttribute', 
                    'void', 
                    [param('std::string', 'n'), param('ns3::AttributeValue const &', 'v')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::SetHandoverAlgorithmAttribute(std::string n, ns3::AttributeValue const & v) [member function]
+    cls.add_method('SetHandoverAlgorithmAttribute', 
+                   'void', 
+                   [param('std::string', 'n'), param('ns3::AttributeValue const &', 'v')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::SetHandoverAlgorithmType(std::string type) [member function]
+    cls.add_method('SetHandoverAlgorithmType', 
+                   'void', 
+                   [param('std::string', 'type')])
     ## lte-helper.h (module 'lte'): void ns3::LteHelper::SetPathlossModelAttribute(std::string n, ns3::AttributeValue const & v) [member function]
     cls.add_method('SetPathlossModelAttribute', 
                    'void', 
@@ -15246,6 +15567,10 @@
     cls.add_method('SetUeAntennaModelType', 
                    'void', 
                    [param('std::string', 'type')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::SetUeDeviceAttribute(std::string n, ns3::AttributeValue const & v) [member function]
+    cls.add_method('SetUeDeviceAttribute', 
+                   'void', 
+                   [param('std::string', 'n'), param('ns3::AttributeValue const &', 'v')])
     ## lte-helper.h (module 'lte'): void ns3::LteHelper::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
@@ -15476,15 +15801,15 @@
     cls.add_method('GetUplinkSpectrumPhy', 
                    'ns3::Ptr< ns3::LteSpectrumPhy >', 
                    [])
-    ## lte-phy.h (module 'lte'): void ns3::LtePhy::ReportInterference(ns3::SpectrumValue const & power) [member function]
+    ## lte-phy.h (module 'lte'): void ns3::LtePhy::ReportInterference(ns3::SpectrumValue const & interf) [member function]
     cls.add_method('ReportInterference', 
                    'void', 
-                   [param('ns3::SpectrumValue const &', 'power')], 
+                   [param('ns3::SpectrumValue const &', 'interf')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-phy.h (module 'lte'): void ns3::LtePhy::ReportRsReceivedPower(ns3::SpectrumValue const & interf) [member function]
+    ## lte-phy.h (module 'lte'): void ns3::LtePhy::ReportRsReceivedPower(ns3::SpectrumValue const & power) [member function]
     cls.add_method('ReportRsReceivedPower', 
                    'void', 
-                   [param('ns3::SpectrumValue const &', 'interf')], 
+                   [param('ns3::SpectrumValue const &', 'power')], 
                    is_pure_virtual=True, is_virtual=True)
     ## lte-phy.h (module 'lte'): void ns3::LtePhy::SetControlMessages(ns3::Ptr<ns3::LteControlMessage> m) [member function]
     cls.add_method('SetControlMessages', 
@@ -16215,6 +16540,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## lte-ue-phy.h (module 'lte'): ns3::LteUePhy::State ns3::LteUePhy::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'ns3::LteUePhy::State', 
+                   [], 
+                   is_const=True)
     ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForReception() [member function]
     cls.add_method('GetSubChannelsForReception', 
                    'std::vector< int >', 
@@ -16283,10 +16613,10 @@
     cls.add_method('SetLteUePhySapUser', 
                    'void', 
                    [param('ns3::LteUePhySapUser *', 's')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetNoiseFigure(double pow) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetNoiseFigure(double nf) [member function]
     cls.add_method('SetNoiseFigure', 
                    'void', 
-                   [param('double', 'pow')])
+                   [param('double', 'nf')])
     ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int> > mask) [member function]
     cls.add_method('SetSubChannelsForReception', 
                    'void', 
@@ -16344,10 +16674,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-ue-rrc.h (module 'lte'): uint64_t ns3::LteUeRrc::GetImsi() [member function]
+    ## lte-ue-rrc.h (module 'lte'): uint64_t ns3::LteUeRrc::GetImsi() const [member function]
     cls.add_method('GetImsi', 
                    'uint64_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-ue-rrc.h (module 'lte'): ns3::LteUeCmacSapUser * ns3::LteUeRrc::GetLteUeCmacSapUser() [member function]
     cls.add_method('GetLteUeCmacSapUser', 
                    'ns3::LteUeCmacSapUser *', 
@@ -16365,10 +16696,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc::State ns3::LteUeRrc::GetState() [member function]
+    ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc::State ns3::LteUeRrc::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::LteUeRrc::State', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-ue-rrc.h (module 'lte'): static ns3::TypeId ns3::LteUeRrc::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -16557,10 +16889,10 @@
     cls.add_method('SetUlOutputFilename', 
                    'void', 
                    [param('std::string', 'outputFilename')])
-    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::UlScheduling(uint16_t cellId, uint64_t imsi, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb) [member function]
+    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::UlScheduling(uint16_t cellId, uint64_t imsi, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcsTb, uint16_t sizeTb) [member function]
     cls.add_method('UlScheduling', 
                    'void', 
-                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint32_t', 'frameNo'), param('uint32_t', 'subframeNo'), param('uint16_t', 'rnti'), param('uint8_t', 'mcs'), param('uint16_t', 'sizeTb')])
+                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint32_t', 'frameNo'), param('uint32_t', 'subframeNo'), param('uint16_t', 'rnti'), param('uint8_t', 'mcsTb'), param('uint16_t', 'sizeTb')])
     ## mac-stats-calculator.h (module 'lte'): static void ns3::MacStatsCalculator::UlSchedulingCallback(ns3::Ptr<ns3::MacStatsCalculator> macStats, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t size) [member function]
     cls.add_method('UlSchedulingCallback', 
                    'void', 
@@ -16649,23 +16981,6 @@
                    is_pure_virtual=True, visibility='private', is_virtual=True)
     return
 
-def register_Ns3NeighbourRelation_methods(root_module, cls):
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::NeighbourRelation() [constructor]
-    cls.add_constructor([])
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::NeighbourRelation(ns3::NeighbourRelation const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::NeighbourRelation const &', 'arg0')])
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_detectedAsNeighbour [variable]
-    cls.add_instance_attribute('m_detectedAsNeighbour', 'bool', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_noHo [variable]
-    cls.add_instance_attribute('m_noHo', 'bool', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_noRemove [variable]
-    cls.add_instance_attribute('m_noRemove', 'bool', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_noX2 [variable]
-    cls.add_instance_attribute('m_noX2', 'bool', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_physCellId [variable]
-    cls.add_instance_attribute('m_physCellId', 'uint16_t', is_const=False)
-    return
-
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -16842,6 +17157,43 @@
                    is_const=True)
     return
 
+def register_Ns3NoOpHandoverAlgorithm_methods(root_module, cls):
+    ## no-op-handover-algorithm.h (module 'lte'): ns3::NoOpHandoverAlgorithm::NoOpHandoverAlgorithm(ns3::NoOpHandoverAlgorithm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NoOpHandoverAlgorithm const &', 'arg0')])
+    ## no-op-handover-algorithm.h (module 'lte'): ns3::NoOpHandoverAlgorithm::NoOpHandoverAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## no-op-handover-algorithm.h (module 'lte'): ns3::LteHandoverManagementSapProvider * ns3::NoOpHandoverAlgorithm::GetLteHandoverManagementSapProvider() [member function]
+    cls.add_method('GetLteHandoverManagementSapProvider', 
+                   'ns3::LteHandoverManagementSapProvider *', 
+                   [], 
+                   is_virtual=True)
+    ## no-op-handover-algorithm.h (module 'lte'): static ns3::TypeId ns3::NoOpHandoverAlgorithm::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## no-op-handover-algorithm.h (module 'lte'): void ns3::NoOpHandoverAlgorithm::SetLteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapUser', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapUser *', 's')], 
+                   is_virtual=True)
+    ## no-op-handover-algorithm.h (module 'lte'): void ns3::NoOpHandoverAlgorithm::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## no-op-handover-algorithm.h (module 'lte'): void ns3::NoOpHandoverAlgorithm::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## no-op-handover-algorithm.h (module 'lte'): void ns3::NoOpHandoverAlgorithm::DoReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('DoReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3Node_methods(root_module, cls):
     ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Node const &', 'arg0')])
@@ -17434,6 +17786,58 @@
                    is_static=True)
     return
 
+def register_Ns3PointToPointEpcHelper_methods(root_module, cls):
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::PointToPointEpcHelper::PointToPointEpcHelper(ns3::PointToPointEpcHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PointToPointEpcHelper const &', 'arg0')])
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::PointToPointEpcHelper::PointToPointEpcHelper() [constructor]
+    cls.add_constructor([])
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::ActivateEpsBearer(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi, ns3::Ptr<ns3::EpcTft> tft, ns3::EpsBearer bearer) [member function]
+    cls.add_method('ActivateEpsBearer', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    cls.add_method('AddEnb', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddUe(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi) [member function]
+    cls.add_method('AddUe', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddX2Interface(ns3::Ptr<ns3::Node> enbNode1, ns3::Ptr<ns3::Node> enbNode2) [member function]
+    cls.add_method('AddX2Interface', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode1'), param('ns3::Ptr< ns3::Node >', 'enbNode2')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::Ipv4InterfaceContainer ns3::PointToPointEpcHelper::AssignUeIpv4Address(ns3::NetDeviceContainer ueDevices) [member function]
+    cls.add_method('AssignUeIpv4Address', 
+                   'ns3::Ipv4InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer', 'ueDevices')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::Ptr<ns3::Node> ns3::PointToPointEpcHelper::GetPgwNode() [member function]
+    cls.add_method('GetPgwNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): static ns3::TypeId ns3::PointToPointEpcHelper::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::Ipv4Address ns3::PointToPointEpcHelper::GetUeDefaultGatewayAddress() [member function]
+    cls.add_method('GetUeDefaultGatewayAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3PointerChecker_methods(root_module, cls):
     ## pointer.h (module 'core'): ns3::PointerChecker::PointerChecker() [constructor]
     cls.add_constructor([])
@@ -18153,6 +18557,22 @@
                    is_const=True, visibility='protected')
     return
 
+def register_Ns3Sib1LteControlMessage_methods(root_module, cls):
+    ## lte-control-messages.h (module 'lte'): ns3::Sib1LteControlMessage::Sib1LteControlMessage(ns3::Sib1LteControlMessage const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Sib1LteControlMessage const &', 'arg0')])
+    ## lte-control-messages.h (module 'lte'): ns3::Sib1LteControlMessage::Sib1LteControlMessage() [constructor]
+    cls.add_constructor([])
+    ## lte-control-messages.h (module 'lte'): ns3::LteRrcSap::SystemInformationBlockType1 ns3::Sib1LteControlMessage::GetSib1() const [member function]
+    cls.add_method('GetSib1', 
+                   'ns3::LteRrcSap::SystemInformationBlockType1', 
+                   [], 
+                   is_const=True)
+    ## lte-control-messages.h (module 'lte'): void ns3::Sib1LteControlMessage::SetSib1(ns3::LteRrcSap::SystemInformationBlockType1 sib1) [member function]
+    cls.add_method('SetSib1', 
+                   'void', 
+                   [param('ns3::LteRrcSap::SystemInformationBlockType1', 'sib1')])
+    return
+
 def register_Ns3SpectrumChannel_methods(root_module, cls):
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
@@ -18763,6 +19183,80 @@
                    visibility='protected', is_virtual=True)
     return
 
+def register_Ns3A2A4RsrqHandoverAlgorithm_methods(root_module, cls):
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): ns3::A2A4RsrqHandoverAlgorithm::A2A4RsrqHandoverAlgorithm(ns3::A2A4RsrqHandoverAlgorithm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::A2A4RsrqHandoverAlgorithm const &', 'arg0')])
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): ns3::A2A4RsrqHandoverAlgorithm::A2A4RsrqHandoverAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): ns3::LteHandoverManagementSapProvider * ns3::A2A4RsrqHandoverAlgorithm::GetLteHandoverManagementSapProvider() [member function]
+    cls.add_method('GetLteHandoverManagementSapProvider', 
+                   'ns3::LteHandoverManagementSapProvider *', 
+                   [], 
+                   is_virtual=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): static ns3::TypeId ns3::A2A4RsrqHandoverAlgorithm::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): void ns3::A2A4RsrqHandoverAlgorithm::SetLteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapUser', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapUser *', 's')], 
+                   is_virtual=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): void ns3::A2A4RsrqHandoverAlgorithm::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): void ns3::A2A4RsrqHandoverAlgorithm::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): void ns3::A2A4RsrqHandoverAlgorithm::DoReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('DoReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3A3RsrpHandoverAlgorithm_methods(root_module, cls):
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): ns3::A3RsrpHandoverAlgorithm::A3RsrpHandoverAlgorithm(ns3::A3RsrpHandoverAlgorithm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::A3RsrpHandoverAlgorithm const &', 'arg0')])
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): ns3::A3RsrpHandoverAlgorithm::A3RsrpHandoverAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): ns3::LteHandoverManagementSapProvider * ns3::A3RsrpHandoverAlgorithm::GetLteHandoverManagementSapProvider() [member function]
+    cls.add_method('GetLteHandoverManagementSapProvider', 
+                   'ns3::LteHandoverManagementSapProvider *', 
+                   [], 
+                   is_virtual=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): static ns3::TypeId ns3::A3RsrpHandoverAlgorithm::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): void ns3::A3RsrpHandoverAlgorithm::SetLteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapUser', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapUser *', 's')], 
+                   is_virtual=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): void ns3::A3RsrpHandoverAlgorithm::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): void ns3::A3RsrpHandoverAlgorithm::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): void ns3::A3RsrpHandoverAlgorithm::DoReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('DoReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3AddressChecker_methods(root_module, cls):
     ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
@@ -18812,10 +19306,10 @@
     cls.add_method('GetBsr', 
                    'ns3::MacCeListElement_s', 
                    [])
-    ## lte-control-messages.h (module 'lte'): void ns3::BsrLteControlMessage::SetBsr(ns3::MacCeListElement_s ulcqi) [member function]
+    ## lte-control-messages.h (module 'lte'): void ns3::BsrLteControlMessage::SetBsr(ns3::MacCeListElement_s bsr) [member function]
     cls.add_method('SetBsr', 
                    'void', 
-                   [param('ns3::MacCeListElement_s', 'ulcqi')])
+                   [param('ns3::MacCeListElement_s', 'bsr')])
     return
 
 def register_Ns3DlCqiLteControlMessage_methods(root_module, cls):
@@ -19224,10 +19718,10 @@
                    'void', 
                    [param('ns3::SpectrumValue const &', 'interf')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReportRsReceivedPower(ns3::SpectrumValue const & interf) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReportRsReceivedPower(ns3::SpectrumValue const & power) [member function]
     cls.add_method('ReportRsReceivedPower', 
                    'void', 
-                   [param('ns3::SpectrumValue const &', 'interf')], 
+                   [param('ns3::SpectrumValue const &', 'power')], 
                    is_virtual=True)
     ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList) [member function]
     cls.add_method('SendControlChannels', 
@@ -19466,8 +19960,6 @@
                    is_static=True)
     ## lte-ue-net-device.h (module 'lte'): ns3::LteUeNetDevice::LteUeNetDevice() [constructor]
     cls.add_constructor([])
-    ## lte-ue-net-device.h (module 'lte'): ns3::LteUeNetDevice::LteUeNetDevice(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::LteUePhy> phy, ns3::Ptr<ns3::LteUeMac> mac, ns3::Ptr<ns3::LteUeRrc> rrc, ns3::Ptr<ns3::EpcUeNas> nas, uint64_t imsi) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::LteUePhy >', 'phy'), param('ns3::Ptr< ns3::LteUeMac >', 'mac'), param('ns3::Ptr< ns3::LteUeRrc >', 'rrc'), param('ns3::Ptr< ns3::EpcUeNas >', 'nas'), param('uint64_t', 'imsi')])
     ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -19503,6 +19995,24 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## lte-ue-net-device.h (module 'lte'): uint16_t ns3::LteUeNetDevice::GetDlEarfcn() const [member function]
+    cls.add_method('GetDlEarfcn', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetDlEarfcn(uint16_t earfcn) [member function]
+    cls.add_method('SetDlEarfcn', 
+                   'void', 
+                   [param('uint16_t', 'earfcn')])
+    ## lte-ue-net-device.h (module 'lte'): uint32_t ns3::LteUeNetDevice::GetCsgId() const [member function]
+    cls.add_method('GetCsgId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCsgId(uint32_t csgId) [member function]
+    cls.add_method('SetCsgId', 
+                   'void', 
+                   [param('uint32_t', 'csgId')])
     ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetTargetEnb(ns3::Ptr<ns3::LteEnbNetDevice> enb) [member function]
     cls.add_method('SetTargetEnb', 
                    'void', 
@@ -20108,6 +20618,24 @@
     cls.add_method('SetUlEarfcn', 
                    'void', 
                    [param('uint16_t', 'earfcn')])
+    ## lte-enb-net-device.h (module 'lte'): uint32_t ns3::LteEnbNetDevice::GetCsgId() const [member function]
+    cls.add_method('GetCsgId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCsgId(uint32_t csgId) [member function]
+    cls.add_method('SetCsgId', 
+                   'void', 
+                   [param('uint32_t', 'csgId')])
+    ## lte-enb-net-device.h (module 'lte'): bool ns3::LteEnbNetDevice::GetCsgIndication() const [member function]
+    cls.add_method('GetCsgIndication', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCsgIndication(bool csgIndication) [member function]
+    cls.add_method('SetCsgIndication', 
+                   'void', 
+                   [param('bool', 'csgIndication')])
     ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
diff -Naur ns-3.18.1/src/lte/bindings/modulegen__gcc_LP64.py ns-3.19/src/lte/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/lte/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -354,6 +354,10 @@
     module.add_enum('Direction_e', ['DIR_UL', 'DIR_DL', 'DIR_BOTH'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
     ## ff-mac-common.h (module 'lte'): ns3::LogicalChannelConfigListElement_s::QosBearerType_e [enumeration]
     module.add_enum('QosBearerType_e', ['QBT_NON_GBR', 'QBT_GBR'], outer_class=root_module['ns3::LogicalChannelConfigListElement_s'])
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapProvider [class]
+    module.add_class('LteAnrSapProvider', allow_subclassing=True)
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapUser [class]
+    module.add_class('LteAnrSapUser', allow_subclassing=True)
     ## lte-as-sap.h (module 'lte'): ns3::LteAsSapProvider [class]
     module.add_class('LteAsSapProvider', allow_subclassing=True)
     ## lte-as-sap.h (module 'lte'): ns3::LteAsSapUser [class]
@@ -386,6 +390,10 @@
     module.add_class('LteFlowId_t')
     ## lte-global-pathloss-database.h (module 'lte'): ns3::LteGlobalPathlossDatabase [class]
     module.add_class('LteGlobalPathlossDatabase', allow_subclassing=True)
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapProvider [class]
+    module.add_class('LteHandoverManagementSapProvider', allow_subclassing=True)
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapUser [class]
+    module.add_class('LteHandoverManagementSapUser', allow_subclassing=True)
     ## lte-mac-sap.h (module 'lte'): ns3::LteMacSapProvider [class]
     module.add_class('LteMacSapProvider', allow_subclassing=True)
     ## lte-mac-sap.h (module 'lte'): ns3::LteMacSapProvider::ReportBufferStatusParameters [struct]
@@ -426,6 +434,8 @@
     module.add_class('CarrierFreqEutra', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellAccessRelatedInfo [struct]
     module.add_class('CellAccessRelatedInfo', outer_class=root_module['ns3::LteRrcSap'])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo [struct]
+    module.add_class('CellSelectionInfo', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellsToAddMod [struct]
     module.add_class('CellsToAddMod', outer_class=root_module['ns3::LteRrcSap'])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CgiInfo [struct]
@@ -891,7 +901,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-fading-loss-model.h (module 'lte'): ns3::TraceFadingLossModel [class]
@@ -906,8 +916,6 @@
     module.add_class('UeManager', parent=root_module['ns3::Object'])
     ## lte-enb-rrc.h (module 'lte'): ns3::UeManager::State [enumeration]
     module.add_enum('State', ['INITIAL_RANDOM_ACCESS', 'CONNECTION_SETUP', 'CONNECTION_REJECTED', 'CONNECTED_NORMALLY', 'CONNECTION_RECONFIGURATION', 'CONNECTION_REESTABLISHMENT', 'HANDOVER_PREPARATION', 'HANDOVER_JOINING', 'HANDOVER_PATH_SWITCH', 'HANDOVER_LEAVING', 'NUM_STATES'], outer_class=root_module['ns3::UeManager'])
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure [class]
-    module.add_class('UeMeasure', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
     module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
     ## ff-mac-common.h (module 'lte'): ns3::VendorSpecificValue [struct]
@@ -1060,10 +1068,12 @@
     module.add_class('LteAmc', parent=root_module['ns3::Object'])
     ## lte-amc.h (module 'lte'): ns3::LteAmc::AmcModel [enumeration]
     module.add_enum('AmcModel', ['PiroEW2010', 'MiErrorModel'], outer_class=root_module['ns3::LteAmc'])
+    ## lte-anr.h (module 'lte'): ns3::LteAnr [class]
+    module.add_class('LteAnr', parent=root_module['ns3::Object'])
     ## lte-control-messages.h (module 'lte'): ns3::LteControlMessage [class]
     module.add_class('LteControlMessage', parent=root_module['ns3::SimpleRefCount< ns3::LteControlMessage, ns3::empty, ns3::DefaultDeleter<ns3::LteControlMessage> >'])
     ## lte-control-messages.h (module 'lte'): ns3::LteControlMessage::MessageType [enumeration]
-    module.add_enum('MessageType', ['DL_DCI', 'UL_DCI', 'DL_CQI', 'UL_CQI', 'BSR', 'DL_HARQ', 'RACH_PREAMBLE', 'RAR', 'MIB'], outer_class=root_module['ns3::LteControlMessage'])
+    module.add_enum('MessageType', ['DL_DCI', 'UL_DCI', 'DL_CQI', 'UL_CQI', 'BSR', 'DL_HARQ', 'RACH_PREAMBLE', 'RAR', 'MIB', 'SIB1'], outer_class=root_module['ns3::LteControlMessage'])
     ## lte-enb-mac.h (module 'lte'): ns3::LteEnbMac [class]
     module.add_class('LteEnbMac', parent=root_module['ns3::Object'])
     ## lte-enb-rrc.h (module 'lte'): ns3::LteEnbRrc [class]
@@ -1074,6 +1084,8 @@
     module.add_class('LteEnbRrcProtocolIdeal', parent=root_module['ns3::Object'])
     ## lte-rrc-protocol-real.h (module 'lte'): ns3::LteEnbRrcProtocolReal [class]
     module.add_class('LteEnbRrcProtocolReal', parent=root_module['ns3::Object'])
+    ## lte-handover-algorithm.h (module 'lte'): ns3::LteHandoverAlgorithm [class]
+    module.add_class('LteHandoverAlgorithm', parent=root_module['ns3::Object'])
     ## lte-harq-phy.h (module 'lte'): ns3::LteHarqPhy [class]
     module.add_class('LteHarqPhy', parent=root_module['ns3::SimpleRefCount< ns3::LteHarqPhy, ns3::empty, ns3::DefaultDeleter<ns3::LteHarqPhy> >'])
     ## lte-helper.h (module 'lte'): ns3::LteHelper [class]
@@ -1124,10 +1136,12 @@
     module.add_class('LteUeMac', parent=root_module['ns3::Object'])
     ## lte-ue-phy.h (module 'lte'): ns3::LteUePhy [class]
     module.add_class('LteUePhy', parent=root_module['ns3::LtePhy'])
+    ## lte-ue-phy.h (module 'lte'): ns3::LteUePhy::State [enumeration]
+    module.add_enum('State', ['CELL_SEARCH', 'SYNCHRONIZED', 'NUM_STATES'], outer_class=root_module['ns3::LteUePhy'])
     ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc [class]
     module.add_class('LteUeRrc', parent=root_module['ns3::Object'])
     ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc::State [enumeration]
-    module.add_enum('State', ['IDLE_CELL_SELECTION', 'IDLE_WAIT_SYSTEM_INFO', 'IDLE_CAMPED_NORMALLY', 'IDLE_RANDOM_ACCESS', 'IDLE_CONNECTING', 'CONNECTED_NORMALLY', 'CONNECTED_REESTABLISHING', 'CONNECTED_HANDOVER', 'NUM_STATES'], outer_class=root_module['ns3::LteUeRrc'])
+    module.add_enum('State', ['IDLE_START', 'IDLE_CELL_SEARCH', 'IDLE_WAIT_MIB_SIB1', 'IDLE_WAIT_MIB', 'IDLE_WAIT_SIB1', 'IDLE_CAMPED_NORMALLY', 'IDLE_WAIT_SIB2', 'IDLE_RANDOM_ACCESS', 'IDLE_CONNECTING', 'CONNECTED_NORMALLY', 'CONNECTED_HANDOVER', 'CONNECTED_PHY_PROBLEM', 'CONNECTED_REESTABLISHING', 'NUM_STATES'], outer_class=root_module['ns3::LteUeRrc'])
     ## lte-rrc-protocol-ideal.h (module 'lte'): ns3::LteUeRrcProtocolIdeal [class]
     module.add_class('LteUeRrcProtocolIdeal', parent=root_module['ns3::Object'])
     ## lte-rrc-protocol-real.h (module 'lte'): ns3::LteUeRrcProtocolReal [class]
@@ -1142,14 +1156,14 @@
     module.add_class('MibLteControlMessage', parent=root_module['ns3::LteControlMessage'])
     ## mobility-model.h (module 'mobility'): ns3::MobilityModel [class]
     module.add_class('MobilityModel', import_from_module='ns.mobility', parent=root_module['ns3::Object'])
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation [class]
-    module.add_class('NeighbourRelation', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice [class]
     module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
     module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
     ## nix-vector.h (module 'network'): ns3::NixVector [class]
     module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    ## no-op-handover-algorithm.h (module 'lte'): ns3::NoOpHandoverAlgorithm [class]
+    module.add_class('NoOpHandoverAlgorithm', parent=root_module['ns3::LteHandoverAlgorithm'])
     ## node.h (module 'network'): ns3::Node [class]
     module.add_class('Node', import_from_module='ns.network', parent=root_module['ns3::Object'])
     ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable [class]
@@ -1170,6 +1184,8 @@
     module.add_class('PhyStatsCalculator', parent=root_module['ns3::LteStatsCalculator'])
     ## phy-tx-stats-calculator.h (module 'lte'): ns3::PhyTxStatsCalculator [class]
     module.add_class('PhyTxStatsCalculator', parent=root_module['ns3::LteStatsCalculator'])
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::PointToPointEpcHelper [class]
+    module.add_class('PointToPointEpcHelper', parent=root_module['ns3::EpcHelper'])
     ## pointer.h (module 'core'): ns3::PointerChecker [class]
     module.add_class('PointerChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
     ## pointer.h (module 'core'): ns3::PointerValue [class]
@@ -1198,6 +1214,8 @@
     module.add_class('RrcUlCcchMessage', parent=root_module['ns3::RrcAsn1Header'])
     ## lte-rrc-header.h (module 'lte'): ns3::RrcUlDcchMessage [class]
     module.add_class('RrcUlDcchMessage', parent=root_module['ns3::RrcAsn1Header'])
+    ## lte-control-messages.h (module 'lte'): ns3::Sib1LteControlMessage [class]
+    module.add_class('Sib1LteControlMessage', parent=root_module['ns3::LteControlMessage'])
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel [class]
     module.add_class('SpectrumChannel', import_from_module='ns.spectrum', parent=root_module['ns3::Channel'])
     ## lte-vendor-specific-parameters.h (module 'lte'): ns3::SrsCqiRntiVsp [class]
@@ -1234,6 +1252,10 @@
     module.add_class('Vector3DValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## virtual-net-device.h (module 'virtual-net-device'): ns3::VirtualNetDevice [class]
     module.add_class('VirtualNetDevice', import_from_module='ns.virtual_net_device', parent=root_module['ns3::NetDevice'])
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): ns3::A2A4RsrqHandoverAlgorithm [class]
+    module.add_class('A2A4RsrqHandoverAlgorithm', parent=root_module['ns3::LteHandoverAlgorithm'])
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): ns3::A3RsrpHandoverAlgorithm [class]
+    module.add_class('A3RsrpHandoverAlgorithm', parent=root_module['ns3::LteHandoverAlgorithm'])
     ## address.h (module 'network'): ns3::AddressChecker [class]
     module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## address.h (module 'network'): ns3::AddressValue [class]
@@ -1664,6 +1686,8 @@
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
     register_Ns3LogComponent_methods(root_module, root_module['ns3::LogComponent'])
     register_Ns3LogicalChannelConfigListElement_s_methods(root_module, root_module['ns3::LogicalChannelConfigListElement_s'])
+    register_Ns3LteAnrSapProvider_methods(root_module, root_module['ns3::LteAnrSapProvider'])
+    register_Ns3LteAnrSapUser_methods(root_module, root_module['ns3::LteAnrSapUser'])
     register_Ns3LteAsSapProvider_methods(root_module, root_module['ns3::LteAsSapProvider'])
     register_Ns3LteAsSapUser_methods(root_module, root_module['ns3::LteAsSapUser'])
     register_Ns3LteEnbCmacSapProvider_methods(root_module, root_module['ns3::LteEnbCmacSapProvider'])
@@ -1680,6 +1704,8 @@
     register_Ns3LteFfConverter_methods(root_module, root_module['ns3::LteFfConverter'])
     register_Ns3LteFlowId_t_methods(root_module, root_module['ns3::LteFlowId_t'])
     register_Ns3LteGlobalPathlossDatabase_methods(root_module, root_module['ns3::LteGlobalPathlossDatabase'])
+    register_Ns3LteHandoverManagementSapProvider_methods(root_module, root_module['ns3::LteHandoverManagementSapProvider'])
+    register_Ns3LteHandoverManagementSapUser_methods(root_module, root_module['ns3::LteHandoverManagementSapUser'])
     register_Ns3LteMacSapProvider_methods(root_module, root_module['ns3::LteMacSapProvider'])
     register_Ns3LteMacSapProviderReportBufferStatusParameters_methods(root_module, root_module['ns3::LteMacSapProvider::ReportBufferStatusParameters'])
     register_Ns3LteMacSapProviderTransmitPduParameters_methods(root_module, root_module['ns3::LteMacSapProvider::TransmitPduParameters'])
@@ -1699,6 +1725,7 @@
     register_Ns3LteRrcSapCarrierBandwidthEutra_methods(root_module, root_module['ns3::LteRrcSap::CarrierBandwidthEutra'])
     register_Ns3LteRrcSapCarrierFreqEutra_methods(root_module, root_module['ns3::LteRrcSap::CarrierFreqEutra'])
     register_Ns3LteRrcSapCellAccessRelatedInfo_methods(root_module, root_module['ns3::LteRrcSap::CellAccessRelatedInfo'])
+    register_Ns3LteRrcSapCellSelectionInfo_methods(root_module, root_module['ns3::LteRrcSap::CellSelectionInfo'])
     register_Ns3LteRrcSapCellsToAddMod_methods(root_module, root_module['ns3::LteRrcSap::CellsToAddMod'])
     register_Ns3LteRrcSapCgiInfo_methods(root_module, root_module['ns3::LteRrcSap::CgiInfo'])
     register_Ns3LteRrcSapDrbToAddMod_methods(root_module, root_module['ns3::LteRrcSap::DrbToAddMod'])
@@ -1895,7 +1922,6 @@
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
     register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
     register_Ns3UeManager_methods(root_module, root_module['ns3::UeManager'])
-    register_Ns3UeMeasure_methods(root_module, root_module['ns3::UeMeasure'])
     register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
     register_Ns3VendorSpecificValue_methods(root_module, root_module['ns3::VendorSpecificValue'])
     register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
@@ -1965,11 +1991,13 @@
     register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
     register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
     register_Ns3LteAmc_methods(root_module, root_module['ns3::LteAmc'])
+    register_Ns3LteAnr_methods(root_module, root_module['ns3::LteAnr'])
     register_Ns3LteControlMessage_methods(root_module, root_module['ns3::LteControlMessage'])
     register_Ns3LteEnbMac_methods(root_module, root_module['ns3::LteEnbMac'])
     register_Ns3LteEnbRrc_methods(root_module, root_module['ns3::LteEnbRrc'])
     register_Ns3LteEnbRrcProtocolIdeal_methods(root_module, root_module['ns3::LteEnbRrcProtocolIdeal'])
     register_Ns3LteEnbRrcProtocolReal_methods(root_module, root_module['ns3::LteEnbRrcProtocolReal'])
+    register_Ns3LteHandoverAlgorithm_methods(root_module, root_module['ns3::LteHandoverAlgorithm'])
     register_Ns3LteHarqPhy_methods(root_module, root_module['ns3::LteHarqPhy'])
     register_Ns3LteHelper_methods(root_module, root_module['ns3::LteHelper'])
     register_Ns3LteHexGridEnbTopologyHelper_methods(root_module, root_module['ns3::LteHexGridEnbTopologyHelper'])
@@ -2001,9 +2029,9 @@
     register_Ns3MacStatsCalculator_methods(root_module, root_module['ns3::MacStatsCalculator'])
     register_Ns3MibLteControlMessage_methods(root_module, root_module['ns3::MibLteControlMessage'])
     register_Ns3MobilityModel_methods(root_module, root_module['ns3::MobilityModel'])
-    register_Ns3NeighbourRelation_methods(root_module, root_module['ns3::NeighbourRelation'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
+    register_Ns3NoOpHandoverAlgorithm_methods(root_module, root_module['ns3::NoOpHandoverAlgorithm'])
     register_Ns3Node_methods(root_module, root_module['ns3::Node'])
     register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
     register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
@@ -2014,6 +2042,7 @@
     register_Ns3PhyRxStatsCalculator_methods(root_module, root_module['ns3::PhyRxStatsCalculator'])
     register_Ns3PhyStatsCalculator_methods(root_module, root_module['ns3::PhyStatsCalculator'])
     register_Ns3PhyTxStatsCalculator_methods(root_module, root_module['ns3::PhyTxStatsCalculator'])
+    register_Ns3PointToPointEpcHelper_methods(root_module, root_module['ns3::PointToPointEpcHelper'])
     register_Ns3PointerChecker_methods(root_module, root_module['ns3::PointerChecker'])
     register_Ns3PointerValue_methods(root_module, root_module['ns3::PointerValue'])
     register_Ns3PssFfMacScheduler_methods(root_module, root_module['ns3::PssFfMacScheduler'])
@@ -2028,6 +2057,7 @@
     register_Ns3RrcDlDcchMessage_methods(root_module, root_module['ns3::RrcDlDcchMessage'])
     register_Ns3RrcUlCcchMessage_methods(root_module, root_module['ns3::RrcUlCcchMessage'])
     register_Ns3RrcUlDcchMessage_methods(root_module, root_module['ns3::RrcUlDcchMessage'])
+    register_Ns3Sib1LteControlMessage_methods(root_module, root_module['ns3::Sib1LteControlMessage'])
     register_Ns3SpectrumChannel_methods(root_module, root_module['ns3::SpectrumChannel'])
     register_Ns3SrsCqiRntiVsp_methods(root_module, root_module['ns3::SrsCqiRntiVsp'])
     register_Ns3StringChecker_methods(root_module, root_module['ns3::StringChecker'])
@@ -2046,6 +2076,8 @@
     register_Ns3Vector3DChecker_methods(root_module, root_module['ns3::Vector3DChecker'])
     register_Ns3Vector3DValue_methods(root_module, root_module['ns3::Vector3DValue'])
     register_Ns3VirtualNetDevice_methods(root_module, root_module['ns3::VirtualNetDevice'])
+    register_Ns3A2A4RsrqHandoverAlgorithm_methods(root_module, root_module['ns3::A2A4RsrqHandoverAlgorithm'])
+    register_Ns3A3RsrpHandoverAlgorithm_methods(root_module, root_module['ns3::A3RsrpHandoverAlgorithm'])
     register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
     register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
     register_Ns3BsrLteControlMessage_methods(root_module, root_module['ns3::BsrLteControlMessage'])
@@ -3143,10 +3175,10 @@
                    'void', 
                    [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('std::list< ns3::EpcS1apSapMme::ErabSetupItem >', 'erabSetupList')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::InitialUeMessage(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t imsi, uint16_t ecgi) [member function]
+    ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::InitialUeMessage(uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t stmsi, uint16_t ecgi) [member function]
     cls.add_method('InitialUeMessage', 
                    'void', 
-                   [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('uint64_t', 'imsi'), param('uint16_t', 'ecgi')], 
+                   [param('uint64_t', 'mmeUeS1Id'), param('uint16_t', 'enbUeS1Id'), param('uint64_t', 'stmsi'), param('uint16_t', 'ecgi')], 
                    is_pure_virtual=True, is_virtual=True)
     ## epc-s1ap-sap.h (module 'lte'): void ns3::EpcS1apSapMme::PathSwitchRequest(uint64_t enbUeS1Id, uint64_t mmeUeS1Id, uint16_t gci, std::list<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem, std::allocator<ns3::EpcS1apSapMme::ErabSwitchedInDownlinkItem> > erabToBeSwitchedInDownlinkList) [member function]
     cls.add_method('PathSwitchRequest', 
@@ -3609,6 +3641,16 @@
     cls.add_constructor([])
     ## lte-common.h (module 'lte'): ns3::EutranMeasurementMapping::EutranMeasurementMapping(ns3::EutranMeasurementMapping const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::EutranMeasurementMapping const &', 'arg0')])
+    ## lte-common.h (module 'lte'): static int8_t ns3::EutranMeasurementMapping::ActualA3Offset2IeValue(double a3OffsetDb) [member function]
+    cls.add_method('ActualA3Offset2IeValue', 
+                   'int8_t', 
+                   [param('double', 'a3OffsetDb')], 
+                   is_static=True)
+    ## lte-common.h (module 'lte'): static uint8_t ns3::EutranMeasurementMapping::ActualHysteresis2IeValue(double hysteresisDb) [member function]
+    cls.add_method('ActualHysteresis2IeValue', 
+                   'uint8_t', 
+                   [param('double', 'hysteresisDb')], 
+                   is_static=True)
     ## lte-common.h (module 'lte'): static uint8_t ns3::EutranMeasurementMapping::Db2RsrqRange(double db) [member function]
     cls.add_method('Db2RsrqRange', 
                    'uint8_t', 
@@ -3619,6 +3661,26 @@
                    'uint8_t', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::IeValue2ActualA3Offset(int8_t a3OffsetIeValue) [member function]
+    cls.add_method('IeValue2ActualA3Offset', 
+                   'double', 
+                   [param('int8_t', 'a3OffsetIeValue')], 
+                   is_static=True)
+    ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::IeValue2ActualHysteresis(uint8_t hysteresisIeValue) [member function]
+    cls.add_method('IeValue2ActualHysteresis', 
+                   'double', 
+                   [param('uint8_t', 'hysteresisIeValue')], 
+                   is_static=True)
+    ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::IeValue2ActualQQualMin(int8_t qQualMinIeValue) [member function]
+    cls.add_method('IeValue2ActualQQualMin', 
+                   'double', 
+                   [param('int8_t', 'qQualMinIeValue')], 
+                   is_static=True)
+    ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::IeValue2ActualQRxLevMin(int8_t qRxLevMinIeValue) [member function]
+    cls.add_method('IeValue2ActualQRxLevMin', 
+                   'double', 
+                   [param('int8_t', 'qRxLevMinIeValue')], 
+                   is_static=True)
     ## lte-common.h (module 'lte'): static double ns3::EutranMeasurementMapping::QuantizeRsrp(double v) [member function]
     cls.add_method('QuantizeRsrp', 
                    'double', 
@@ -4939,10 +5001,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -5210,6 +5273,50 @@
     cls.add_instance_attribute('m_qosBearerType', 'ns3::LogicalChannelConfigListElement_s::QosBearerType_e', is_const=False)
     return
 
+def register_Ns3LteAnrSapProvider_methods(root_module, cls):
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapProvider::LteAnrSapProvider() [constructor]
+    cls.add_constructor([])
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapProvider::LteAnrSapProvider(ns3::LteAnrSapProvider const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteAnrSapProvider const &', 'arg0')])
+    ## lte-anr-sap.h (module 'lte'): void ns3::LteAnrSapProvider::AddNeighbourRelation(uint16_t cellId) [member function]
+    cls.add_method('AddNeighbourRelation', 
+                   'void', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-anr-sap.h (module 'lte'): bool ns3::LteAnrSapProvider::GetNoHo(uint16_t cellId) const [member function]
+    cls.add_method('GetNoHo', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## lte-anr-sap.h (module 'lte'): bool ns3::LteAnrSapProvider::GetNoRemove(uint16_t cellId) const [member function]
+    cls.add_method('GetNoRemove', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## lte-anr-sap.h (module 'lte'): bool ns3::LteAnrSapProvider::GetNoX2(uint16_t cellId) const [member function]
+    cls.add_method('GetNoX2', 
+                   'bool', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## lte-anr-sap.h (module 'lte'): void ns3::LteAnrSapProvider::ReportUeMeas(ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('ReportUeMeas', 
+                   'void', 
+                   [param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3LteAnrSapUser_methods(root_module, cls):
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapUser::LteAnrSapUser() [constructor]
+    cls.add_constructor([])
+    ## lte-anr-sap.h (module 'lte'): ns3::LteAnrSapUser::LteAnrSapUser(ns3::LteAnrSapUser const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteAnrSapUser const &', 'arg0')])
+    ## lte-anr-sap.h (module 'lte'): uint8_t ns3::LteAnrSapUser::AddUeMeasReportConfigForAnr(ns3::LteRrcSap::ReportConfigEutra reportConfig) [member function]
+    cls.add_method('AddUeMeasReportConfigForAnr', 
+                   'uint8_t', 
+                   [param('ns3::LteRrcSap::ReportConfigEutra', 'reportConfig')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3LteAsSapProvider_methods(root_module, cls):
     ## lte-as-sap.h (module 'lte'): ns3::LteAsSapProvider::LteAsSapProvider() [constructor]
     cls.add_constructor([])
@@ -5225,16 +5332,26 @@
                    'void', 
                    [], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::ForceCampedOnEnb(uint16_t cellId, uint16_t earfcn) [member function]
+    ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::ForceCampedOnEnb(uint16_t cellId, uint16_t dlEarfcn) [member function]
     cls.add_method('ForceCampedOnEnb', 
                    'void', 
-                   [param('uint16_t', 'cellId'), param('uint16_t', 'earfcn')], 
+                   [param('uint16_t', 'cellId'), param('uint16_t', 'dlEarfcn')], 
                    is_pure_virtual=True, is_virtual=True)
     ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::SendData(ns3::Ptr<ns3::Packet> packet, uint8_t bid) [member function]
     cls.add_method('SendData', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'packet'), param('uint8_t', 'bid')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::SetCsgWhiteList(uint32_t csgId) [member function]
+    cls.add_method('SetCsgWhiteList', 
+                   'void', 
+                   [param('uint32_t', 'csgId')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-as-sap.h (module 'lte'): void ns3::LteAsSapProvider::StartCellSelection(uint16_t dlEarfcn) [member function]
+    cls.add_method('StartCellSelection', 
+                   'void', 
+                   [param('uint16_t', 'dlEarfcn')], 
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3LteAsSapUser_methods(root_module, cls):
@@ -5451,6 +5568,11 @@
                    'void', 
                    [param('uint16_t', 'rnti'), param('uint16_t', 'srsCi')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## lte-enb-cphy-sap.h (module 'lte'): void ns3::LteEnbCphySapProvider::SetSystemInformationBlockType1(ns3::LteRrcSap::SystemInformationBlockType1 sib1) [member function]
+    cls.add_method('SetSystemInformationBlockType1', 
+                   'void', 
+                   [param('ns3::LteRrcSap::SystemInformationBlockType1', 'sib1')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## lte-enb-cphy-sap.h (module 'lte'): void ns3::LteEnbCphySapProvider::SetTransmissionMode(uint16_t rnti, uint8_t txMode) [member function]
     cls.add_method('SetTransmissionMode', 
                    'void', 
@@ -5586,6 +5708,35 @@
                    is_pure_virtual=True, is_virtual=True)
     return
 
+def register_Ns3LteHandoverManagementSapProvider_methods(root_module, cls):
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapProvider::LteHandoverManagementSapProvider() [constructor]
+    cls.add_constructor([])
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapProvider::LteHandoverManagementSapProvider(ns3::LteHandoverManagementSapProvider const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteHandoverManagementSapProvider const &', 'arg0')])
+    ## lte-handover-management-sap.h (module 'lte'): void ns3::LteHandoverManagementSapProvider::ReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('ReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3LteHandoverManagementSapUser_methods(root_module, cls):
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapUser::LteHandoverManagementSapUser() [constructor]
+    cls.add_constructor([])
+    ## lte-handover-management-sap.h (module 'lte'): ns3::LteHandoverManagementSapUser::LteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteHandoverManagementSapUser const &', 'arg0')])
+    ## lte-handover-management-sap.h (module 'lte'): uint8_t ns3::LteHandoverManagementSapUser::AddUeMeasReportConfigForHandover(ns3::LteRrcSap::ReportConfigEutra reportConfig) [member function]
+    cls.add_method('AddUeMeasReportConfigForHandover', 
+                   'uint8_t', 
+                   [param('ns3::LteRrcSap::ReportConfigEutra', 'reportConfig')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-handover-management-sap.h (module 'lte'): void ns3::LteHandoverManagementSapUser::TriggerHandover(uint16_t rnti, uint16_t targetCellId) [member function]
+    cls.add_method('TriggerHandover', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('uint16_t', 'targetCellId')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
 def register_Ns3LteMacSapProvider_methods(root_module, cls):
     ## lte-mac-sap.h (module 'lte'): ns3::LteMacSapProvider::LteMacSapProvider() [constructor]
     cls.add_constructor([])
@@ -5864,6 +6015,17 @@
     cls.add_instance_attribute('plmnIdentityInfo', 'ns3::LteRrcSap::PlmnIdentityInfo', is_const=False)
     return
 
+def register_Ns3LteRrcSapCellSelectionInfo_methods(root_module, cls):
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo::CellSelectionInfo() [constructor]
+    cls.add_constructor([])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo::CellSelectionInfo(ns3::LteRrcSap::CellSelectionInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteRrcSap::CellSelectionInfo const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo::qQualMin [variable]
+    cls.add_instance_attribute('qQualMin', 'int8_t', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellSelectionInfo::qRxLevMin [variable]
+    cls.add_instance_attribute('qRxLevMin', 'int8_t', is_const=False)
+    return
+
 def register_Ns3LteRrcSapCellsToAddMod_methods(root_module, cls):
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::CellsToAddMod::CellsToAddMod() [constructor]
     cls.add_constructor([])
@@ -6276,10 +6438,10 @@
     return
 
 def register_Ns3LteRrcSapReportConfigEutra_methods(root_module, cls):
-    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::ReportConfigEutra() [constructor]
-    cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::ReportConfigEutra(ns3::LteRrcSap::ReportConfigEutra const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LteRrcSap::ReportConfigEutra const &', 'arg0')])
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::ReportConfigEutra() [constructor]
+    cls.add_constructor([])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::a3Offset [variable]
     cls.add_instance_attribute('a3Offset', 'int8_t', is_const=False)
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ReportConfigEutra::hysteresis [variable]
@@ -6504,6 +6666,8 @@
     cls.add_constructor([param('ns3::LteRrcSap::SystemInformationBlockType1 const &', 'arg0')])
     ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SystemInformationBlockType1::cellAccessRelatedInfo [variable]
     cls.add_instance_attribute('cellAccessRelatedInfo', 'ns3::LteRrcSap::CellAccessRelatedInfo', is_const=False)
+    ## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::SystemInformationBlockType1::cellSelectionInfo [variable]
+    cls.add_instance_attribute('cellSelectionInfo', 'ns3::LteRrcSap::CellSelectionInfo', is_const=False)
     return
 
 def register_Ns3LteRrcSapSystemInformationBlockType2_methods(root_module, cls):
@@ -6712,8 +6876,18 @@
                    'void', 
                    [param('uint8_t', 'txMode')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::SyncronizeWithEnb(uint16_t cellId, uint16_t dlEarfcn) [member function]
-    cls.add_method('SyncronizeWithEnb', 
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::StartCellSearch(uint16_t dlEarfcn) [member function]
+    cls.add_method('StartCellSearch', 
+                   'void', 
+                   [param('uint16_t', 'dlEarfcn')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::SynchronizeWithEnb(uint16_t cellId) [member function]
+    cls.add_method('SynchronizeWithEnb', 
+                   'void', 
+                   [param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapProvider::SynchronizeWithEnb(uint16_t cellId, uint16_t dlEarfcn) [member function]
+    cls.add_method('SynchronizeWithEnb', 
                    'void', 
                    [param('uint16_t', 'cellId'), param('uint16_t', 'dlEarfcn')], 
                    is_pure_virtual=True, is_virtual=True)
@@ -6724,10 +6898,15 @@
     cls.add_constructor([])
     ## lte-ue-cphy-sap.h (module 'lte'): ns3::LteUeCphySapUser::LteUeCphySapUser(ns3::LteUeCphySapUser const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LteUeCphySapUser const &', 'arg0')])
-    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapUser::RecvMasterInformationBlock(ns3::LteRrcSap::MasterInformationBlock mib) [member function]
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapUser::RecvMasterInformationBlock(uint16_t cellId, ns3::LteRrcSap::MasterInformationBlock mib) [member function]
     cls.add_method('RecvMasterInformationBlock', 
                    'void', 
-                   [param('ns3::LteRrcSap::MasterInformationBlock', 'mib')], 
+                   [param('uint16_t', 'cellId'), param('ns3::LteRrcSap::MasterInformationBlock', 'mib')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapUser::RecvSystemInformationBlockType1(uint16_t cellId, ns3::LteRrcSap::SystemInformationBlockType1 sib1) [member function]
+    cls.add_method('RecvSystemInformationBlockType1', 
+                   'void', 
+                   [param('uint16_t', 'cellId'), param('ns3::LteRrcSap::SystemInformationBlockType1', 'sib1')], 
                    is_pure_virtual=True, is_virtual=True)
     ## lte-ue-cphy-sap.h (module 'lte'): void ns3::LteUeCphySapUser::ReportUeMeasurements(ns3::LteUeCphySapUser::UeMeasurementsParameters params) [member function]
     cls.add_method('ReportUeMeasurements', 
@@ -6812,11 +6991,6 @@
                    'void', 
                    [param('ns3::LteUeRrcSapProvider::CompleteSetupParameters', 'params')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-rrc-sap.h (module 'lte'): void ns3::LteUeRrcSapProvider::RecvMasterInformationBlock(ns3::LteRrcSap::MasterInformationBlock msg) [member function]
-    cls.add_method('RecvMasterInformationBlock', 
-                   'void', 
-                   [param('ns3::LteRrcSap::MasterInformationBlock', 'msg')], 
-                   is_pure_virtual=True, is_virtual=True)
     ## lte-rrc-sap.h (module 'lte'): void ns3::LteUeRrcSapProvider::RecvRrcConnectionReconfiguration(ns3::LteRrcSap::RrcConnectionReconfiguration msg) [member function]
     cls.add_method('RecvRrcConnectionReconfiguration', 
                    'void', 
@@ -6852,11 +7026,6 @@
                    'void', 
                    [param('ns3::LteRrcSap::SystemInformation', 'msg')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-rrc-sap.h (module 'lte'): void ns3::LteUeRrcSapProvider::RecvSystemInformationBlockType1(ns3::LteRrcSap::SystemInformationBlockType1 msg) [member function]
-    cls.add_method('RecvSystemInformationBlockType1', 
-                   'void', 
-                   [param('ns3::LteRrcSap::SystemInformationBlockType1', 'msg')], 
-                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3LteUeRrcSapProviderCompleteSetupParameters_methods(root_module, cls):
@@ -8833,10 +9002,10 @@
     cls.add_method('SetBid', 
                    'void', 
                    [param('uint8_t', 'bid')])
-    ## eps-bearer-tag.h (module 'lte'): void ns3::EpsBearerTag::SetRnti(uint16_t tid) [member function]
+    ## eps-bearer-tag.h (module 'lte'): void ns3::EpsBearerTag::SetRnti(uint16_t rnti) [member function]
     cls.add_method('SetRnti', 
                    'void', 
-                   [param('uint16_t', 'tid')])
+                   [param('uint16_t', 'rnti')])
     return
 
 def register_Ns3Header_methods(root_module, cls):
@@ -9262,11 +9431,6 @@
                    'void', 
                    [param('ns3::LteRrcSap::SystemInformation', 'msg')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-rrc-sap.h (module 'lte'): void ns3::LteEnbRrcSapUser::SendSystemInformationBlockType1(ns3::LteRrcSap::SystemInformationBlockType1 msg) [member function]
-    cls.add_method('SendSystemInformationBlockType1', 
-                   'void', 
-                   [param('ns3::LteRrcSap::SystemInformationBlockType1', 'msg')], 
-                   is_pure_virtual=True, is_virtual=True)
     ## lte-rrc-sap.h (module 'lte'): void ns3::LteEnbRrcSapUser::SetupUe(uint16_t rnti, ns3::LteEnbRrcSapUser::SetupUeParameters params) [member function]
     cls.add_method('SetupUe', 
                    'void', 
@@ -9438,18 +9602,18 @@
                    'void', 
                    [param('ns3::TagBuffer', 'i')], 
                    is_const=True, is_virtual=True)
-    ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetLayer(uint8_t lcid) [member function]
+    ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetLayer(uint8_t layer) [member function]
     cls.add_method('SetLayer', 
                    'void', 
-                   [param('uint8_t', 'lcid')])
+                   [param('uint8_t', 'layer')])
     ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetLcid(uint8_t lcid) [member function]
     cls.add_method('SetLcid', 
                    'void', 
                    [param('uint8_t', 'lcid')])
-    ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetRnti(uint16_t tid) [member function]
+    ## lte-radio-bearer-tag.h (module 'lte'): void ns3::LteRadioBearerTag::SetRnti(uint16_t rnti) [member function]
     cls.add_method('SetRnti', 
                    'void', 
-                   [param('uint16_t', 'tid')])
+                   [param('uint16_t', 'rnti')])
     return
 
 def register_Ns3LteRlcAmHeader_methods(root_module, cls):
@@ -11203,6 +11367,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -11213,6 +11382,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -11228,6 +11402,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -11253,6 +11432,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -11467,30 +11651,34 @@
     cls.add_method('GetErabList', 
                    'std::vector< ns3::EpcX2Sap::ErabToBeSetupItem >', 
                    [])
-    ## lte-enb-rrc.h (module 'lte'): uint64_t ns3::UeManager::GetImsi() [member function]
+    ## lte-enb-rrc.h (module 'lte'): uint64_t ns3::UeManager::GetImsi() const [member function]
     cls.add_method('GetImsi', 
                    'uint64_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-enb-rrc.h (module 'lte'): ns3::LteRrcSap::RadioResourceConfigDedicated ns3::UeManager::GetRadioResourceConfigForHandoverPreparationInfo() [member function]
     cls.add_method('GetRadioResourceConfigForHandoverPreparationInfo', 
                    'ns3::LteRrcSap::RadioResourceConfigDedicated', 
                    [])
-    ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetRnti() [member function]
+    ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetRnti() const [member function]
     cls.add_method('GetRnti', 
                    'uint16_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-enb-rrc.h (module 'lte'): ns3::LteRrcSap::RrcConnectionReconfiguration ns3::UeManager::GetRrcConnectionReconfigurationForHandover() [member function]
     cls.add_method('GetRrcConnectionReconfigurationForHandover', 
                    'ns3::LteRrcSap::RrcConnectionReconfiguration', 
                    [])
-    ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetSrsConfigurationIndex() [member function]
+    ## lte-enb-rrc.h (module 'lte'): uint16_t ns3::UeManager::GetSrsConfigurationIndex() const [member function]
     cls.add_method('GetSrsConfigurationIndex', 
                    'uint16_t', 
-                   [])
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeManager::State ns3::UeManager::GetState() [member function]
+                   [], 
+                   is_const=True)
+    ## lte-enb-rrc.h (module 'lte'): ns3::UeManager::State ns3::UeManager::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::UeManager::State', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-enb-rrc.h (module 'lte'): static ns3::TypeId ns3::UeManager::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -11592,19 +11780,6 @@
                    visibility='protected', is_virtual=True)
     return
 
-def register_Ns3UeMeasure_methods(root_module, cls):
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::UeMeasure() [constructor]
-    cls.add_constructor([])
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::UeMeasure(ns3::UeMeasure const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::UeMeasure const &', 'arg0')])
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::m_cellId [variable]
-    cls.add_instance_attribute('m_cellId', 'uint16_t', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::m_rsrp [variable]
-    cls.add_instance_attribute('m_rsrp', 'uint8_t', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::UeMeasure::m_rsrq [variable]
-    cls.add_instance_attribute('m_rsrq', 'uint8_t', is_const=False)
-    return
-
 def register_Ns3UniformRandomVariable_methods(root_module, cls):
     ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::UniformRandomVariable::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
@@ -12757,23 +12932,28 @@
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::ActivateEpsBearer(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi, ns3::Ptr<ns3::EpcTft> tft, ns3::EpsBearer bearer) [member function]
     cls.add_method('ActivateEpsBearer', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')])
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddUe(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi) [member function]
     cls.add_method('AddUe', 
                    'void', 
-                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi')])
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::AddX2Interface(ns3::Ptr<ns3::Node> enbNode1, ns3::Ptr<ns3::Node> enbNode2) [member function]
     cls.add_method('AddX2Interface', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Node >', 'enbNode1'), param('ns3::Ptr< ns3::Node >', 'enbNode2')])
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode1'), param('ns3::Ptr< ns3::Node >', 'enbNode2')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): ns3::Ipv4InterfaceContainer ns3::EpcHelper::AssignUeIpv4Address(ns3::NetDeviceContainer ueDevices) [member function]
     cls.add_method('AssignUeIpv4Address', 
                    'ns3::Ipv4InterfaceContainer', 
-                   [param('ns3::NetDeviceContainer', 'ueDevices')])
+                   [param('ns3::NetDeviceContainer', 'ueDevices')], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): void ns3::EpcHelper::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -12782,7 +12962,8 @@
     ## epc-helper.h (module 'lte'): ns3::Ptr<ns3::Node> ns3::EpcHelper::GetPgwNode() [member function]
     cls.add_method('GetPgwNode', 
                    'ns3::Ptr< ns3::Node >', 
-                   [])
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     ## epc-helper.h (module 'lte'): static ns3::TypeId ns3::EpcHelper::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -12791,7 +12972,8 @@
     ## epc-helper.h (module 'lte'): ns3::Ipv4Address ns3::EpcHelper::GetUeDefaultGatewayAddress() [member function]
     cls.add_method('GetUeDefaultGatewayAddress', 
                    'ns3::Ipv4Address', 
-                   [])
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3EpcMme_methods(root_module, cls):
@@ -12803,10 +12985,10 @@
     cls.add_method('AddBearer', 
                    'void', 
                    [param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')])
-    ## epc-mme.h (module 'lte'): void ns3::EpcMme::AddEnb(uint16_t egci, ns3::Ipv4Address enbS1UAddr, ns3::EpcS1apSapEnb * enbS1apSap) [member function]
+    ## epc-mme.h (module 'lte'): void ns3::EpcMme::AddEnb(uint16_t ecgi, ns3::Ipv4Address enbS1UAddr, ns3::EpcS1apSapEnb * enbS1apSap) [member function]
     cls.add_method('AddEnb', 
                    'void', 
-                   [param('uint16_t', 'egci'), param('ns3::Ipv4Address', 'enbS1UAddr'), param('ns3::EpcS1apSapEnb *', 'enbS1apSap')])
+                   [param('uint16_t', 'ecgi'), param('ns3::Ipv4Address', 'enbS1UAddr'), param('ns3::EpcS1apSapEnb *', 'enbS1apSap')])
     ## epc-mme.h (module 'lte'): void ns3::EpcMme::AddUe(uint64_t imsi) [member function]
     cls.add_method('AddUe', 
                    'void', 
@@ -12971,10 +13153,14 @@
     cls.add_method('ActivateEpsBearer', 
                    'void', 
                    [param('ns3::EpsBearer', 'bearer'), param('ns3::Ptr< ns3::EpcTft >', 'tft')])
-    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::Connect(uint16_t cellId, uint16_t earfcn) [member function]
+    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::Connect() [member function]
+    cls.add_method('Connect', 
+                   'void', 
+                   [])
+    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::Connect(uint16_t cellId, uint16_t dlEarfcn) [member function]
     cls.add_method('Connect', 
                    'void', 
-                   [param('uint16_t', 'cellId'), param('uint16_t', 'earfcn')])
+                   [param('uint16_t', 'cellId'), param('uint16_t', 'dlEarfcn')])
     ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::Disconnect() [member function]
     cls.add_method('Disconnect', 
                    'void', 
@@ -12988,6 +13174,16 @@
     cls.add_method('GetAsSapUser', 
                    'ns3::LteAsSapUser *', 
                    [])
+    ## epc-ue-nas.h (module 'lte'): uint32_t ns3::EpcUeNas::GetCsgId() const [member function]
+    cls.add_method('GetCsgId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## epc-ue-nas.h (module 'lte'): ns3::EpcUeNas::State ns3::EpcUeNas::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'ns3::EpcUeNas::State', 
+                   [], 
+                   is_const=True)
     ## epc-ue-nas.h (module 'lte'): static ns3::TypeId ns3::EpcUeNas::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -13001,6 +13197,10 @@
     cls.add_method('SetAsSapProvider', 
                    'void', 
                    [param('ns3::LteAsSapProvider *', 's')])
+    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::SetCsgId(uint32_t csgId) [member function]
+    cls.add_method('SetCsgId', 
+                   'void', 
+                   [param('uint32_t', 'csgId')])
     ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::SetDevice(ns3::Ptr<ns3::NetDevice> dev) [member function]
     cls.add_method('SetDevice', 
                    'void', 
@@ -13013,6 +13213,10 @@
     cls.add_method('SetImsi', 
                    'void', 
                    [param('uint64_t', 'imsi')])
+    ## epc-ue-nas.h (module 'lte'): void ns3::EpcUeNas::StartCellSelection(uint16_t dlEarfcn) [member function]
+    cls.add_method('StartCellSelection', 
+                   'void', 
+                   [param('uint16_t', 'dlEarfcn')])
     return
 
 def register_Ns3EpcX2_methods(root_module, cls):
@@ -14743,6 +14947,46 @@
                    is_static=True)
     return
 
+def register_Ns3LteAnr_methods(root_module, cls):
+    ## lte-anr.h (module 'lte'): ns3::LteAnr::LteAnr(ns3::LteAnr const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteAnr const &', 'arg0')])
+    ## lte-anr.h (module 'lte'): ns3::LteAnr::LteAnr(uint16_t servingCellId) [constructor]
+    cls.add_constructor([param('uint16_t', 'servingCellId')])
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::AddNeighbourRelation(uint16_t cellId) [member function]
+    cls.add_method('AddNeighbourRelation', 
+                   'void', 
+                   [param('uint16_t', 'cellId')])
+    ## lte-anr.h (module 'lte'): ns3::LteAnrSapProvider * ns3::LteAnr::GetLteAnrSapProvider() [member function]
+    cls.add_method('GetLteAnrSapProvider', 
+                   'ns3::LteAnrSapProvider *', 
+                   [], 
+                   is_virtual=True)
+    ## lte-anr.h (module 'lte'): static ns3::TypeId ns3::LteAnr::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::RemoveNeighbourRelation(uint16_t cellId) [member function]
+    cls.add_method('RemoveNeighbourRelation', 
+                   'void', 
+                   [param('uint16_t', 'cellId')])
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::SetLteAnrSapUser(ns3::LteAnrSapUser * s) [member function]
+    cls.add_method('SetLteAnrSapUser', 
+                   'void', 
+                   [param('ns3::LteAnrSapUser *', 's')], 
+                   is_virtual=True)
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## lte-anr.h (module 'lte'): void ns3::LteAnr::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3LteControlMessage_methods(root_module, cls):
     ## lte-control-messages.h (module 'lte'): ns3::LteControlMessage::LteControlMessage(ns3::LteControlMessage const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LteControlMessage const &', 'arg0')])
@@ -14824,6 +15068,10 @@
     cls.add_constructor([param('ns3::LteEnbRrc const &', 'arg0')])
     ## lte-enb-rrc.h (module 'lte'): ns3::LteEnbRrc::LteEnbRrc() [constructor]
     cls.add_constructor([])
+    ## lte-enb-rrc.h (module 'lte'): uint8_t ns3::LteEnbRrc::AddUeMeasReportConfig(ns3::LteRrcSap::ReportConfigEutra config) [member function]
+    cls.add_method('AddUeMeasReportConfig', 
+                   'uint8_t', 
+                   [param('ns3::LteRrcSap::ReportConfigEutra', 'config')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::AddX2Neighbour(uint16_t cellId) [member function]
     cls.add_method('AddX2Neighbour', 
                    'void', 
@@ -14844,6 +15092,10 @@
     cls.add_method('GetEpcX2SapUser', 
                    'ns3::EpcX2SapUser *', 
                    [])
+    ## lte-enb-rrc.h (module 'lte'): ns3::LteAnrSapUser * ns3::LteEnbRrc::GetLteAnrSapUser() [member function]
+    cls.add_method('GetLteAnrSapUser', 
+                   'ns3::LteAnrSapUser *', 
+                   [])
     ## lte-enb-rrc.h (module 'lte'): ns3::LteEnbCmacSapUser * ns3::LteEnbRrc::GetLteEnbCmacSapUser() [member function]
     cls.add_method('GetLteEnbCmacSapUser', 
                    'ns3::LteEnbCmacSapUser *', 
@@ -14856,6 +15108,10 @@
     cls.add_method('GetLteEnbRrcSapProvider', 
                    'ns3::LteEnbRrcSapProvider *', 
                    [])
+    ## lte-enb-rrc.h (module 'lte'): ns3::LteHandoverManagementSapUser * ns3::LteEnbRrc::GetLteHandoverManagementSapUser() [member function]
+    cls.add_method('GetLteHandoverManagementSapUser', 
+                   'ns3::LteHandoverManagementSapUser *', 
+                   [])
     ## lte-enb-rrc.h (module 'lte'): ns3::EpcEnbS1SapUser * ns3::LteEnbRrc::GetS1SapUser() [member function]
     cls.add_method('GetS1SapUser', 
                    'ns3::EpcEnbS1SapUser *', 
@@ -14894,6 +15150,10 @@
     cls.add_method('SetCellId', 
                    'void', 
                    [param('uint16_t', 'm_cellId')])
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetCsgId(uint32_t csgId, bool csgIndication) [member function]
+    cls.add_method('SetCsgId', 
+                   'void', 
+                   [param('uint32_t', 'csgId'), param('bool', 'csgIndication')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetEpcX2SapProvider(ns3::EpcX2SapProvider * s) [member function]
     cls.add_method('SetEpcX2SapProvider', 
                    'void', 
@@ -14902,6 +15162,10 @@
     cls.add_method('SetForwardUpCallback', 
                    'void', 
                    [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')])
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetLteAnrSapProvider(ns3::LteAnrSapProvider * s) [member function]
+    cls.add_method('SetLteAnrSapProvider', 
+                   'void', 
+                   [param('ns3::LteAnrSapProvider *', 's')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetLteEnbCmacSapProvider(ns3::LteEnbCmacSapProvider * s) [member function]
     cls.add_method('SetLteEnbCmacSapProvider', 
                    'void', 
@@ -14914,6 +15178,10 @@
     cls.add_method('SetLteEnbRrcSapUser', 
                    'void', 
                    [param('ns3::LteEnbRrcSapUser *', 's')])
+    ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetLteHandoverManagementSapProvider(ns3::LteHandoverManagementSapProvider * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapProvider', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapProvider *', 's')])
     ## lte-enb-rrc.h (module 'lte'): void ns3::LteEnbRrc::SetLteMacSapProvider(ns3::LteMacSapProvider * s) [member function]
     cls.add_method('SetLteMacSapProvider', 
                    'void', 
@@ -15007,6 +15275,38 @@
                    [param('uint16_t', 'rnti'), param('ns3::LteUeRrcSapProvider *', 'p')])
     return
 
+def register_Ns3LteHandoverAlgorithm_methods(root_module, cls):
+    ## lte-handover-algorithm.h (module 'lte'): ns3::LteHandoverAlgorithm::LteHandoverAlgorithm(ns3::LteHandoverAlgorithm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::LteHandoverAlgorithm const &', 'arg0')])
+    ## lte-handover-algorithm.h (module 'lte'): ns3::LteHandoverAlgorithm::LteHandoverAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## lte-handover-algorithm.h (module 'lte'): ns3::LteHandoverManagementSapProvider * ns3::LteHandoverAlgorithm::GetLteHandoverManagementSapProvider() [member function]
+    cls.add_method('GetLteHandoverManagementSapProvider', 
+                   'ns3::LteHandoverManagementSapProvider *', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-handover-algorithm.h (module 'lte'): static ns3::TypeId ns3::LteHandoverAlgorithm::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## lte-handover-algorithm.h (module 'lte'): void ns3::LteHandoverAlgorithm::SetLteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapUser', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapUser *', 's')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## lte-handover-algorithm.h (module 'lte'): void ns3::LteHandoverAlgorithm::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## lte-handover-algorithm.h (module 'lte'): void ns3::LteHandoverAlgorithm::DoReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('DoReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3LteHarqPhy_methods(root_module, cls):
     ## lte-harq-phy.h (module 'lte'): ns3::LteHarqPhy::LteHarqPhy(ns3::LteHarqPhy const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::LteHarqPhy const &', 'arg0')])
@@ -15083,6 +15383,14 @@
     cls.add_method('AssignStreams', 
                    'int64_t', 
                    [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::NetDeviceContainer ueDevices) [member function]
+    cls.add_method('Attach', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'ueDevices')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::Ptr<ns3::NetDevice> ueDevice) [member function]
+    cls.add_method('Attach', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueDevice')])
     ## lte-helper.h (module 'lte'): void ns3::LteHelper::Attach(ns3::NetDeviceContainer ueDevices, ns3::Ptr<ns3::NetDevice> enbDevice) [member function]
     cls.add_method('Attach', 
                    'void', 
@@ -15160,6 +15468,11 @@
     cls.add_method('EnableUlTxPhyTraces', 
                    'void', 
                    [])
+    ## lte-helper.h (module 'lte'): std::string ns3::LteHelper::GetHandoverAlgorithmType() const [member function]
+    cls.add_method('GetHandoverAlgorithmType', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
     ## lte-helper.h (module 'lte'): ns3::Ptr<ns3::RadioBearerStatsCalculator> ns3::LteHelper::GetPdcpStats() [member function]
     cls.add_method('GetPdcpStats', 
                    'ns3::Ptr< ns3::RadioBearerStatsCalculator >', 
@@ -15214,6 +15527,14 @@
     cls.add_method('SetFadingModelAttribute', 
                    'void', 
                    [param('std::string', 'n'), param('ns3::AttributeValue const &', 'v')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::SetHandoverAlgorithmAttribute(std::string n, ns3::AttributeValue const & v) [member function]
+    cls.add_method('SetHandoverAlgorithmAttribute', 
+                   'void', 
+                   [param('std::string', 'n'), param('ns3::AttributeValue const &', 'v')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::SetHandoverAlgorithmType(std::string type) [member function]
+    cls.add_method('SetHandoverAlgorithmType', 
+                   'void', 
+                   [param('std::string', 'type')])
     ## lte-helper.h (module 'lte'): void ns3::LteHelper::SetPathlossModelAttribute(std::string n, ns3::AttributeValue const & v) [member function]
     cls.add_method('SetPathlossModelAttribute', 
                    'void', 
@@ -15246,6 +15567,10 @@
     cls.add_method('SetUeAntennaModelType', 
                    'void', 
                    [param('std::string', 'type')])
+    ## lte-helper.h (module 'lte'): void ns3::LteHelper::SetUeDeviceAttribute(std::string n, ns3::AttributeValue const & v) [member function]
+    cls.add_method('SetUeDeviceAttribute', 
+                   'void', 
+                   [param('std::string', 'n'), param('ns3::AttributeValue const &', 'v')])
     ## lte-helper.h (module 'lte'): void ns3::LteHelper::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
@@ -15476,15 +15801,15 @@
     cls.add_method('GetUplinkSpectrumPhy', 
                    'ns3::Ptr< ns3::LteSpectrumPhy >', 
                    [])
-    ## lte-phy.h (module 'lte'): void ns3::LtePhy::ReportInterference(ns3::SpectrumValue const & power) [member function]
+    ## lte-phy.h (module 'lte'): void ns3::LtePhy::ReportInterference(ns3::SpectrumValue const & interf) [member function]
     cls.add_method('ReportInterference', 
                    'void', 
-                   [param('ns3::SpectrumValue const &', 'power')], 
+                   [param('ns3::SpectrumValue const &', 'interf')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## lte-phy.h (module 'lte'): void ns3::LtePhy::ReportRsReceivedPower(ns3::SpectrumValue const & interf) [member function]
+    ## lte-phy.h (module 'lte'): void ns3::LtePhy::ReportRsReceivedPower(ns3::SpectrumValue const & power) [member function]
     cls.add_method('ReportRsReceivedPower', 
                    'void', 
-                   [param('ns3::SpectrumValue const &', 'interf')], 
+                   [param('ns3::SpectrumValue const &', 'power')], 
                    is_pure_virtual=True, is_virtual=True)
     ## lte-phy.h (module 'lte'): void ns3::LtePhy::SetControlMessages(ns3::Ptr<ns3::LteControlMessage> m) [member function]
     cls.add_method('SetControlMessages', 
@@ -16215,6 +16540,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## lte-ue-phy.h (module 'lte'): ns3::LteUePhy::State ns3::LteUePhy::GetState() const [member function]
+    cls.add_method('GetState', 
+                   'ns3::LteUePhy::State', 
+                   [], 
+                   is_const=True)
     ## lte-ue-phy.h (module 'lte'): std::vector<int, std::allocator<int> > ns3::LteUePhy::GetSubChannelsForReception() [member function]
     cls.add_method('GetSubChannelsForReception', 
                    'std::vector< int >', 
@@ -16283,10 +16613,10 @@
     cls.add_method('SetLteUePhySapUser', 
                    'void', 
                    [param('ns3::LteUePhySapUser *', 's')])
-    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetNoiseFigure(double pow) [member function]
+    ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetNoiseFigure(double nf) [member function]
     cls.add_method('SetNoiseFigure', 
                    'void', 
-                   [param('double', 'pow')])
+                   [param('double', 'nf')])
     ## lte-ue-phy.h (module 'lte'): void ns3::LteUePhy::SetSubChannelsForReception(std::vector<int, std::allocator<int> > mask) [member function]
     cls.add_method('SetSubChannelsForReception', 
                    'void', 
@@ -16344,10 +16674,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-ue-rrc.h (module 'lte'): uint64_t ns3::LteUeRrc::GetImsi() [member function]
+    ## lte-ue-rrc.h (module 'lte'): uint64_t ns3::LteUeRrc::GetImsi() const [member function]
     cls.add_method('GetImsi', 
                    'uint64_t', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-ue-rrc.h (module 'lte'): ns3::LteUeCmacSapUser * ns3::LteUeRrc::GetLteUeCmacSapUser() [member function]
     cls.add_method('GetLteUeCmacSapUser', 
                    'ns3::LteUeCmacSapUser *', 
@@ -16365,10 +16696,11 @@
                    'uint16_t', 
                    [], 
                    is_const=True)
-    ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc::State ns3::LteUeRrc::GetState() [member function]
+    ## lte-ue-rrc.h (module 'lte'): ns3::LteUeRrc::State ns3::LteUeRrc::GetState() const [member function]
     cls.add_method('GetState', 
                    'ns3::LteUeRrc::State', 
-                   [])
+                   [], 
+                   is_const=True)
     ## lte-ue-rrc.h (module 'lte'): static ns3::TypeId ns3::LteUeRrc::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -16557,10 +16889,10 @@
     cls.add_method('SetUlOutputFilename', 
                    'void', 
                    [param('std::string', 'outputFilename')])
-    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::UlScheduling(uint16_t cellId, uint64_t imsi, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t sizeTb) [member function]
+    ## mac-stats-calculator.h (module 'lte'): void ns3::MacStatsCalculator::UlScheduling(uint16_t cellId, uint64_t imsi, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcsTb, uint16_t sizeTb) [member function]
     cls.add_method('UlScheduling', 
                    'void', 
-                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint32_t', 'frameNo'), param('uint32_t', 'subframeNo'), param('uint16_t', 'rnti'), param('uint8_t', 'mcs'), param('uint16_t', 'sizeTb')])
+                   [param('uint16_t', 'cellId'), param('uint64_t', 'imsi'), param('uint32_t', 'frameNo'), param('uint32_t', 'subframeNo'), param('uint16_t', 'rnti'), param('uint8_t', 'mcsTb'), param('uint16_t', 'sizeTb')])
     ## mac-stats-calculator.h (module 'lte'): static void ns3::MacStatsCalculator::UlSchedulingCallback(ns3::Ptr<ns3::MacStatsCalculator> macStats, std::string path, uint32_t frameNo, uint32_t subframeNo, uint16_t rnti, uint8_t mcs, uint16_t size) [member function]
     cls.add_method('UlSchedulingCallback', 
                    'void', 
@@ -16649,23 +16981,6 @@
                    is_pure_virtual=True, visibility='private', is_virtual=True)
     return
 
-def register_Ns3NeighbourRelation_methods(root_module, cls):
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::NeighbourRelation() [constructor]
-    cls.add_constructor([])
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::NeighbourRelation(ns3::NeighbourRelation const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::NeighbourRelation const &', 'arg0')])
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_detectedAsNeighbour [variable]
-    cls.add_instance_attribute('m_detectedAsNeighbour', 'bool', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_noHo [variable]
-    cls.add_instance_attribute('m_noHo', 'bool', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_noRemove [variable]
-    cls.add_instance_attribute('m_noRemove', 'bool', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_noX2 [variable]
-    cls.add_instance_attribute('m_noX2', 'bool', is_const=False)
-    ## lte-enb-rrc.h (module 'lte'): ns3::NeighbourRelation::m_physCellId [variable]
-    cls.add_instance_attribute('m_physCellId', 'uint16_t', is_const=False)
-    return
-
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -16842,6 +17157,43 @@
                    is_const=True)
     return
 
+def register_Ns3NoOpHandoverAlgorithm_methods(root_module, cls):
+    ## no-op-handover-algorithm.h (module 'lte'): ns3::NoOpHandoverAlgorithm::NoOpHandoverAlgorithm(ns3::NoOpHandoverAlgorithm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NoOpHandoverAlgorithm const &', 'arg0')])
+    ## no-op-handover-algorithm.h (module 'lte'): ns3::NoOpHandoverAlgorithm::NoOpHandoverAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## no-op-handover-algorithm.h (module 'lte'): ns3::LteHandoverManagementSapProvider * ns3::NoOpHandoverAlgorithm::GetLteHandoverManagementSapProvider() [member function]
+    cls.add_method('GetLteHandoverManagementSapProvider', 
+                   'ns3::LteHandoverManagementSapProvider *', 
+                   [], 
+                   is_virtual=True)
+    ## no-op-handover-algorithm.h (module 'lte'): static ns3::TypeId ns3::NoOpHandoverAlgorithm::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## no-op-handover-algorithm.h (module 'lte'): void ns3::NoOpHandoverAlgorithm::SetLteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapUser', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapUser *', 's')], 
+                   is_virtual=True)
+    ## no-op-handover-algorithm.h (module 'lte'): void ns3::NoOpHandoverAlgorithm::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## no-op-handover-algorithm.h (module 'lte'): void ns3::NoOpHandoverAlgorithm::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## no-op-handover-algorithm.h (module 'lte'): void ns3::NoOpHandoverAlgorithm::DoReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('DoReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3Node_methods(root_module, cls):
     ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Node const &', 'arg0')])
@@ -17434,6 +17786,58 @@
                    is_static=True)
     return
 
+def register_Ns3PointToPointEpcHelper_methods(root_module, cls):
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::PointToPointEpcHelper::PointToPointEpcHelper(ns3::PointToPointEpcHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PointToPointEpcHelper const &', 'arg0')])
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::PointToPointEpcHelper::PointToPointEpcHelper() [constructor]
+    cls.add_constructor([])
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::ActivateEpsBearer(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi, ns3::Ptr<ns3::EpcTft> tft, ns3::EpsBearer bearer) [member function]
+    cls.add_method('ActivateEpsBearer', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi'), param('ns3::Ptr< ns3::EpcTft >', 'tft'), param('ns3::EpsBearer', 'bearer')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddEnb(ns3::Ptr<ns3::Node> enbNode, ns3::Ptr<ns3::NetDevice> lteEnbNetDevice, uint16_t cellId) [member function]
+    cls.add_method('AddEnb', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode'), param('ns3::Ptr< ns3::NetDevice >', 'lteEnbNetDevice'), param('uint16_t', 'cellId')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddUe(ns3::Ptr<ns3::NetDevice> ueLteDevice, uint64_t imsi) [member function]
+    cls.add_method('AddUe', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'ueLteDevice'), param('uint64_t', 'imsi')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::AddX2Interface(ns3::Ptr<ns3::Node> enbNode1, ns3::Ptr<ns3::Node> enbNode2) [member function]
+    cls.add_method('AddX2Interface', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'enbNode1'), param('ns3::Ptr< ns3::Node >', 'enbNode2')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::Ipv4InterfaceContainer ns3::PointToPointEpcHelper::AssignUeIpv4Address(ns3::NetDeviceContainer ueDevices) [member function]
+    cls.add_method('AssignUeIpv4Address', 
+                   'ns3::Ipv4InterfaceContainer', 
+                   [param('ns3::NetDeviceContainer', 'ueDevices')], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): void ns3::PointToPointEpcHelper::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::Ptr<ns3::Node> ns3::PointToPointEpcHelper::GetPgwNode() [member function]
+    cls.add_method('GetPgwNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_virtual=True)
+    ## point-to-point-epc-helper.h (module 'lte'): static ns3::TypeId ns3::PointToPointEpcHelper::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## point-to-point-epc-helper.h (module 'lte'): ns3::Ipv4Address ns3::PointToPointEpcHelper::GetUeDefaultGatewayAddress() [member function]
+    cls.add_method('GetUeDefaultGatewayAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_virtual=True)
+    return
+
 def register_Ns3PointerChecker_methods(root_module, cls):
     ## pointer.h (module 'core'): ns3::PointerChecker::PointerChecker() [constructor]
     cls.add_constructor([])
@@ -18153,6 +18557,22 @@
                    is_const=True, visibility='protected')
     return
 
+def register_Ns3Sib1LteControlMessage_methods(root_module, cls):
+    ## lte-control-messages.h (module 'lte'): ns3::Sib1LteControlMessage::Sib1LteControlMessage(ns3::Sib1LteControlMessage const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Sib1LteControlMessage const &', 'arg0')])
+    ## lte-control-messages.h (module 'lte'): ns3::Sib1LteControlMessage::Sib1LteControlMessage() [constructor]
+    cls.add_constructor([])
+    ## lte-control-messages.h (module 'lte'): ns3::LteRrcSap::SystemInformationBlockType1 ns3::Sib1LteControlMessage::GetSib1() const [member function]
+    cls.add_method('GetSib1', 
+                   'ns3::LteRrcSap::SystemInformationBlockType1', 
+                   [], 
+                   is_const=True)
+    ## lte-control-messages.h (module 'lte'): void ns3::Sib1LteControlMessage::SetSib1(ns3::LteRrcSap::SystemInformationBlockType1 sib1) [member function]
+    cls.add_method('SetSib1', 
+                   'void', 
+                   [param('ns3::LteRrcSap::SystemInformationBlockType1', 'sib1')])
+    return
+
 def register_Ns3SpectrumChannel_methods(root_module, cls):
     ## spectrum-channel.h (module 'spectrum'): ns3::SpectrumChannel::SpectrumChannel() [constructor]
     cls.add_constructor([])
@@ -18763,6 +19183,80 @@
                    visibility='protected', is_virtual=True)
     return
 
+def register_Ns3A2A4RsrqHandoverAlgorithm_methods(root_module, cls):
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): ns3::A2A4RsrqHandoverAlgorithm::A2A4RsrqHandoverAlgorithm(ns3::A2A4RsrqHandoverAlgorithm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::A2A4RsrqHandoverAlgorithm const &', 'arg0')])
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): ns3::A2A4RsrqHandoverAlgorithm::A2A4RsrqHandoverAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): ns3::LteHandoverManagementSapProvider * ns3::A2A4RsrqHandoverAlgorithm::GetLteHandoverManagementSapProvider() [member function]
+    cls.add_method('GetLteHandoverManagementSapProvider', 
+                   'ns3::LteHandoverManagementSapProvider *', 
+                   [], 
+                   is_virtual=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): static ns3::TypeId ns3::A2A4RsrqHandoverAlgorithm::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): void ns3::A2A4RsrqHandoverAlgorithm::SetLteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapUser', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapUser *', 's')], 
+                   is_virtual=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): void ns3::A2A4RsrqHandoverAlgorithm::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): void ns3::A2A4RsrqHandoverAlgorithm::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## a2-a4-rsrq-handover-algorithm.h (module 'lte'): void ns3::A2A4RsrqHandoverAlgorithm::DoReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('DoReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3A3RsrpHandoverAlgorithm_methods(root_module, cls):
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): ns3::A3RsrpHandoverAlgorithm::A3RsrpHandoverAlgorithm(ns3::A3RsrpHandoverAlgorithm const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::A3RsrpHandoverAlgorithm const &', 'arg0')])
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): ns3::A3RsrpHandoverAlgorithm::A3RsrpHandoverAlgorithm() [constructor]
+    cls.add_constructor([])
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): ns3::LteHandoverManagementSapProvider * ns3::A3RsrpHandoverAlgorithm::GetLteHandoverManagementSapProvider() [member function]
+    cls.add_method('GetLteHandoverManagementSapProvider', 
+                   'ns3::LteHandoverManagementSapProvider *', 
+                   [], 
+                   is_virtual=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): static ns3::TypeId ns3::A3RsrpHandoverAlgorithm::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): void ns3::A3RsrpHandoverAlgorithm::SetLteHandoverManagementSapUser(ns3::LteHandoverManagementSapUser * s) [member function]
+    cls.add_method('SetLteHandoverManagementSapUser', 
+                   'void', 
+                   [param('ns3::LteHandoverManagementSapUser *', 's')], 
+                   is_virtual=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): void ns3::A3RsrpHandoverAlgorithm::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): void ns3::A3RsrpHandoverAlgorithm::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## a3-rsrp-handover-algorithm.h (module 'lte'): void ns3::A3RsrpHandoverAlgorithm::DoReportUeMeas(uint16_t rnti, ns3::LteRrcSap::MeasResults measResults) [member function]
+    cls.add_method('DoReportUeMeas', 
+                   'void', 
+                   [param('uint16_t', 'rnti'), param('ns3::LteRrcSap::MeasResults', 'measResults')], 
+                   visibility='protected', is_virtual=True)
+    return
+
 def register_Ns3AddressChecker_methods(root_module, cls):
     ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
     cls.add_constructor([])
@@ -18812,10 +19306,10 @@
     cls.add_method('GetBsr', 
                    'ns3::MacCeListElement_s', 
                    [])
-    ## lte-control-messages.h (module 'lte'): void ns3::BsrLteControlMessage::SetBsr(ns3::MacCeListElement_s ulcqi) [member function]
+    ## lte-control-messages.h (module 'lte'): void ns3::BsrLteControlMessage::SetBsr(ns3::MacCeListElement_s bsr) [member function]
     cls.add_method('SetBsr', 
                    'void', 
-                   [param('ns3::MacCeListElement_s', 'ulcqi')])
+                   [param('ns3::MacCeListElement_s', 'bsr')])
     return
 
 def register_Ns3DlCqiLteControlMessage_methods(root_module, cls):
@@ -19224,10 +19718,10 @@
                    'void', 
                    [param('ns3::SpectrumValue const &', 'interf')], 
                    is_virtual=True)
-    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReportRsReceivedPower(ns3::SpectrumValue const & interf) [member function]
+    ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::ReportRsReceivedPower(ns3::SpectrumValue const & power) [member function]
     cls.add_method('ReportRsReceivedPower', 
                    'void', 
-                   [param('ns3::SpectrumValue const &', 'interf')], 
+                   [param('ns3::SpectrumValue const &', 'power')], 
                    is_virtual=True)
     ## lte-enb-phy.h (module 'lte'): void ns3::LteEnbPhy::SendControlChannels(std::list<ns3::Ptr<ns3::LteControlMessage>, std::allocator<ns3::Ptr<ns3::LteControlMessage> > > ctrlMsgList) [member function]
     cls.add_method('SendControlChannels', 
@@ -19466,8 +19960,6 @@
                    is_static=True)
     ## lte-ue-net-device.h (module 'lte'): ns3::LteUeNetDevice::LteUeNetDevice() [constructor]
     cls.add_constructor([])
-    ## lte-ue-net-device.h (module 'lte'): ns3::LteUeNetDevice::LteUeNetDevice(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::LteUePhy> phy, ns3::Ptr<ns3::LteUeMac> mac, ns3::Ptr<ns3::LteUeRrc> rrc, ns3::Ptr<ns3::EpcUeNas> nas, uint64_t imsi) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::LteUePhy >', 'phy'), param('ns3::Ptr< ns3::LteUeMac >', 'mac'), param('ns3::Ptr< ns3::LteUeRrc >', 'rrc'), param('ns3::Ptr< ns3::EpcUeNas >', 'nas'), param('uint64_t', 'imsi')])
     ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -19503,6 +19995,24 @@
                    'uint64_t', 
                    [], 
                    is_const=True)
+    ## lte-ue-net-device.h (module 'lte'): uint16_t ns3::LteUeNetDevice::GetDlEarfcn() const [member function]
+    cls.add_method('GetDlEarfcn', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetDlEarfcn(uint16_t earfcn) [member function]
+    cls.add_method('SetDlEarfcn', 
+                   'void', 
+                   [param('uint16_t', 'earfcn')])
+    ## lte-ue-net-device.h (module 'lte'): uint32_t ns3::LteUeNetDevice::GetCsgId() const [member function]
+    cls.add_method('GetCsgId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetCsgId(uint32_t csgId) [member function]
+    cls.add_method('SetCsgId', 
+                   'void', 
+                   [param('uint32_t', 'csgId')])
     ## lte-ue-net-device.h (module 'lte'): void ns3::LteUeNetDevice::SetTargetEnb(ns3::Ptr<ns3::LteEnbNetDevice> enb) [member function]
     cls.add_method('SetTargetEnb', 
                    'void', 
@@ -20108,6 +20618,24 @@
     cls.add_method('SetUlEarfcn', 
                    'void', 
                    [param('uint16_t', 'earfcn')])
+    ## lte-enb-net-device.h (module 'lte'): uint32_t ns3::LteEnbNetDevice::GetCsgId() const [member function]
+    cls.add_method('GetCsgId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCsgId(uint32_t csgId) [member function]
+    cls.add_method('SetCsgId', 
+                   'void', 
+                   [param('uint32_t', 'csgId')])
+    ## lte-enb-net-device.h (module 'lte'): bool ns3::LteEnbNetDevice::GetCsgIndication() const [member function]
+    cls.add_method('GetCsgIndication', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::SetCsgIndication(bool csgIndication) [member function]
+    cls.add_method('SetCsgIndication', 
+                   'void', 
+                   [param('bool', 'csgIndication')])
     ## lte-enb-net-device.h (module 'lte'): void ns3::LteEnbNetDevice::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
diff -Naur ns-3.18.1/src/lte/doc/Makefile ns-3.19/src/lte/doc/Makefile
--- ns-3.18.1/src/lte/doc/Makefile	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/Makefile	2013-12-20 09:44:50.000000000 -0800
@@ -11,7 +11,7 @@
 # specify dia figures from which .png and .pdf figures need to be built
 
 IMAGES_DIA = \
-        $(FIGURES)/epc-ctrl-arch.dia \
+	$(FIGURES)/epc-ctrl-arch.dia \
 	$(FIGURES)/epc-data-flow-dl.dia \
 	$(FIGURES)/epc-data-flow-ul.dia \
 	$(FIGURES)/epc-profiling-scenario.dia \
@@ -26,12 +26,20 @@
 	$(FIGURES)/lte-arch-ue-ctrl.dia \
 	$(FIGURES)/lte-enb-phy.dia \
 	$(FIGURES)/lte-ue-phy.dia \
+	$(FIGURES)/lte-epc-x2-handover-seq-diagram.dia \
 	$(FIGURES)/lte-epc-e2e-data-protocol-stack.dia \
 	$(FIGURES)/lte-interference-test-scenario.dia \
 	$(FIGURES)/lte-subframe-structure.dia \
 	$(FIGURES)/lte-epc-x2-interface.dia \
 	$(FIGURES)/lte-harq-architecture.dia \
-	$(FIGURES)/lte-harq-processes-scheme.dia
+	$(FIGURES)/lte-harq-processes-scheme.dia \
+	$(FIGURES)/ue-meas-consumer.dia \
+	$(FIGURES)/ue-meas-piecewise-motion.dia \
+	$(FIGURES)/ue-meas-piecewise-a1.dia \
+	$(FIGURES)/ue-meas-piecewise-a1-hys.dia \
+	$(FIGURES)/lte-cell-selection-timeline.dia \
+	$(FIGURES)/lte-cell-selection-scenario.dia \
+	$(FIGURES)/lte-handover-target-scenario.dia
 
 
 # specify eps figures from which .png and .pdf figures need to be built
@@ -53,9 +61,8 @@
 	$(FIGURES)/lte-rlc-data-retx-dl.eps \
 	$(FIGURES)/lte-rlc-data-txon-ul.eps \
 	$(FIGURES)/lte-rlc-data-retx-ul.eps \
-	$(FIGURES)/lte-epc-x2-handover-seq-diagram.eps \
-	$(FIGURES)/lte-epc-x2-entity-saps.eps
-
+	$(FIGURES)/lte-epc-x2-entity-saps.eps \
+	$(FIGURES)/lte-strongest-cell-handover-algorithm.eps
 
 # rescale pdf figures as necessary
 $(FIGURES)/lte-interference-test-scenario.pdf_width = 3in
@@ -78,8 +85,6 @@
 $(FIGURES)/lte-subframe-structure.pdf_width = 2in
 $(FIGURES)/mac-random-access-contention.pdf_width = 10cm
 $(FIGURES)/mac-random-access-noncontention.pdf_width = 15cm
-$(FIGURES)/lte-ue-rrc-states.pdf_width = 7cm
-$(FIGURES)/lte-handover-algorithm.pdf_width = 10cm
 $(FIGURES)/helpers.pdf_width = 8cm
 
 IMAGES_SEQDIAG = \
@@ -95,7 +100,7 @@
 IMAGES_DOT = \
 	$(FIGURES)/lte-enb-rrc-states.dot \
 	$(FIGURES)/lte-ue-rrc-states.dot \
-	$(FIGURES)/lte-handover-algorithm.dot
+	$(FIGURES)/lte-legacy-handover-algorithm.dot
 
 IMAGES_NOBUILD = $(FIGURES)/fading_pedestrian.png \
 	$(FIGURES)/fading_vehicular.png \
@@ -131,6 +136,8 @@
 	$(FIGURES)/helpers.pdf \
 	$(FIGURES)/miesm_scheme.pdf \
 	$(FIGURES)/miesm_scheme.png \
+	$(FIGURES)/lte-handover-campaign-rem.pdf \
+	$(FIGURES)/lte-handover-campaign-rem.png \
 	${IMAGES_SEQDIAG:.seqdiag=.png} \
 	${IMAGES_SEQDIAG:.seqdiag=.pdf} \
 	${IMAGES_DOT:.dot=.png} \
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-cell-selection-scenario.dia ns-3.19/src/lte/doc/source/figures/lte-cell-selection-scenario.dia
--- ns-3.18.1/src/lte/doc/source/figures/lte-cell-selection-scenario.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-cell-selection-scenario.dia	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,9 @@
+     ][sH~ϯW"2L25I>l>d%@%	;އݒcZiO%n߾/Cq~E,ヸӻ_qH}"-o y*2˃$^EtW$ᵺӻ{aYtUF4\F"Vn%Y>zWou:{־4oG.KG%%;PO'[xYFw)am:l P B0pOnzZri%7Y^a\nfYiEWQw:,Lۖ.nmm6PCڎE;VywGUhItqZS?o~;_>nj;\D4ǫ*G6[fJweׇN}S$|z/jzT5Y?<LYYok0>S?eW맵?­~c6N7"jDWDk7ʳ,Motnq/`;n?]-gdE6nūAĔIH,(SmRԎ|fŪ-xoIMm1d.W?xE7*Q-Vm?0J;z(^ܕF֞f<x 9%`
+q(8>`aEp)TtĄ8M{#ћ!kA]Ѧ'A!؆2/d[bRƐ:BlCl%vfVFWDpFձ^</q1~d.[c`X30x;kWB,SΕY e7˨D@$ 23ryZHÁ} [^F7q ;Dq=4dEtٛ,eFh2
+	xHDLlBao~@Zb3[(7PFbw0.vEa+z\&Mkxz}s>p:WT>f7Ÿ")F.60ySTs+ t5	ޏÜĆ1Ҫ&k?©kc|m?e<a2L	uZ;j8:e6ne<)ҬgJ2R}:8_#7grvж
+vt6uJ+02j>U#]Y^TN`aRwFAVw^۽8voLikurЅ˴juS;._ߙ WxoFp[OMHA<dTʃZA|D!<SuޅֵqкIAC'tec+ㄘ({*/|l08_V_{>krhcH ץ `]sKH@$ەwl쬄p}mwfhg>\PiU%2Ƹp-uO(.N_FwkSLi_`ᳰr>lQ?BIz"wΉF)ҙd	$`	6PomƓW (y×FI	el(w
+TiD;E٩4Z70+SۗJ9MZA9s-;/>]P~L.P rB	Q3u"}jVXU+YTFǲvʢȢE$RZX(H](B^ H!#`%TȱPa>vc>vxa{?*h5=A<t>IO$jB\'t:z1A`P]lo G$@P2Ia:Ш`Y`mL$Ȍ]ck	#AXtA9\ 9ЏTMH5%/Ir'9o}!y_觟$ˡr <Bb8A.3)g7`r	u#4KYUyyy}`o(]ejO w/я		AknA':~2<ɓw׀1Π!?;Laq!<@4U;w!EmEH[oGD#`n;)Ҩ,1лrɀ:-cBӀ!]+:@p={ͅA#䇁7cݍ "XZg}`]z\YYiSmcªR|L"۴a 3&e7ffw
+GB.L0syjp әM3fĒ9m/o3[IIfc`Ryld],VRI"02yٽ*,ϵ0R jT:m9Sv,=yEv`0=M @ÿP!D*=/r(=T,3
+SBhbպ R܏<<(g1e0b)T*gވQp&$rIg*B`oM\l@ я$:~T7t P3jîXHb
+ B $<_H}oh҇.9Z?N0Pg~nRǵY>)~ ZQ;(6D9~*?usi"CgPnR4/_>EIr(nΊo\N'> Rnfl,fHоal*14*`#px<2x6f2 ̵#4l#hqǥa}աt;F.xƀ.AΛƈA'ĠҭO&c}sd\ t(09QgQb?Z%"EE:{u>h<z=Zs`"c?{yuqpԺ^LW4Ey#iy(Pz>(=<U
+KA[Kcau?#]bZWXk,%>R건<z,=0nUḁTNS:ˠc)%K/KpCς*j,Ry<z,=>h<K@y,uciXZOQ]w%3E  
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-cell-selection-timeline.dia ns-3.19/src/lte/doc/source/figures/lte-cell-selection-timeline.dia
--- ns-3.18.1/src/lte/doc/source/figures/lte-cell-selection-timeline.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-cell-selection-timeline.dia	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,9 @@
+     ][sH~r0}L2e;T9O*,aN۷$K`$$qU.P7>sw}~<24I2ٛѿif?7'Lft緯~jF'wfG:=0~yWwy`<x3'.ʣM(I{?z3zq]U2?c}aIC'lGv⨌޾8/SZD7NtO&*/6]1s=ˡZ^;]wTta6M<WI~\Κw&~!mYVqyr~ǻm;w7n|Uh086NޫwDC9F0u.Y̪lfqQU)_b'+3m,$]$_,2㩟NƗ[>ZsBFF8}3dUV}}|4NO.m)Щ)wl>rOޏgQqV1{I]&rÞ7g..Bkl"5W"../>`i27>_^^$>ǖu'qtbuڟ? GF?Hqpd//c	Mi2]nVڌVۤam*mqr-D;=M|q%wSDS-wfbRϧ-ԕ!QH[;Ħ]P$ -˘g@DH`FD;!LLP0y-L~Dx"]T
+."@E"ҕN
+o2mP{AzIpҸ|'7i'F~p&ς,/B<_>~e	xyȤycj!|0E0	`jpj2
+骤/^΍+z+ßL8O5p>q8֝Z[
+CyMg˳/?}u*x,trl8LaPaU*!C`B2[}_iBltY6rSQQӶ=-^3;D8Ixb;/mLuMEI/w\8dO$P$g_EGGA<۾u˵Rʞع;!O@Fڨ{a-J{aWkǴlr|d=[WczWT/W6T+IpW>fY2
+sPFgI鈠edNp_@G0D#$Of;l-#-+r_ޝχyhMR~&i?gwIexԟ߮r,g?]|8>?$0bԓvLIa	(10+("c9HPe?KYpZdwRB)VGwRT+HocFQF- ՁFReGΖ?ّ#kym >q-e[DTm<p>$([kqzqqݧӳ47ROE4cܦ$ޥ#ZDAp:.!Elܛ,Y,1x tHpl+HL&
+SPeF	~	~%RgFv	@^6ѓ Frؕg2c ECy0'E?}(-G8]U^YFWѥ C`%;QK-yܻt&֘2nW0==pX,]Z]%i]]eT%hԨ;r[(ܢDwlu	 8J2#V#E:8R2̰_~00h )倂	:$b[mZi f	FO mF6R8	l: ȑ) _O'@5&	`=WŤ<^xL61OF4骍&+[@IM8 Y2JOoVQECMc2^f~z pҎ/Nx@L=Ĥ¶BAlϻ3ŰXm+l5hՕ5=GC@If#]'4 ]jk8m FhrM*G5n!$QOdT +smt,G65INNIuiB{XNj_{Q\mVd0uR4 JQ_?9b	rz"&lNtjmt-[gDՐQUsdUtnS5<P5'1iSUWɶ|8ǁRɘz2z@	!,$`ܷޟɪd.0ħ6xP#I)uT%UoPC3Қs\D(MøjX_>YZޓ,Iiyj[08<Kd֡X]-TbԦ@x2v'R=l	K%!eq2)l)9-m 8 q(#:qYvr.V@IM8k $P(.#Th=(JH*ewD!lI54t-y?( (Zvu:CWgͶ: `2JP[4v3ИT	!JF*JFVH*~KPV߹<l !12x~4nHjh\[ZYC>[3	ň&Sܞ6)	MմqhbIPcrCAk5[\Ps֠ꂚ5)PS+d5xjbR-Pkyxj֠f낚5<)PSH@5VP#XZ=Kf[r>, ka@X#Ԑ	PVP&hkNxPrXMi( es:*}1چ0 `TrĐ&VAf`W1)(cQFW(cPZQ(U2g2WVA>`G9R\2entfU5c 2W
+ʔ[LD$]Q@R2K,Z1ҷ/,o(Y
+ 
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-enb-rrc-states.dot ns-3.19/src/lte/doc/source/figures/lte-enb-rrc-states.dot
--- ns-3.18.1/src/lte/doc/source/figures/lte-enb-rrc-states.dot	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-enb-rrc-states.dot	2013-12-20 09:44:50.000000000 -0800
@@ -1,37 +1,40 @@
 digraph LteEnbRrcStates {
 
-size="20,20"
-
 
 NO_CONTEXT [shape="ellipse", label="no context"]
-INITIAL_RANDOM_ACCESS  [shape="box",width=4]
-CONNECTION_SETUP [shape="box",width=4]
-CONNECTION_REJECTED [shape="box",width=4] 
-CONNECTED_NORMALLY [shape="box",width=4] 
-CONNECTION_RECONFIGURATION [shape="box",width=4] 
-HANDOVER_PREPARATION [shape="box",width=4] 
-HANDOVER_JOINING [shape="box",width=4] 
-HANDOVER_PATH_SWITCH [shape="box",width=4] 
-HANDOVER_LEAVING [shape="box",width=4]
+INITIAL_RANDOM_ACCESS [shape="box",width=3]
+CONNECTION_SETUP [shape="box",width=3]
+CONNECTION_REJECTED [shape="box",width=3] 
+CONNECTED_NORMALLY [shape="box",width=3] 
+CONNECTION_RECONFIGURATION [shape="box",width=3] 
+HANDOVER_PREPARATION [shape="box",width=3] 
+HANDOVER_JOINING [shape="box",width=3] 
+HANDOVER_PATH_SWITCH [shape="box",width=3] 
+HANDOVER_LEAVING [shape="box",width=3]
 CONTEXT_DESTROYED [shape="ellipse", label="context destroyed"]
 
-NO_CONTEXT -> INITIAL_RANDOM_ACCESS [label="rx RA preamble",labeldistance=0]
-INITIAL_RANDOM_ACCESS -> CONNECTION_REJECTED [label="rx RRC CONN REQUEST, AdmitRrcConnectionRequest = false"]
-CONNECTION_REJECTED -> CONTEXT_DESTROYED [label="ConnectionRejectedTimeout"]
-INITIAL_RANDOM_ACCESS -> CONTEXT_DESTROYED [label="ConnectionTimeout"]
-INITIAL_RANDOM_ACCESS -> CONNECTION_SETUP [label="rx RRC CONN REQUEST, AdmitRrcConnectionRequest = true"]
-CONNECTION_SETUP -> CONNECTED_NORMALLY [label="rx RRC CONN SETUP COMPLETED"]
-CONNECTED_NORMALLY -> CONNECTION_RECONFIGURATION [label="reconfiguration trigger"]
-CONNECTION_RECONFIGURATION -> CONNECTED_NORMALLY [label="rx RRC CONN RECONF COMPLETED"]
-CONNECTED_NORMALLY -> HANDOVER_PREPARATION [label="handover trigger"]
-HANDOVER_PREPARATION -> CONNECTED_NORMALLY [label="rx X2 HO PREP FAILURE"]
-HANDOVER_PREPARATION -> HANDOVER_LEAVING [label="rx X2 HO REQUEST ACK"]
+// connection establishment
+NO_CONTEXT -> INITIAL_RANDOM_ACCESS [label="rx RA\npreamble"]
+INITIAL_RANDOM_ACCESS -> CONNECTION_REJECTED [label="rx RRC CONN REQ,\nAdmit = false"]
+CONNECTION_REJECTED -> CONTEXT_DESTROYED [label="connection\nrejected\ntimeout"]
+INITIAL_RANDOM_ACCESS -> CONTEXT_DESTROYED [label="connection\ntimeout"]
+INITIAL_RANDOM_ACCESS -> CONNECTION_SETUP [label="rx RRC CONN REQ,\nAdmit = true"]
+CONNECTION_SETUP -> CONNECTED_NORMALLY [label="rx RRC CONN SETUP\nCOMPLETED"]
+CONNECTED_NORMALLY -> CONNECTION_RECONFIGURATION [label="reconfiguration\ntrigger"]
+CONNECTION_RECONFIGURATION -> CONNECTED_NORMALLY [label="rx RRC CONN RECONF\nCOMPLETED"]
+
+// leaving because of handover
+CONNECTED_NORMALLY -> HANDOVER_PREPARATION [label="handover\ntrigger"]
+HANDOVER_PREPARATION -> CONNECTED_NORMALLY [label="rx X2 HO PREP\nFAILURE"]
+HANDOVER_PREPARATION -> HANDOVER_LEAVING [label="rx X2 HO REQ ACK"]
 HANDOVER_LEAVING -> CONTEXT_DESTROYED [label="rx X2 UE CONTEXT RELEASE"]
-HANDOVER_LEAVING -> CONTEXT_DESTROYED [label="HandoverLeavingTimeout"]
-NO_CONTEXT -> HANDOVER_JOINING [label="rx & admit X2 HANDOVER REQUEST"]
-HANDOVER_JOINING -> HANDOVER_PATH_SWITCH [label="RRC CONN RECONF COMPLETED"]
-HANDOVER_JOINING -> CONTEXT_DESTROYED [label="HandoverJoiningTimeout"]
-HANDOVER_PATH_SWITCH -> CONNECTED_NORMALLY [label="rx S1 PATH SWITCH REQUEST ACK"]
+HANDOVER_LEAVING -> CONTEXT_DESTROYED [label="handover\nleaving\ntimeout"]
+
+// joining because of handover
+NO_CONTEXT -> HANDOVER_JOINING [label="rx X2 HANDOVER REQ,\nAdmit = true"]
+HANDOVER_JOINING -> HANDOVER_PATH_SWITCH [label="rx RRC CONN RECONF\nCOMPLETED"]
+HANDOVER_JOINING -> CONTEXT_DESTROYED [label="handover\njoining\ntimeout"]
+HANDOVER_PATH_SWITCH -> CONNECTED_NORMALLY [label="rx S1 PATH SWITCH REQ ACK"]
 
 
-}
\ No newline at end of file
+}
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-enb-rrc-states.pdf ns-3.19/src/lte/doc/source/figures/lte-enb-rrc-states.pdf
--- ns-3.18.1/src/lte/doc/source/figures/lte-enb-rrc-states.pdf	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-enb-rrc-states.pdf	2013-12-20 09:44:50.000000000 -0800
@@ -5,18 +5,20 @@
    /Filter /FlateDecode
 >>
 stream
-xZˮW6oA/dD@Hcz\]B:u&(fR|B
-	2qIfwf߭l\&3~f0A_?XG8`uRoe|dT4qk0琖z/sv)X5iN,!^<U\$yj5їŔֹS/]zWlK	Mv+حOu	+߭c87o'q7֝K1yIYqi~8<1>~j-n}p5m}o{?jV>_8۲Hz6%{?;T+);%❻>A.*a2ޣ.V:km	MI~`5n.b6˙Y~}{dbv["q,!9Eb³G%؄%'~},3}}SPbP/o$ed}7G6(Ka^|uv7J=(AEǦ@k*6<r.[~VgM|FN\n>U{ʇfCϖoIU㡭:..9ɒ\&C-~aI`#܊!9glJR2`=E Ŭ*9&Z	>UY+̾Tej˶њǦZуlՐ鈊4a<XdA0{DCBsVbE.'c<GPãٔpYtbtF_R"{=*!B2; 8;dIbY9*.k3ɞb zK=JW$ik)JPi&z56=wzLEшxq{vf05 5)}V6iᆹ:/1(HTd'jyiqMm=mPd˥DnuZ(2me,k-7+J%%5u"4 s,dߍ?LcDC\\䄀 Ò"%?t 
-A)8AӰD>G#@xʒ4Igmȋ7E>yB ĞV2	nw#C1 Pz<L 5%zb	Vh@֎2̂\@{	hЋmӨaQrx˧1^3&Dt!4Br(7#;{hՀmyV6ʘ(R)w
-$;8{L(sUtUT9*`0Q@ #|+:/&Lzaʥ%sJٗMn;@sh$|KA`DMUWLmne2X,N/#,F|cSę%$8tNOifXiMlpQ3% `ěSRP`J6;LNωSM 'f̝	E k !-1@xSXaxߚ/u;jSmy>B~GrvJwKhqD] aYC4:F60ޤIMrZ\W=U>#^V1%xreߠ|oz=,FsQ^*	k0#[?j[]т@zM<Iq7N;H&-/-S!`6]iKRh9x=s'a+u-[hdڽ<=cm8p ʤpA;VLBV-&[AZ-CVU j/kbPU 2<33uEj-nVU'ŉ`-LC@8̀11Tp5w=uȰ+0e8'pǏkܑk6dLw߰7pLoUod>u.\DO֨,ׂ! rA`E,&fb97ob!*&ӎf'tf9iqJg)Qђ{pV'Si0mc"|3t=QvhZ7R0=t.x6J	6W$bN!$(oDf-x;C*Q!3^S"Qܽ1gc3>pk1	T1]#ueRr̻wPo]c'5QvG*gClNRCt+h %JϞwʥpq@Y^ZlRb+&T>L._
-2U]W
-lFSha
-ȕJvTjoK=Y).vjܖAjʖv=#|}^qh+o6D(G5pndP>Ol44&ďVÒ+-z8e:\)gj2Føqsn|;`3g0ܹcUKσ(o|""DMEef"j;#xeƏ?s%i/ cQDgh_W`\Y\b"j[> (<AGWaL|`Kȗ[&yB/09;kagAS<'̯Mf%$uy6gpB6C\4La)N1>zs%0Ŝ |e LQq2,r*aRq()3=^\Yo`^-t6IMou?=! O,̻US
-~us.Pi^*]7s H,53$>H\א!zՋ]d)T)^*s4lqC-^L/(ڑ4
+xZkob>c@e)D[NBYrR8v}zf'-uGI0}vWWW*wJ}ܨW>ʵU^]^O|gV6^mԋDY?L58Duy}C*%K:Y׬/?Un3}sϯbfzڗoo~{~<Oq_
+6|=ؠ1.w}ksrʬ0H_ߍoUմJ40?>y\~~4__zbP&־}c[֟)e\cNn޴~|,w!;|n<B|4>ԇܛxr2>ٴ*s]|p.U'SUFㆫq:\(:')oui'xNTc6!IR<aNX^^2TunM_]]18IթL"fEx~>0^Nɏ<i P	!=k6FxF@-؜>ht:e2۪l|6sXx@e˂+XQ^U akOF{+.#<k{*o|ǳPOX6֗pSH"AOv^F%BY"<p4d\@a 'BOO')6_d_OΎb&٬kb N4wl q(;&cs@1L*mHS1W:iq,۪2^JKra[+W0`0R,@&9BOIfPS1rTkOxՀuSfpv~O4hz$Oۡ_}qTU& ]x\{I$\)"Р"Ƨe6'a#bfX )gh %XiMm
+
+PϕV<RGR/'o|i03a)d|)l>.4"m)|O7
+h<_ay^"(f?=oSz>ޒL˻ A/H10
+ZR
+T5W$   Crꘃ4X#" ]עkUa1Up	慆)N~ N!(>BQkpx`_>-K6~ƂdiC38]FK:Y-)<u4s\+ӯϞ 1Ύf́-gj艹d)d#!#0bG~OU@%HZ8^;`) ZB}JA$w ax
+-ec]2Թ(o"-S Qwܓ)a*eL#!.%M,6rPiyrf;ANij,M<Gb9AF""ұՠHNPGK="yCHʦ&{=\$}#,,~dYD5<Mc(="vߍ&0nylK7TUZpƢ!m7| 1J#Z<Hf,eH%3lAAab z"pd&dےM Qކ}اX~yYa14q.J`q/*t#kȉݔb)54:/O_>MPm]2¤9&anE"op{QragAz#1H@dtpф <SW@'@̬is.bPvo#lL%L^fT+ 483np hDr	N.Q(A7<X:ňk2qqCEbn5[Ț+lҶQYUv1t![(횿~sJ@ȴ!'Ơpҽ#!G*(I"^']9CSd')P*(KEJ'Qm/1; Q*,1=;}@ڵ;dF	2z99xc{z`s>0	̖?bݺ7E7~#»`bԗ҃s"ZTptEz!
+ִ6R1AG@ esSn[ɟvԦ`ۚZI={E-йពBccȾc<GcHvBlguM}:c[]JQs0+	r ҧ϶C/V慕Z(SB)JjFUNE{vbieZn)_jز)Eba=|ez#EhO+Lqޥ^wnn	.pGtEL%N>h!ݓ)7e)!e'I:˱%)S-VumMMnxs4z& iqM<0FjXYf`@m?*Qc˃	 x#`[x8_I[l`a	6wPԄ?%d^ODk[@PTT
+rgTF##1LpkI&<tlRwzldmPE~eqBw9®l&mv,suS@nXM)(p-	~L_pv'Jh@ˬ=dYr{Wv
 endstream
 endobj
 4 0 obj
-   3089
+   2892
 endobj
 2 0 obj
 <<
@@ -25,82 +27,132 @@
    >>
    /Font <<
       /f-0-0 5 0 R
+      /f-0-1 6 0 R
    >>
 >>
 endobj
-6 0 obj
+7 0 obj
 << /Type /Page
    /Parent 1 0 R
-   /MediaBox [ 0 0 1512 646 ]
+   /MediaBox [ 0 0 870 804 ]
    /Contents 3 0 R
    /Group <<
       /Type /Group
       /S /Transparency
+      /I true
       /CS /DeviceRGB
    >>
    /Resources 2 0 R
 >>
 endobj
-7 0 obj
-<< /Length 8 0 R
+8 0 obj
+<< /Length 9 0 R
    /Filter /FlateDecode
-   /Length1 12944
+   /Length1 12408
 >>
 stream
-xz{|<;{;=9'+sKL@Y#w$( D5,	4*$R1"ADVzH}!I {dϞݝy>BLRE$ϸo\r)HHZ,?cdvB!!YC|=^Bz1{ϖKG{!Κ9ɷXՄJY=nx93k{-TGϜ;X;EE)J9߁HV.2y%SHN˩T+JOR>ڿoW	%	Qʔ
-A1`Rk5d]#ּKXaΐsZZ@Ta{!FR+ꗑC4?/R)kZn_ss^;vtɶnt̲o:*.Ejs4ko<BãsZrԡ1B*JҬtU+=J_Ҫ4\5؎`d~^~y߰oo}_q7ԂO?~˷}E%Z-4Hl#6Ɛvogl)QMX-!c[*.]kجP_ݴ!/*%/ΏuG>_q!>}:qRW'OkOZziJu5-ߊc6ЎrOkLnWِ+,qk45*,=lQK	X4#J-ȷ"Z!VKڎ6o=+7ࣻƭm$qdFBԨWӔ7́&C:@X°/,ȵ&MhH]>C8[s2asBs〈SiVS*Op3~Sq	2s567{]S^>֯@j$ܲҞq,QJd&w\uYxi&;aVdj
-Ut
-g]66&1/	wLn&*mN;_XrŊ#45g&k~׻6KzPqSQX%df+י۵f.Uj&eQ{|EVUvj1x!2b]ِӍd Zx?Q|1e{J$ZJv>I-&铌Wgg1<A7h{O'g*jTA2S8,ϋlv|m)Z9k=?X,DQvh)"&5ڞ\nb^k6NȷR6?֫dY8zLhƀ<sj,^a&e{Ue.+_˭ǁ$;?b#٬\bJ5Dctz;Τ%JZG7\~@D
--J=NE\츷|Krms_a;5D?rOlOk?ԚKM~DG,#DX}7lc0ԩV|qD~zOiK[<uFpY=2$# BS'huqF %Nm^4h[G}̧tLd-143%ưIt2+vCgt![+z]Ū܏MPDI')4B
-#K_߯{i툁mhXN|BI:EE^u56rb
-JBCn{pZE?}%OSKu+RG6'"H<y.@" T@	:rUfLbn%AFvQ衎/JKU_hZ;1	)! (%tjgɉi6`e_J]=>%ii"H)ɑTXwc'ϼ2fߦoQPjX]cH#he\wBCI#D'kHu7	xC	8Bv7ZsF8*gMK&	QD^bϹFӾ7%6*QγTuR~T_>Ą\GWxoXtPcJEt],VMQCEBU4Q4Q;b&;tG5	m&HtfNH@ӎjr	#Wxɰ^@N7!"%kfO+0geB[bV
-PD8H!S2!0I/1f%8n렎>Ap"Ti%<!*uOj'
-iL䛱':>I+uQJJ!At݅܃8Er-@*3ϯ$"S|_R<#jz[|q쮻?5
-Qny#wu	Nyl)9sZ6Hu#$vmǡ#(d߷߀+F8ǩyvw&=f^KLJD,))t%&)!JBO7DYJِJ4]Iq{d?n?ə'hsGWBfꡤd5T4	gz(,phN;$5w>h ,MUE\4w93bz9tܜ?_սGe1-kUF,x#b8=X0rSHRx8b[pCʊ(4^7/w@QQ>sg<?bv\l3]K_#	V52
-2 l^Xa߂(MJlH4@'14sOc+xtvSc=%UsO4qD|#N?pl@?3I:9bg$/y:JmZISQZDIDKzpxS0[i9w=(hÃ?MMMMM14N$;N{''''(Μ2&&&&eeG22/f&v}SIɥ)s&MRXT\=u=AJ~S
-+iΐ?ٷ|Φ榦GV;q60)yWL`O{mK*'3wU2PF	Z]MqGbM>]W-WǎHuf;cG@JjGM{$?}֙f`?vU&gٗ_PEv57m\t/^Kq)nOG3}YxxP+RAg4G6Ɛ@`d[ņ_ƜV^=E6^x8df_t^ǯzfykl7K/d0Ƕ=.=_DpךZ9`+{A=妊(*۝Y==P %*)$cgy;^5e<U%/ؙTTS c,dpNn.$ź	H>@StE UbyOA3Xd} ɧl2PGt8#UCj9KBK%|Z?N6SɧlLwC|v֋rGHbDdja~y΅1)؞bOֳhڋH>ɳ9K{_o`I v2qPQ}m"#V?%?:O\{˕+N]MR
-R,U鎴JԵ1XyCbbX@лڜk5*Ow꨼m"D?Fݥ]x7ݙ'˱i\zҮP
-XjXF51B!zudd%9NHL ILLHNb)aFE :hE8gaED(O	Ң Yj]tiFF}]^27|)_i9uJNN]=_eZ(Ku$rv?,nzm̾WBx0I<MbQ'"\w:Ŝ;%$
-L7zk}.Ǧ>Ip;ӝW;ƊƇ"2I&6R=#zB9y~yccC#b~7N1J%w&ݝw{U.q/֓t#[-6}kƼB'+e vWFS3Ƌo
-/1TݻF
->H=5F:Żչyim۷`H^jڎKNKi>1!LK;sݜt實 xzFpH-w[~ƜIs4e':IeuCd޽պlFu&BԀ]e{՗Ʃ}H#!.R<$<75)Wr_mգ&?FzTl*9CܱEœf!2meb o皿ʿSE#PTLPJ"򝔏g|Hf䌸SO^߳ ۈLs>lF&WL?6x*?c3>jЄ2trjΣj8T5?4˛L⓴R0&FS*q<P];?:fE슸87y}A2z-QPck7ϧT,^zj48qiϞ=裃8zQ}M\w ֣.=@n{b<Qȗvj4
-TO'#&ΑY+	;G(%nWE,JKNI5,,5.e1NBWr vgYĶ#ufydy@7bX1p5y]j?JEҝS	gXN''ؘ/'(*\Ni]e_ hZ)ԙ"3C-bIX:˄LԇBCCwqgfqzcE@znub }4e6xﱚvϟwFl7 nJRĐhc:F\`[>*%^⬃8z6ƽs$a#'^Hzʵ DӍClUtt%v;O#^NvևduhIܨQqcH60S8DsBe뚑t\&z}f:mVqa_[לγpېIwiۺmW3`uhu\Iooӽ1<KjS?q!l?q"xWl6]$,33"'YmV՞da7x>CB+	FfN컳+nȾ3"]Mw.&{7m?NygGX;sO-?ݟ5a=:s-RS_.((?8ݗVbİF9CKG݉=laET!2]YID,3	{_Ď~֟ViU,B#uusP")^
-:%*8U-GJ࿐pB2u6I$wjAq-4Gظ%5x֌xv܋{eU]c߄аO.C^G|!r`s[.Yq~5uMC߽;urӇjNY?@kttdXdx"(ߓ)6bL15*zO$w._1Qftzc}$=1YIznܙޞdk ),WBo/׺f6؊mln2gX)ԉ$vvsk[+i9eZbbjҵҽڳڻڷɨsչ7{7vvzONk&:8ҰlJ֏۰ln"Aw1뭥GUOPƵoI?`g9EM"|Er9&*ؚᬦwyHL9͇pdh)smm}<3/z揤dfl@mCgbkn3=)ptrnOxYfVmG!;A2UrqT>H(!-sݚP@wtGCRWؽUjVe;.dBAdd eRd|j* (z9)ar*|aW5fx\yoTwFUSAS^jqgR>]nxpaavi[/#?PMFf|Y[nuȐwI-*JV$ur,#}Ø~iԬSl;ЕVA0tf8	^)`pq1w4-tȥzO ׳F(=Tt"MXc%$Fv@rsލ9iΐ]Ra^u5=Ww^.TqpJR2Yh<,Q_R!a||Y	W<$Sc	F:"MGfK	1DwT2vIsa$NgUφ?\E\%f(}g݆;7lmھۃM>c7*!=_zӑU3Y8lgi&*JE\Y`V:KWNL1;Ky+GLuphtQ\XU]&{\ao~\pD  
-3Hų?紐d#MDv[*^o`OYHjhS,KWjxӡT5Jjݛ꯵C[MxS|}	_)_P	Ce dR#bw2-~q]k_cQnkRXKb-׵$ƫE&#.2]r9ڥ;/QoQ.MKwƾUFWb,f&7x?3׼L,A),5%.㕼ʬgu<A#Ӂ(*GگRMPLMRBzMVRx%FJ&{APc[uz%ގaΘ"H+m6m&%bo9)yZeFYZD
-)%m>W_tWzYB<^i<nTyэ\Ρ³X-P.zqEg>ù5qAr4z$dHEeK8(-F}S)/Hw#6љo1;(G5+af
-^_?
-wYrq@g'~N?B%K}-y"yn"x1QU"$D#6ǒ8Ta	$$sRHJH:@EIOҋ&}H_D\r#ئ_EH9£rl<,i`J Kޠ'jva?+k	؃uZKt9u -T8rҤWN|Ŗ|߅[!AI~Be%IC(X	RKv
-lK!HnŒc$ٌ9x$uC4y6l_'w!*	|V?u7h$2l=>k }isT'jR)bU]Op'̃J%U٭"a@)ź7{r.?vH){WJ6~Sy݊=*'Gp[OJX-gImcڃkB@U kr[ϰϵta5dN7eodH=K:;'+q7Bި~?Oœ;ux0,m2GXÇ9Cy:.mL1+aé'<[؄s}CAtgڜxzú??lߘ:_'|{*7=a2ZNA*zm+!ٝ8o'Ǖm|	+7l业dz'ARcaVΓ
-D7+$8.`wv֫xd9'
-r=">9|@c{ؾJ/2G=HΰIzlOܳΏXIr=̇WdYW?;G ]hp^\ y7Z,70h}Xf4b$u3nXށ6{<X)SXXHJH>'z!1nBHln_ǲ7Q<	I#!)pMH|~*>7IssΨ	w1c(!{Uٝ_}?\^ᛇoP_CkCW"8/yŹp/<w<ms3
-$?>
-3/| >5~N~?8x_']''<8.J7#E^W"e/	8"E-hN^x7	xTBrTo᠀က4
-xV2x}ewOM=xt]v`lv/<YxIC=lnUݰOf?l2q=|zMuaoȂ^x}EGjG^G_کPk+Ju֮
-Xn>|#^⫃5XPShtXi/<	XarU*؝xA>ʠbBWRK,"7,4a`~`9~.g)SZE`Y=xP.`23L0m]n*SL6yIL6~{L0<&6EíA?&P삟wpn0ό0f	><0Rz^ڠEq,
- !0d;}0
-8 ~> \
-\/=w	9.c~c@<3*3γntHw M@>H~  X	Gk"e7E@H@P@ ^`a_"?2
-#GvGKC eI= X
->@@&Zr݀/ Ҵn
+xzy|EvU~so冐%& e"0
+	D@ DDGGF|QA߉ㄤ :~V]uԩsT% 	Mgr#$Bĩ	y ⒻkLB=yS]M&ɿF`YXW*}ܷ̉هݳN&0#OoVf;7m鄑bYËV%_"%2Ifkx_/5ٗ\IkZ֨W 'RAz1pSw0(h9-Mg/66QyY{D})^i) ^ҜH^Txqymimܴ-pQmg\lAH3BigupH4i5={{>LSJJ2L+ˌ2GU.y|ژ1>Dd핖M|^:9kw^kך/_Ç}o7weNy4h_T3ds(cdƑ
++\+oU.2<0$r6CRyGƕ=W'P`O!ZJΎs*x}Iڃ*l湻u;snvtLR7~)\}q1nyYJá8l@#e5]ؔ|ZL"`J\_JnΧr9zbse(ߪj]9zYaM[$@Hٙ^ghpWqA52=Cl*:=XefJ(IMc1ؠ8]2,2bI-5&',dVZ8<ДCU쎉kw/5p7ۻ{8BכCOQZ')c:|jO|Ckuگ8GcGy6k|co@b0.0ֺn{㍾(k4eux+SZ.N|܈A#͸_coU<S3ˌ'&N}xFZ# .n8b!(z#DryGR{y,*#kG'	pLPi	,ZzUw-jCiW+s_Ny-qRO'i[ߤr8"lZea<'З|<h<b5E,Y),aQ(&L~=q[{="B3Q1k@UyM(Te񼷊h-Mv+g:Ir<1zp6Lr*TW4VJG(4:CY,*tED$S_)43ŉKInKI5}r
+&K95!B?rؔE-3*шӈ6wA$Tn%&]֤N%+GZϋ;Onּc0e^pO0 CEWBf='VSX]]ưٞ=b*zQ!|0<d<GJjTc
+<ưqt<+pEt[`Pã,#4@2<K_W޹pnL.%6gbI5aUC? ˪6ezZC92)T؟ZD:ǫI&܅y<K	kWtJ<pS*#-Ex򂙋zCA9+@k|:t#&x'O"nڨ<P[,M[/!PfETA*SA	Q<TJ޴7Jb.+GPV+IZH"R'fPd0=!5tѓ\{]JZh])~|~9Li])N|CoZW>ԡN4#= ֗jƼ1ls(#VS֞;Vؾ>95>gP"ͥIKyDMte,2/ͧѴ'Nu\/k1vFlxOZx#Ɠ1Ao.ک=1=ܼ}S©SʶS] WȃYIdZE4[mr$o[ܶvأp^HQi	n8!
+rZy8턡z.Wsu@(q[v13#jԐf^j1-fB-SHNA vtދq}6S-q{=NDb;t	-=ޑeGdz~n&Z'_}!!finG&yuԣq72Y{=qIqJj PJ[Fdٹ^>'
+zswbʉ;<tǝǆGA/C7#V8,T&j!_NK֜leړBFX>}?uPke :_9tGv6c ,1)j|Ñăj6%p$ũS\{,'{
+ln+<8a&KM\Ep<SZzpgo[՟K}@үޣQ?NNKvr/28d8);M#a~#/HP*9]PPhFx}-atX+"
+F&ᙆ~G􌇽~ߑZ (*=q|E;Ќm @ݫp wB̆6;0Zۈ]/L,OM"@d96sPJ'mm>cX݊h< d#=Jz|I%$G&F)n_"i|C
+R('h{%Ƴ["axpBYY	fddSABAbARA SAzIʤPeNצ_HO㣎
+
+C%%I%PyrֵҤꝓkkI͵vzYO4:bבK=piM,tʜ{3nh]x_}_g-&:fף=DIPʄ5y4M)ih-vh6[9mtva5#:t.HZ^|s[gaƲ_kwnն{?aPE;ay?~eۧ7XmI]S{?%~%bk՞u1TP+֘dY¶(ՆwAQFZbXf屛Ǣ(%oN/ujd(06]v]". d1JM+=RCA/)UسzYS`{JUSX{vB޺5wUwNUf:/E :q))N'%BP"7q@]a&&x TLX+42xHUBZ_Cs >@Q!tGa
+!3"2!BPUʵ:%cb|r(z=Iq!Q[$(F<A#j#KBSUs6mbs*p\\6*hw̍*~u⎚.UwH""VC\ڷ;X~T[Hωqx-\qrܕ[s}
+<ߖK,UǨ:e</Cme7B'ӝX~jye*6W۽`!e/oT3ZEdsz.|M*:W(3@Mȱ)Uғt{R9)o̂h'X֜YirHdD$G.zܱqtXt)o6('HF(/(	xǎr ; aa/e^Pvئf-|.ļcySΉ/~Y,nYv=·旊8$73^9xwrP؂ECCnw1>u#_5߼u֒0~?r:]N7uDP]q'1q6N`>ːmp+
+c*AS/:~Q)0-?C3Fx|Ǎm~6cL'l$(ObHbǶ,IoP=5}7;jw=]6bHc/_r=J,\_GHۑ/B};zvGt0p<Y;`ʗV^/LPe@_aL+(]:8˵KJ[kOBl7]dS6pMPNR/g֬`a;l{ٍo%ڠN6ha'h+/,Y7r+zKs׿0wt?:yӦ׶K^8Aߗ>GL3Rc>t:Y⍾n_q֤l',4KB0
+.K=Gv#44 Zn'+{C6 h{qY7aJg}+L
+
+|>(l	Hj5ɾKĸ$>VYض3}UvA&
+3F`/uj*s+U!`i°4(;跡νr`A6hQ
+4N>X0\7F)?jx`ԪLj+;QYmgG:9·nnC7_C䁊h+ZU-iH?¸u!na{xG7;;!YkDf 35KbPFr
+QpŘb(p/@,A<O33eܙQQHFmƅh˳M&^'\9eƭtwlǿx/KcOܰ/%	cFz:W/۸+)2^H<ty1G<Vښ!"9Fˡ{CT«n4t#!qU۶p}~NekV|ʶ iDWkck>јiT]k\~t(d^QFpƺc=3VDEO5:;:;]]]=!_KsY}ގξ<w'w1L0)LTM-_bsp𘾱dn^ )[[[8''x
+|ŴM7fgx
+}Jܱܹҵҽ^vwlqlqt>7õAFl赋}؜dmz.Z?b,ݲǲ?gfX"a =hV[a**ngÚ
+0YP6cilFXH2h}4av
+lS'[/AК<39ΎQ!xS5Z)^%/x5P~㢚l^dkr[g
+|_8x:o8ᥡ̸d?yc'.^k=ßÀf'vpb'r:i0ֽgethch_v!#͔gl@CZJ}jlBZќ?4$rTl+Z޵믘^]\K!Jkn][^ɻƌxK{,{ٵ:S*&$ؽ뫯6u
+%2uXC_MzOaxj_V@Fk7mKfmZ!eӊeӯ[Qjup#X@j><dUr(4!t;W<XFCZ.z~Џ CኩV`/ЊI13]bR%R(s"e9YNWJRT(5cqXl(uiMhOrmxۛyaXunna.ŅmӮ-uh͊)E akjI_cni`MrkaE/m*nawylxUZvЅA*0h")]޼YЫ	{U(]|Q\JZ\O)O%xG|~o+?fcM23)oXSk/Xo9>l&n!b:5tb)XivkO;m41g*(Cs:]SP{2]e9T;0rot1,v7LcZo]FabQ&ʍV-T3Wc!ȃZdRBjHK;;A.A/nrf-1J6ntn=&8.̧BP-Ԋ"1̣lBuV-p9Vm/tTMݷuزmH~&u8*WJjoIq⒟n|/Lm4PYXZ]KR$Q5=֬vF1ʶQ2
+Np6OOkwOiё-[v9[xakH8xND6MHz?}dBiPЮNmmߐZz-KڟGbzFZ۾].>]WH_~vǸAzb[qH6Їϋ)@#o!IUu $Q$ C_|!t&=4D[6A1X9?K$;x6Բ=d9%o#t%er߬$G`'t$|4HǒXG<Uᄏ{MGI>|E Ɖm;̏"dB|p"[H)HÛ8J6E+=ql8HO`0bu_O =A"Y7,C鱭)1zvgY)K(J@MV,mo&e%v<oIUXPH7J1]}Rv6[^N߱zme7a+^SVrT3{A]&d䒙xUJv=Ԑ*G_n_bC'r\)Q8j8t!oKQTgzwBryP)s-շqbBT|~٣!kR8nc3:#
+BS>A~=E1#Il>w@Zvݫ߂C6r=2Wy+\b'd6[޽̆&2 h!fx\&mMV2pQ;5dp9@*a$ُ)UYyav{[kE7{3#G$w#PkQ_o5ۖ rXlP	Ϩp.^XAswo㨾]XbEw}X܂zo\X8{ w;#qL"wxB!$H@9cCYvjG\}:뿄FY$y=+7.Ih?Rl{%\?VRK8_@S3[·|8'/ٛ5p_<{3*Si2K	_H8k%pT''Ka8>}'I8>G	J@xHx_Dx/K8';(m	oIxS^W%>hH_~EKxy$+r9R7l}&)JxHxAB%.ܰkgU;wTgQgag$l[$a[!6"Wjk`O9F	O9aÓ1bC<+^x%quj\PU5nqc#G%<R5I<
+<RΫNUCV)VKXn>x\+XPYTXKx`O< aJ(P&lq%K`qTX$any̕p_3i{av3H%wNJ3o/X4	EJ"ar?(l;0Im&J0aFƈ[a[[aln^qs41##	7zh	7z	(	#Gx#0$!50X_F)a \;#À.1l@'o}z{E u^u@DqA5-de:D2г.zzݳ[TѭfETCT:HOTH@:KHd? Ex`f͇]Q(	Qd%$DH~	>/KSn	.gpIpHpH0K5M 8>hARݼ "Ӣn/m/ <
 endstream
 endobj
-8 0 obj
-   9456
-endobj
 9 0 obj
-<< /Length 10 0 R
+   8822
+endobj
+10 0 obj
+<< /Length 11 0 R
    /Filter /FlateDecode
 >>
 stream
-x]M0@:n-ْw!C?h`[rFq-4Hƙo/yT#.9ljfm!>\Fi؄p֢Lm<.ʟ)xC=}K>J{!NE=~;5̛Q0vTO>ŧezA̚Ň!v%*0ױ/n-e8w1^U.3hLb5d3Y%dj^WH2Y9' Ot dr 25~kp5t?nLBSp\4~A5_B2~[#Ϗ,7jz1G?g3tmkVkf?']JkɬŏI$}E/5~)ĽƯ!L.˲o&۷4uYÃ
+x]Sˎ0>n+	m.sC6 sOkr jׯϧeM=v3KsHfLys߾;\zZ{S۞S\2rLy^.뙥}kZvTǣiR/u&SSy<k?ǖL[֘nRK9~UZ{e8CzIJm]OطMhcSmhݱPaEX.okq <c8ӧOKogF_2ҏPS)By-:>> {b4ߖ-y3SpuїĮ`r%	y/@MMG쀅gE0 0 'Ǘ##4ww̨m0C39븗V>/.n놮$v
 endstream
 endobj
-10 0 obj
-   462
-endobj
 11 0 obj
+   459
+endobj
+12 0 obj
+<< /Type /FontDescriptor
+   /FontName /QWMFPY+DejaVuSans
+   /FontFamily (DejaVu Sans)
+   /Flags 32
+   /FontBBox [ -1020 -415 1680 1166 ]
+   /ItalicAngle 0
+   /Ascent 928
+   /Descent -235
+   /CapHeight 1166
+   /StemV 80
+   /StemH 80
+   /FontFile2 8 0 R
+>>
+endobj
+5 0 obj
+<< /Type /Font
+   /Subtype /TrueType
+   /BaseFont /QWMFPY+DejaVuSans
+   /FirstChar 32
+   /LastChar 121
+   /FontDescriptor 12 0 R
+   /Encoding /WinAnsiEncoding
+   /Widths [ 317 0 0 0 0 0 0 0 0 0 0 0 317 0 0 0 0 636 636 0 0 0 0 0 0 0 0 0 0 837 0 0 0 684 0 698 770 631 575 774 751 294 294 655 557 862 748 787 603 787 694 634 610 731 684 988 685 610 0 0 0 0 0 500 0 612 634 549 634 615 352 634 633 277 277 0 277 974 633 611 634 0 411 520 392 633 591 0 591 591 ]
+    /ToUnicode 10 0 R
+>>
+endobj
+13 0 obj
+<< /Length 14 0 R
+   /Filter /FlateDecode
+   /Length1 2600
+>>
+stream
+xTktT~$0	HB`Bx; 	ڦd"&$4` i48"P6!ֶJt{]]kz=o?X\҈(jd,[B&!ŁXi߂E+Mn~J=O,Al%_p;K/]["xEe%sw͂c]QnYnR^1|SR)A#HvV5nVe;}y8/<3IuU[9hu|Yepd_MH|Τ{gTBۈBBcc29[}(%s׫	/9FedWLa>[WRCƤ$3IiE3M9Ӳ2FŧaIִ4#/Ji7Z[8y+'7mFiviYB2_&ک5
+
+HA?@Hj:=]dtNZjGAZe]Z1[cdL7CFFQlTjحW7hg2q5thv=T%2ZWDrBuvevi$jꤧai)u5Z}L= NN-X,gk^;骳{^UXZ,nkDtQ;]l:oa	j49c2 ^G|,mUv}Q5%:OG*YRQZn1qZ-Im2uXkTMT,Z(*O(Az-5i5@.qEzMn QբI1Cg?Y9C֔Wtu(4Ԝ'*dx'!Sg>1+։Ź"/mXsu!gJq(4άK[g.W*jN\/"ctv~^=;rGۺ篟	ϴW|%TLv?v<`*X&mz|uv_zq=k|7>s zI	Jrƥ(2>|u1bx!Pq>fOn1?0sxc3<=IuV$z'Ib0f[}[o2ިu7x12~xW?ca1;ѺƣZ-m|H58G*uxŃ8xb<ϣc_KɅ0c{vgh ~Lx&;w$~nnb[flVFЎ-%͛j lra<M=X_6acQGg<''Nʬu:7aF:ƃZ'c~ԩV3u*j ^Uy0c%cc,1QFEK(g1X2:s|<(|Qǘ;a|;Eo2SQ^Ϙ-g {a3z6|1}31U4SySLSjvLb r0r0a*|1Rw1>;Nw!{]e0Ύ1ѣjtFj#lj,FE6eaXM#Æjhb Ǡ.5ȃ.ˣL]T8xlƸ#Rg)~׏d;H0蝃D^~Nd$SB"nFK\́Y8?{l3b:66FhFE1nX0Di	H51_A0 WŰ
+endstream
+endobj
+14 0 obj
+   1860
+endobj
+15 0 obj
+<< /Length 16 0 R
+   /Filter /FlateDecode
+>>
+stream
+x]j0~
+Cqslrfhd8d7t0-$}?Yڿ2Ov>c\a)j.{Uo;öd{Q-^\ @C4:<ZÚgguso&AW;S|m	RaFK2Є=KtzN!1\MQz|iʮn)sY)BSp
+endstream
+endobj
+16 0 obj
+   223
+endobj
+17 0 obj
 << /Type /FontDescriptor
-   /FontName /AOYUWE+DejaVuSans
+   /FontName /OIEQEX+DejaVuSans
    /FontFamily (DejaVu Sans)
    /Flags 4
    /FontBBox [ -1020 -415 1680 1166 ]
@@ -110,69 +162,75 @@
    /CapHeight 1166
    /StemV 80
    /StemH 80
-   /FontFile2 7 0 R
+   /FontFile2 13 0 R
 >>
 endobj
-12 0 obj
+18 0 obj
 << /Type /Font
    /Subtype /CIDFontType2
-   /BaseFont /AOYUWE+DejaVuSans
+   /BaseFont /OIEQEX+DejaVuSans
    /CIDSystemInfo
    << /Registry (Adobe)
       /Ordering (Identity)
       /Supplement 0
    >>
-   /FontDescriptor 11 0 R
-   /W [0 [ 600 633 611 317 549 392 615 591 294 748 610 684 557 500 694 770 787 862 698 631 634 411 634 612 974 634 277 751 684 294 774 779 634 277 685 636 787 731 603 317 634 633 520 837 352 591 610 591 277 575 629 634 633 655 988 636 ]]
+   /FontDescriptor 17 0 R
+   /W [0 [ 600 629 ]]
 >>
 endobj
-5 0 obj
+6 0 obj
 << /Type /Font
    /Subtype /Type0
-   /BaseFont /AOYUWE+DejaVuSans
+   /BaseFont /OIEQEX+DejaVuSans
    /Encoding /Identity-H
-   /DescendantFonts [ 12 0 R]
-   /ToUnicode 9 0 R
+   /DescendantFonts [ 18 0 R]
+   /ToUnicode 15 0 R
 >>
 endobj
 1 0 obj
 << /Type /Pages
-   /Kids [ 6 0 R ]
+   /Kids [ 7 0 R ]
    /Count 1
 >>
 endobj
-13 0 obj
-<< /Creator (cairo 1.10.2 (http://cairographics.org))
-   /Producer (cairo 1.10.2 (http://cairographics.org))
+19 0 obj
+<< /Creator (cairo 1.12.14 (http://cairographics.org))
+   /Producer (cairo 1.12.14 (http://cairographics.org))
 >>
 endobj
-14 0 obj
+20 0 obj
 << /Type /Catalog
    /Pages 1 0 R
 >>
 endobj
 xref
-0 15
+0 21
 0000000000 65535 f 
-0000014531 00000 n 
-0000003204 00000 n 
+0000016590 00000 n 
+0000003007 00000 n 
 0000000015 00000 n 
-0000003181 00000 n 
-0000014372 00000 n 
-0000003313 00000 n 
-0000003514 00000 n 
-0000013065 00000 n 
-0000013088 00000 n 
-0000013628 00000 n 
-0000013651 00000 n 
-0000013921 00000 n 
-0000014596 00000 n 
-0000014724 00000 n 
+0000002984 00000 n 
+0000013121 00000 n 
+0000016430 00000 n 
+0000003135 00000 n 
+0000003349 00000 n 
+0000012266 00000 n 
+0000012289 00000 n 
+0000012827 00000 n 
+0000012850 00000 n 
+0000013619 00000 n 
+0000015575 00000 n 
+0000015599 00000 n 
+0000015901 00000 n 
+0000015924 00000 n 
+0000016195 00000 n 
+0000016655 00000 n 
+0000016785 00000 n 
 trailer
-<< /Size 15
-   /Root 14 0 R
-   /Info 13 0 R
+<< /Size 21
+   /Root 20 0 R
+   /Info 19 0 R
 >>
 startxref
-14777
+16838
 %%EOF
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-enb-rrc-states.png ns-3.19/src/lte/doc/source/figures/lte-enb-rrc-states.png
--- ns-3.18.1/src/lte/doc/source/figures/lte-enb-rrc-states.png	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-enb-rrc-states.png	2013-12-20 09:44:50.000000000 -0800
@@ -1,325 +1,318 @@
 PNG
 
-   IHDR       ED)   bKGD       IDATxw\TW3bC#
-j[Ɔq5Ac,^&jL61K$F&nT&v@zefa_3gNyr/pB
-        ʛ        j&       
-A       P!H@       *   Zjiiiɏ?ViiiyyyYYYJRVgffꚤ~/uttqwwupppqquvv[>   Lj   UQFFǏ?~ѣ؄t]M777{{{;;;777''''''[[[WWW]5www)ʂJKOOP*JRJ՜=<<}||ׯW~}__߆֯_ۻ
-   R   P۩{ݽ{ݻJ¢nݺ4_~Æ֭ҲrBMIIIIIINN'%M4iڴI&Ε'    		h  Z'666***222:::222&&FRYYYgl4hWn߅VMHH}..%jM˖-[jԺu&MXX(   @"  P=~ʕ+˕+W_nmmԦMm6oϯ$KKݹs'222227ovpphݺuǎ;uԱc-Z(
-   j   5Fvӧ/]tʕXg}SN:thӦM@@aF_ׯ_z˗7R.%{ݥK||   B  SN:ud??^J>dTSXXs˗/_p!::^۷/h   lH@  ToZի8x[֭厮ZzɹsΜ9s?^z#F5jTϞ=k.%   @!  P-iڟy|appQ(wh5ʣG;weСF8pܡ    	h  j&>>><<|<ҥˈ#F٨Q#RSS9r3g888L>=  @   *4  @qu=zEӦM		;Z'++k߾}_vꫯN8   Q$  :Fs%KDFF?~̙]v;(?믿ްaǂMfoo/wP   @B  j;v߿?mڴ4nX?VZW_Y[[ϟ?ܹr   T$  k׮͙3~3g֭+wD(J
-[t_~9x`#      @Qyyy?:t|rUoݺճgaÆ><%%E      j;v;w֮];fA]|yYYYo߾    rb4  @rҥW}B(
-BQשS_~cǎݺu۾}{   T}$  _~8|Æek׮E˛6m;   @6l  P%<|088xȐ!7oՋt(W֊8+W׿uɞ={Vp   @U
-h   iiӦ5o|Æ}6Ξ>}[oO۵kЮ]>,??
-
-V\١C'''={~tUb$C/K۶mٳo!4~xBJ)I&"̛7oڴi!!!JB   &V@  ƍlѢEE%\ǌo>]UfϞ-P駟իǭ2ĉEʵZm]D%j'OޱcGZn}EԠ]vKB]vM0QFׯ_wss3 'J0}V@   @
-h   _~}ֹ{ndddzzzhh"<<\*_bO?yM6={vŊ|W'NprrZrGrss/^8b*.bӦM;vhР={/^sEEE-YD!mpBFSXXpB[B999-X`   V@  LV޽{ذa0_~ԩ"..QR	!ڶm{ƍofԩ&6mzWڵk]vׯ_{WTbW#яVWΝ;_|ݻw޽{Yf͛7}T2k֬uEDDhڗ_~wO볢6hի۷A  4  ̤_մiJNJ
-!ZoB>777))K$))>;;Ho999E^*+ӑG_h://OzݦM鱳+WtT~Z~qU   ؂  @fmxEH9#18Լ8W-8   P  Yu{GKڇ~/<a}OߕQRVPWҺuk!ĕ+W͜93--?~u_lhϊڸqJ   "H@  k׮;!8q{DDDrrrrr-[ϟ{!׬YV嗑#G+<<<N-5kbذa_srrj۷7nصkWΝ;>8y~~~w޿q}VvСr     Ν;OӨQpdZݷoiճgǏ)8pӧk2dرV1wUVVMLLlݺurr~;d!Ď;&Meϊ׺u#G._B    V@  綾^j׮̙3e&ɓ˖-kӦ}6m>Sg!ѣG?3cϞ=9RZrѣ=<<wꫯN:5f___kkk{{֭[ϟ?ڵkB_=99[nRY1a{.11QZ=mϊx̷~   V@  T	oر3>ScAٹsgHHÇ,w,       BѢEݻw1`喖rGiӦ3g~gd  Pk  
-9yqゃw-w8(#Z=o޼M6X_;   @6$  ?siii{ܹ߿?~޽Gr   ȉ/!  Z/^ػwnݺM>=11Q`jիd      U-[Μ9o=3+Vɑ;(hӪU7;wW      @UPPnݺ?zΜ9f;(Z?x`ܹA   U	h  NT_/PTӧO1cF@@AA7VR*3f?Y~}      Cnn͛׮]խ[iӦ7Ij~믿>zh:u^yٳg{yy   P  f._iӦ]v	!F5jԨ~WWXXx޽;99yȐ!ӧO0`ܡ   U	h  j)++k߾}?y򤕕GջwoCQ233/]tC%''wmԨQ&LSܡ    	h  MRJe``/طo=z8::]/:uԩSW\իרQN   (   5ZtٳgϜ9s!DΝ{ѱcN:y{{`T*˗/_pܹsAAA{իW=\\\   H@  @YYYR"ҥKW^U*M6ԩSNQf111._|嘘V[N޽{9gϞr   T{$  j+W/W\mݺuPPPVZh*w(''111QQQ7o޼wVm֬BCϟߺukTTTΝK5    4  @풗yƍׯ߸q#11Q]nv5o߿AuԱ;INNSϝ;wbccZkPPPPPP۶m۴i\yLLLxx-[7eʔ#FX[[2   #  P%%%9rdɒ%~!_~Soe&g5MJJJrr'O&$$j!..3s³gφ:tsܸqӦMk۶mEN   H@  jO<y7m6y%K4h@*OJJqbbǏJooo777{{{;;;777''''''[[[],ݍƠT*
-
-**///===777'''##CVT*J%%u<==ԩSOO֭[^=B'55u߾}֭vZpppHHɓ   0	h  Z*///\tiWZէORխANJJJNNViiiyyyYYYJRVgffZJzhccnkkbkk(-?Kի;vPTC		4hee    T;$  jSN͙3YLjȑ#ǎSɓ_}f͚   PE  ]=z4k֬.$$dҥrGT-mݺuӦMw	8qq   U	h  "//oɒ%yFVZջwo#	^sNB1|)Sӧ\   j    ɓ'̙xb(w999}]XXӧ7o>aS6nX      s2=zhǎ6lxA޽CBBƌ w\   <H@  X=77njժ^zQmhΜ9~qƅt]   F  f:qܹssC^wpBVLG   JB  scٲeח;"-[$''+44tĈU    5	h  CύիWS?
-Ϟ=v!OOqM6m۶r   T   5ĉ'̙ɓEFw!!!'O;.     >|'Ofύ%**j֭6mR*Æ		4hq   4  @5V.]g5mt=z;"Z>rHDDıcԩ3yW^y_   E  :~ܹs=7^u+++#ӊD߹s'88844tĉNNNr   	h  GύO?^zrGrvհ;w2$44O>
-B   ұ;    Z^pa@@Ν;AF
-ްaCbbbxxxZZZ~Zlp   P
-  6;6w܄ܨm=zcǎ6<xw!!!cƌqpp;.   $  ̞=[scu֕;"@\xq֭۷o7n\HHH   (	h  *MV/]>_z?/wD_FFݻ#"".\/O:N:r   E  HLL裏snݺe˖𤤤^z1Z   ×  TE<:t{u֭y}-[.[ǎsww<yrݺug̘q5C   `4  @Usuk֬yFZZ޽{ׯ_L4K   P{  B=:wܴ/b|^eu͛7gff6,$$d,  @-  @pC2dРAoߞ2e
-gY֭-[ѣ{
-!Fոqz?;4   .  nύ5ktAPݻwӦM&Lpvv;.   |$  ?̛7/==7{n]z5,,lΝC	ӧB;.   X  СCFR(&_7lؐ֯_?ik{Z5S= @-  ʖpVZ%%%]reʕ>BSΝwiZ-0Pٍ;ɓ<5k޽{-wtԩaN:%wD%03=x`B1l0¾}*1cHO/_<cƌf͚9_-s FKzH,X`"+??!C[NRp¶m:99999i>HOOUh߾B6@/b޽
-"88ĵp[8|{TIrlmm7n<u.nn"~     /,,aXs۶mҫO%3.	+,,<|hhkhh|ٳ0Vofvm!ıcǤ0!Ǔ'Ogaa`ī[LVU??~MattњRk
-!`O֭+qh^K'hUC7Lj]8 V   PI޽;dKK˹s禤Tp!D۶mkv]ܵk׊Ҙ΃%1*===<<_T(˖-ӥ2F	!>󴴴o/Qt2zKѲe˼G!nݪеkoÇ{׮]ehyW]R&z{޽-[lR㓜,ռysRvQRR?ޮ];!DͳZmzzţG}𡅅CFFF5ZJ|7nYbo&Q[]{=z8M  í  |;wzjٳg񱴴|饗Fh'N4щibbֶH(!DNt"43POOO''#FܻwunڣGWWWf͚-X ==]zĉvuuҥ˩ST*NRn+VhڔI&yzz;cN,--_|={UFO2hZKKK!~ƻw>s̙YYYF|=W3R_?8pb&߽{Waeeezf1]=VRx*7T6m!.\(XBT*k*J)[rJdԩBŋW[hbԩ̷
-]KЪġKK͜CVaJ  -	h  w5kLsCr2MzK?zh]*%%E4ڵK#m'ڨQFE͝;WaÆ!ٳoԨQiH˺jfĉESkBnZZXں#GW;|pǎKtp7'HfZ'O;v{hhJ)TV+m<2`lLNNnРsHҞF%o.B>~De"h)7!jҤINNފtBN:IO_xs@t>J{7kL/M6B\pWkiZ8t֭[yu-JJJ2Q  В H@    IDAT 8{nPzK=zTѲegy⧟~2݉8>>^ xnnnsrr<==]]]ϰ^FΝ;T*Ϟ=+mQoƍ4سgORRRvvŋ{9!ěojǌsܿK܍?pv]~=##c֬YRƭH.cNfƆ6o^ѪUe˖*3?yyyӧOz5kњ<xaj^jqF5|M!/`0IW̫ռyff-mݥ&$$֌mժٳ3gH'5[qRC*q;2R&Mk.]af^zm۶ @
-  sK.QE_{5!DDDDxxw)}]t)o!!!!6olNxGѕ<xPP\:uBjKѼy"K)z%i\\,Cl͛7|Mooo[[۱c9r$??G)זG ;;wߥoT1cFy`Ҿajfj,5|j۷oW(VVV%~dq	"yеJMMtppxzۆHkuyyy7/'ON4I_9_FV%]|(8ÆgΜ:tvSq [  @9o5kcEHoMgee5vڙޖHr/RGʽV޾}[P>n紴4]IjjήzX[[|gڵӯfccc8hnnT-Q(iNlE픛{ȑcZYYկ_7߼}v9_-͏?!Ď;Zݻʞ={ɭfL0H\-Ҽ/$;w.}vKKKBm۶,."f^=[YF1fފ4!!A!=5"ɓ'W@'''gddϰġT1z--[.qM4ѕ(
-!Daa~B͜Au
-
-
-֬YӸqc!Č39 j3n   {nQ[xwwAInn;lmmmllc_vMڵk%lNnW޾RАcb Mf8 ..nŊAAAB62q?=*%ԩ[\Cg	h32<W͙~RrBpjaaa
-bÆt[\ _=[Hyi3go>!DΝ-0ab֭BKװBq2*qhi6lUd<J)so Z[  @9ѵkק>\1-]dJq,_\ѩS'Ii7^{{6gw:!\bC)RPPbIiKtl0o6w\;;cǞ<ylk%&RZ8;;9֯_/ltsg[pṪ{IZZPP`"HɈ#=zh4WBԫW m(
-ڵkK참hͿzԩSBiwfMժT*}Tb
-J*RSsʕҾ=c~)[\ki[8gb}K.B"ܥ5]v5PCS)e Pq   xZ~mӦMfύ"߱c"000''G}I^^^@@bZVTXXX<|PÇ-,,\\\;{6t6o,[ƍݻuEZyAkF]aA C999{y
-EÆ|ͻwRZ3f{֭			RRꫯhṪ{Sqر"{)=wjmڴѝᒏ?XP(z3wu奺z&AS>>>}3T*}ǏWTYYY'O!yEQHM65z}.1jZ4JZR5mڴ9RF{]vyyy˗8hǎ׮]T*/^(-<7Fsz @K  i_=7?'$$HyoV*پ})nNN<)puuB0a7n4ȑ#W2gQ'?uH@؊;0ѣG˖-kڴEn6l`<x@ܹ`޼yōnlLNNnР~QF	l%)unߺs	!lllt[rwV{Oq奺zv͐߯<::aÆ56lmҲeˤ
-|21k>lUZ͛u&MT$ۮVvjX[n9",,,0`  q   (J5w\nݺ۹[z)'խ[7]Fycǎ5V+-9rdppbϞ=oi6J>}uk]M#N:5f___kkk{{֭[ϟ?ڵk)))&MpssT*;)mIi,.JTXXxPGGGWWϛ)T7xE666zAA]V%w6lǫe4gzFѣG{xxH{qR::u*JzBAl)ХzmF޾AZvR4%-->
-
-rppppp|'O---dz
-k>lUВ{/00PŘm>x@;;;{{ŋgggjyڴicooomm;z~x;[  Ч  Qn~~CBB<QˋCmݺ<ԩS_~uP>}z_    ([n͙3ܹsf裏H$Q6Ν;^z>\ slܸ144ѣ};  JF  ,*w]~}ǎW^ݶm[#	h<Fs̙}ٍ;v̙>q  B  (Y-s({	zjVL2}t   Pc  0%&&fΜ9?Y-Z*wD@Mu͛7gffwʔ)#G;.      T*ռyڶmP("##W\I[^lǏkoo?iҤF[wܑ;4   <-V@  !P(֬Y3tPj={l޼ƍ&Lpvv;.   	h  3{^`իW#""mۖ=t>}     ?=7nܸpBπW\3` ikw   
-h   !xw,,,s?~}7޻wK.SL4i%  H@ .::zΜ9Tŋ[nݱcaæL   U[p  KTΛ7]v֑T}ݻw߰aCllW_}߯_VZ}O<;:   
-h  PKI{nXZZ^=7?عs-[?~ܫWÇ      jٳg_xz7h4gΜطoرcg̘Ѿ}{  ؂  "=7lmm=7>5ŋ/lٲ֭[IIIrG  P{  oUs񢣣#""曌}N2eȑVVVr  P  5_TTԜ9ss?uCyyy;W^	
-
-;.  ڂ-8  @Vsrr$ٱP:tϞ=<x76mt!,,LT  @
-h  PM4>*R.accW_ իW#""oߞ5t>}(
-  X  KܹsҥwFEE+44W_"@'88xʕ?0`[o)ΩS*!B  4  vJ6m"33Ss͛(;;c~<={}7o޽{,M~͚5  ؂  TWkg,--ٳGVg&L3 wհ;vXXX>|ʔ)Ex>SV:tUh    Zm׮]ZZZaaTP(lmmCCC?cgggyPMeff:th֭OnѢMWXXXnd!u:uN8 w   U[p  ';;{Bj4;;; eʔ)'Of͚-Z7O>IMM?y$88ￗ7Z    0a_qFs̙ǏKP(/rܹ2F  Pő  _|o见YYYO `3݃ӦM[vu  P  N;`g;;g㏕jΝ:i4-[?==  X  :dggKO---mmmsrrZm:wܡC:*UV111&*֫Wرc<LE  P- u ?855UPhZ&M4nܸQF5rrr;@ռy^zEm=>JYh
-FR999͙3q2F;#F # 0noذ܁ Bj4YZZLILL5jTxx܁vN۷oӦM͕7IIgV+KId(W/_; @5/F b5k'8/!믿@dɒÇ zK       4       B       T       
-A       P!H@       *	h       @        $       4       B       T       
-A       P!H@ j8BP(K,X`S%Q^^^DXI:ws JyLt2dݺu*ʰόmɩM6|AzzzqSشi~'JlAAAxx֭kcck/fL\re~~~7:ucN 嫸\+پ}{Bw^{U(CXy+1+]TR5BdggW={򲶶vuu}g̙se'  ̦ UVlR(ʁN*u떉OͼwoݶmRxx9vvEDDD* m)!??~MattњцC8::>cǎutt,1=ٸ;O4W8`aa/S2eʔ)Sړ'O֘V\9ʿ~]V1` Ð/XnMfx+1Е.`XRt޹sg)@'tQ(  + T~~y̬\iШK6l41/...$$DlyLrssݻe˖-[>|pРA)))RÇ?|m۶GU**ڵ{ó9jԨݻÇ=ڌebCrJ֯_޽谰]0<}Fӿk׮$&&޽Gmͩ@v\B+9qD'N<~XG<yaĉCmx+1_Ju6avv!C-ZDDD<z(//ORݼysڵ;w.È  e\ jzBCWčGEE	!:uԥK!DddHD!m>1QTmڴB,\P*Yb"  @TT*-[B\HOB|R_|!8sLiɆ	!7n`3V=Sbt
-hCq9uT!ŋk.ZH1u[\ӊPaoe84\r[FFX xz R_|񅕕?v
-./ҊiӦkAsrr*[ e;&~ѣRɁ~aHR}z>-شiSFzi~ӓݵkbѢE>>>&:1iM6B%''?M 2*W_BlٲEcݲeQ$R)]PoӦ߿_pBRu  N8 +ZEiFYKnnn999YYYf'NX O}LrS!BOOO>{=!ٳg/^(xMhTf86_,Yf/Ҷm{0N
-*ІTkx_?ZmV+THV̙،JJTòKJ{Hi(ŖX ZV@ W q!Ú&ވa7|#		Ο?_yfsz3aBK.	@$??_aee%=Bӯ;w/iӄ*q&gf5Ã_$3g:TUBv%%%wbNjtAPq?OyV/'ON4I_3_JJTòKJ{Hih Z  }ѢE?+h髫b̙
-vprrz7(m e;&BǙRњ/wm߾}{޽{f@Rdqu_U3IҽԫW#GdddDEEYq׮]z`WTPY!!!8p͔)S3_᭤v0T۴Bt]I  <% Zmƌ}]9~˗zR(
-EZׯ_/ǁZmnn;Gi(19E@!ٳgkJRCSNRT7k9ĉ2,--[j5k֬~A![: *Y.5jTNNΝ;wܙ3rHi*VRe*mҦ%^O  r j+VB̙3;7иAN0ayyyf͒Vr->H1p@dԨQBEeeexb]Cƍsppppp7n9C3gǏB|III&2ZiI+QK,O7mڴi&t_?hVRe*m#FB|''  26 63|p;eq/+Jy𡅅J*qi X~cV߿޲eK!OrrJBo**++ɓ۷B4o\+LÕcdj>+hذ߿ֵkW̩f:;]6&&&77WT^x^`ԩ`hC}DHMM6h4fη
-Lw2ߦi٨Q#!D.]=Vݻ'ea1  `\J@߹sƦw%_&0`a!6nܨPf'%\]]Uu`Đ߯<::aÆ56lmz
-濪c~qpppܜjexb߾}g:	*.,好Wβe˅xD    IDAT:|Iq*bet
-[I\\QY-!-C7nzݺu̷V! xzl 7o^)}@[UO.V_=ztFFƇ~4xL4h0hРkFEEuAՀ7n|AAAҮ7u{ҥ͛7100^t钮L_͛צM{{{kkk__ѣG㏣G.U xkx_?NjmmmiiYJ^+	!ty^I|60(((22?СM&Mf̘5s2  LSh_ 1W^fMLL܁ ^~e!Dxx܁vN۷/ܼy3((rǂdɒÇK_	 @X     h4]v;  PE Vsss厢S(ŽT3r4 @.&kk  vH@@T*333uJeFFFFF~T!333//^zr  .gg{>(5  	h 6tib)w__YXX߉Kƍwww遳8 d!X8    iJjsrr.)Bpssscoo_N-[V(U7n(ש    Z4 <|i#tirҪdilXou딝]]]K2     H@h222Ҋ$333/egg %7iD?,J/     @"JKK+-/,EzZjn@{\      l$Tj:%%Ŝ<lw͑6mZ\*;&      dhRSSf%{+ZXXH[vhҤV$     *	h I))##CPPYݢE<ne	      s`V73\d׋z)nyf      5	h6+=)     @B9RRRRSSSRRFwXNOOoX$w\~r      	hLNNNS$,=V*&&V+{xxS     @!F$.,Y.e.((XZZJ9e]r900K%;;;yg      *D~~.㄄$SF#՗,K|}}۴i2KXJv@PXXhii_j5MB@'++krGUG~~܁,AAArG ZVj&770(=NJJJMMwww){{{שS1Q矿QJs{ｷa777]attG}m6kkkcCU֨Q;EmO?-_֭[k۶ܱ,};
- @5FZ6O<ILLLJJ̺-,,K?UNooo1 ݒ%KvqM{5mΝ;r vZ}_K,a)4  5[pv͕2j'OH<y"RǧaÆ۷̺̲1~Ǟ={)x	h 
-śo٪U۷  <$Q?y$...)))!!A?Ŭ[lcc]^=oo6m_*[ //~W<zH  СC/_<bĈ;<xurG  *
-	hT3?NLLMHH{I|||ZZTW#y\g'@OQ*rExjzmTkmzPuzxT\ţJZų^U[Hբ(3Ǽf2'd}g=Of'oHvfYuG3 ˗+++w@B0  			9sLbbbߣG  Q`KYY={VXXXPPj~Y*y{{h;""BGӦMq2 @}9uTXXXf͸/a  iӦG:ujo>|p  @4@P<~8//Ç?<zbmmK/  @BCCϞ=k8  Рج]6$$$11qb'  z	h0B#YB||||||zТEY~?  sM8Qm۶ݰa# @3m4??ѣGZ
-   4$a ŋ5efg}}}}||;>  pB׮]_z%G=zU   :ujС={LKKspp;   rٹ\5ń{{ ???}2bg  9sM6|ˡVVVYYY ٳ'^}A   &ASEEEvv6a )44488888O>^f ̙3ݻw{!(((+++>>ޔ  j߾?hРÇ;;;   
-Ѝ]IIɭ[nݺs֭?377ҴiӠ>}?ڊ  LAT;wneڶm{E /00ٳʱcp  t#P(rssU999EEEf͚m6$$G-[d]\\Ď  byYntyϞ=&  AfN8߷oߌA  X4|	aUYYyƍlv֭[oߖR488n		a%  pmڴiΜ9e?ޯ_<  ǏgWWW   0pS[[ۤIvM6RT  `d?s>}L  ={zyya  rʕ+/^pŋ<x HZlپ}QFEGGGGGhB  `Ν;7i$2....\4  ;__#GsȐ!?؉   @o¼xɓǏ_333kjj:wܩS(<  œ'O7o~Ν;LJJO?d`  ܾ}W^wﶲ;   @T^|9##ѣ.\H$111ݺum޼ ڿѣ?M~ӧO1)   Fr.]7n;   KP={v޽=ݻw^z,v:  h>K.:uJgɧO6o_~ڵs @#uԩ̛7o֬Ybg   =ӧ_uJJJqqqnf͚5l0<  Lŋ4%5ks!L@ s˖-cǎ|Ď   QYRPP0eʔݻwϛ7ÇN2e
-f jkk7	hBk?5  Q>쳑#G޸qC,   @0#			g>|8	  b~zdd|}}igffo>77700  QS*o/_ܴiS   n4Ǐ}=!!   ˗/{{{S>B:dT   VVVRwT   fڵkC<y_~ics ._ܩS'Vׯ  @㧟~:qĪU   aZ|ÆѣW_}%vz&H$Х&V]]'IR77ҥK/^[7R$ άKVZXO??   :`ZdÌ?q׮]XDsllΝ;+V[[:p͛:;;k.))_@ViiirrrTTsddܹs?Ηs̙Z[̰~P/"''v͞=o:Kogg8~s\/M6iҤ~"c̈́l]R=o,]޽{V~zLL^k#$$o5R*(CbeNMQSvDNǄ;X`G0b1Vz0vJiG2,x&GIZ3sJ$͛7/?z(7zB=zpY8@{^vNS_?hРu֕	w, 1 ŋܾ}kvo۶Mbs|[Y+++ߟVV֜R֭[3tv_|||]u|I(7q:WZX۷R&Jk^͇irM4]Lٷo_uu믿J$b}W\d_mm1RiE,NF_$-ۨ;F΀M[F5x)[STTCgIQg>%jp0Խ{w			NNN4i8 @^NU@ XeCڮYcƌ!DEEUL.wؑ~\\^^^ҥKYu>,ʎ9Miݺuyy97'!|](00ŋ4imFfffVVV>ydݯ
-M3Э[7޷HSNϰެcSn^zޔLEZJ%eyӤ_GRѣG=v.5Y`?a;aQ8q*##C'@SE>Jj`9fDr]vӧOmmmǎ+6???!!ҹsgo@Ivܭ[Bh @#g6N
-SNM)SxyyY[['&&B"""TJeDD!dԨQZE<yBӫXJJ
-!$00MYkʕmd22VZ9p@BS.Jthҥ4u	eggGy˄*͛7롸8B׹e!C899yzz{[ddǏwuum޼ʕ+)..=zg}ɹk{~L1SSSrʎ;:99988+?CWWW/^8**!**jҥr\c&LpuuOԏw+ڶlr̙ϟ?W	}%=/	Kꯨ3gNHHk>}<^./M[9zkw1	hu}3fȑ#[wС4%&;69v4Rjy3`Pw51<Yvio.`Gbvx!;#;IXj5a ֨_iN&,=6>Jj`yqBܹsم˗/'8qB8Ǐ	![n}{JK"##	!4 hV\VXX}=>\u%W\\ܢEBȮ]2sƴ^7xzzUW^DҬգGcqg3;;&((Rk~b\4%\uڕ6.ڶmK?ӧO7AԩS	!6lضm!dʔ)|}}aÆoyСe87՞]W_;cJ.Ok4;pUUkvĈT|JQ/--e	}	z^	:w&4?n8"ܒuY\*nQN:wzl2=p=\!79v4Rj"-rctw51vӚx]?}vx?\ܒ+
-oUcn,M{***OtFUJs4`9^9|QRVl49J`` ZJR8eM@3o>¹e @+L@ӧK,*{~9tY>L	U(!!!VVV&BS;Ȅyzz}9_I&\XX(p3m4BqtA"-
-,]TKZl}v+WQQXZZZYY?p)LvIՃԷ}榱D5s
-4JS?+BU<xPUUu7xہ/^Lqww߲e˓'O<yyfWWWv:\~'N$tI#_7B|}}ӊϿ˄+&&Py&a6D}pe˖TWW_xqذa5kw ЬdĈ{UUݻw)׹c]YYթS[]T}:KrLr`G(/mdC1Y`f21Nk_w/`@ki/ݻwj<oC_*9>Jj}x9gϞM9y	!sKÑ#GAdztV·. h	hq|mڴۉ=k,OJJ"l۶-55g	l;~qGMb666ZG@\Nd.\f-ؚma'N<Xh{to2f?e2OŲ{-?_p@///k{~LEEEBRRR;[6mb_}+Ç	!NNN
-tܙrMܽ{Һuk&]:@_煛s%{גO>P(h~	odZ/Ο?/HL͛7<{LdacxixIk6j,kc3]5.u]/`|SwZRL݆^{{|_@1`!\;^:B/^ۄqM0rʴᮢAASJ֭!  0-ۧ`%%%[Gtt?gqvv>t萾D)ѣGDC^k֬!1.E]lQPPBDBјS(DBQڛ7oY&002i$fꬍcɓD"ySN%%%[dbU}Mc=1@y	Bޞ1'>4^T|	T*ᾢle~nFkCرc^^^%ZEKc+_~ettzr[[[1nݺuu{޼y9ٟsixgYC1Y`f21Nk]>1:_/m]C
-70w;;;I`9ʈu4wP4,}44k׮NNNݺuOu4-o@I]}fH&Mh @#	h|'mڴ+w~/,,suu~4;;;[[]bD'Ѭec1ٟkkkbہCMw	Wҽ{wܸ1;FSI>y7f\ p6!&+&y&MJ.8t?ݻwEZ{Lx+:WW:}tJ4~՚_g.))iȐ!udÆ<(×yvvxgY?X`:fZN}c;׍:":rRW~8<4Ơ?`QaԜ#e!6m    IDAT.}:KK	  &M}߇BIMM/!,]ҹsg(aBHPPuV4k_%VVV,,,W	ss;v]]x+E]XBE?8BwԥKʍrUR؏k*Fd<sc{Mٸq#4;0T[l!O%D.ЩS'BȥK24t6Aܞnͧ6mJgp^]~Q4*4~eoIMM-..-..ֹKpӷ`]tQ}iry6m>2|`;F΂;n,dct;`]314NKXϽ?sKD&,=9X(iXu2jRGGGGG/^hGV}{JKڵkGz hmݺ]˫h=B"""
-Eee%&{D._"~zb۷'mذ޽{r";;;%%EOGu4kjՊҡC#GgddtЁҺuk.	;CsZ̰,88EC՘ac5k{]vWZbbb֮]]UU%Ο?|XXM3id2WWW++<yyyVVV0e#P|?,0_nٲeիWWUU]pR#R#ԧO>}oeH{
-`<n޼ƍsss+**rrrRRRℛ@W:o~n7{ةI&޸q=(hG-++dk׮%۫jB~	/
-Bo޽YYY|0=;Kβ;0uZKv:;_/Q4iN7ovrr*,,XnAds>Jja&ȩ΀zUhX=zKMMe˫&  4r6nݺ=P; <~kML;v{o ر#q',}!\k1úKg'ܸqǇ[`rҥp׮]x*Q/YYYM@B}D"___$Æޮ@#Fhvn%|z\޻woչWUUBгgj,dhM_l=/;07oV/K~iT>j(]*_xǨ;wBn߾]4hPLL73;pc,ec;L;F&<^k.>t#8^fii:ֆO<Yc9dxݜy;JjSU_/_ Iϔq®k׮%J_&$$$PV0{7tP-[)"""))I}ZѬٳsk׎hRDDĜ9s's̙4C8e@3̞=;""B*X`ADDCDDĂ***6ziӦEFF:88HRÇk|ofhժUث={p_ڳg!cǎ%믿ԤIw}\}ܭ/xÇÇoҤ	IOFi}4/222ɩgϞꟐչWUU-^]!22rɒ%?iK!ǎ1bEL~Q|M+&MaQ*|򉧧رcɓÇtpp		?EK#mqqѣ4i]&	tp~.ӝ^;;;pMvZs`3Y`3Y`wf215ZK:v/`ii+^T*T"x5y8J֥:;'߫4iޖJ:88k׮d T$W^_Lݴio-v^|'|r(@cU WrrѣGϟ?__.]tW^z41aMMM;   B<X`"{fėf3e˖իWr  \zή2sΝ;9b;C",Ydǎbg   BЦSQQ~ 0ѵlrƌIIIX{"##?yc  
-iǇ.   6K.)nݺ  @Lv޽vo{Y`AZZZ  g޼ywuA    &t  )	Nxeee)ʈzygϞ4iիWr  ˂4;wd    &Mʕ+111b   .''ϛ7o}1  駟ر#??_    &M';;;,,L   䄆rDcǎ}>xH[  P<xpXXزe  aD
-ݻw[n-v   nݺbmmmuvum  5}7  QWWWjJ    u蘑ѳgϸu[   #GtqqټyA   5L@ȣG!b  Т{֭[N:bĈo  cgg7u5k(
-   4^6"[[[WWW   hq=\n;YdѢE6m5k>|h @4q'Ob  h0m"M6;  v999vvvAAA&q\RRRҮ]]vl  Шxzz&$$[N    &MI   ݺuUV֦h6mΝ;3fРA999:  4IIIǎ?  HaDJz  ̔	P+TplBHXXرc<yb  ЀEGGoܸQ    DM  `rrrL|Zj?<y]vׯb gĉ~mUUA   #L0b   ?lӦoݺ{}!!![l7  4oVMMw}ZRRRr]#  46L&v
-   -***?~,v߻woܸq}QXXضmp  ԑѣ׭[W^^6p^zI}>   &	h  0[yyy'''=zԩs}ع  R7idرGH$D\   &MյLP  @mllZh!v>o޼,\pϞ=>>>>vع  b(ӧOO8iӦӧO\.W(`  40m"-ZP*b  Дcmm-v-\\\&Nx۷?~o߾=zHKK;  ӧOk˖-2LT*J  4F6___BH~~A   4BT*}7/]tVZM8w̙o;  ŋk}a  `6WWWL@ )mٲ`N
-		ݻڵkKJJt;a  1cƌCr_4  i`t޽+v
-   M7;5N4W\	[h1lذr<|p֭ћ6m2qZ  D"ٺukppT*$J$  Ц~MS   h˳;5DGG>GݢE>3ч4iҐ!Ch 3Θ  0L@NXXXVV)   BxefZ*777x饗ƌsJBP(!JnժաC  &w^L@  Ц][[+v  *((;5899=|_-FرcJ-&KKK<qĊ
-q3 i799ښ   &	hҥKEEիW  _yyy}̘1M?~\SS^@T2}5r )͞={à4  i`t.^(v  ~ӦMbΉ;v~!D.߻wSNVb  $ɶmllln  0L@TLL̥KN  _>>>b0}i|'JMMMMM͌3#  sqqIOOg   a#vW^Yd)   YfJFFҥK*++ǌ=vX```vM ҵk0aSl[~ڵk<(v$W		; Iwʔ)m۶;   !5m[)((xoq]rEcT*Jvvv϶aaa	 222.uС^"stttqqرA2TWW\T   	&զMǏc  DQQ	6xblH\]]]\\L ꨬSL{= (7nDEE,Ë/V\)v
-  Kg@Z^;&v
-  WTT)v
-#
-رcXX/f emmg   :db   T      	Цַo_[[ۣG  L@     1a{   B3L@     `Z			x
-  DTb      "6l]  ]QQ!      `$mbbbjjA  4      &1nܸs  "ggg{{{      @Ä	hqDDDl߾]   Шxzz      ,L@歷ںuB;  4^2E      `aZ4G.,,<qA  *//wtt;      4XoBBҥK  Wyy)      f̘q?C   HUTT`Zl޼sv풒~WU䨨(gggggȹs>\*D"HfΜu%%<ՠQZcZKogg8~sqk4ңG!HPKM6iҤJ6NZn]YYNo$w}]ﾓH$;vԺisNCs$I@w*((H"dff={VΝ;噙$88Xk  0 1cƈ  wy'11ںu	6d
-
-
-bbbͲgee.Jn.7΋Fu]~O1$h5t++-bpkK"i,ZÁhL<yСu$44o<ܗXo;OMMo"vZBȀyOYnMضm
-tqד|4jdg:OV&L XBdTJIIIQ-_b!E4WݛlJKK	!/^; E"1cƮ]<x v  h***h<xK|}}ׯ_+˳RRRtB2dH^^^TTÇe2YYYّ#GRQQvڴihJrk]QBuFm5ל9sJe333+++<y{W^y+kN			E:׳?lذA^'ܭ[lwԨQGWFҺi#]XPP0fBȲet6Gk|_O$dիW/Bɓ'UKN:E?~{ֺ!-:   qGt0%R'  I&`CZ%%%c2+W$mV&/dUVWt$߿_c%/ikPcZΎ#U>~@ w@3XzMBHΝ!ׯ_[˰BYYYdd$!$99]B,P/6|BiWɓ';;;Ukw4=)V\:OVB0\.wttw7[LPxxxhT׹_&' PZd?\n݋/  Nmm)]vBϟW&==2o<gggSP|rӧ=Հ7Q[>5%% fWw	IIID&h"'''<|0}w	![nef$nݪz4}OΓwhhg@o:t(,,&\vٳg/aIw {76m$v  ht
-)WB'PƍxK={TP:y/R8 eI=E0Fm5;)6wf͚jjȑ;v쨩
-)((`d
-NYYYm6GGǑ#G&$$xzz>eAԽ{wBȟJv%,,ݻOf:u꯿
-ѣG}!}ǝ^=).S8lْo3'  3L@O?]`g  6=3eE5i҄"[yyzz.^8//O8}I.1v5$&&8qbNNNwݽ{[o#4{YDjϟ?>|qJKKwWް}L&cet޼y3+;CuuQ;..=jwМ:S>4i  &BRR  6=777B꛻ruu%p_bh?~EE{ 7[?޼ys͚5g(JBW[uv!C-htM0ޓH$ώ0 bJ%zcƌ۷oߋ/JKKmmmǎuCٳ~:ӷ'4dճgO++3gTWW;wںGݻ؜:uJP/Zj^:6  L@;;9sX   Ц~ѣe"""Y.dpM4)""b޽'NA_RM~ØZY[[?!s7V?}hRgiΜ93hРMիW/^HgomӦ0/^dљ3g!mڴa6lXeeΝ;wYYY9tPe*--fСW\1qgXOɪI&QQQ7n,++k߾={zqqqСCQQю;={֡Cwww  &w??ŋ  <FI7o;հa!///W_^^^`U.kk+WB>%oZ;_SwB22238K H\=?sB%pߨٽ,~lkXO֓pgIqO`߅<   1 ;wݿ_   X{֬Y&֭[}||L!W]]ݾ}{B߆ݻ'+**SRRt0LYYYV!:t8rHYYYyyyFFF![.//WUȽSnrʒ45UHv쪪*Lvyaaa]AFayf͚޽hHfiV    IDAT]M6%Zʀm5N'O:th+	o%(tJ2*//O@^^kYY@m:OKMM%xyy/u2T*`RI^rm۶E	zR*}sќ9t駟To>z(}K7<xA  , Rl߾o-v  h,0-;l,???~~~YYYq}-w9eI`˷5޽{Bgҥ]r40RJJ
-!d2'lܸQ6N/_V_e>K 	G
-
-
-֩uzpU4ԠqbF&_`cc#T_x.%ݛl0 PxH$۶m;   υlү_?///''.eڶm{ڵsk1""bΜ9׮]coЪUiӦ$/o~Øլ˗/O6-22A*>ÇKlmm;`{{{dddH4r!T_&V=>:"__W_}uڵ7oԩǏJǏh>}>tu=Y(OV111;:;;SƱuc?  4l_GkfTYYyq  @קOE{C?! hLRPP^Jڶm;y)SW* h<^xvEv  ;ΪUΝ;o>          	&N˖-M6}t    J~bG S  L@ٳg+K         p6G...-ZtinnY    ,wp LRN  .0mƌ駟         @6SVVVW޷o?,v          C`|N>}	ϟ?;         0mϟ4k,          faƍ7n_         L@={?w߭;         0m-[V^^`          mٲe˖-~Y          ha2$&&oKLLă8         R`b^b֬Yb         	h}5k>|X,          aڒtmNqqY          t; gG8q}  cǎ ,҃^ONNND `
-#  X0L@[;;o6666--mԨQb  UTTԷo_S :th+Yzի^    Г0#v,Yo  ,X>}bbb-Z$v #v h8͛aÆ{ۋ  3-g}֭[aÆs@   0YYYݽ{W  pܻwoҥ.3  0mmVZZ:uT    {{-ZܹsG  p|g&L;  @g@[f͚ݻgϞoq    e˖ ٳgwuq++w   &GIII999bg   +L@@}afƌ;  @c	h駟viܸq555bg   L@@}ٵk|r    &-uZZڃ>C    Ipp0&***>㤤-[   0m͛7oܸQ,    ~ mʕ;   	膡}6l<ysԗ:uӧb   KhhD"; X/bΜ9bg   B0`3f				쒍7755U`    \]][ly ;wn-}   t7ߴl2!!꣏>4iRmm   @+**իb  Kuʕ-[|RT,   0pH۷~B/r    LS 1cF޽_u   aAa-;;]"J7o,n*    Jׯ_; X/_~A   `8{lttt^^\.W-;wd"   U]]#v 05553g?~|TTY   `8x`߾}e2!Bߋ
-   @/x
- kݺu-;   htCT*ϝ;W[[kmm}UPlذ    ! '''^^^bg   Mn/^;bD1T*ϟ?-   Ћv) ,\>;   h	7---[J/m۶M`    bccWB!v 5k-Zdoo/v   M||͛7KGGG[[[vauuƍ   ݻx͛b ļb   0 L6-//wߕH$666gϞbG   ٳb ?|WD,   &,OOիW<yuֶJrb   Эk׮Ν; ;B1sX    /_8p4(336m؉!߿||)  -_\ `nz   tFFw})V0;w9rO,`]t  PG{:u۷[n-v 0S/^?9m4  `l4~ڵkzz(Q<y%v
-h:w,v  h|}};	h tR++>L    ݸ`   ,B^?.v
- 0S_l,v       `vzu)R)v 0G}Y6m&L v       `vWRRr% 9wΝ;WXamm-v       `vcbb/v 0/̘1^իY   
-&   4b  gϞ;   4    Aeeeݾ}[  `.>{/$$D,   @    `|||~' XrL&   z4    #D2rȴ4 Y(,,\h?O   0    f7߼t doo)S   	h    0S;vlӦ͞={ "v͛,Y"J   4    #GرC  ӧǿb   a    ׯ DsСӧOWb   C4	ԁ6oٹ]vIIIz䨨(gggggȹs>\6D"HfΜuaŸW6ndaycccw)P7U(!64hݺueee   𸸸׋{%WP_V_їpҥ!C?ܹs^V{mݺK=~Gzp7oV_~QFNٽp2ƥoMMG}4nܸzP+[/^kee%hvM6iҤo]oߦnoPPD"T-9{jwQ-̔H$Z7M
-BqR??s''v͞=>r~V+OŀwΝ;/4 4Rɓ':i
-
-
-bbbtCVV?VVzrTz-rÊ	AMudaZm۶MgM-X~;P`C|7ʎD111׿N zݻYNÖ-[0u(Cyif-c\їTne~}Ŗ{[_Zk8p _~;\ɩ{p}K߽WU__G^Ujv.}vvyjju	&BVXZpBB +VB~ml́fXK2'as5H˅7=[]ka.e;r֭-ZH$Z` h5	h\ޱcGBsssryyyyVVVJJJ.]b[&DEE>|X&9r$::Һuk|Too`)V&T1,LpAA1cح[!ZF@rssnJ***n44X
-ww[aZFtigE`xx8Jfffee'Ov+@Y%BHΝX0fDr]vӧOmmmǎo`3]Jz[TT1T;6o޼7nrݺucܪ겜믿ZҧOBȻKy7UˇBIKKٴ֗(χS0|Mm8>I.πw͛͛7ڲe} hTtJJ
-;6<~Xʕ+	!m۶de2{	j*B;p@B5VMP%c4Y`O<!Q(#:@YYYdd$!$99&%44Xw}Gu+**Lemm0Lbb"!$""BTŔJeDD!dԨQ~~-#]vhggGq2Ҁk3ǏBXpqBܹsم˗/'8qB½WKt*1***~hp\[4$y&!sqqqׯQ8-(( xxx(
-arս{b
-C*}UFy/]Ԁu|+&\zYfRtݔ j,нz"pуk.K샢ˑ=fggUVV/7Xݛ@SKh^+ OOOe2RU`߾}DFK	h 	hW^H$W\1vt>|8a[h~-^<\կ4W22^ЯeK;.۶mK?ӧO_Fpm&|s;\AT3JR½WKt*1ޥoNNT*ݾ}έ4i|NJٰaöm!SLwq4eVwaΟ?Of_&?!ᔛ]T~<̻vj@ԺGM \r[ƩL@{zz?lҤ	!DjTSiرAcŸmw/
-@i܌7nTxz@x|벗;,&,&ȑΎ>>>RÄPBQ[[bee/,|%#PFtigE]TI-[LLLܾ}\.,|էs[Ñ#Gzpg&<yڛ3gooݺ_]tQ,\W5H_d.XZZZYY){} 4}	!_}0-"L>aH׬Y|eh}|hXK}N|<5vr7rzҹ;99;vf И5	hBHMMrwqQ\m.VP@D P,PQchbQcXb,#
-vA$AHo;yfRr?339;;;{;BdcbbB)?qdӌᣔe<&&4spKU 2Slyy̐60(@;(@C=&^z3gg͛7taBȊ+TG36Ꞗ_Nطqڵ#FHGqqqOi|ɐjpHϟ?'L6~[RRǟ2J-[S߫WxHfj)t<x !dʔ)|!D-t}TT_ÇS5x`B)
-%;2o"uw3C{*Xݯ*,o!3]e_rSiѢE||<M@cX
-U͛7D5#E޽1sEfUJϪ.	&!BCCهghüTZ?366fAAXlggtR?srrg%f:g2m8*vU<	߽{w6m!sQff-y<!YDee%!ɬf``ЫW/酧H$ի><zǖ1ĩoeeUTV}-lژ_AwwwB_={]T|QIIH$Ңo`G@`jjZQQѬY3--\V8Km5)7~|HOTĐfd6Ŏ+rymm͛?zj,h///R3kA?Qȝ8լ*]`BY5eJJJ;#
-雋	Іy@:uңG~	Do߾`Yf͚YZZ1pS3em=-aTUI EQ			KKKkfȈȕPӦM5\&C`` &lkvZNʩtuuUTuU[TeLLQ"&&IS.]BvEڵdz	!ݺuciX5_?{69r:"1fS9y򤖖̨ Hk,hB7
-
-K~Y3fҳjjۼy3!]nlV(߆y@
-
-
-!k֬a>BA^}HMÇB>as&#FKЩ]RN
-̀!DQuõzh>2?~0fgXrj?~lѢŲe4VP<}UjI!Dy_UU^8i
-h"BH֭	!K,L_t)!֖"21lZ,C{*@.\^CG$}x"GM6w@X
-ХZZZz(111  @1PPP@^|իKߛ_OL׸f]`BY5ef2'۷Mx6K lPZZիÇ633{s/	
-
-MKKSwAeǎ#8::VVV[YYBN:r=ldۨ{Z~:${{ILL,))Ϗvpp`X2-*pO8ݻw?~Ԕ0UWA/jꞖW˩U%uyf2o}6|~jjT>ohh(SdXf/ҷ{]xQ2ŋW\aiX5Eehm۶GyNf'ٌz	xM4}6s hK4777YBB|KK˄?.
-eՌ!.(ۮYef^J122`?ʦ0,UȰeOU P NEE_~
-?ٳ袀Ƭ?ؗ_36jHY&Nط_JϗmS~%weNP2sUf~lf%hvꛒ']d&GUl BȐ!Cgяd*u3EEϣm	!BbFӬ
-h2&M$LG$ʐ؏Ύ+B߭ڵkI jDh80h 333@```8o޼-    IDAT(fWvrr&qժU2V,Y"3]fvAvͪ.3SϏ"TFii)#6cXȰ!zzzCݳgy[4@4GG{ZK)d;v,!S2E,w֍2n8Qx&܆RDN?s;wnݺql2H[QWWWOOqݺu215(S2SJḷ~lf%ӫ~;yd''
-h}!.텄
-		!\ilKFdקO60KM*kOrrrV\訯Oe#X控+e8 i< 4r<J_ddd9sF١xUJJ
-Y}}}WXu `ۻ{7n:(ׯ_ӦMw @uzA=u """RQQ?\ \ PX,~7|CQM   аx;vq EQ.Aٳ2o޼  @C͢{ZZZs  ҥˬYhkks S>|u f͚5k,S  &Mի]v:   pc͚5w: Te˖͙3Ύ,   Pp4Tj̙  @`ff~K:C\*ٹsg^^ޚ5k   W@   @4~}\g ͽyfÆ+V066:   T?   ^x^ںu+Y @sk֬177/   5h    Zjuuq 4?
-B   @@    >l~~~yyy\g -\_~G:      ~;rP(8qX,: ŋ7n]t   6   ~DgϞ{ l/Zhԩ...\g  $:     @Uo>00pĉ]t>|8q @ׯ_GDDp   j
-    7ѣGǏz'q INNի.]ڪU+   @B    :뮮\ 6n(,Yu   q4    4[nׯW =|׮]ׯ:   8   Ǐݻwbb"q @˗L<    PP   EOO={: ͛7Ϟ=cu   (@   @C#
-c4\'.\u   %!<{,# 4u   Bcƌ9p'|u"  Gyə3g   _K~g\EPh۶mNZ`#u_֭   |={Lrݭ[
-BC4^+Vꫯlll   _h++++++ (<xGGG	   x/K.ƍ{ApppvHmٲE,\    PphN丸?8   P+::Z[[s;v\'htRSS7o޼z&Mp   j
-P?߹sgԨQFZxqYY׉   >iժ͛77nܸr޽{'&&rqYjٳ   h7CBB߻w  @},XۤIggr
-Q?9}v---   @mC꙱c>~X 899p   ꙶmۆ<y۷߳gOEEס 2,X0dȐp   84?7oޜ?	̙q   |}}ꫥKUVVr
-a:}Ç'    7PzI lڴٳ!!!\'  zFWWw/_7oѣGQ^K.5k=Y   (@C={BOOh   @cffu/^:t;vܽ{waa!׹ _5kp	   4o<ݻ#G   SRRLvZkkUVeeeq	߿ß={nݺԔ\   EQ\g f͚2eʮ]B!q  ooݻoܸ  uHqqqPPжm^z5f̘sۗP CIIX,E9::<{LWWh   \ĤI"""~eddp   +==9s<~ѣo߾rppo#u4bRQQQYYiӦb   gPÇbk׮QQQ\  zL[[{ܸq>>>k֬iժCCC+**NPG=~X֯_oggw9   PUV׮]ݻ?u   :vO?edd=zdі-￹PO|ѣO>]   s(@CCe˖M4iӦM\  @GGiii˖-qㆫkV\8=x𠬬Lf"!!!~~~   n!`9sfʔ)Ç?|0{ Bϟ2o߾:::\GǏ]]{yyq
-   +3f̵kn޼9t>p   w=JLLOoݺ5dSSS??feeqeddTBaݻ3  @c44dQQQYYY^:   4@vvvW~w8`jjwߙknxh!4|`
-B;;N:q
-   844p666n266ݻG   qSRR"""F}ʕ̝;\gABY[[+22e˖ܦ   Ρ Ixxx=wm   @ݿ[&&&xbٲe)))Ǐ766\rexxxQQ1٣G'jii͘1#44P   =Q			9s'   E۶mK.GEE?ٳgcǎ544ڵN<U@-|~w^---  @ : @-x[l1554iRnnܹsN   ۂ"##oܸq={hkk{xxѱiӦۥQh`***|u"U  QuZuСYf-ZhӦM\g w7nuƫΝ;ׯ_q}{=zXHSRRXXXWe+ %$$s  (\ӵ?36mN   H$2dȐ!C!<UE"Q׮]b?~^^Ν;:thڴiwׯ7mڴK.\ږnaau
-  PhҤIcǎ   @!M40`_߿޽~ݽ{;wD*٭[qm޼Y :   Q(@C#s۷:h   klmmmmm'MD)..믿zm^~mmm]\\t"}t~~~ff&}ϽgϞ>}z6lhѢ   F	hh<==/]CA   2===OOOOOOgϞGGG_paڵņNNN:urpppssڵ'O$O|)//'9r$88xٲe˖-?    h j   P5imԩ;&&ѣEEE"SNBL ƍٳ~?U|!     3C   ;}}}wwwwwwgϞ+l_^^oݺu    > yo,    Ueoo駟I_,"))i߿Mm&   h B0`wرf    T8ӵ(222    ܂0ӣG600Xx1q     ++"JKK]]]afffaa1iҤVZq     gذa:u3   DPضm.]8;;;::vښ\    и /&Mٳ6m:f    hSN\   Fh Yyzzɓu    Ms     !PdÆcǎ3fLBBY         +x         B@1@p6m:8    ÇBH4o޼{I"H$uy>|_xK,Q8]fwAdfCE"[PP~Yvre~S_~eZZZjjjjll\RRJO:u*֭[eenݺxS*[  @ƣ( uWVVVnzq	O zۻ{7n: pbÆӦM:H5jԃΥ%&&2$55UfUXXDP[[;..cǎ2%_j,.AQ)kceeu7776bqΰ+4e6nݒL?~ŋeN	<y2!
-K>|˖-/L߲eҥK;t-JOOHHHy   H
-h &-Z8ŋG    zG}%''&$$ٓRTT뛚|ҥ˗/*c	%}.lmiSRR|!;;ԡC^eGw\aeddu~I~cƌs˗/_߽{)̰o>]c ?.
-W^zbRRsW}  `E d>}ZKK: @50`~u
- X֭:u@iӦMVV6;v KOϷ#ܹSz:5Ǉr95b㱟MAAAΝ	!? *;ְ,[Bv#""!W'n۶r5B=<<!qqq,D\k^^^bX,O~/jH!			\ W@6f̘+VL4)..,    	!k׮533S̙3^THKضm@ 믕>XfUB200ҥKRq͆]D///++ !5]A_<cƌy`#F\~=000  ƍ#Gꫯk   
- :    #BȠA<~%?.\d}[laX9fdBL޽	!Ϟ=c!l	!o޼Yh!dsz͛QQQeO0aܸq&&&G<xbɒ%K.8x`u  >B>1>?k,     +&&&m>~H166E/dӦMӠ2lPӚ5kFWk)k0tże˖Gؾ}ҏ<t%8qćuuuMw	:$88Ǐ?~<vn  4(@դI3g΄ܹ,    !yYDz%5kvڢ"\e4UZ]`aCq=k<HrJe$<uTHHH^ڵk'߆~3_Ν.>}?׏  4f(@a׮]K,wY    @yW\ahH~,z"@9s8:::uJ򘻪4SMj۷	!:tPwAk0E;v|N>`s=zt}B}Uu(>}   ^(@gƌ&L<y2n   PM0ggg+k3fBڵk[N@!--;vBK,)Ħ5p͚5uefî駟[lʮ?~2\\A   h ݻW[[{̙\    &ӧOҥKrr[@@@JJJyyyqq'O===	!3gδMHHӧϕ+W
-铐о}{泾&$$0'aL.Ԅ]ř}GYǫ2.~@@M4UPPSSSoE󃃃e
-   Pu< i>ܻwq  w7nu ņ>HOOV868xׯ_̵|D'YԩS2j5S}ߐ6VVVOڵ¹
-7Da_gxx[lTg2dȥKd2ˁ7RHFzzEBB;  @W@hk׮7nꫯ^|u    PuQQQ4h@ 000ptt7o^TT>66vNNNWZ˦fkk`jYСCϲWeؽԽ.ɆHO   W@hH,{yy߹s @+4+F
-h  P	U3 C*	      pm 	h ج]v婩\g    q<帎u۷oCBB̙ӦM~8   귅={vܹ/^:      >|p֭W&''柦\G   P%|>...AAASN:    @3@W^x1==][[
-B1 (@TUǎŋ6Ą8      Ç1c<(--rB͛s  {@Tox͚5\     =tM999Y,b~͛			߿  1\Po>bĈٳg;::r     6X[[B޽i&압
-9s?77U(6o޼Efff-Z033kٲ hP>>>K.    Qן={̙3CCCׯ_PXVV&FKK+11B333322rss233?~|̴4ɲZjٲefjҤ	  u Pmm|s     V#F1"::z۶m'NҒ4iBW	!zzzm۶m۶eggy͛7ٙYYYϟ?{۷oyfffZj޼y֭[jժU+sssPX  f(@T3f|7=    -88xժU۷o?|0!ۅBa֭[nAyyyvvvVVVfft?<ׯ-Zhٲ%]MhѢ=  6P#N֭k߾fϞu      _~޽;wlٲeuY[[.%wEawInA/^|n֬Y-[7۶mۖ-[K *B:}7k֬8qH$:      7oze˖FB!]vssEQTVVVFFFFFFzz:offfLL}5'    IDATPi+++\: .ŋݻk׮o,      ڵ+)!㙛---MGFFy&--kmmmeeeeeeii٦Mϸ4 B(@T3e˖_/  (  u¹߿OKKKMMMMMMKK{uxxxZZZzzzyy9kٲ6mmmmccӦM== @݂4@7o֭[۷d    ({ƍk׮EDDr 011111qvv.߼yŋW^B%hVVVڵ ڇ4@/wW_p   BܹC/Pػw3flٲh  ϧ-?+//իWqqqϟUAAV֭bmvڵkgkkkll\]  Q<@M˳矧Ou  wqF @zͅN<y.]x{{8SWWbaambbuR\aa̸H7mT h\y&$$s>ΖT?k5kFW%%v)n (@Ԕŋx<  (4@s?ÇÆ2dHMMMeZٳ'??PE7k믿3иZZZjkk۹sN:H̜9Uu%%%IIIt17)))--(}}}ݡC:tرcǎs 	hbkk{%ooo  (4@SRRr_p!55i#G޽;:Tݻwĉcǎegg
-޿5jb822ɓ!!!=z7nܧ~ҡ*O>}Ivv6!ظcǎvvv-n	 u
- 5O,={    0TTT\zΝ+))۷#FѦMA)//;qAYY=K(Μ9s&ʨ'O?~t%zĉ͛7:4Ϟ={ӧODKKںCNNN:urtttpp:/ 4v(@ԠW$''[ZZr @5޽o<y277w&L5j!ѠTVV޽{ĉǏҪn̞>}׽T//)SM
-5A,U'Omҷqtttrrmlw* Ρ P(j߾W\u  P={'NyzzN0aܸqAJKKsvvX,V؀]paСRTT5riӦy{{8PcccztBBBqqCN\]]N
- 
- 5kHJJ% A(@/.\طoߕ+W:w<qO>ʊ\Pnܸ1` hP8qă~*LAAKΜ9s9SSɓ'O6Ύ\(/_J/!n@= j
- 5+%%֭[z: ,ꋗ/_<xb֬Y}YǎgƍW7o3T.DDDO:uڴi\Ǐ111_=y򤲲ͭk׮ݺuD\zh׻wogg_~   P(
-;t0wܩSQ}Ƀ	!|>Æ0Tׯ;B$zر\ƨ8..NRtttѣ{ǎy<1A/ׯOOO:  PgSNmܸ111oܹ}:pC,]vÆ&&&޽
-F:qz#G;vL ?~ʔ)(JJJ>|uݨoӕh_( 4@Ȱ~:7@]4@TRR}>,\?	&<~8((¢{E͚5{	رc믿\]]Ν;e]]]sϟGEEEFFFFFx<WWׁ8gϞB Pw Pm6  
- uJQQѮ]o^VVW_}(/6r'N			6k׮rI&qjPll9BQԴi̙;Cݑw݈X}}~h@4@m駟C?b @p%K222⋯ԔD%6o޼ro޼YGGG2kܸq.]0Ԛʋ/gϞ4i׹ ۷׮]ɭ[>|U  P>}ڡC  
- ux;w̟?ժU\'}aڴi''O,30??ܜl}=zTOOoƌsΥ/S^|~ʕʁ5jȑ_UFu F:,,    P/\[nFFF۷oGbccw)_}&999޽;==}ݺuڵ7n۷/m۶={S?nbbtRsss//;wz jɀ]u
-   +]pܹsΝ9s֖D_9::ٙ8PDYf=z޽{zzzСΝ;/zzzʺzjΝmֶm;v PP%uX,:   pl3fL||ùN+..:uy6mbhhu"܂?~bŊmۮ^۷\%۶oݺ>}u: %(@Ԓ>}s   ԣG/ܹhBHrrr^,XNCǎ믿zmڴ/qx<g@@@ff;"##x-@CX[[[ZZ޽{    +W48P'\t[n͚5ӧq166^|yZZډ'<xЮ]#Fܿ\ M2?uH$ݻ+W 5hS    7~aÆ͙3',,Ԕ8˗>|̙aaafff\'z1"**ٳ#G:Rz:{llll6m:z/_r
- j
- 9&&   k.Z_ݸqq{YYY?{M׉!#GsΝ;w|~^SNGԩӎ;(: T3jO.]ʸ   j7n<qԩSuBTTT׮]߿#Gr={;w.))Ʀo߾ס rvvy]VX㓓u" N(@ԞΝ;Q   ۷mv̙1cpO>~Y۶mڵk7zh9s hcii٤Iϟs   jIhhŋ?tP JKKg͚jժ-[߿_WWD(=|y澾Æ51Pg9::޾}48 P=PU666/^:   Ԇɓ'\w BHff~Յrs=ziѢEyyy\P,""Ǐ3f: TjUvP hx<:Qk&L=ĵk:wLQTLLL߾}˗O>t!  P5(//oܹ|>>Jmcc'N;wn\e j4@j۶mrr2)  WQQqasssP(͛w=V;_xRD"[PPPӛVK^-ްaCRRҁ|rK=gC4hеkZjU+6lǓyy<رc_߿?gΜvXYY=?Tfeyyy?H$D;w^zl֤I>}\pH$ѣoFZb'RSSScc㒒6ļjBȈ#?~xEתZdZZEQ\g条mW3ݻw߰aŋ}꾕!ӲYqNdm&89~YQ9y<ޯ*=ʕ+
-H'TiʴT9bB@-ڶm)  ߀nFFFIT6>VVV>`U5V^sj:/BkmF9bxժU`۶m5gϞ	BBHXX=%  bllz>}y^)			VVV
-W			*7!W&((Hel62dG=|0Qf.;^zէOCCãG*z//VTTpw]{{{W5~+ɴ윖R쏫tmm'OOWfc95`2j"A޽7eZO+̱͕iɼ_Rӡ8r䈹9)  '貲2777Bž}
-zYy4|W[)))INN>t萝!ݻwhT=vX//ܢ2ujHqqQDDDnh;;ׯ_B9"iгgσ={3V+%3}ggK.\|ŅҾ}B6HKK7n!]Y)SbU쩌^z~r/˼6]-!lZZZ+))a`@_'/D`/>>^ "uVRFsZ6Ku\G,?fpk6SLx/^'fggBBUiGZ%Ig.,,L[[ @%)@ӧӧO744477߱cEQ߿4iRӦMMLLVX!9|]reذaFFFzzzu~'GGGIcXH8q"ϥymڴbVZZi&ggg======gg͛7IЙg̘ahhhbbl2E9ro߾FFFB]vK,dnyy;{y"Gf,2̰tܙ?b̪|O>2'|>_J_h1!Uejqw} ;$;^|k```bb2wB*l--LIVnVTT_iii)elq6III#F{7gޱigڼys=ys*ʶE_uVBȰa|"!3}ǎ{{|Tѝ;wDVV!DOO۷o	!:::l!KI'{xxBT.hWh(tƍ͛777We.>ɀFC:n|xF*H(|i+JyP6SJ
-p
-[jp$߆96Ku\ss)ϲ<6cr=\Mk!gDD!dm۶B]2swꬲ4/)X P-p 
-УG&R~w?@7mmm[Hn>@'ښѿӇ%)m׮]07'NDN(*++4h|y2[dߗB/}륷yfBȨQðJ}Gw*cW*+W\>Kf޽;fIm	D߿xbn<_⒟[lw*Ͼlٳg(ܜC2@@122x]>000`ANW7ۗ&MLLDUkC*W_B!_|eCje\\\ڵkǰߪ$ck[œы<JO>+#H(|i+r	G믿)6o%6liYJ*311Q +ϲ<6cr=\Ze)ڴiCINbʴ M)XjBׯ @QrhG͟?bdd$3ӓ^pر%%%/^K&LҥK;;ʊ;[nsMLL!;*i&BHӦM8۷oo޼nCgvuuٳ	!]vA`` !"$$$;;(22[ne˖QuVBH$ڹsׯKJJ"##",5]`_~+yf$STEfU/_tt4!e˖rKKKBHddɫZs*(Qƒ'`x)U,kXt)!ƍׯ_ܠROҗḺJڵ+!$11bn:44T CpƋ/&iӆݍ7W@e~,55ήK.)!A޽u2\l!O>#I3cccBfffEu
-M?pLejT͆X EQEEEM6+..611122ӈ~pW9#ݻu֏=b^Y`[j<OHu/\?WDy̯Zr	h"9ٿڰ9f), ]V>?f،USr\rHBȪU?+b*(lJ-(%_U jBrr2!\ (tTT==##C333Ч͛G	
-
-:|0!dŊYz?:xDbLW:{_ɿ/cnN}&^xAi߾=EQ΄ x̧k,2Vɿv^e_N=_K'?~8!W^
-gXSUs*(TU̞=[p|eȿ4*@'w봳gJzrJCo,w3gΨ ;v$Y[п27P_.0x왵6FSM?h<O ȌH1>Y2$GQ	!SL}7/<\`49T4-[j<OHu<esӫ~"~2`?P* ֭srrbn֑SL6,qU2999&&&)))}Ue3ylJa35ske4PŜϟ?'L6mƌ$i2UPX([PKʿV,4 Ǐ @Qrhɣ$&3QUQQe}}}P(^saaaH͕߮l7ߠ),i@:mmm!o߾|Ʋ,o[<ccc}^ʗƍΝ;ӿуh0W>#<:}}`Y*_q/5Bߚ#ir{|w,bӿgL+[\Ҙw*̯ViѢŘ1c<ɍasPeAz>ZZZ<ѣ,p-؛7o+izaɷ!DPQڐʞJմׯӿ>{1\&$J鉕|G4***Mfdd$)n'ck['	UXTXϕ;@ƪܺu3T)І+Ѕ    IDATC{nBرc)%f،pk6"Hr4VQ%IR,c@x=!D~  )@Kb_Egff6kL듗Quo0JO*CVZSNBz!/ҫbٓrը(BʇS{~.))a9Uo>SSSG#Q*߾}+
-mllbǏE"H$\ƫnLaKeKW 2Z]PݻM61cFEEc8*kO^n]f!oy<UL{@3)))9v옎P(Vk=
-Q#0,˜ȈU4ZFӦMWR`|ĉ&&&Zo]Z8`YVDH0_tr	B~j9%aVRֆ9<6Kipa犊
-Su+JՋUU͜hkZUX_RX P-򈪿 52Ç߿_QQAךLc____B'|"OQXۥv*S@9p =7}...DɭTkLWSUPPDYfdʾHB2~x"wJOaԔ"y]IޜU4hР+rT4*Fo޻w/!dƌjf%ěQ%K17P_.Ȼx񢑑ѬYTc8*4j(BH߾}b/BiٲǏl߾Sń2wAqpp(((nVPP@ٹs`hC_.c*ףًp)7oò<<<!2WK#F
-j[NTXT~(m9#[~"@jeh֑S|6,qU&gxx8,󾪬<6c%߬Ze̙/ -s:f~IR,c@@ 
-ugϞ#yc!cN:E---ҥ!իWeeeEEEl;͚5;|pvvvvv6mJ9)W8ss䢢OxxxPO?B4i/DEE!:/,,Loj>~6EHDB{(MQi""% (D˦b>{oM6}_!gΜs33+3[M񧦦޹s',,L0GGGkZaSV7N̬VFqvv.Qf)%5,CJ億^tVZFY
-;;-}X4V[PBy~		AǏ7nn&[Z]_>qD!D2e㏄?L2kWMC02a
-͈!R}-#R?Μ9sfʕُШ<!!|BZj			B
-FoS҅LV[re!XkV||STTayTT>gHh+Vl֭[l29͆rYgV,V&fg<w.$L)<e:QV1G ^^^?9Q2֔l:Ή20j~ٺ9lZM1?k)@ ॒t߾};}ǏK0p7n.G߅w^ڵ:.%%qƦP1[0n8Zm.޽QiV0~SJ:sѦaOOj|K̆ȌHfE[
-;;~
-XʵYj%K4lk׮:J-33|җ+Ud4廙<oiu}Ǐ_}U_5ﺱZA>~;;;W6h;%P-Z/vuþL)Ȁ :B__Цt*hӦiexMו255UzF>6Gf&ZSNELpsbqxsBSeuu>$%%	!;fGN=Z(ױzMkWMq㆛QjY+#*6[S_psX
-L~6b_RZ2H@xd-ٳ~*ThȐ!Hդm5j_133nݺB=zZڵk[j8z'OJRRRϟ_z
-xxxT^?7jJuݻ(Qãjժ&L?S.\P+88Xzu'}RCPãdɒڵ[|Fdbزӻ~766lwz
-gæ}ꈬ'O.RH`ԸcԨQ-Zxn%s?;^^^~~~#FHLL4cutNXۃLɷa۷o7rH!DbV+$..gϞ?MO!Ԩ~zgݻ]v}ʩN{Ō3U&}800pτu<`.]hSGJ۶m3m6!Dڵ-k5ȤٳgJٳg'%%l*==}ȑf<fR_Y;ŀqxsB~0QVAW^5[#~\Ӛd-UqN4IɾjZ͔yPrQ[)q,U9,ͳ`/*%Ei@
-
-R; -Z
-
-7oځॳf͚Ç.T;Qf͞={N6M@e˖7.88СCY={ٱcS tU6lУGñ#7i<x`۶m_x#eNj   ˋ/x2DXFrr˗,N:w|Ѹ^>߈WR!GH/k֬Yڵ;FFYt{=y䌌#1s'x}w@;T
-!ڵk<_~tt'؃~ԫ]'|Z!]6lذs͛7oܸq=yÇ{]|m۶kjrḑ7ON:۷Os5 ;  ?
-(ЦMիW#9{lR>޽{[n]xq77rM47nXZvʔ)ժU+Z7{=ȇ?P^v=n%eizݮ]i*U@N?~[~g]9rd	7o\`ȑ#I=#KJJ
-		ٲeĉ?#B^6dȐ7n;vL@ dw@   .]Z(_ޥKf͚լYի!!!dOO6޽{˖-˗߹s!z͛?-$  {n@@Q '={l񁁁Ϟ=;}5k/vPK]vΝСC=3#B4uruY@ d	h    H@%ӦM+S̞={#GԮ][QBVZuለ
-*,ZHժ6|wj [H@   ٢j_{5Avݿ?$$DvZfͭ[z37 y7x.\XlЌKNN~<4   -			:W@u		)[ѣG˗/ɉ_ E\]]GyqM81((СCj6jԨ   -			BoooAVܿ	*UV\yyR@x{{O<իuiٲe˖-/^vPpH.[Hc   %11Qv ͛7GQ\+W^zuȐ!j8%JZɓiiiu֝8qbttAG+WQڱ $  l!pN:ձcǊ+>z/^߿qyGݺu>cǎ~lٲӧOQ;(8?sΓ&M߿ڱ 1$  l^v B<x}6LII	駟z-:;wnΝ+Y)S^xvPxy9rm۶ܹsՎ@N"   dtlzzځիWW^]v>>>͚5S;. _hѢř3g6o޼ҥKO2%66V9tPΝ3o<cH@   BevڵW^ye֬Y֭͛v\@h:vx̙Em޼r_"@uֶm<844TѨF   :N'}|Ϟ=K.8qb^/^v\'N۷ojՎ?hѢׯO<Xbj_#F~ԩS?RJ}ϟ?W;.l;wŋSy    l޽;**ҽ!!!nnn:.55iӦj%''o޼oￛ4i{6mp?pww7n/_dɒE=z	ڡ!i>`6lӧ    جt'O))):QFꆗ?]tIzƔ)S:vxCmۖ3:uݻw-[gϞ^vM{n߾]^СCd4   `={/_lf`Rf͚ƍרQ?/o߾=s%J +x~իUTر_%VRRRٿN:_m<4   `3''ӧ;;;k4zqm8qİaÊ/>qĪU<yٳÇR;4 6prrرSo㠠>}={lڵk<x0DNINN;vlw #   dE߾}MXޤIU?n߾=eʔ&Moڴɓ'+W
-
-R;4 YԵkӧOڵSNf~NgXm׮]׮]k۶֭[
-Yvر*U8pѣ˖-swwW;" 4   ...;55Irr[lY|_~?ڶm[ǎԎ@ر'Ν;WBnݺ+Wnҥh4~͜9SHaV;{͛7h6T;" GcD v: ^-Z
-
-7oځ *555  ӧ''8Ν;bŊm۶eddgȑkV;( +VXlYzzAZnݾ}{RggѣG/]ɉ^jG		yŋv8 rh    ݧL/\2ѣ˗תU믿;wnTTԪU>+2s[n}Gv>|7222BCCb#G׭[ʕ+d4   u!!!ܚ7on<y/֬YӢE%KΙ37<3gƌSP!__I&8qӧZpVݹsgV
-f/_7?p@XXXѢE
-:H@   YJ7AgddP,^t[oUhӧשS<XxqjԎ֯_lZzĉƍGGG~T0맟~RԩSO~u:s$  l7nzKpLBB;vXdɹs֮]ȑ#ݛ?~ժUՎ"--mũfj+Wԯ_?***7ovwީYƏo* 	h    [|}}ǌ#(VX%1h۷ww-\޽+ ٻwZݻ5yfECϟ?Vѣcǎm۶tjॠtj #qqqAAAj EAAAS;Guu֩^
-III6m*]t˖-Վܽ{ȑ#%J(W\2e*ԬYsjGvܹ+VuÇSRRRSSSSSLs
-h׮e۶m
-
-z'T|vR.j   ਮ_aÆ:^
-e˖~ځ8 FSbŒ%K(P@vP*￟>}J:}ڵktv ϴ<===--M{MFw)rYPP+h8ŋoݺE4  @m۶M(R{nLL˃rԎ kMvi l@   jG   \B
-       .H@       4       .H@       4       .H@       4       .H@       4       .H@       4 (h4QXJ13      ooo޼9wNOOk۶]ZѣG:u*w8aXTR:tXbEBBB)s͎3KFEKIIʤI6eA/66v̙5j^3bbbjժhon5MڵM5$[-,XmPv$m2%5ێ 6\(ج](٩ RxD(xsM>6q&%%}WEuuu}7Ǎ!ߗr%($t rQll""""6{X~}APPpRk̆0<!DR췟S1͛O:U(غuJ(v%\2*0K^zU)RJ)Y|M6!nZb
-~flwﶩ,jؑN&S2XX
-(`ȕlV.Thر]tQ;
-`Ν_
-shS5A	~1dyf^{4ƍ+*irptSNm޼r_E0@QFvjJ,r۷okІڵw#̀|SRRn߾nݺJ*	!~Nw1ٔoTnuM)<%&&VPA:\۷/>>>!!_YB
-:.&&ݻDEE999yzzRlY;_p޽=z!իgSj#MdlTpdrD$-&^hSj|rhd644LW>ׯ{VMHHtׯe]!p88tN<xϫdNٳ~*TH"ӦM̔=p@}}}=<<4hpA}zB+gff
-!+<y"pww7oÆM4uss+WܤIbbbEiiiK,]G&MSwwwgg7!^ǏLjjkԨQFhZSHɓ'BgfgLԸ~&W.9s8ڑm]&e/^rrr23(~cQo[L%i1CB:[Bz5h@qEmV?4d!DʕkKKJ%B̞=۰ڬY:X̞/ljBB)d(iG>frUgNH@[vM@
-W$T-Cڠ9+;M>6K.bWMIp88t.]ݻw}J#\]]_R~k&زeT"=tҖɻH"ҏ}&Vj[jeT[o    IDAT_oB|͚5
-oߴiS)(ؽ{wå_9F-XliΡ~ap;ծ6gt:^9s`!DΝMNVGp-		lo	{Ojժ!}]\rťL2ɖԩAOn3]&M?.(Wb˖-+8~~eb3:_(aԂQYմ#L>%lT|l٩	|ˮ	hW$T-Cڠ9+;M>6ӻuV8,p#mc1M@׬Y󱱱cƌB4jHZ{gϞMIIu떔ݻ}	!*U^bE''?C_CKW^-(Ym۞>}tĉu
-!&O_!.]zݔ'NH	]QV-a֩SG:)RD#i?PBk׮}ɓ'O֬Y#X`>Zj]x1&&fȑB:uNB6gefLutUpaq#ۜ={VQxT$---  @q	lfVGpt6%jIII
-g\H___o>nǏB̚5˨ܴ=_>[h*U~PUTQ2XK/0lk-=RjڑML&%혶&SnfUS9"]
-IML/O̆&}䉥-͌L	̟')p88ɓ'E<0[oڎy@@aѣׯBL6pCz	!=jʭ[*TQ"44젤'd 4go!Ew}gX(F]fM}Nݿ_e4:
-ٜT1=ziiiBq\ms'˖-Bzl7{p߶:"x,(#M*w	! 8a!ڵkMtϟ?/RS93:ɜGZaMNxb!D'Lcuf/0ۅ7sZ)d(iǰ56mVVw*GD:߲kZ=>6U9)iQrٰ͑e\ϓ	h8hi:%%EZiDt֬YSuss3l<11լYS\љ{޽quulC>#GoV
-!>}jX(eK[+T̌&_.}Oa(m>,^c{1D&NmuD
-wXQ>G:Rj"ׯ_h4F3\Ez@v'sңGޅf{%cB	սz뭟~.lմ#L>%lTnfUS9"K~t?Y!XmPOytv&vKh4!DFFaaFF+r2E/ b6\*Ss+?|p>>>F~}M6={VZ*%L-O@?yͭL2qqq6m*<F,̀QV+`zǎBkvm؎F5lP~I!D*Uh5NB:2%VGpǜb5葀Φ>ws̮.~SrXlzNӧbʕ+VBK`1{Pj/J)TSn2K(lG>,<^SNH@[vM@+'1ղ3~ɑٰc3ZڨQ#!ݻt$+w*d"')#$pp,YN@K{YzzgL+wIg	ߺK-׫WOJIOm>}ٰk֬)XzqSqQCJVB)SRZ"=c!,,̰pڵ"XZb`̌IOOOԸjժ	!>Sj׆(mt:O?$hӦ~aM>l#{-ZTq=iF7ҜCG:OZzʓYGңtzқT`TSjM>nݺұ
-+S|^tPemFxmڬw*GD:߲kZ=>Y!XmPO̆&҅
-!k!{BҳͮIJ4_%	hMv&׭[7ʛ6mBfdd$''*UJcKkʕ+!V\o:W_]z۷RRR]ڠAE	!
-,lٲ{<yRzD:цHǏK婩o"  `ժUwjIIIW\	_[Ho+\pXXӧO>}w*THd-sVKlV1;t7ƙaxw	T_r]cudffVVM8;;(QBBBƟauDVw5$$$66ҥKj2ҜCG:I:>>)**ʰBTT74Ӧ?dz			˗BԪU_MHHHLL>*T0zPffT_QlYӔ1:_(a%]d!T,o2H#QMUNH@[vM@+'1ղ6~ɑٰc3ZWti!Dŋ۷oK\vbŊmݺ5:::::z˖-m%2]NRz$pp,YN@WܹaǏKgk7n(0|iB__tq	ZmMMI𻻻!*Ud˽{j׮meNJJJƍMKPsedfaL[,3cݻw7mY߸RJ9s0lmI;oJW͎Ec͚5yvKs	l'	P!D6mLH/2ô7nY:2=EFFп֐W+!ܹs-FfBVY=("kJ#Qގ|<7麖v*GD:߲kZ
-\gOMo
-`_K|1ٰkfcpuu]baT1F5jdx	h8hKϞ=ׯ_BoXYʯ5jHbfffݺu=zԸNRu|<ؽ{%JH/Z	giڅV^@^^^Fojk׮mժW``ѣO<2|}ի[qΕM0mA~nB'(Ydv/_.=MۈL׆A6_.]ƚ.5d6oɔ=233'O\H80!!qKs	l'	hm۶ٶmv2MM4A@Aŋ3f̨Vg``_xav8=ruuuvvA:!FyԦ..ۛLv1[p*ߩ	|	h+p]Nm&|S>KZ*̓ONuf#Ǉ&?XKcbb̙SNEA!!!ׯ_7]=))iف~``ٳvIJGH||}}#""Ԏ-TPՎ%Yf~6-Z
-
-7oځ8>޽{j!<عsځ ڵkРAqqqj!M6ғ0v   V\)(Wڱ/^H/t2dڱ     <E  xyyIӧ8Bv D47 _  
- 뜝˔)ӿ)SK+P@ppի     5$tC  p H8# B<       `$       vA       `$       vA       `$       vA       `$       vA       `$       vA       `$       vv    ,==Q;
- )66VLN ŋj ؆4  @=~\rjGQuEDN yj ؀4  @uڵqjGuddd4o޼]vԎKVZݺuK( 80C l@   
-,X`A:֭[ٳYf UlY   B   66lg   @	h   6;w}I   xّ   l̙ӿ c   ^v<   /]?       g}ֽ{rʩ       Pѣǎ   p   (5o޼vըQC@       "O:v    h   @?<88^zj   8   |Ν;߯v    #h   ֫We˖j   8   sΦMmۦv    h   /bŊ:uR;   p4    Çk֬YzFQ;   p4    gɒ%}Q;      ,zŊ+&Nv,   !   X_<X@    D   0/!!aҥ&LpwwW;   !   uvv		Q;   Q   HIIYpq㼼Ԏ   pT$   3{=   	h   XzzFv,   #   ۺuÇ'Lv    c#   ̹s6?l߾Fyw[lhw.R\9wwRJu̙3V[h4Fayll̙3kԨ]z3f(E]~͛71d) //jժ}ϟ?vzN:*U_<x׵ԢEֶmW_}ۻZjG>uꔥݼyTR>  !ht:1 H\\oDDDPPڱ hѢEPPмyx㏽zyf@@@Nyƍ@V֭[!V^=rH??W^yEatrrھ}{׮]eZ27-rJ6mj*Uj+Wڋ0@a(Qľ}UAwk׮ݻgff]j5l6C7n߿",,lFK>|عsӧO˴l4k׮5kÇK.7n   ^~   y/B
-*Hxݻ
-!.]*e6RRRfff~G9@RRRNjԨo߾_f͚QQQ:uJJJڈNt<΋-Tǐ ߿;gyt:>}zfff֭ϝ;ɓ[6iZ2\RϪUu%K\r۷ZmbbbdddhhhÆM[~њ5k> Z
-!""" t:ySNU;
-tUG9))wwvvtzBfffJ233}r||k&/ڶm+h߾L$E>`KWFK,BT\9>>(J*	!.]'O!ݕD0:(!=zdydJ2ue!Dz4h xP!믿c%?Xb[nU  ˏ;  o޼yݺuXa-[ɓ!_{K.m۶MuK..]zZ^pbʔ)5m֨BJfΝ;|Ԭa/|򉾂Mf w5 ʖ-+ƥ7tѣGl"5k'͚5۹sgϞ=s<T      >lԋSNݻWuWf!̙3333322fΜa___۸qt!_|QD	.j׮$roϻtiӦ+(ѣ'
-!Y+j 
-Pީڞ1cFbʗ/߻w7e#{zzݻGEٰacLΟ?/hժ֚5kw:d?6  
-	h   |m۶QQ_ݮ];[w۴i3zWnܸqƍ׮]2eJƍv#z26mڴ`s>3~~~)"&O/^|Æ4Xxq!ԶիޱcG//[nmݺAAAٿ!z֭111ݺu)PAbccnݪ ͧ44/ͨ   ^B$   !믿~ӧ.n5_+WO?5kV͚5gΜi6ݻWuqiӦ
-!֭[[o)	Y{FMו
-6}H = ["iXMnNM6ݳgOll˗_ܹs%~pСҏFh4OٳgJZ۾}σ/\   ^6$   !Xpo]~}E6-{V}Aѣ_1{:ujÆV^=`̕+W/KC1CzGCLIRy:.%%eӦMiii]t믿PjU U/F)?}Tؘ(svvRʘ1c~!o?>""BѴiS7xCEDDHOJرM?޴iSf  G   ׯ_߾}iӔ2jԨ/^̙3gԩO<yw=M4裏fϞ-2eJ||a%K9R}7#G@,ڵb֬Y剉R0R3{lV;fK7qg! VREnXSJJL_?~8;ȼ=RwBO>Dʛ[ս{͛Km  <j G7*""B@ @7o>uT ^
-Ç[ikM6	!322K*%رc7ntu̙#h4+WTʗ//U֯^V-!D
-j+W,0UeZ
-K.K,B+Vl֭[l)ZbҥJ/	
-
-Z|+WRRRO8o!Tbu899EEEGEE999$$$t7|Sjժ;whڤ+W6llWh4<zH   	h WR!H_WWם;w.2|駟7
-!>}jڈEB]~ݰ/Sf۔lyddd@@i2]mM=WtR%L+(ڰaCӚ5jY"'''*4FBCCmڴ1]Ժuk!իݻWvm%6_!~w   x   /bŊ;wVXرэ5СTҧOu>yd̘1׫WOzI&{jvUr.̘1ZjӧOpt;MZhѭ[رc*\jժ/^===^z}%nnn={v```<<<gϞ<3gΌ?z%J֭ۑ#Gu림#C644l0
-!J(qɵk׶j+00p'Oﾻp=  it |}}#""Ԏ D-͛v <yRL+W0@X~M6~  @   ׾^{o߾j4o|BѣGoj      +&&믿8qڱG#FtZyj      kŊ,    IDATCQ;    o"  |*11qѢE&LpwwW;    o"  |j͚5fԨQj   Y$  iڅ7KX   <4   >>>~j   e$  ddd̛7/$$WX   4   ;v<x`	j   q$  t>lСڱ    y    _~rO?v    @   _fϞݷo߀    >  @>r3g΄   /p4   >k׮+VT;    _h   Y/^8p̙3q   w@   :#J,tҤ>M65jP;.       <޽{nnnO>/~ΝcǪ     @.HOOܹȑ#޽vh   @@   y۷333?[\rcǎ}   /!  @eN紴4''X__	   W   yÇM]\\Fagg	   WH@   oMII1*tqq2dȊ+4*Q   
-	h   M3*qqq<xU>   4   {&]\\zE   M$  7ݻwMKϞ=    r   țw@cu   e.j    SSS]]]۴iF   }  t]vݵk    w@ Ԁݫvp`qqq(Vڱ@˗/ݻQ   k$ K*111((hذajGf͚!C|kԨQjG  ߑ  /C(:uvP|v      ȣ>   #                                                                                          /;Fh-Z/%%*&MڔƀwR:tbŊfcccgΜYFoooooիϘ1#&&F_VZfn߾]Ԯ]۴_C2կ_ͦ-˰4cvd%%%}WEuuu}7Ǎam   @!  رٳg/^ضm:K.v6޽w1cTZٳK\RzO?/^={v5\"1bbڵYF_!#""aÆe:n޼YV9rٳgqqqΝ[lYm	   `7$  +WJYj:iiiǏWҚNt)))o^n]Jڵk3BRRRNjԨo߾_f͚QQQ:uJJJB3lݻឞ}5א<x0` !ĢEH91Xj[kJ~%%%uڵko޽j.]|r   x  ;"##;V^8qҥKfm_ݽ{f_AիWɲeˤEWqFʕ;֦Mooo//VZ=zRJ7no={\na֭ٳOֆ\xq)|լ52Sooڵk+W>s̀J,UjѣG<y2ۃ   r	h  CwСGo/]\\>ω'!'ܹS'x{{jJ;n::NJfF=f:@?b̙Y   4  cN{zzݻGEٰa#*U;v۷.\hk7B\~]QiӦ56Rʭ[9">|RJÆmޣG&N(hݺc'թi7++      #nӭ[7
-4(66v֭f+'E?~TTM.\X/'3YH!DllDWz?Ç) =)Zx64h`Yk'Lu6+96   #  oСҏFh4QpYf%%%I+s!B5}}}%pwwbccw6p,֐o@AT+Y2`BPm%   `_$\%}+ 9BMJ:.""fW				ܱcG
-!x@!ġCLkJRI"Ev횜y͛7'''wEQ:t:]JJʦMҺt_e[)Rĉ94    H@Caq  d;e9;;/YD1n8$&&~BmJ%]vB̚5+11ѨٳIgZv̘1'^SZ@;wB̝;7--ͦ  GU...nnn$ 9+!!aƍNNNQQQrrrڸqQvXy:uo_ׯSŋǎ+->|x###~$&&&%%<xߎPS˗/̙?lٲ͚5ʕ+GDDf5y6Mukv.]M4ٿLLVsҥKs`   @""E<{L(  y͛Zj`Xвe˸͛7[Z/pssTzĄ믿>hРW*Uj޽GIxyyٳ'  ௿jݺW˖-므ݻw{zz5OI6Lz8~BL<Ç25mRZ`nO'Ol۶m˔)ﻺX"    vBme˖Ԏ HO~паa_gVǏ/߾Gɒ%۵k|˗/שSpiʕ/\0cƌjժyzzzzzN>+W6mm΃V08EZhѭ[XvbTgf7Pj.^8gΜ:u)S&$$ˣFZG   =hxv   Zh4o<1k׮ڲeC*Yܹsv    w@f͚gϞU;
-      H@-((ʕ+qqqj @df%   `$VvmG      `_$ݴi={  y2C   Ѐ
-:t/dff      `G$W;      H@*oӦMXXځ       vDPǈ#v}}      4:TZuj      	h@f	k׮}ڱ       vAPM>}*W<m4      4''s熅]pAX      GPS֭yÇgdd      H@*s      a$-Zt~sԎ      I$:g}5u6l B	{ɦL *PkiV[\JjZ=n+
-Vъ 6"HH͛$FEurɓ{Uyx쐐F         E  !ϞK,9tY  7ҝK$)(`MMMtG      }ѣGǌw߭Z8  }MIIɉ'"***q NOO    
-hko}HHq  =ڰa޽{ٳgc4     	4@2k֬01c  #F8{l`` ݉     /NNw  ҂<==[[[>    @DGGϘ1cܸqtg A֭[Ǐ&\v->>ϏP     _sƞ={}ݱc^z8  0X\roȑIIIqqq    %FLLLhhhPPПIw  ਮyܸq&&&qqqF;     ((۷GDDDGG  &z1c{?Fw(     8P@]
-
-
-7o޵k׊+͛Fw"   b'݃\     0(  aܹ!!!%%%'O֦;  c"СC7oyO>k
-     ,̀^W=;  Kpss[`A@@@AA;>    +pssKIIvww?}4q  ?ioouppXp믿ciiIw.     P@&&&/_^foBw"  ALL<s☘ssss    `?a07nHJJ{.݉  jmmqppXfMxxG6l`hhHw.     \P@?^^^666~~~;  -|>ƍVVV_ܹs     " Em޼?<~  ɓ_moo_|ŋ544     f@W>immuppظqcGGݡ  QQQ666GVX     hIHH^~۷N  w_DFFls     ` `0zzz~~~ׯ
-t W*22rϞ=ׯadd$Ţ;      npN  JEEEddleees     t``0+..}뭷FqMC @O*++k֭YYY᨞    B0ШGEE;88͞=P  JKK,X@˾}Õ      
-h.]uss[~}SSݡ  Eܾ}ɓfRPwq     . ٸq222[Z[[oڴ
-  䕗윛{ԩԠ T     Џ0 \paqq~cnnqF  }\vvٳ
-
-
-Ο?֭ Aw.     `PPRR(,,\~}LL}LL@ ;  tv ě7o
-     D#""rss?5k6_mmm;  B5ۛ׳1e1uTǏg03gΤ^,XFEEbƌ`<uvn}&M2d2vqqYhQrrƨ(7776f]]]꫆"_wQ)<.guw6=r~M9(#"uuu֭[ӦMPQQ;w7^    ?bb3  ׯ_믿jhh,[lѢEt8|dKNN^z˗L矏5}PAA
-/^0a!dΝFFF'eL7wW)bnݒƜ't:jaaqEGGǮ߿5<Ӥ7\o<p@XXs:#B>B}̙"1A    a4 ?TTT\r˖-&&&t \i>>>:::qqq}&}'e˖=~>#P3!g޽%%%>>>"/.;-((֭[fff۷o/**
----ٱ>>>7mڴ77.455577_Æ+))6m{ȑē\]rw޼ymٟ"c۷S;vիWD	&ܹsscǎ    u> @~'''%%l@/7nܪUN1H9sחdݻwOԷm<>244d2o!D"Hp!2jjj211!lڴiҤI)S8ÇEEEy>s~KhBcSSCBbbbF?xKxky.t&%<hϑg,BȈ#ܿ	***    f@ QVVwށ\]]gϞHw. H,[[[Suqqaaa[lr۶m311<~8uرc۶m1!+Wp႖SgJO:wQBڵk;ӄ5kPQ%l5k$'t?***~ǯY{_^2P3o޼EM&~<    
-h &9gΜ۷oǋ@WW;v ` 'Npwwvqq?p#$'';w竫{nBHTTH$舊RPP8x𠖖qBCCGNٴiU<==L?kݻ7xChcv= 9C.Yj_<\7TVV~駄jH(|̙3k,==vZ1W_}e```kk;gΜÇ    N8QVV;|wT   /;vxמw_~eɒY'N\hQnnÇ>rѣG32N;r>oHӓqΓ'O!]Qoj͚5zzz6l'^TKkll|QFO=8<;{566;vLz
-
-bXǎ{w	    
-h x:CC+V޽'N?	\   vz^p믿ceebQymڴ믿^vaâΝ###<ȑ#ᄐ}*wR/c*\wRkkke|4u=DnJڵky<5}s-rf˧.T"Λ7zpBucǞ9s1++k֭VVVw/{<*    A(@eeФ4SSwy|ŊyyytG bcc-ZT\\caa2ctɓ:PX]]]^^T_i˖-#|7:::zΝ;D"ygKVWW_yP/]$ыW\zIT,p8'O_8lr#[[[96cƌYwMII!;moo/SRRSL&iϟ'P_   `C rؽ{wMM?qF, @'111vvv˗//..ްag轌ׯ[nժU\.>z[-ZTWW_|7+W655I!n!Oj1xTq\\w2gBȚ5k.	!k׮ЂdFGGB.]!e熿~o
-/Y2(A$z>    A] 222,Y17nН ^ĸqVZEwEGGkkkYF~mG!p8>OM>yqvj%[`0o+
-d    IDAT.B5008vXMMMMMѣG	!111/D@N177߱cGqqP(x999>>>b֖_577{xxBZZZaڴi27~;S
-?5yF}MMM
-
-
-%%%KJJ455=Ç߶m[NNNkkkSSSRRҘ1c!NNN    )| /8p`̘1oFEE
- 
-BMsݰaÓ'Ozv\UUUQ{>L144~ l޼Yիeeeݰ@]BӅt%cǏ{zz~cvvyףϼ%_Ƶy,yΤkii˙8K8qbl&L ܹS 
-
-
-?,'*    SX ^ZXXXbbb^^^hh#G]QQAw: eii?zhŊs,YRSSoR{~mooo.xbo1b$1Μ9BPzPVVNHHo8o㕔^fdSSӛ7oٳ7044TTTdXgѢE7oޤqttwW_}⢮pV^}=j^l/^*000$$qɒ%=;SQlH?(mBRSS###]]]ԔLMMCBBCBBz!'    Ў!ӥdgg?~<3gݹ ~zK111[lQQQY||b     з`4 $''܄WW5kXYY͜9رc խ\rׯ/**D     
-h yL&sܸq{쩬<|D@WQQiiiyԩ-[FDDH     NP@+|K..]TKK/&&  *++x֭[Q=     Ȇ zɤJG;v/		9rH}}= UZZ`kk{䄇      	 ЫBBB=r:d##_~ѣGt p[[۴'OfffΚ5KA>      z9r͛~~~۷oLHHhoo;# ^yyyι'OLKK
-
-B     ( gTTTVVVzzzXXǏoccG]xӝ ٳg;99?֭[AAA\      
-h CݣӋ?ӧM<y˖-tAAA.11͛t     P@@_diitK.577_tu߾}C	?qDcc#`HMM
-
-&$&&&$$
-     ` P;  ,~~~Ts.1̱cN0!00ё _%''^SL|||N     0`4 ~iBBBMM͑#GͣΝ{С
-3@qe???8      =4 ?l6{ڴikaaaeeO?b
-8q GM0ݻǏwss;     %8 3225k֬YSRR/]{n#Fcǎ9r*Ifbٳ6luocgggC     pXLw _|9111;;[UUuȑcǎ;v#W>|tybɓ'۬yXښP      
-h ફ^KўE|qM6DDD|VVVt     DP@ RSSs5TWW9rȑ#555ݺukӦM/${o߮KG~ȑ7}ᇟ~ݡ       0Hݸq#))ƍiiiB5Ғ DCCA{{S:88r޾gϞ7VVV.]O>144;       ttt޾}ƍOvv}}}|}}cf̘qٮuT=uǎ˖-[dݡ      5  UTTQetZZZGGg@@ ~ӧOϞ=~#sssZR$>?>y$22rҥzzzt        2xtyfmm15-]AA G 鵴Hd0#GLJJ+mmmJJJxˏ?޾|ŋkhhf<      4 222eˍ_nkkQVV,X@c믿vq鮇m۶1̕+WΟ?f~B      4 ***JIIIMMMKKKOOonn&.!!a	"HGQQИɓ'ݾ}C!::z˖-***˗/X,9     ;( zFyyݸq_tgHdddTSSCd2Ǐp:9{;::xuuum۴V^{難Н       uttޖ*Y<	ZddۅB!!DQQqtsM>z`0.\p={2dsQVV7$      <
-h W9===---55555P]]ݝZ<ޞd#GR۪F|IVRRbl6ZpCUUx       ?  jԜꪥEwL,--KJJ=Jw'MDM$--ӳ#     C @,j;w899Qu8;;s8,t=/ؼys{{SMFwBrĉں~<u'N      ^
-h >G<쬬EEE;;;vrr9r1uttԬQRR;z	>Sƽ{8N/      {ݻwݻwΝw>xbggFjjjJwLmb[[[{)	=k֬	b:=ߏdjjjBl%u˸}?D2N{      4 @?߿_kjjG;;;;;;ӝ hnnv677K;OiZ544Iliis{{{SS3?bX,6f%~---Cm쌌ѣGBTUU;::Z[[2bX[[-]`<3      ( 7X\TTEבttth'''Tҽ(//o_oY6ޖbijjRTLU̒ZKyTTT2L9onnnkk]_Jsm&*]3LH$ԴLLL,,,hmmmllf	      }
-h ^wUVVNNN
-
-
-tjkkKJJJKK\neeeeeeuudΐ!Ci_{ϗ@QQ뫫\nUUUee%5-ndd4dCCC6556X,W      O `DYҙ999999|>_WWP}aǏ|BҐ!CMMMz@EE+ZZZ*++\nEEr?JJ4mmmSSSONWW      
-h |>f;88888PjP3kFͺ:t
-?Btuu2^Jkkk     `@  Q__C6:::ttt֎= %%ʪGΣGrssrrrl+C_XǏE"	Y__      
-h  V[[[iit%}'OB2ZRL[YYDm۶{W졋;wgff655)++:ɉXYYP>_A~~>_rvvD">qvvrtt      =4  <.K׷4qxȐ!>iҤ/***(IvԴ6WWWpWTT|O~dfffeeeddձX,www///ooo///;;;AwR     ~	4  \xY,O|mmmmEEŎ3f|wxɉW^MIIXld+..NRUU=zhwwwL     
-h  x%BǏG+-@ D?n"x{{3fx7o^vʕ+YYYT=f///       #
-<x +]TT$
-nJ6lrqqqqqqÇ5jԫxF"@MMׯ^x}==7|3((7`Xt     P@  D"Qiis,Y"4jՎϙ3'99̙3)))h .?DSN
-
-zu     <  ';v,,,B!mff:uԑ#GbOHH8s̹s窫'M4w7|SYYh      {3   z_QQɔ.UTT[ZZLFSS̙3?S'''HSSS
-
-
-
-
-ݻBCC.\V    `S;    !P+Alacc3{y6L,8qfhz`0txzѣW^^޼yw{     g >uʔ)_|E|||}}]JJJnjoo޽gΘ1CII=Uȴ;,Xz:;;ӝ     X  ʅYНQEmcTWqQ=l/^JKKOkUUUZb      4  !Νػw;q^н/d;uԒ%Kttt~CҘ     7a	  +bccM6T///6G
-7n6la~(x<󵴴W\)]}J֩`KrСC***˗/oll͙3`H...wޑ1f'EEEӧOg-x].ꫯbƏYEmK)**ʾL&bJGjhh`L&S{%5,++#Fܼy8      E  oL&sΝtbPo</1ct=4vXP(9s_~E2SD]9;;766ZBѣGq~7BeCCԘI,}^w${HH~p֬YuI'	!ӧOfg^##""߿Ow     '1  \yyַ~Kwشi!fĔ&%%Q!{r\.wݚ^oqB]Н;wB̎?^]]񒒒	!+Vιp!dС
-
-
-׮]n̮/_NzjSSӕ+W,,,(;6!duuu %%%88XEIv;w)޾}bll,	!IIIk]GGɓ=<<      `rJgg玎!$66!WWWB޽{wڵ2l0krr2ubڇ1ru靅;;;ɞEB8~B.c̮Ϝ9#KQv;;;BȔ)S;y(O>-p	'=z'Og^c_c?       B  sss]bAC]]s\NZ[[%;x<qkk
-!D,+((}^gX*VRR
-6ǣ[Bƭ[+UUU@P__Oe&J(;ƅBCC\.ɓTY] jg]]d3abbb@@ݻw	!FJNN>sLPP3C*((Ⱦ>bƌt     xB  _UUUu{;}&ROMF7*y!!ɓ'uuuB\ؽ";Ƹq㊋ϝ;l2,]Tagyܻw/!!!999997ߔ's}LMMN     ʡ  YXXҝ!gCK<{]Z鎎gggBȭ[J.\X__nݺUVq܏>HƘ]kׯK$&&Jjjj'O駟!zsWZEټyO?D$Uϼ>"77Ғ      
-h  ̙3Lw#|'[n-++3f B-[v}}'CVHHHDԞŋBNk׮b>/wCow]lűcN:ݘ]M:tWFFFJ ;ƤI[ZZBg"=2e_u)SSwyGΐϼƾ ++ʕ+f͢;     rKH  􀆆pHDwX,
-ƍ{_Gz(  @ ,{fΜbY⪪*j丸8ÇBNKw:_U5(/ay/wAFHy^MMMnnn'N;     @o+ A.))I]]}ҥ}\]]UUUY,V@@3gC6lnܸQҜv:)++		Օ<0sLSSS%%%555ggO>Ν;]___"ۛ2k,cvéSX,]]?kb\r%$$DOOOMMaڵ<OEuʾ|BVcccd+y.MMM666tg     q_z"<  fg5j4۽{|gtgԲgϞ;     @o  W?>%%ѣGNNNƏH~ӝ(///;;     0x >,x`^|yNNNty)`۶m[lٹsIw(     ރ  UUյk溺>ٳtަ:qĝ;w	۷}AXX@6     5 *,,\nݡClllΝfjjJw(g޽{9###?c!M:  IDATC     4  u߳gÇǏ?wiӦҝ9rd߾}龾ϟ5kͦ;      P@ @ ]k׮SN1O<yʔ)tGA-;;ܹsΝqㆮnXX     ' ~ɓ'/^<s̅=<<L2eOOO&Iw:x<שÇVVVSN:u1cN     Ї qqqgΜ),,TTT; (---IIIW^MMMmkk6mZPP      (  0&&&R`II	3fȑ#===555REEEZZZRRҵkRSS9N@@1c     ס joܸaggNwFjkkZVVpƌCzzztg     OP@ @ؘ|BСC95|~nnnNNNVVVnnnFFFQQ
-I     +  0477߽{7###333333++AYYFCCê򲳳srrD"1_x      @OA  Ziiivv233srrZZZ!6]ѝǅ]<yp$9.ݑ     ,   kwY[[KaX433377PUU;XZZѣǏ>~X(2?E@     ЛP@  <[CCCaaaqq1uSEgyyP($2H__P__jnnr\._ԟ5Y]]     v(  ^JeeeYYYYYYii)˭iCՕlH6#ZZZꨯښjɭ466j!CP6W      2  x&U%%%6bX,ImSs{utt!jjj2^J-D]N[[---T,Mm477744Hfb"3     @  ~<ORFSmޖڐlX@uobXL&SSSzbfK;5钮YYY      kP@  ]Nx<@̡ZYzbfJJJ                WB           00         W4          h%՚    IENDB`
\ No newline at end of file
+   IHDR  (     {lQ   bKGD       IDATxg\geH"AQ4 *ƆQHD%Jω1&*bCb#5TDHQa)0컁e,fyqfvn1B!     P%     C     *     T       UUUuuu\.PmBaEEљLN:1LCCC===elld2ttttuub~  }C ޽{WPPPTTT\\\RRRVVV^^^VV&IW[[[___f\.F+n.9-Tv^ c`q  WiiinnnNNNnnn~~~qqqaaaaaaUU@WWZtoff&T[[ؘbhkkwI0޽p8յ۷eS^^^RR	!ήsNNN]vuvv   crYYYϞ=ͭ&hii988899;88ۋ~033;xx<^IICaaannnii)ٹGzի# @9(<  )6}֭{=x 333++duMtNQ.UNdeeB:uѫW/OO>}ټ +  E}}{nϳgs^{ٳgOWW8ѣG>|G233KKKuttݿc d(<  pƍ.\x͛\.Ʀ>>>~!ۯ7nܸq͛wp8C1bĈ#uFw@  (<  hu̙/^rݻwݺu6l:$K.Ν;1Ԕ  ;  mD ܼy3))))));;Ғ:,ܹ3
+Ͽsu)==2dAAA   @nݺ{Ǐzk׮'N0aB544莦޽{w̙cǎ>}_~SN;  }>x>0aB^tұcǎ9RSS3nܸ9s=ZSSh    6lHLL5kݡ;k׮T[[/r޼y	 @Px  K.]ܹs}]`ɓuuuEp   hW\onݺ5tnԨQt'رcÆ_]z5n  P R%%%C522vZjj*D__999[n=s挛ۯ np Emi``aÆ`@TWW\r={ӧ݉  x  (>ꫯ²PuCC6zzzڷo݉  x  (ŋ'N|E||Lw`BTx}݆ׯ_) =  
+:tMbb#q5(<(III}Q{  
+  Ŕ{yyY[[={А8ѣG[nm % Yf	'NA`0駟tbz'ކFEEGOOOOOO>֭khh-ǋ"go2#Q%E}کS'lٲJɓ'3={
+j@ ٳ'޳0`۶mKHHP  Ԝ  vqWY>L5裏ۇr%r%>WdFjF 4ݽR(Pڳg!ҲTJm <<ʊ	  A  ooiӦckʂ@B/`͚5N:ڵ͛7o޼ٹs!dڵ\~=! &&ڵkǏ7DmMwǎ;;Çr8k׮yyyB"##6{%899q\.D9v@EEƍ~  j rrr!/_n)RΝ%RzxxBǊ%Gb{&l߾G&3+WinDCƎK߶lB			i@$Η͛7ۛI \  ̚5d{jkkutt!BPCCk]]ݺRsssXizzzo޼h<ɌD\__hjj>!L&R͊uuu~>|H]%綑8}tS P @^_677oCDtOnj|@ D릦L&XXXjpR  tT(<  e``;S+!O<I޽QɭқDT)Bn޼)Yddg~׿d6	!x2 Px  ȫW^Ϟ=;po߾}v݋/}Ԍ3!/ߊ_>az+11N4𫯾"?}tǎ\pa˖-={O.\عs6_{novttn  e.  u`mmbŊ67ݷ:^b\.wĈMf$P8sL5,eT^^nggGIII߿ҹsg6-gUnnno %  
+MMM_~6(n͚5:::QQQU.n:j}}C8qBTQQ1o<GGG0.\0yd;;;&x{	iӦB$j,N>]f*6 PKx 8NϞ=svr7Zaaa~BBB Ё  Pׇdɒ,rl6{ĈB0==]OO8    :ؙ3gr8kiaG
+l+WPu  j 3fݻw۶mGƋUjjj~SSS   PFHHHZZ뗞NwhM|>ڵF4hЍ7N Px  (?}v<{oҝZAFFƇ~|+W;v/  h-(<  gaaqܹ={:u{۶m*^~={Aݽ{wxp @+B "cƌO<Onݺmݺ\WϞ= n8] V6ٳh_|񅉉	ݡ@u%$$-^x֬Yt PO(<  Zٛ7o6oL?~YF3HeeeBB®]n޼ٻwK  * @%8Α#GbccgΜܣGsRSSwQBԩSgϞKw. 
+  ޹sg||ׯƏ?q?7.s٤'Ol//YfU  m	 @[׮]KJJJJJupp7nÇbaaAw:.;w~РAAAA&Lprr;  @[{ARRҙ3gn߾{9|aÆ<ԔtӧOԿxذaƍD @/  MOOpիWoܸlllׯ_?__߁ѝKKKsΝ;w߿;ccQF  
+ vիWiii7o޼y]SSٻwo={~ř۷={&
+mll㣫KwL  h @=ztƍ[nݼy<OCCٙ*B\]]vjffFwX=z!vpp;,  Ȁg ;ZZZ{־vZVVo[[gff޽ŋbllLU NNN x%%%EEEJ#''ŋ\.ӣG^z3*N   v'%%%***=={iӴpϯR&6SSSSVVV^^۲)///((xUAAAII	'0kkk'''gggQAlkk6Q @uPx  |>w=vX^y^]]]XXXXXKBqqqII	u;Ɔ,KOO@[[SNf&&&rkjjD솆wq8ں:EOnn'|":Qckkۨ   ~ǖ-[?>nܸHUN@D644TUUVWWszC"
++**$d2ovԩ444cXL&HGGGtW'NL6mȑ			 @  ٱcƍCBB.\طo_C+W'99ؘ8  B(<  Q^^y~2,,lҥ...tGϞ=kooOw  P  mhݺuvsYx#ݡ蔟___ݻ  T @y?|!̟?ܜPByyq㲳O:Cw  h}
+<,  vƍ wwԵk׾xbʕ:DLMMϟ?wY  @C Z)))>>>999qqq999σ~rrr@@@PPPBBq    P	>߷o@wĉ=Rhkk8p`!!!6l;  &-  m۶999ƍۼy*^ʡ-,,.]ZZZ/  
+ VSYYiӦm۶9rO>t"##̙SRRo+ r VPVV믿nٲfܹ]v;TgL6f  j  hܹSKKkͳ;~quvI333  Px  ()++_~IHH033ojs  Z (={|u?CEݯ^Mw  P
+  y	B͍J}}}9GGk׮80##8    C ^d2|ȑx9 @G @WWי3gۧ]v-   /h{ԫ<Hw  P  R?lǎݻ7ݡwﷳO Px  4ի5k޽?_pݡƺu-ZTXXO  
+ WPPz={.Z諯;Habb2{슊
+%*t'    ǏY&!!"**j֬YtiBCCMLLlCjs v/]FF?|)_,P / S =%z)_zɓPT˗>裢"  @Px {{zzBΟ?퀀 ;$|>6 h- ZK9Ү^Gw.h)涶x9 @{< PQQￗO>}ҥz;)S\r%11q̘1t @ jNR7gΜEu҅P*\.7,,ȑ#qqq!!!t z٪U>hѢPZO_|W  УGNvҥ/^\!FKK:((ʕ+8`߿CvM6-[,""BN1cǊ
+Çg0ӦMܻwoٲe300`X..._uaaSDֺJw(XZZ,XvBabbرc>Cۗ`<xPbd0}m!en͝t---8fk;!! IOO7n޽={N$544N:ըǏE>|HKZ5g&rj^xO9zh`tt4!ں"qe311;6hnuUill?f7%63fLuu5l˖-???3;bBȖ-[dRVr><̻_ee$ 4B @ 8qbРA//'N|C5&~P__9zh*pK,!PoYhQ'U'N;KYv-!ޞ:ʢڞ"j~wTVV<yɉ2l07:ƕ9\*:&ҥxشC!<իK,ѡQI&B:u]PPrcbbLLL!&Ml(X^^ujET47ͅ+7<q㤏@# б544ٳÃMKK;QRBtttr\KKKBN177oWm:ׯ۷tgi3ٖ,YE5knܸAՕLCuݝH鰹I߽{ȈH9<!D__?33QLЅ!3VXѨ?@			@zH[# ϼ>}Zz  DGG;99ijjΘ1Ν;
+upϟoii)_EU|>uh5uT]<=zһwoPHT-PΣG>24][(׮]n1c!Q6Մkkkyr9\u1!!PWW\RW^M8q"+UK\Rb+WB>׋/RH,(ܹ3!ŋFV2332  |ŊL&sƌ*:E%%%xٞ={!һ~bƌͨ7o,
+cbb!F~~cVV-HʭE"9t1cȓSԈ|>G_sSw888PROnn$8;;S
+2sΉ矄'''˷-<lJ(3<(= ]Px @GR\\nhhVGٝ:uJtǪP(ܻw/ur\.uds1]52tPK455Y,upYYРOjlm?u+k˗/544!2?|ؘ`ȼQZ*"RuU4!BZ"vuOSUV5ZPSN%rλ6bQfy]u_ tA Cvv3X,+p%R4ߨ'_,.+qm#iӦ7=B{n̘1m|s+k%&&&o޼Ç666NΜ2r|!dӦMB҂CI˳K$233&&&2  wn7n}tti6@}嗗7F$S]Q?|2<<bjjKj@ pvv&&ܹsgggkB@ifڹsg[NIѵrMMMΊZ^vkܹB7.*>}!VVVT!!#BHΝ_Ԋ"UaFVefg=<<
+ hΟ?O=!͍rH9p8ݺuspp022iW_¨_`#~,@ Xt)6hs+о    IDATkP(lQWӖ'O#|rr#x<WWWBD`rCrON#q)}}
+{&/O)mm-Qfr>|a  rߟޗrH9X`!dϞ=!dҥv-!Es`0TRs+kݛR~ޓEꫯG9F#B/<ݻG=Nȑ#pyKrm۶Op$ipDJG 
+ hGrP(h'/h8gϞ|>sv5w\BɓEo:kԦ@CCCMg*%+>}-zymm!d͚5fS
+-hBjy<Vz˯^7H|`PP!$&&m޼C%h+nd8qyo 555]t^q]r;;;"B:w,6Uqq.9s&!O#G$lٲ7Nկ6oZTVVF&?
+'zi3SxP˹6pR
+-*qMKz&/E=RH_>֭[#ʓ߿i,E Rϟӝ$~mO62h @@@z
+u%
+###E8.(ROOOf\JkZD=6Ǉ5-00P|r]maCCC׮]mnn_7c@oaaeaa 庲B̻~[qsŘ#ʓѼSOU&/:--R1Pֳ  Txڵqqq./Ǐ={8 Y~ҥKLfRR.Jzzeˢh  hzC.]t޼yͣ ty򥿿YYٳg :_W?L\l١C?~Lt@; Цnݺ?>}~s7"l6{ܸqO<III8p q Z{֭; 6DFFN>d
+jjjNzÇ_  -Aw  PsB011_~:>|!}}ࠠ]v @h  VCC׭[ѣc
+@--Xss9s}vٲet' P(< q8;vlڴxݻ7ݡ `0lmm/^\\\i&K @i(< 5o޼~#""SSٳg;w@ B hݺuvҊꫯ,--"3f011	fهӣ; @Z@K=y>t萙YdddXX^͛cǎuvv>uꔹ9q  :*\
+ ʻyf@@wؑ0ђ*\ի>8lroZཅ ۿW^%%%=y$44bѝ@%zqu---L㴚B͛7=zDKCP  (700P(8q֭[x=[[˗/;992$==8cΝOm@(2o @.111nnn3gδKKKKOOabbrܹ5ti{B	!{rt u dquuop}:+s)Ђ|憆&LoԠvVVVZZ}:SN,eٲeO^:c{{{&iff6jԨs5wmllbbb!~˛%XJڦKNN>}zPPP"P7o/x'?~y8NJ; 26|yv /! @3VXannGw{'Nۗ74iNR 4WVV(`$%%5	$''{{{W4-<!Hf(?&l޼Y(RՂxoۋNQF[F,JsQT( HPPPn```bbbŊׯ_ӝuPWuuujjjΝ	!˖-o`ggwԩjj;.--p8׮]"DFFRmƌs̙
+.[TTi&BWI_}!ظѐA)Vк544|>YVTTb:bihh,[LHJ*ho=;  x3좣NԚ#'N?~ңGǎz+WBuFz kkktttM:##˗XZZ*Vd2?S.KwŬZ2m4ѐ`Bȏ?(&qlZ6(b7JI/<m͵v4@ ƍ?ӧ]\\/_>m4mmmC2l6ݩS'j655ѩ5(//711p455	!>ځBL&=t%NE'	BQ`0@PZj2CRpĉ1CCCE(;wnȑϏ5ԪS__t$b7mF /yuRRRVVVhhUktAF|>/@_~evvvmmP(|ĞE:ݜh҇_2C]p޽{~~~o߾;\RSSsss	!Ff=j(BHnnnjjnǐCKoIᩚ_BPx rxzzQo"Wr~|2!IJ{wwwB͛7%8&PWVYUGGr6N+3$j󒒒>8ISjMk.z-!DQrK`Pk @FGGwڕ`L2Ν;t'j#~O۵EvEޱcG^^é޾}B!/++cهWeQ(̐jߧ;4l6[GG`4}N]AA*rsx'rآ_---	!Tsjhᄐ'O:88`P
+KEEŊ+L3233NԦ#Fl,X 7k׮m4044O+=$A\z,ڲe!O-[l*8]\EΜ9Vt&r֬Y }H###==|р:xٳMLLrss58&Olggd2uuu/^|=P֭[׭[7Gty<>S(6jjjƎwIHI9pO8@~755kjjZ𨨨7o#TzsӒ2]v1L?˴`j
+ׯ_sN`盛mxo/2..n۶mgϦ; @{%	 tX?^fMBBիgϞm``@w( 5}v33?:Hw" vz~իO>/ hƚ5klll/^M6  dBVBɓ'ӽƎ# ZDDD͚5|׮]
+  O8PM_qƍ
+nn;G>ӧO'''t H :WWYfyxxԛ w18  S :M6sڵ+ݡ @,}}gϊ^ ^A!zj͚5wf0./ Ҽz߿ٳt hk(< :իWٳ`,033; ȅf>zĉ 7(< :GEEE%$$X[[/YdΜ9t p8S>|xرt h;իם;wbccsrr"""Pu tDzzz!!!AAAt h;x@%Rd@P6;wnQQʕ+N Px G<6l;vlZZ.P'cʕ-bx9 Px /۷o)((		ݻ7ݡ @%js Po߫ΝLw( P/N0ㆆt P ^1o<+++C@۹uرctr)  
+ :={lժU655322; ɓ'G?js PKw	pss~"""Pu ~O222h	 ZPx k׮xyy%$$<y$44bѝ hfccڵkaÆ]zU4͛7Ç7o.R @__A'''gffN2 .>ѣ#F>xt Px ZG#y<Tܠ  9cX
+޲eˈ#|>!dt Pn.h;w>ҥKÆHRӧ7tD DDDx<G\nݢE  h7n:FSS~g+Wҥw}xT  'fDU!X`  JC/2|>ҥ/_FDD8::n޼y޼y111NNNt?x u	 pΟ? d#77W[[{,0777$ tDW_}ܧ,+??ں-# 
+ e8qb|>ì.]? :B//7oB$~G3̰m۶y4 V 
+KJJ4iĪC[[ר: @i/_LNN<x0!DKKQGё @y8cǎ^ܡ @ܻwo֭<O~--QF:ul   8q"88X믿e* PW}پ}ׯ7l`ggG$xӧO @8 /):$x<@```SSS:bzrѷofX\.t 7n~Z͛BFKKbX,/^Lw
+h2226nHw
+5f={VTT$dccCw"Mbb" 5qu@VUUURRҭ[7K]>~:*,,<rɓnLLL=<<?nmm`0m{`pԿ O 0e#@{ݯJQbXtv`S ((<   uw @^\     B     *     T     
+     P9     r(<     @Px     ʡ      C     *     T     
+0tǓ5׏F匪$ZZZAAAW\Q:cii`=ıcZYYikk[YY}Ǉ
+Θ1cć3W=z4((F[[W^ͻ~d*/k׮,KOOW^n<m ^s[}wt`0<(2}6DH\QWq	!<o׮]#G`2ƞ,qs R	ɓ'ON.+ed4cQˇU9mDCCԩS%I4~x6-޸?x̘1M{b2eeeoRC[V2g߿9RC5{NiVپ@]:tXjnonx;mٲ'qfGAٲe CJ
++ߖUtRhLʪҥ˕Rne~dB",ZH>!>z}}}ffѣ	!^^^%QtxW.YDGG2l0@ j<i$BHN
+
+\naaaLL	!dҤIM{wAܾ};mܲ9ぁ?{۷o8pd>|8!?,++i E;<0jnj.a0QVD%<{<Din|9.6l!?r޽{֭[}||6/ UiN?d[q\KKKBN177Oy4\,wB!ϟ'gff6jOpB޽[e%sϜ9C166ʒҏ̈́rB>}6AR6riхBVXѨ?@			@zH_
+u~i-d9=v!ʪH9W;ܾ dRUVGBB!NzK9ѣG	!{
+_T)u͕KEzjBĉ_ؕ+WJlrJB'|Ҩg6ׯ_kjjjkkWTT(di!?~l&?֖rQ
+5ApKŋGGG>/j;wLx<P'vBs\LLLIv}ȤJ>ߣGBȯ*JFvB0&&/]<3KED]`@ڥK̕B033ܴ瀀 B֭[7BH``6G;::Bdǐ<!͛G100۽{x<mhFmP-ҸNNNsΉ矄'''˷ 'ΎĜ-YrKi8-:pIWYB[[Z-VGEEE,Ibihh٧<$C}IZjkk	!ԯT?Mq8=۷!CB/}3*Lxꠠ FFF3gu"O )ၑ\wtV"L:?94
+QJ﷛Qb!9.Rt>DҐ	v}ȄTpp˗/N(..O0Ԕbjj:~x@ WAE333d	eC``Ε+WtuuEtIII>\fĉtRUU{nOOOOr qhGT^^N)//ONNИ9sfK4
+QK<
+e RtW>*35ʪFzK6@ pvv&<~9B'ӥ˗SSӗ/_$ҋѣGΝ;Sĉ_EOPQhY9mUS~~~De!
+x/mP˥kG'lqe~ȣфZR+gER'O3GD;ܾ dV0m4WWׯ_SBjjjnn.!dԨQ;5Č;|-I"JJJ"xyyQ0B5jTppp"SSbK!g3帺ݻ֒6 ={6!d׮]="    IDAT]!-!+@	-o7Ւ/\)RRRR CwrmpC(BeT# QR4=;;[KKKKK+;;%IXDݣ2yjuǤeׯ>]q9:uWslhH^U==	g<@v6Ҳ
+\.m6҂7m+@:i~[Rd33sN@&_eۦx...%*QMo.((PQRH}ܹɓ'$㕗_zo^-&iB.[TTyf9_D%qSSӍ7p\%2ٻw_~%##͛7ǏwssmhFmP˥eGGiJ
+>NZnRdss7>}*+++**_*/ mC(q(mٲ#GBl">Dr̨HźUQ$/"D_𔪪*MWWW˜9?AUUtr6p7ԩ- )Qs[p%v~GGaR$P!%#
+ue"qBJNsN|_[UU5vX!w-ϼv}Ȥl]vyzzB8 %@OOO%cF)G$/"_.qB !!BKK?!!AgGO)_@%LLLٳy222͈f2Cݻ|AjjjkѢErPx\mnT2ҿ4Wkx\EgE'>D/\ǥ8qbҤI,s%%%2g@&P7eBHbb"A /%mׯ_׮]?Nw5:"-   @'>}h"B/q =Ba0R>}j  ]%bQw 4x   @+0229rdjjj^ xGg{)p  d® Zg<     @Px     ʡ      C     *     T     
+     P9     r(<     @Px    tHtG P 
+   ɩG/>w\]]q d@   !ݾ}{̙7o3foTTԝ;wB! $@   !/22ի_>psTTԇ~hccXQQAwFEwp)SНAIIVX@Cj{QXXhkkIw~)]k?_ uRTT$)SLR__ӧO>}z޽:::C?~	J@aɸ7fddНB***^xQPPkiiIw"|k{Aw ?dX|#;!0`t(##cƍt y켼}(ϟ>}ɓ@ 4iĉ,!8/<hgϞ>}tРAt璭z̘1999.]BNzjժUK@@ ݉ @M>|888GjUUU|)Sm߿?>>>##<,,>@[8Uu]x͍8EEEVڵkƍ}}}N 
+A]]O<	ׯཀ£=~x۶m(//6lXXXĉuuuΥ1c_t{tn߾~ƍ3gO666t'{?<vXJJJEEE߾}'OHw4Pg(<ZKJJںukjjjΝfΜ٥Ks):
+
+
+.^JwF(۷oZ|%KL&ݡ CB~r.]:v:yd###ӊZA^^^DD^xrʎXupI&;wUG`0f̘ɓ~uݡ  ߾}ׯ/_ܽ{92>>
+
+đ#G<x0""ŋ;w?ݎk֬ʲ߿hhhyy9ݡ  #ݶmۛ7o<3g;;.T
+(++rss:u*!$!!pʕtGkdwwwºvzԩgҥKt' GGGgʔ))))%%%QQQ#Gҥ˷~3AǆC1˖-ڵ~]|SLaXtGk[۷otg%1>ɓ'~~~ϯ;  tHsνz=iҤx77ѣG9rt!ÇgΜŋ>\ɓ/ްaäI-ejjw3g?~[n)))t' zt{aaӧ?.''hA(Ν;;v(..ѥϟ?BBB.\Hwh5Gu떇/_N  ѣ>\PPpDWWב#G9rѝ:ͪ޽{PPIZZZfffhh6ZS}})S\\\vAwhegΜٸqJJJN  շ~ӳgv)$$.--;w(<$`p.]s]ݹT"<<ѣ:::tg`0"""޽[^^޳g3gН  ԁȑ#ϟm6./PSSvZWWuM8ѣG{;?~|ǎ۶m;P=^~z  |Ν;_z5rH__ǏAjjj֯_jժ?ŋ[n֭ݹTsc>㢸m""DM0D(EALEQƐhI((IkX cCP.y}6[fgݝ?sg9rgfN>bcAzgggk׮N0BKK	&\|#G
+
+7¼zjʕ7ndX3rׯ[YY2.>ȑ#t23f~+@:q>++.))iƌZ;(D})))m۶\hQEEErrr:vuر[bҼΝ}v 2C6mz333ƏE-4fͺw^I9 O?4iR~ 00cǎ!y3gNYY٪U㏐9sTUUMK<BafffNVZ5nܸҔggg2ŋbɸ%stt=zI!O>~ZZZnnn``<x@w\-+ڵkRRRllݻw=ݸq#==}ҥNNNtǂb233OJw8!̙ԩSoݺ?w!11~4-%(,,ٳgTTTݻqFooo_ݩS)Sܰa7|3wUVB!3fǍW\\{ E1Gݻ7ùp;ڴiCwPtҡCVZb/r˖-.\d	ݱ jxҥӧO|/_;(wx};wz#GΞ=ۣGْ%K"""Sfff,_XBl6{ԩwYtiVVV``ի<He˖;fff._tСtE_599@1SSSM6BΛ7Ç_|ŲeڶmeHDw\H/0rJ>}f̘]RR2gCwPFaݺu:t>|8݁ #5k֬kΚ5СCtǂBNNNyASPP@wPH*񨩩ILLѣիWnZӧOw=o<&ӬH>/bر~Bֺu~ǧO>C}!A!]2|>ժUyyy?tBwPe˖-~!݁ cߎ1bرwޥ;B-N/	BBaǍ7{/rׯ_9	­[N2J53dlسgjWL"8p 666$$$11aP\P"DGG[XXGEEeggK$ڕTE!i[DDĞ={[6۷wqذaF	3fר6^z;<<ECu7|W_?~<2SRRR,,,y睿pב#GLt^Ad2sss5-VWWG-(.X__Lddd}}Ҁmۦ8]=8pׯ#Qٳ֭[:T$i5p5NaJvvᤩ?x{rI'Z/;wDFF2'VWWS\
+'N<㏶meffb1jQQQQQQYv񊋋 aaa ''5kܹsy󦤤d˖-z"qqq 蘚ZQQ+++҈7) ~~~|>_iC4-SuC!_\gr8+Wjn03aҸC'Gց݉/DdgX}޾}p݃LQѣG r5*FBupp(--( <y lllf Sܹ3 l޼!K*ҺhݱcȃQgZ,C8{!#ătI'7o$''X~5Bdxx\|sζxe˖455I$777%;w^Z#ѣUUjQc5m %%Eܔ 7n\{ iڟR)HӢu$Dr[Ha-i9I'w~=R4{l&c1!!!3gΔBtwSggg رcQ,++ ^xrٽ>Hb OY7n([\\ rD  ذabC4-HӺuOOϑ#GjHa-RI']#<op8дLQRR[oج_\n޼	 gϞHssse۹s' |> $	FŸ\. 466j@khh  +++%ɞ={ ˋXdlTZ'wj^#+8t萦*i80CA.cyo5͛7wnooڐaFekk>}ܽ{XLLJJ܃m^":: 222 >>~]KaaŌ":v ֭TԖTuɉ<r\i8d0CA.cyo5_x11bə7d<=xɠA,,,RSSD害wPSSXSMǏgϞ r>3w o޼!9-HӺu]t!ܫW&ORF3ŀq!%x2ר:A~7oo6mo-H':swwx"ݱ 8}t]@CCCv|||tWX{ؤI4*Fb
+
+~ 7(9B} zj)yIEZ@%%%VVV<wETEL1`fvr2*lQuTWWİ+WHXf6δdOOOf͚ YYY+V B26feu?GGGMGq'N FO	~ܱc ݟTuԶNqbqwN"a4`f^TxludeeYYY?z CZ0ģnԨQl6{՘6G.]O8].ɓ#88X$566iӆd*0Q[UBB >J1Fk׮wohh(--r(SZZZee%ϯZ~={Ba`` v%51u/&_#vrJ#a*`f^jxUlQu^z{{9s0kD1ҥKmڴtݱw'g)x{{ѣG)w6m֪ZҪ=zdee`0D*"""@R\x'(xJ*Ҩ[W__,--ϛSMs纺zJa0#o3D#7^vklWCp87n4JEuTؿ]߾}͗g)׀[:E,|j-& 0p@✜CzxxlDŇxȡX,޻woDD+vuuػw5ŀA۶mOUTQ-Zd2D" `䱩R]]ݪUJa qy/yLb5N0T444xՈ$b8%%`̟?_ 92d +; gi]ulll<y0C'M<2Ǐwttٳ'$Q6ׯ_GGG^:;;L@ 8sAO-Z$Fy9#Gi믿ֺӧ;99-_\a"ӦaBqgϞƍt  ғtPVVtȑ](,,ի׭[:t@w,ȸt#n4چ>쳻w|#$G'ؾ}ƌCtzԨQW^=p  K;xsܳgb֡CfH7aBתU'O~޸q#tt&Gxxx׮]j"]@wlYZZ~[ly	ݱ BdX,֦M-[4gXLwD-mǶm믿YzMAAODz5e''B!^rrrFFFFFԩS'!ã'X~i,XqFEKf@ 8@9r3gܼys}}=ݱ B%&&<xpϞ=pZ"ovܹiii+V`0={}t܌3|~VV݁ BĜ<y111t43fXtivvvRR!Wݢ_={;
+d&N"2}+(( ^Nw8-X<}~СC#G4z[Drz@PtcǎB!DU^~ע؆iAxiӦeeeцYiT^^^[[oӲ^z1wyby_x<^rr?áIPPP~233jI4Z2DrXOOO[[ې.ɉvwwpwwV|-	"##eGFFJg)-`0lרQ\Xʅ\.Κ5jމ'\0bqBB5Zl6`UHՍ7,A(WFD"Yh!3dVVVr6if9l6VWWL}}}TT2ul6ém    IDAT&&|)9sFICT5Xd\c /3lذZ-f꯿t"D"wqQUCW\ԩW? @cìK? xt`fooO~8j>ü<''5kܹsy󦤤d˖-z8qcSSS+**|~eeeZZ'NX
+$O$ MMMW^_}Q=LqTQ,#
+ϟ??|.{#FLV=~I&a9sXZZ{E0`I&~|> 6m ...qr:Ib"ϐNکS'Nf#\26v PZZJRɓ `ccS\\,7 N:%HlP? 8Hj튛J &)#G0zT)**̙3w|r&k.ID"tï *HttvXVZM>͛7rGc}}ĉ=<<RSS%Iuuq[jpB5,Vs}l6?qAFFƻp<==N<)-s~988XXXmv^Gsܹs peìN`3F.IIInnn,K1TLh!0cر |rb tnJJ
+ 7N:jkk-,,X,ֳgϞ={b,,,^z(N1C",[ HΞ={Lq?2m۶oHΝ;w &#ش4 -֭[~y1bүÇ-vȑ=zNٱc"WMYVtqaN<YU=b8ܹׯ5X,n۶ٳ:fN#|]NWZ`0- TU\\ )maС qƌ (|dxk׮0  RjP,L2q>>>#iind2:Dw L_CX+V~?cVUUX,KKKFjKKK&YQQ!-gY__6m]v~ׯg̘ rSz-$~C)ǏϯZn )] RRR|~uuѣG$Hn
+ {ECCCAAAXX $''SiᥤjՊuͤv&;;77WYe' C`l#jee%"v ݻwKT'rt{sZC8<@rfϞmee_.jƌXbE6m%K رcSƌ ~tJǎ_~N9teaa!J-^)ԩSC`҃U!Omvi1gϞ޽{ Ю];}I{rwD`k	#Mvh@KK<\.d2VVVD~gXqqq.]R,C$,N\w	H))!b***`>I&Io3X  to ҫ>ȯFIZ)CnUJn]{UwWHEDD<{Lߓ!,bEi0B^
+*G*e' Cfl/H$0窚Hm$͛7(MHmmmPPл+=" tbcc8`aaʑZoСWzA/-4h ܿӚVH|q !)]<
+("~q>}zYY?CRW^w_zȑ#mmm̙mH$Db>M,%mލ9277Wa`3ё&Iq+LtgϞ pa*ňgN("eKecވ$D8::=z֭[ͣ;s$F$ƺ>|P"\]]һT?S FrS>_[\;s9Rą.xŋն¨M}0Ql7TKղ p}'N6xutt,++#)Fo[[[K͛7666666o޼Qj"eTBpsv8S%;vrxb6ND]uu5 ;v̐+r\nVEErE/oDӯ٣[u``  ,\v߾}$Ѿ{;wϟ?_j?# xxxlݺl˖-={w#88X϶8oZ#wbbb***~W¦;^[!Hbbb yڵbcc)--x˨,
+555ϟOaZ?^z@̊v1cݺui p=C4==d$ "r*[_Pf*%WիV=~xhAbYkoѢEz`3j]{1g7K˘ CzeG]]]DDڱZWW7x`e"""d&gAH2!ro߾#.qјFhǎ\.W$rݺu={(g ֭111666SNUZ7NիD___C	Bw}׮];KKˀoFzE
+Lp\\\zꕙ)
+O:5rHoooceeչsy]vM-j/Q9ff#MպH?vؑ|7BP)0WFxH$X#}`Mpppbbtb{puueٮ{UZBR9ZJ)(J=-,,\\\fΜO
+ÇZ<y2݁wO
+~|ʕ+ͬim+--;rI$6m$$$|Wtǂ̾}ƌoG߿_mHk:x՗_~YTTtA:UYYI<|!0HK}B!S4t'&&>XAsSN}wVܹNBZ{䉗Q.::ŋtB\i4+xɓ$]cOOO@-]xx8-!rpp8|5+X`ACCۛ,x cЭ[7L<BCN0a֬YtbڴO<mۖN
+ыUWWVBdݺu믿;ӦeQ__?mڴaÆ;V!<}T"`⁌A~JJJ={Fw !n899-_<==;ehѢ76'O  ^jA߾}Y,֙3g!ҙɓ'%%%SMoܸqɒ%5x<~`_;;ݻV!	\n]~~ÇTixH$ķ~{ƌiNNNt @߾}ϝ;Gw!.;&LυB!ݱ$_p!##deT^zHw>}z@B!]ZlYee?@w &Iģ)99>z뭷ׯףGDrA!ts~mcc#ݱϟ/]TO a⁌K!ұgff 񨫫[rZnv^~mooOwO=0@!d~\\\f͚|r|4H<֮]d2ϟhR+dl0@!dΝظc11Ty5 
+ʧOB!c...SLYfH$;S¦X.55r֬Yzi/B&,,d޽ٹѣ;v;4 @ ߼y )*sIOO?|p\\ݱ/͟?ѢE	i?11>;Ԣ?ҥK%%%EEEw}5 0L!,,,޼yfS!WO<!6<<Çxtb2(}ؾ}P(LJJw4HktGZ˗/ϛ7dbD;tYBӳo߾gΜ`e}	!'_pwߥ;ӠHv)S-L p8@-̙3}}}p8_FL0A,3zhCׯ_HH͛dO<~J<a0@ƀ,YD$44!!H>\yH67x VBBBNN>W"GZZZttt۶mҚP(ċX17n\NX,tPصkWZBBboo?dÇH$i		!/Ow AMq֭?sƌix #d2WXx*3q)n111ăiqvvzP&駟lhvbH$C[7T|BF(**Fv
+>|8˥+$LϜ9S^^Nw &,Dv튏g0iA( ^jʕ+aI`Xaaa4ƃRt%i	!蘝Mw &,8s̓'OƏohvoxx>}DDDH$<2Z@ߧ1L:Dw &,عsgXXXvq3Ȩ^Zz҃c⁐ӪU+gرx@AH#111.]z1݁;;tl5	L& !			3f&-Ol hiiGw Neq麺QF2)ox#}֭!ѣG^!cccӿ\1v*P///CFC$"dڷo  ݻw;޽{ 	!DGG<yQSygnn.^ge*Z`QXXvZ@5662ǏSp;5- pZMHS+III;WhG`0X,VԪjڷoHw HUUU:پp;5-
+]mHWΜ9Cw FM<gg=z85ӢxPSSS[[۶m[AT۷o̘1Sr8@v;E:ѫW0jxgXifggg:2	u ={,,,Dtb$$??O>iB!ի@ģgZ,,,A
+!Bt	ëH(I<󭭭ufhlll@!jX,V/_Lw KIQPPoK7L&!B4
+		y&Q/%GQQomPPsB!PTZZJwK>DDB!^zS1RÇhi/B!WN  Oz"x=ձcG:A3!Brwwwvvu݁)%#- aB!Dvݽ{(|qm<almmR+B!zy{{?~(|ѣ6m
+j''Z@!j<<<rU'Oxzz
+j/^B!P*ӧO=<<h	5Kcc7oH$		ILLp\hwwwwwlD"W!`0BPqzsJ*E-$զXz܃Mֶm[KKKkk됐9s\tz4J.fFuj	T^;CRuss{wg͚UXXf{V?`0w﮸v#Gllٳg֯
+qciS93k׮.AӋx_W=L #!
+Y,޽{%;dggˍ^EDD룢S:k۶mӛY$Hm!D6 $țgd̙3WھY$H;ƍm,Æ-Le`? ];yL&377W*RZ8Tձ$q,<Iϓ9O4	 ֭['"lmm`pܦ& &O4I1 u hhh;c!KgFrC!pe1 Ӛ5kܹ޼ySRRe˖^zIcjjjEEϯLKKsrr8:-???>/79%u*u*S0`  tĉ<,###,,b+K,ESSիWo߾+M<ϟ  0w\Ujϟ?@b0][[rCwbi>Ce@ʖxŃ MqcՆR)*;  &&F:U]věϞ=+5d عsgs@qcTA$85C1F7o7oׯtb Ƴ=~8 888;y$ *..SNI'GΝ;͛.i淅br$ ZBԿ[(N kkka)&|> 6m ...<OX ''B}`ŋ} v>z \.(C*6lPٜE"1eժU 0uԤ$ Xd	1](GiL9"9 PRRBw _x466-@˗tdee@rr2s' X`񫛬Hꫯ `ٲe<<%IPlvJ?9{6dގ=ӧw˗ҒT]vMNN )S `bXZF,o߾]:ˊtz͹uց^***" ޯ_? 8s1ʕ+uuu۷:$3"H7551WA&&#Ψ>XAA 9R\RVGTYYuV$A-w( {<yrVVVqqH$Ңׯ_0a tc~w_bf*bL}`ÇS***{Ͽqɓ 22RJCo7g'O> "(??  @Z|Kkzg"ӅN/_u5G.]09L_S S={ ˋXVqմ$~b[], zˊĉCUԴ$ӕo.CwbYZZVWWK$jKKK&YQQXDJtj4,Y cƌ=z4 |N^&<<\#qHcek"J7g%H.^ ڵ#f@AAD"4h O:9sDrtbhݺuUUQ 3fLǎ?~yf]4-iÇoܸr#Fm߾[n5ƀbyxx?"MO"h <l0UL3d/ԤIX,Çkjj ȑ#L&sĉZ)bŊVZiqi͙8q9PH\XE1 ҫA~~>BH,  
+JPs$$$0(x~ wG|J{#Z@@tk.    IDAT pwwEvYJ6-딛HYY ""J+f  d'| `+1FuCtX  toF(Odc!ҦM⣦x%IZZPTve?~<{l pvv~1WDcFO)g6.\@<j׮]tΜ@ppp3@}0 C\wA1F:ASb2Axz	 RӉ2Ǝ۾}gϞeddzI նE;ڷosN 8w\3RD*L<\HHӧO߿ $}q!Ki=$,,&n6rOOϴ蚚E56):֐TmISNӥ5"k}53Ew FI6٤m۶Ɔ(x*8EGGǲ2b'N  [[[&+H<EqպmX,>0T:I
+ i&ى6l AQ1<Vڵk3XOLt`|WWW j9eeel6fdhұjkԂ,Hrrr  ego :tMGq);󑗗 r5WF5VH9;;]޽{|>TRmNNNiii|>j$ϓ~
+CNJ6-TT bŊ@C߿?Vhdw{{ϟ?|vvv Ec`B|rwK$
+&Ib>P(9~l	j9			 0rHeHU[NvSܜ%ɋ/Q,;kԩt&YSSC=U(3ur8 &*`a>nܸ %uuul1"""eT<ٜjSPGGǫWj3T,^ddL(HOO*8B-6X/l'(9ʀT9=b0.]R!JWtF6*J*ۜ	!!!\ ޽FEqcTA$0PQ[[ yyytb6VbqNNСC=<<lMpppbbbaa\{FDDlWW׈{RMS mVq%ɏۢj$]hѢ޽{;;;X,s*}ʪڞQdDV^jeeeeezj>Q%3ģ[n g5OV֭
+l,...aaa3gW"@УGHUCPU tEJgiԱjknkCqs&w@UUt 0|!EeclA$0P!۷x8^3[[۴4]טXEHt}veFvv6$2CHB!2*l@jQ*?!<aV0@!B	j9`;:dr[&f%  ˗uuutB!п`aV @B!L<̊B!ìXYYyzzbB!&&(((B!L<MǎoݺEw!B&Cx B!c	
+
+~%݁ B!?x; @!BFsmggB!2*xѮ]۷oB!B
+~:Q B!?xТ"@!Btt/44ŋ?;5j! dtXnnSx]2k׮9(Ԝ>}Z$֭[dH痗1]m0Cmڴ~zTTݱKϞ=srr'O|}}ccc'L@w,Hp;5;v8tѣGz-cAtx<u/G&sСtzyfΜYB`avjޗZ!s2mڴB|"B:h".tRA! L<Uhh;wAH]v[n;JAAm֭[gggGw,!
+7nܠ;c0SNݹsg]]ݱ d&ӣb!ぉywpp<yP(ܻw/݁ d&6lptA<1.]Tj*..nƍt9xW_}pB___cAlȴL6/^;L^rrr֭ϟOw !/?xܹstǅr^pppfff=!vСҒXB_00C/^pٳgy<@ `X"Ȍ'CBBBrr5k!󄄄BK̇X,NJJuss矅B@   HdaaGw?~<ܹs'݁ dfϞrJA!%00L&300 $	rH1BCcn޼Y"B۲e5ݱ xٳgq8Y|>M6	!L6tyEbbI@w,!&fdbXqD"z+33@21ͳ\v-݁ JxJ2	ӦMy9݁ d2>k׮M6988BJIIdXL]!!Dرc---wEw 3f3fȐ!tǂBd00CVVV[nD]]]Aٍ?>==]n#y<^jj*݁ x=Z.s
+O?t;z֭[SSS=<<!l_g2ƃu~~~CMKK;ZEE?裏>XBH=L<̖5kL& p8___#BHsϿx"݁ db]]]322!(Ü}ݺup8butûvaAH[`ݶtǂB`aΘLݻdr̙]UUEw k׮-Z/;!H7f){SqqqYY5KNN!㏗,YBw,~? E=zh1::aUVV߿_W!ܹ5݁ UUUrڴi7onll;g}ӝ;wbց2-:~CKET>}tGG;
+$$$X";;{ĉtǂQ8zƍwCw,!E(//c~]y)SǍGw,!1L<BFm%%%݁(f=<<bccϞ=]1DrXOOO[[ې.AqADnaa
+BڕTiӦm:$$dΜ9.]RG)HQ"kԨQW\!oaH$.O{C*l)5gY}ݛ(PSe2Cq(e"##m6ڕSTT࠶E#+Wx(9s9xbKKˋ/BH  ~ArB-X ??@#v<xb8%%Eb~a^^Ӛ5kܹ޼ySRRe˖^z'N<v옣cjjjEEϯLKKsrr:~[h.]*t~K.'NxeeeJ8]ia!)ի૯Ү*]9~%K{|~.BȄB	޽{6()E=z \.WbǏ Rɓ'ƦXnVqq :uJ.Ν;͛IB+++ }6yCYZ$; )wvv?~<1 <@9rU766Κ5ݝfȑ#FppX,&`(IZZ,++ ;vъ(.O?f/X@ZFex<yKJ999 >(
+7vXOOύ7B5&!n:]UG?\$@FF͛7wMصk͛7222Toܸ1yd ԨXaa! >\VP\JmȑJI5jԨʭ[OTll, {YYY¨ׯO0 ~m7oޭ[<HB!&{/B8%HmfiifCssseo޹s' |> T[/_jT@ccm y X"ٳ eKʩ'r){{'+֯%YZ$ƛˉZ{e! ^j@q9::nڴI'mذ!**J?0::|֭[l)//,ˊ+Zjb3fLǎ?~yf]$>|ƍ+W1b_]]ۻuV\\ubyxxܼysƌIII-!3$n_˗;99~9YUUUT"ٳgi|}}@;˩/ 7nP:4]v7oKUVV6p@ PZZ$;yD> l6b%ݛBH3g<T3!1{l6;=8;;q8WWW<==Ңkjj-ZQ={Ç5lbP:NQ4v?{L.K*վ}{jsi89ggg  &&E|4N3g|Ν;9ݱ n`2666sYnݫWQrr;w.]__~5]fܹԋ/Z|)E$^wݸqCn֍7; 4ieY,W&zIUjkk5
+ Ӈ~W,cv={dee!=Z!dpzҥKAqG8y$D]HئM&yiMJHH #GjT,&& ׮]{=>PZZJ$wr;99UVVg~H%
+5bŊ@C߿?yשBRx `ooϟo߾ (Vb0￧7 /RdXccc<}Bb틊"pssܻwX,8mV_UGV%&xm!D6H} 9X,{LL`tt) 	NRRRAAN&/^ܪU:W? =JL!ۦMZz葕tbuuuTF<Xi٧{)8zI]իj)d"Hi/EFFFoׯ_MHH0J,,,gϞ}E2+Vxw.m9r˗/+$.ѣGz󉻤dnPӯ^
+ ~~~Jc"*_{j?Ms޽{wJǀ*? w}G=fL<T0ă⑵>**JiHGV ضmf$	Rm[H*M1 = 9c2v⪩,.RÆ#xzꕣU[\J;v, [:E,|QU$99 Q1X3tP6MV~^QDqAXwވWWW6A@жm[KʹvڢEzblllBBBΝ[QQX?&I,zP+++++իW+޷6rz왯oyCyQQNVJ)V%%%ҹOA  rh7*(6qݺu)`pܦ& &O4-GVDc7wR|1@ЮCB)S f˝7CH<k	֬Ys͛k	`9::VTTʴ4k	 OvjZR'mR,= 9<(,,bCHޥeBauuϟO*C&r.\"K#d||||<yb0  trĉjWVV!ԩŋ	Q\pSSիWo߾ϟ  0w\*Q6Z*߱c H\p ڵk gϞ2d ܹ9aS<ijN=B8|h!Æ kkkl  L  ntpp dɓ'ƦXnVqq1SNI's yf鲋kZmX,ϊrBR.ըLQQ= P:L<|/GfC,O8Vz۷oS,1Bpee%]P:绹 骵
+ND̎"j* :ujRR ,Y.
+GqMV+-ݱwcǎC>W^ z!4I$x(eq	ɋ@JJҹ))) 0n8btݻ |||IU}^mX,;/!)CojZfٲe 0bPO?ã@ҁ/ҒaQCCCRR"~{ܹ+H$"~`=zJ T@PDҥKP{oRl>) {`7'l5[vn*=T=)1i<yk׮ кu7o]J L D"QPP lذAv첚l~[()7K=@=Bӵ}ņK5-C\C=0P#.Nw 5Wzz:5]ӧKKvA 77/^($11 lmm'M}[(]Fx׮]#.mԊ=`$--IV5Km?uT  N=3 &X^r% L>9aS?ijT{C>4퐀  رÇ.'
+&x7666XCC XYYIH={ ,w_%Ҩ-J׮vzJr_|ܺK5RQu,X2GaXku4B쎼sss<a|>xUUR__O<mY~ĉ$+(B97WUUX,c㚸?	IX!rGuWkֶZbݻhEDZEVEqa*VE 
+hQ
+}_q%yK>sKgWVV
+J}}}&)1̀M|{GKqP( N:<#G;NaK,~]SyVk7{[*}}}P>!''*[RϧL$_PP8<
+MrHRG3055U!Mٲe˙3g6(u$T= 8 ӦMSXUVV֭[ǏO fff>Q"$M0A4ҴP()SL< 6nܨԦIDp_|	 &&&<ssĪE-[\1(--U*lt%]{DPn F!>X3L<ЂģIZ?y$ 7 'PdcbPd `aaQRRBqGH{H-@۶mC&򄄄lR':'OlmmG)/BQUU-[?$S;|pIkya@@~h׉Rb    IDAT&ētbܪ'OO>MNNN FMsr&TeHnn 4`!41#'I#eM2ٹ[^$H97z說k6**5UV?@"E={ӹss8TEZ*ǭښq:ggg۷B 0rHƿJMuy $$$ˉqEIII!w"5F_s߿?(<xS9= 			qqq3fJjZYf> Q333%)v5 hѢRɊ$F鶲>,*Ty_()鎀X,%TմCTLٳg)FB> sNCCâ"A''={R[My_G˖-Ǐoٲ V^lPcO)ܨRn!·W4'rpp ;rvv b@~aS5fu&N{Hrv@޽KL9k֬_Ka$C&-H<Ncaa{|.[[[#1q?|߾}EEE\.x$lhh ˓\1BNUMt,` #$eh?eK@.>|hݺ%K!J޾}ۻwoGGFV%+ƍŅm۶L&d^ww-[UUUx~CqJEHx^XXd2^~M6yFK}Q᧟~*
+ Lt7¦x]SyQ=~x{^4q8c 0C;j___C14___I?KǎS
+/$['YDG/^044d0NTR*A4vXˤ`A~byyyt"@ 8{l``666vqqYhDWN@O󋎎d ==={{`ѤeHBV"$$[[[>e.05zݠAlmmOGB-"~#/ жm[yN33{),l"DwF e&o )>ՕX+A I@Ϟ=A*5Z^ծ5552߰aIȭ[9"gCoRڑxB@`ggbŋ/Ѿ,ח-999I/W$:8_f#=WZ|s9U>}.]B)r\.IbyAYSSCf/O,fWTTKOrՊj*l-4q!!((2VSSӿ{{{MCIeTk-DǳSʬ$33sڵ366vuu/$F#UQPG p)kk{A6yIq	Dl xZE̊ VR*UTk*5IeݢhELoٲ<ȵko%G 9&@:ݻ Dw ?_
+EEEeggD#ss;w>}i[XXrGTg""" bNexw#V|77+TfV299yժUMڦI{nvvv?;1;|2ݱy0@999Ĩ|	h"|)н{ѣG$[d˖-ǂ$166Vjp(& 6H/!~>8RD|aĈVVV2g@Hc&%%0GE4bRVv횔j*uU>*zzz?˗?? k֬!CWvqqXzjQqAAA'11֭['((H;a<<< 	ZN6-##ˢNM6	A x `jj:bĈD*#ZKKKqƑKMM`kVXDUFϝ;wY>K I>xO>޽{SB;w%߿LLLzj߾}!Ģ; ф:jV`׮]ݺuJKKܗīW @4b˗/WM<9...&&M<d+*lvhh(y`
++!)V@EE[l~~~~^JMM%F>@:|gׯ;fh``tmCCC#;9===;;	&(!PR\\<xo&''cցBBHǬ_t? sbvvv /s-^z@ lY}^|yYY/؜Z6gС7nP!>x tc S)v9kDiUtq0)4n߾YB`5,ҥW_}Ew   Dm۶'Bg;vdeeI"ş3g׎3xjY=x`۶m 0uTc-66=zHMM%d!"`5zzz[lp۷|}}߼ygϞÇǏGDD0(6rȱcǾ{n/..x/^	&tH322zݻwqϚuJJի===}||ƏOw\28p`ԩ3gμpy77	LRǣ;auu518puuQdS|-yy2$AR("zHʌ;`0V\!D'	'!^PP}v؀ ;;;ellxb9LLL\kmmb}}}?9U>}.]ry333iӦ޽{׮]L&^[BH!ڶmw߅L<Y͆`˛Pɓ*znTyeTBZAAA^߇Bw8!WZr%K鬄>}´4:B&!bN2WDDѣ===o߾MS5|x tY~͛bŊ7o5553fXpʕ+4	Bi&L<B:n۶m`ڵtt۷weJB%BHǙܹСCCH!>⒙9tP#B!mQ&N
+B P\\Lwmƌ˗/OKKcp4?O?4!!aݺu}!Q6m()5OfffR֭[1ơC6oLw,HÇ޼y3$$R~򊍍UWm1AǎKw,inݺڵkٲeރ;5rrr͛_}_!>:ƍϟ?_h݁ Y/^7{욚cAZ冄ٓ޹s'$$jL<tPxxAtBw iq߯ZX{n>}nNwD!05/^[p!݁ lllÏ9rEcAn޼y,+==}͚58 B&ѣ!yf͚駟zXƉwuuBBBO#B!݁N|	á;4מ={/^,
+iGx{{R;L<tիW_x"gnn/\ti׮]tǂWQQpByFFFxx=A!C899Bn;vXfц۷sW\9uTrrr^
+!t&|2>@+VL0a̙/^_ϟj>iiiC/g̘'2B!]8zݸq!qQKK`.K,IOOӧO?Do`Ieff߿E377;(}x1{lu-Zy_ 111CxtG޽{#FѣG]]ݟyݻB},0ׯ_ܹs!-gϞ{N<
+ª8CCꔛ;iҤ޽{s۷o߸qo߾tBL<tDddСC[9B*1cF׮]/_,Zd2>LcH쌌%%%K.uss<uTbb-<B"x˗/'t)--4hӧOh!Ͽ~zQQ!*RRRm&s=k,GG7n<ySLa2B_]pi}}	&BZ&33Ç=:X,։'h
+QtC\pD|UffԩSSRRÉ'bʁBoa]p`###AH<|ذaeeeky<^dd$Nmo>~xO<t ¸ѣ~[x"C=|޽{
+!e9::^pUOOOOOOgϒ?0DN ,_|͚5<x0**cرoNII	9BHs`N84x`AH8033666l6[b-&~GGn	X^UU5o޼;=h	!	L<;y3W=T`0&Nop8*wׯ_QFŉ@`2}9wBvٳgB8$$$;;{̘1  GGG/^xzz||>?##nBQv;~A!]tܹ'''"tǅ 77o߾yyy2G p8}!4&Zح!6lXff<x/--%: FEE}C! ՝9sbݻB6ÇEEEƍsww;TYYYjjjCClbX,6pԲi//+W*BV;~MMM#---==ӓ@ta~:weT]]˗/;vfB/!D7E!1C[eeeeddtKwO x<}}}AgĉtBxhӧOjǇ@}L&B0VgΜ:u*@!BZ?uTA!BL<RLLLǎ{Ew !BQ
+111!BiL<OZZZQQѤI!B!0>]v;B!C3gl!BH`eRRR^|B!vCvŅ@B!R&ڄB!u0&o~Ք)S!B!`Mbbb\]];wLw !B)pYlgP(<wرc9N-\]]/^.Q,66vѶ̙3BPB`0:v 1%e/$HFeslll<==-[W8obٍ;6))I^1???~~~2HF~HvJ^K,<y2@0dρBH;Ŝ9sFb				 Gw HS7Eվ
+4jjje󫩩Sȑ#Y$HBRDmT6GR&((qL&X,ͮ$VTTKc dggʒS
+ZbaEE ޽[|] ^5! I'Z#&&GNNNttߌ3^jnnsΧO׿>;;={v||޽{\nQQѾ}ͯ\2{loڴQ	bI_mEզpse*++WZe``pKnqP "ѨQAHHtÇx__mhh>|H"##@___ ok#G,,,Ե-BMHډO<4Ϸݴi݁ D^r ZlCRƍ `ll#U=266B{ p!/Wdb
+7GR T$
+jox/^ ֣ `aÆcd&˵~	 e½jܹ зo߆קO 7oImO<B*|!>)))&L;? k֬ҥI1tҳʸ^ZTFw} ?C}}=yK/c͚5 pi^8FHkѢ  XVVVVVv-$2wwEUTT\xQv۳gOv222lٲe˖;w8::ٳG@!Ԥ0/^tvv	}nƍ#/
+ 2It'vڵh9CzIyaܹsGW)<.E<IDN0335j?wٳg|o˖-eF7o_5 SSӨ(qPebbM jRxh(#yW^NG/_J,g2O[l#zIa(RG"Ѿ}{ Pjs
+jok׼=:<y2 Ĉŋk׮O> f̘"j;Jϲex<[|+G!0999yyyx 0y.]:tH]%@ PM}lbii)sm``ARR۷}EEEq-,,Clݺϖ-[[3BpႵhB5[[[ x9y1bx|kҫLu `֭$XRf5E)$#GammɏjovII+**F-T`bb/̮ BFB";FPdhh(B-pѣG(xyy;w̵r)S8;;8p|+Kp_1HCc{{}=V&Q*y
+
+ `ȑg#GDC!@/_d2+݁ Ӥ隙v hBQ\O8 VVV_D*Ty_(֩ps$e233tϞ=Z$C#PbX,Q/{cccccˬdڴi$WiӦ)<>P,x8.BHeʁ;z~uu5݁ t7FD;~ݻwsڜb=Qc}\nqq`	uJ,644tQ/ *l̾PS{ↆ/  |||y6GrF,X  Ί}xDB&i``  y0t#G;
+ƨWF%oMMx7ݎSRaTdJmرcETP?|#B/Ɲ;waaa 6ɠ#F @XXI!,/6u!2Cx<ǌCw bbb`ggb]\\/^,>#ɕ+W}}}Y,ottt||^O.oXK/MXYYgҥ)))ϟ733kLC# hժ˅B7|lTd͙3=B!-3yd!oN9O>obaĉ Kw  |!T`0Μ93i$8C]zcǎu B!mǢ; Dʕ+~~~tGR33B!O<4׋|1<    IDAT/>|B!Cs]vۛ@Bj4B}z!BCC	}ȑtB!`⡡޽[YYB!CCݼy޾[ntBÇk׮]vtGBuM17B5W^ m'ё)ݑ"vC}!999,,@B5dbׯ_yqbbǏ߿ :toժUkNOO@!&JOO>|8݁ ss^zK|!-**z?_n*)) `ll,z*"ҡC[[[!h&y&k݁ 899999IBRRRˌw nӦMܹs-}'BYa⡉n޼9l0@!
+OHx<^QQѳgݻ111o޼ 6M<q/###v!ۿkŊtBHml6pCw/^!u 100СC`C㤦6442@B59}}}"_r矂㑫WLMMş8;;w 4&'))svvvtBSN:uX^VV&8q˗ вeΝ;I!dC$''8(
+8Ӌ4@d2B1666666#wvvvAA+Wo^]] nݺuB.xh;w̛7@
+))).]+..6558q"AigϞشmۖX4KIIIaaa۶m0(==]^cz#kM6|նm[l}+B`YܹS__O<>kmm߷o_Gh;333 j*///55fm۶m۶t<==Bu#kyɓ'?~'ORRR;rƆhչsgWW׮]bj
+xhd{{;W^=w\|||eee.]ƎcW2K.04ӧO]\\.Z7o;wLwh۷o߾%|>繹999O<=|EE lْx"ҪU+bGP(3yd%=(66@\cbb.^XSS3`cǎ;3R<xԩZ&  l6{ԩǏ;:͵yj r;v>}Y$FUB쬬~5 {˖-!`0Μ93i$8xh>oiiaÆ?X޿ܹ؛7ox<__߉'34BMMӧ8C}}z8(	.RPP = `X}N:uVVV44PII"rzãCQ!&`S+[zQddɓ'+++qI&akGDD8qÇ/#Yڵk1 p<8bBݻwܹ7ߌ?44NVZj%:sBg233>|ٳg `bbޣGwww}}}ZGiL<4ȟiddNw TWWGGGGFFfdd899XbڴiE@ `2+WlΨçL믿]->|`ccY"`0AƏO,xO<{nvv}r իУGcccZGݛ7EDFF	&l۶mȐ!JA&&yԩ߿9 9RvU'ݪb6lΝ&믿{nHHH]][^zݻwݻ~5ȝ;wFEw	FDD6,***  4A|||޽_x!{ÇK4B$,--m۶h",}1118j$===ٳgKJJJ̙3_fXÐ^zuyAcx]vvu5𰰰ӧ믮tM+
+F?HWTZO?=z{ d2LMj
+D/b~C.?3==?|0 k˫_~=z*L<4Ž{|~>}ӧO{q.[ΎRTTI]]h	ZjQi#&yP6w\33#GyhmtR (//'wС>>> K𑺦s玍M̓:wt~|{駟É%L&bڵ\\\VXA4g06lHOO:udd$ѡ1c6mtׯ_?|pm۶677>|͛dvBi|)ܹӻwo@Q\\աCSNM4	7FHH; [liѢieeek׮e2l6{<OBMMOOu [nXvɠAFLw!U`)222f͚Ew={GGGwܹscƌtر6ܹs̙Ē}UVV"ׯ?u3̃-YD(.^GSN:u?> <y?u?_899{{{iL<4BYYٳgKw Hu|>?,,lݺufff?ܹsl6AiE}V-dX&M4x`7oXtiCCòe!q/_344:t1cڴiCw!0< ={Rуϟѣu֭Z
+S]vI255uqq%*#ї_~)>s&I FHC0LOOOOOЪ7o&$$.Y[n'N6m6BHcÇX,\gϞ999k׮ŬC-jkk'M՚W_}W_-_ɓtǂl'NKzgϞ]<8,,˗tFx葛Q 366񎎎tG;V\YXXxEcHmݺ?;wk!2g'N(--=w_ݺuk??˗/D&CBB⒓3o<U^>|Ik׮Yf7.55XR ((eeeK}}}@@@NvYUUEwt!L<4@CCCvv6cE޾}u={믶tGS
+/^h"___c1QF>~phʔ){VV_hhh֭?ӂCC裆0π-[:nVVV۷o; wĉvoHt-,,x׮]]v]lYyy9q!ă~=bXݺu;ӧO 8qSqƉ'pf@abbr庺ӧcsyLLL/^O?]xĩj~xѣG:u¡4_nnMRRRvGyfŊ-;vvv.]}_Mw,b͝;7//믿ꫯ뗟OwP}\0ߣG+//oժUBB6M6ĉv튉;Tf׬Y//L#B#rrrwNw7n\CCC\\܃m˖-?'OFٳ_եKÇgggBL<h;wLw ڵkݻwE]{~)݁ 2;wtss>}:ǣ;ի]t	
+
+z Qăfϟ?ohhԩ݁ .\s΃JKK;w͛LRh, ##/`kP3k<͈xh9s̜9stǢ6nwh֭[ڵk޽iiitǂPcYXX:u*99F`AOٙϘ1tǢ޽{6jΜ9cƌ={v]]ݱ X۵k4R;A|_4n&4{)>X{矍Emݺ_~#G;={ٳ@R%Kx{{ϙ3XexUPP~ՋXtY^^ob
+AСúu6oKcAƱc^|y#Ԥ0ٓ'O0@BpΜ9]v]fݱCjj	tj*{{{etömvcAHgaA"L<4Б#GҎ=Gw,K,atǂpBCCO<Cw,ݿKAoڴQ__k׮QQQkgΜٺuk6mii9rׯ zkWٳ-ZXYY-^X ݶmǎ;D{xx0acbbhɓ';vW_}V">,[֖b8B1gΜXq>݁(--\b݁H}}rAիɓ!?  !!@v3gsJ~Ĉ`0Ο?/Q֭[?~}~]]7rBݻ   @|/ƌ {
+`ڴi5t۷q7aqdģ]v ǂڶm;}^^^&M;
+(zzzyyytz=W^@H<ڴi@ 8pߕ+W޼yrEvG6J+ h׮ݭ[jjj۶m+~uV 033;zhYYYYYYdd) l߾](X,6]QQAf첲2P 111嵵}5kֈp嚚GFL<YddQw<u݁辧O2Wjv}tzddd +Wi1U `bb"Z`gg'6@6Jt /^777 ȑ# A   @~@RRx ЩS'8W##&lƍtGϯw[W3|>݁
+!#FMwHI$>|)Att6k#D__ ^~-*PUU%^  $6!s ˋS<022 ======&d2Eal8`r:xBM׍7\sNsGDGG?o!7gΜʋ/BbŊ[nݿ@ 	77n
+-%Rw)[Z32-- ???==rZ"|>_ D=	$[K>#F2@tߣG>}:ydAjIw ǨQvO?}Dk[:;;͛7} pmbggg _x% ܹ3'Ù:u* <yɓ 0m4C޽; ddd{C&t*..'#%%%55uÆtQt钍݁ ={KKK!5`0.<uTMMݱ צM ؾ}{UU՛7obcc,Xl%D_e˖޽u.^jŊ'N8vʕ+Eg_~_~IXd	#G<ÇO<߿+:CzeiiFw&Nد_?h<4nA͜9B|/>>>  Wٳ1qrrZdIaa#26mccMC}pp_ER600? J$|(22R4)I1P(Ξ=hggf]\\-ZF	R?+hx<rJJSY	<<rرc_B7o,\uD\,"HxH-ܾ}Y:k,W)pDx{{׋WBruue?YTSL<F嵵4#>}ZaI":ROOܹs{ ;;Jb̯QssO_;(Q6-~G(ɼ|ª$9i~~~ܘ ]WFJUG^ZI@5 .~~~JϗGvFT;x444رSN:tذa˄[XX̟?nf```hhm6C(رxΝ;+!!!88fv}ʕ$qJ-'h'jf|MV?h<Ħ"::b56ďI[&`rrr ..NTG;w߾}{%y/ĄJfff{-,,rEEE#:M0ݻ YѣGFOFNCCyMJ@RxbfnnsΧO׿>;;'	:+DIK jA P'Ol͟kUV OOr)M<L<h ϟ?;$[^~=x4'|2`suuUVx<bs璿?A塘xܸq =z$QѣG3򙒥7TTT Iyw0xݜ\ HMM%I|]r ZlT_YAL<tɾP/)M]gMSQUUf<	JcGי+R0Gv۫W/cccCC!C&%ߺuۥxhhhm׮ҥѣGU
+eB?<dȐ-[W^ZyA,ՠ}Q\]]Pcܺu rssrVܾ}{ƌ,bĈ׮]Sc[ZZ.ZH)	.G|EK?ekkk?3===*@ W@FEw.
+25sL h׮۷o_B(#/&*" >}RxXYYQYԦM[!٢;A.6e ؼyBʞD ЦM:yB4uErȷNϜ9s$JTvE %$///  ,\Pj"p,#;$L 9d$\.wȑ2OKĒsJ**#{ًtޝc 	Y}Q٩SlDQYt89g8<
++Q޽{7 ?f سg§L'q(x1 az N8A;~8 Ḧ$4'sUؼ[1X YYY2+y tЁ333
+ԚZIt>RٜLƍS;AW]v /T b]vQz_-)M]gSiӦ6mHT+~6v!ү؄P(,//_.q5wdHoWzGi%S;CΝ;E+**KMM
+
+
+[n 33G;T    IDATEFFW#  i&..۷DCρV  TĚ5kB!IBjwY[[7H?T
+??+WyٳHZa%_} k֭[555m۶U.--eXl6xIyy9feeeB
+2Q/_VǏtџ ڷor\.C4*bBHV$Zl`0n߾M^R5UDT]|YqYt. 
+cVjs28;;!A7]w1AF=+DѩS UVk%;JJk_Cؔ Պ]Q=/ёܺuHACN؊/L 9d$DÇKvss(O  _.*PPP  &&&UEe III"zcwIo3A
+vܹF"ZgggS,OHHHcXkx#it DBo	   @O2Qo)KRd eڴi7J\zܜȻ"~oVDԛxM0Ν;XYYIJ%`*L&SUޛ;A.'GR%,Ґ 36q8|D='jcnW{O%ćӸxKde?wһ/[2L<䐑xCȼ6Ŀ3C{D <}Id2lP($	RH,W׾lʕ5Ҏ;WxVDGGNW	+ׯ_
+TUU){;w ?===/
+?e8;K߾}.]JRd-[K.))d׶Yf+J4Y`5.WoS+*eJJJ/_ %%%J)Ϟ= s\ۢ;AWL3Z'&nTIi:4 4R޽jOܮJ%
+&2k^(CJz'i%S;C8NJ2B |> J4q/*"nqRRRT?ظqP(\hQnn.;e+Q1cXZZ秧[ZZ?!22b\K̍ZXXSZ[[hBa=޽={@ XfMll'钗/_>|xUU:w8<P(?T ~߾}GZvk&׮];CC'Or7]w\AWxGΟ?NP}acΊ)S8;;8p|+KJkYQzy=%'jܮ4BbA ̒R;uiCxB< 4=
+R$^(Pa޽{$A
+ZNbfSMk_T6vXqlP3VVV2gɑGYA$>ɅPljE~> 6l@l2*2yq6Ɲ;w@Q6Ӧ?~|˖- zj[$J֯_ ݺu,E(FEE,YB}yJ,v hBR)bX,mUE]Ν7lؠmQw\ ]x̌xw"_Y!' Jz_HBc1+MwO%DU\\K@+߷|+Bj;%S;'rH<v &&&aaauuuiii͏?^^^^^^effR$7C_HmvvvϞ==|0n$HPhcc Nh9*	ug5DKd/QxVt ׯ_*ع
+ 8;;w	 ޽+ZS&/8phTmƍŅm۶L&311x p89?|@A⣾˕yJ/;v,~L^WaA,X  _E#GT8M
+-7 H#ZXX޽;??P@P:+$bnhh d}^R":qu  KWۘە_j* h߾}RRһwq_B[XXXX]]}ҥ6m(܊N+n0CFrRBa]]ݠAWy{{ƨQC"K&PHP(={W׾w_uAqUP³Bt+2k,e?TUx\\\U[$ɋ1/^prpp ~ h۶xeqD7q###H9İ|}}ƦF,CCC!NJmN:TWIoQw\f=BAaj___K*uVHoرc2^RRPiAPeVJS/)--%h'~'d+Bj;%S;P2PvGTq9V2Prwf```ll-jQWWuVb۶motT\fwrLb-Io޼Yxqvl\]2WWWSes!333^hhhرcGN;taQK_@cccKwTxvAPf2Oڿ>o<227JG&>߹@  L:Uf='O OOφډ+ fX־эN̚5k `dRjslܸQu;.̃XѠ=.../V؁1x<'''KJSYiAe<d={ZoWJbɓ'OFmdddaa`l ѣ]tamڴٰaCCC*;%S;CP$&&;K.]f̘n:}W\>݁|,.\7j*Zvmee%݁ 67o^p!݁GXXزe˼Eg13gL4@4NSjr(>vh*%ꊊ&HWYXXyF4%B:ʪ(Tt/_FDDcAPă6xh*KKKX<{L wEB y@R++
+P݅ܲeVZ-XW^ĘHC0с\m<<<<<<v!>@DyO>i&GGG}}]FEElK[haeehѢZJTR\5L<4:EM-//``ۈL)BD˗/߿Çmڴ?~uDc׏92))I<rʵkHnZ,X@ ?;wn-&NH-TTT4˗ p<'C`ќlmmi">Hh{S+Wm߾Ԕ\{MJJ233;zhYYYYYYddibb޽{I^xƍoY߿|[$/ٶm˗/aoݺu&Cp\L<E#]%zAw RSN={̙cmmmmm=wݻwV9f̘c㚸?]6ZQ+TъKZj^.mmUAպ..XZ@ d2$_r9d̓3cÆ}q¾hrʕ{vppݻʕ+ktH<D"<`rrr'
+a,,pr="zwሻwr̨.ƍQaa!w_oѣ;`*++q 	1<777 suuEaP` 666b1Kj5Seд溻03 Cjٲ%)ND[o,v ܹs׼YHPխ[`ģ[.d2x3fΜuּ͛7GEE'{׌3Ξ=[TTt3fԼY}%5/Em_aCbnݺD]r]gvXb+,,L܋`$[I'޽;,,^zVVVm۶LOOWiee9hРĪWMHHbyHHʵԯ_ĈJѸJ!mll<<<O~E39@͜9gϞ^ٛ'LO?`a̙3Çzrppի5{ 11QDp$"[
+w^HTPPfݮLe|":rЁ}۷7oTw	Qbaagd+8q:
+
+
+5~RY'$$PM\,K$/^yyyl	m@">}Zǂpo!SVc:C}U5W1k뺆AOHs<WZZgccckkSVV],suu2e
+W  FM6h
+6/OGC6VVVvƍdn)j#cǎ=r䈋߿_VVVTTtuuM^-""СCqqq?JYYY...rPPPyy={?SQQ.vm|󍶋nQplH|4ŋΝmll{fY&t?9Ν{ׯϙ3GQJ+c,-Z8x`QQы/֮]{	"kT?aTVV:88$$$YS/֭[Dt-ѰvR^dRwiɓ'Ddccÿ;^^^BGÇӝ;w8?~oܸ4ƍD*/dW֦M(((-ׯm޼6EDvvvuhpTӎ:׮]cR3յkYf	ҵsh"wTbu=zʕ5iF#*/U,Q)޼y3a''z˗/ǎ6o<s۷:;;[[[7o|Μ9lRȒJ111۷k߾e˕:bZfωuE~QRR2}tOOOJ^ff!CܦNZ\\mҴD999ڵ:u_^^Lu5z9MȖ-[hܹZƦgnӦҤ6m̞=[^GСC:ujС\ #Ӿ}s/"t,5+h-Mj{{/}cQo߾^z999կ_ʔ):u2eJUBhPqaÆ)-;ＣXuVL&Sy羯o~~>0zZO>RTeU5~ zE0ӦMҥԸ_>cͭWV4>{ǏݑF^b
+aG5ݦ/"qNp/_&Lюqw0>bR?ܸq6m*/?O?ѐ!C@FFF߾}W^*먤QO;uثX6l3UNߪq· x͛7_`AEEVJJ'm4kl^m}ׯ_ϟ6m999)tޝ@DIII.\ҥ͝;avXyƍH6l`ǀ.]Zd]Q^ݻ"77Wmr)))w*֟5k5nԩSNbχWиpD?O&ϟ/nUD]vv5{/-,,H8.<<)y):uJ@^`]RRRjDdkk+/۷kwDc6ۛUVv;(}+Hkv~9M<.^~-U-`dby6333EðڴibQ9b7lFb8))Imr{ϾK}xVиpD?ǎ#"cxYODGW5j}wU[.3U];IEhD&թSgڵB}'666)6`ii5|+WTV[Gk|ᘽL?x1;wN޹Z61	s<5xd2%"Ύ=ZZZi_Wjc1ڵ/_rgP<AgG$s"***2X[;2iӦDt1y!/5mT&q}$a/z.//W,JD$յSmMO>ߝ1ѣGddQhGߗZ1#eU+Jc5}QF<#1N'O$gϞ	;MLOG~_|U*a"dW>;IqnJm;_~GUTE}"<[i&--D4` } UeWWW"bO%q*З/_Λ7ڽ]vQh'  ˧ݻUNe:Uh1o^cݻ%t *o0i5M<ؓ
+]؇_|YeDD-[$C)uA"bӓ=z$pYeر=:wv絪q_Qzk׎اʱ+vXXm۶{U; c>C"t,[͛Jn޼l2"0ay}]{{{{{Pl̮_CFܿEBo07P5.bxsN^wƍ+!!Çťw]n]@@ ߛ]\\lْi&gggR}Ȑ!C?~\PPp*.~ mN6MW/TDԤI3gμy̙3M4Ѫ݇#1K^zecc#>|4666kpttܲe0͛7שSl٢م<3W\!۷ovBDRΝ;/,Tb
+G_eT,ĳV[Gemxsf͚^ݧOM?zǷ9:5M<"cRIaJKK{YuR``m_J!D4qD^o (ŋݕ¯6bϕٳ +0vHѣDkCve_j)MIhժUZPi*++N
+		Q:'Sۓ'OlmmE"cAee˅D;*הg[PP>渪`puw7 Q',,'QCoւ&&uW>̚&_H$bՏOIjjjxxD"`FGG(cxƍZH$6\p|RcP䯿D5sS*w^hh)Sgỻh}tc1d*\:Ν;UβsN"С}1˫-]]vڵ[tCܱ1þMi9c&ɒ%۴il1Lk׮`wwwXk׮s>_ B8zӎb[.]>s/Ib},|(<ǫhTjgM6W^Æ:
+V\IDծ`KdVVVx?41eׯ_:0oPT$~>
+͜9s߾}s5tгg<{,!!}{a5V0Bg[AmT^^*t  ՗cmLbC"x^?M    IDAT&M̚5K@T\ЩS'5V0Bׯ_'?Bӿ )SS(,ML9ٸҙ9gaaaDDW\\0/^֭W_)]m۶޽{;99YYY5klيwWEGGs\[5;P*ԘMhd@aHH<Ptt7o#%%eՓ5`G^vM@p~W
+0:t:3ocذa5;(lݺ/ƌSq___vիj>}s$fzիɓ'o:(..H$Ё>Sw2h߾MFDNNNJ%ݻwg'$$wRRRnnnqq7xΝ;(7n>}Æ.
+G|/ZLX̍H$zЁ?pJ/90	u0uWstt믉(??_l/2b777[[ۀ]vў={}B?8awwwww'' 1wܼ<ICbBeZzzkӦMj5iD$RInn.'>}bKKKKKKf͚ѣGwUl}qݻw$D@Iz""",Y/霋F<jL2~("ǏO$	j䛢RODTYYYYY)؛I$."$ f͚ٳ;vqqqG-_|0R̙3:0Cɽֺ>n,iٲ%:tHq[oI!a={V# P֬Y>`#-Z%t, |]|胻;%''Y^!C_ѣG%%%eeeKHH֭ϼ9s֭[6o%DD[fdeeL4I+&Cx!jeĞ<yboow	Y6l/t  Ty pƍ*sgJgUO5L>ㄿgϞU'_ޢ4BD'NTE]|`@GEE-]ٳgBb> HvؑO?	 /'O۷QyH$myŊ7***##?gccckksQ+++7jJ"4lp֭a"FQF1j^%G)t ڛ7oZl9xk
+NHH:_|jժ6m "77c
+$㩃 ꫍7޹sGX̄ӧOF?twe&	`>\QQ1h 07H< [h1c1ޥ/^:X,ޱcGiiiDDDee o߾=z
+AD"IHH8qۅx{{ѓ'Oo<yr̙BZyy! ҽ{Yf5(  `ΝW: Μ9aÆ	Be*++,X t &	/sC_~e˄@پ}ڵk#t  fu֝??|Mc1y͚5믿7eʔ9s,^XX 0xw<! ,22CBbښ7oX3f_O>]&	 ѥK=z.t  	fݻw.\(t,(ڵkGQRR"t8 m۶m۶o^@  ^6mx˗/	k޼yff&~#G<yٳxg<))i̘1B`x 'O4LXLUKJJ>}*t `DnݺաCxbrر/^  $ |YXXl޼ÇQQQBb7oND
+|駟}#hǎݻwoԨЁ -$ Zh֬
+6I򲷷GU☘+Wn۶M舠v)..>pQ! gϞ:#ڴi
+[n5*"""44ѣGBGERRT*EWH< ?tq̘1Bbzڶm{ ?:uÇ[?~qqA[z݅! КD"IJJ5jTyyᘘ6mUQϞ=o޼f͚5k4o|ݺuxϵk._<yd0sH< СCϟ?~<£6mab7o2dȴiz왖&tP`֯_߲e@0sH< cǎIII7|#t,m۶D'ww5k\vյo߾AAABfhǎ}H$: 3BBBbcc/^ec1
+Ҷm?<  `.]:(0w...?~Ё ?$ 52}I&%'':
+0=ݺu;}CrrrN<)tP`VZ%t  @M-_<**߾}бwyBG*$$ҥKDԯ_sg^r0$ :sNc1:uw^AAЁ	ׯ_jjKֲeOmw5  @@ j$ : Ǎ7a{
+ҥL&?L;oegg;vɒ%#GÇ;c-x 膅ņƌa1j5zЁWނmۖйs[5;m͚51bЁ H< tbӦM-4i_|{pܹ3-kk#F\pի[4iRF,X+th`7n8ydD"t,  ;wnttҥKgΜ^ر#ГN:mݺݻƍ[reӦMLrEaÆHEx ܹso߾zA~ZpQ333>}*t `4itҬׯwߎVD$J.]:ydwwwcEx Ř1cҥ>}dee	֭̜ɓ/]㈈5kx{{wyݺuo޼::0SN)Aر#''g֬YP! З}iiiBc\۴iaÆs<~x֭?3#Gv`Ȑ!~~~$"L3z@@6mz̙Ν;4RңG$``AAA[n\p͛73}),,}thѢBP  /_'O?~|QQjLpݻw. //ٳg߾}֭[yсݻwءo:.Zމe˖8q"55JJJJv횑!HxB֭[EEEOZn'%%.lܸqppMd_YZZ gϞ۷O>x!! 0>}\|aÆ}]~⤥K޼y3$$V]ӼyǏ ڎ1_}՞={<<<>Ӻu#>>>''G F/XX¦ϟw"""?@ߐx NfΜ9uP6xŋŋ%%%Bi8OMM:
+cmm=x[>|޽M67o^{nݺ|d2X<x` H$DBGatb?pڵ'Ojjݺu|	{qyy͛7{J4yyyB֖@իWL6A#Fؾ}Wp֭s666Ç$*Zjh۶ǌ3uC+//?vW_}%lxӧO<kYݺu'Oɓe˖~GAAA+Wￅ4`JN:Oի QNH<@_9yzzoyddK[Nٹsθ
+LԩS9a__%K4nܸYf~sJJ$WWwI j'$ UyaմiN<iyɱ	
+
+ξzq?޳gOOO8pLܿ_O++맧BPk!^EEE|||Ν8NJ111۷k߾ec/s7nlmmooڴI}>uh큁͛73gmꂔ_d%RX"oA'bN>}`us03tPKB ?N:-X֭[W\:ujFFƐ!CǍk.
+b+H7o޸qcAJ%?D(JrO>RTM8QNRRbGud2٘1cv뛟0Gu,?TI$z]fa͚5Bٳgtt)t\ח_~ieeT;wK#GDBGa0!+V;v!>>>++C%3g8;;oܸ1'''''gÆiiiqqq?~?2d۬RGu6lذsNoo襤.t֭[c^9d7`U]L.(--uqq!"Dboot~yyyfffxxy?ʪw޸
+FӦM?#Gtm~~~#Gܺu+Kh`t:tp1#1aHDخ];"Zn]
+~~~Di&Bs۷7BDǎW`/YSbGuvJDgΜQ(33Zh0GģjTTTܼys˖-3fPC_:Lsuu: }̌
+
+bAw}U{9JKKj"F餤QF1xADĈwww
+nnn\[[b-%%%	+1caaA
+cl	qD"Jvvvꂔ_uQ,ղ\llŋu՚1SXXիW^|2??رcӦMN_҂j*   **J_x166V[YY?ٳϟhтeg޽
+dCP=9rЁInouz|ի^Yxbzz[	HC
+yH~~~IIꅓSXXcEVV֯Ǉa<0[JKK7nܾ}{]6<[4iҤ-[矇?~\:ի/_ҥAH$b`1L`FaO(:~03:BGՁaG7~'O6'M͜9s֭yyyyyy7ofaPj6m2d=*)))++w^BBBnݸ$"Ru]lY   lmmu >ps!ۯ_?르gϞU'ʔ
+ԙ>}:$0*ep6 rؿ=  \F<&H>l2???{{ǣI~~~111GeIC+VHMMH$QQQAQ\\\ddD"Q׾!    j%<@5@@{
+ 8s<u0     z               ;$     wH<     @x     !      C     zD"H$tʌ3*>EαDݺuD]vhyxxxO>ŋ*[f&99944sРAvQ$/*g_D"QǎDeb+,,̙3*WG1稣jĬ;sU6RJҸ:ə:avV^=+++mFFF+UGmMT㲘ƣXwa^Scx*?7]"899ua.]R)  11Q jgSZ	I"WW~mvMu3ؑ+ʅRY9$$aUVQPP%ׯZJcZXXB%H$ӧOkQcVf=j\vuMqD"0VwՎ4nrڪ既`OGWAj\FZ ɊVoYrss5\AJ:39H<c%!Ҋ?>S7#5nX*r4XRQQŋs}666DԧOL&<|p"rvv{T*ʊwqq!Ç3+H#>|(lllUXƍ$.]pϨ?#00zmGƬ;z|I|V|69mU1d"rqqY|ʊn߾nݺnݺɫ飫~]eӦl<:܅aE\Ra*++CD_fͣGR7on޼?s3?*9a )n5?/GSZ1p!J=<<hDVVVrF___"ZfG꺾v횣#%''%Ǐ'"{{7n(Uqㆽ=23f"?Roƌw<yBD6663r7EDvvvvTv=jOSWu+gӖ$&"'';wpTGWZe٦l<څdEstTaϞ=D陝1DbƇ ?_%<3$vdw_I۶mݻUffϞk_^^שS'{{{[[޽{߿_ގm>x ,,޾nݺSN-**[JWx޽ڵk0)J3ڵ6lXZZAmѢED{ĂTV^`}Ü8q|||*++*++5jDD'N;G͍{FF'JU/_CӔ&_݊e<ѣhdjYxi$va#Y]+U`G>Hd竄C$vdwH%9e2+WRtU+۩Zͼ(Nz_t{+'`3VVVDrJur|h56dlܸ1a7nQӦMdM4!cǎ+=z4ixUXGqܸq3r4ѷo_wRGՈYewףƐ41xIW|69mOCDdjYxi$va#Y]+U`ӹwwAJH<@!m7JvNIIߧ&%%_pK.D4w\y_|9988gee^paСU9sԩSiiiWMW:5---_x0̋/-,,?~\AavID/))a+))!"[[[O+D4j(y#Gw}sq|JT6U;fZ!lJAHVfӖ$ܟ	j5购ɱ\k$gQWWؔRDF8f(!Wٝ    IDAT	H<F{Q,dwL"jѢ<k׎֭[R6[jEDZ~Ex'G5Ԝ3SYY~V?#y*S{ZX+Tuŋ9>Ϫg>|+WQّ1NϦV[_&ړx[yJ3gQYzWؔ∄|>R9*!P`(˗vvvDdiiiiiiaaaaa!D"Qg}[[["APc3K2إV2iӦ0;v6m۷`8>[nQF?R"u<}tƌDSԑMUU2$MiLiRs`Ͻix^ZZe٦l<څjET?Èb"*//W,JD$k ?_%$j&}20DTYYYYY);Cmр^byAZZʹFݲeϟOZuw^"bp# "bo"-g>#"ڸq_&իyհ5:zTRCխڛc/4VGWT1l<5مjEr]]]M\nݺ!bb9jx(vܙ._sF۷oOD			*CJ?hl,/X{9nݺܪv댌q+[Rݝ֮]Kù{X,wWU)E^UCߔ&ior2)>.6dѸh\誔*׭[733SceaODWV,\r%0{^3>*aC$vTC?N{yy%$$<|ݻ֭:N:V.--xr;wTScfys9w|>TcUTT4o\e/_;wn֬Y*_ FD...sRivv+TΉyZ}8SL!";vSGjJc`U'ior2ă{\]]ccc333Riqq;w+5k,|4GQh>K{޽҂;wTyf"rttܲeKNNNNN͛ԩCD[l|xC0nvӧ*g/J맮mZTj*u4U}DQPP>K`T^;[[[Ht:|U;fVףbHó)U:MN[Fxk i[Sc|wIl<*Wo6qI
+
+BCCUFbooyfʕ*.$$DAJH<@!m7J2555<<["FEEeddT*]l}``*ׯ_GFFH$f|!C]]]'Ol/СܹSe;t蠮f͚cYYYuO>9ʎd2ٮ]b{pp]Db}w8\%ܹs9TvT:J$fQ1$Ϧ4rӖQ%d{yyb{{6mDFF*=G]ku[)eQ;$o<:܅#[<tÇoРu:u:t0o޼jͲKkֶ]vK.J<;2C5D>˟cW]D'??Ɔ}1` q0xO2gk֬!"	      (	"z%ǋJ  Aa,--4i2v/BX    VCa***N  =     wH<     @x     !      C     zD"    )1   j{<    F#     wH<L"%Ś"͛7&LprrW^||<|rر...nnnS'پ}{``u̙/*Jcbbڷooggggg׾}e˖+uZ5f     fZoDTPP0s&M,ZŋjjܸqD0رcw)733sٲepႣcYYـΜ9#pׯ>|ѣİK    #&C>@(ׯO6Ə/JK֮]ܰaΝ;rss/\ХK[n-^Μ9qƜ68::)~    0'H<իk"W*>[sD/16  `׮]Dg"bC~	&O8166V>	    .2[:t`奲$77ƍDԧO︄|8ѣGDt="zw2dݽ{Wˡ{#F:
+ apIOO7@G؅jlCjBaJ}"ʪ(>M$銼jOB DDo޼9sLϞ=ԩ#t,36l. 5h Ô'b.WիW/_ܥKZl:th[o?<zI&lٳgV}͚5;t萅.-$''  TM;%''Y^!C_ѣG%%%eeeKHH֭3fΜuּ͛7g$"jݺ5['++0%%eҤILΝ;wkd   HBIIIF³C$%&&9,&Lؼyb	.ROɌ3V\Sa_u#00ѣVVVDtA)N8qƍ{Q?6GsNFF   SsZ?7H:cŊ7***##?gccckk#:($$dƍZH$6\pu??399oA  P`C0Ȇv9r{]   `8ׯ__wލ  V `8}]N*t    `h  ~7w   B  YpaΝ    0+W۷oB    ߥKw}W@   @  |RRR    л_   P` ҥK)))G:   F< @,Xгgρ
+   	# GΝ;rȱcǄ    УW^:   F< @_Μ9sر'N   # /}]޽+t     <x ^>}ĉgϞ:   0
+  Xpa>}z!t    `0 wԩs	   x }޽Ё    ɓ'ϟ?y   # бofݺu:   0"  ]:~.^(t    `\0 4    ЙG_rE@   ` tazРA:u:   0:  8|~U   c awQX   a t %%?HHH:   0R bfaaa:t:   0R ڿFFƖ-[   F< FY`aڴi#t,   `0 5w?sB   F# P}2o>|б   QÈ Tߞ={n߾(t    `0 $,X0r֭[Ͱ0HX0L߾}E"ѣْ9stںy|IVVE"H$Y0LrrrhhAK,{yy9sH<<<w'nݺD]0ݻիgeeжmtf/E"  ْ "D%&&ZZZ޽{WmD{nya\\yyyx-Qy4sqq~:wU{B>)HIIXM)H#aݾ}[>͛7V(((ҟ}-[  TL&[pQZlf5j4|"O߼yCDK"JHHpuueua׮]+**?x`&M^z5sL]Eq!gg縸ǏKҬxÇGDDi=ΖݸqcjJDdÆDdmm-c9re/+++**}uu릲6۷o|" K{#DȆܹS,߻wO-mۖ>.]ĉtrWzSY~q"qR7nc2Zu"V:taR^+>|ܹݔ<ׯ_ݛ\]]/\= @s<u0 Z?ߢEd鞞b8<<\$iF&ud2Y6mD"ѨQ8k׮D'Nr劏Ϗ?{.6mDDgϮr6m̞=[^G[:d܍8p '']vSNۿbsmժӧO7hٳ  j/$ ]v=|oU*7nܪUrrr*++'WW[nر}[nyxxOL4b۶m"hӦMܳ:t2.QxxʩÇ'/lM*޼ysĉDHUJW[2l0Qu=##UVϟ  )R+C"Ái*//o޼~XOSRR7^o۶4i"JRi&MhϞ=|zy5Jc7o:99Dgry<!˺T3(]$;;ښ5ŋ?湼*Vl  pF< @;;w|7|Suʕ+$hر>LHHXnÇǌgXcǎrԼuV=zh@dɒue[[[6m6l{kСCe284hР죏>*++v#  P   -TTT|wǏo֬YթJ%k׮urrz\O/gϞ{լYռxb^={6eʔE\(U"LӧOg̘3>CIÆ9`a/bW[m޼Yދ'=zHN8u#F  j9$ m۶eeeUT!HZ͛L6wdkk[>}j͔/_~k֬Qfa޽{ʩl9;իyi	([Hznр&0` =x --.޽{yFղeԺu8p`رZ,  Z?C"\gҤIU'U=OND[lYd	͞=[c/'O&vڱ|e֭[KRj6mD4m4LsũT~Q"rppt޽+b+#w1T$7f1cjt5R1}  s<ux%[YYU'<>~8DʒFYXXqtq!"yD-tR3fh<a%>>>++K*fggX>|x5:2e
+kG{+HCI?y[2d"ruu̔Jwa_ ./XSN^
+ x 6J0-prj/_z{{с5*y{ŋ_=z؝JK?(((8p.OҪ'OڊD+Wh\\U+X[[/\#UVQPPʩ'UVɗWe/JT]SNwgܟ	 @-A8S`QiYv-T=w./dk}/PĶ6dTUk׮`wwwXk.>hܹ C))DdطܹSԝ;wQ{INN<xX,oӦMddŋѣDW_q PO͗>2tE$%&&9R@ 4+++kٲehh?,t,@˗/={D"ٻwA  S @M6~BDDf͚7o^yyyxxٳg  $ AYYŋ??0={:   ^x ׯꫯ   L RRRhѢɓ'yQ7   :H< K   ӆ *))Yd%t,   `ڐx Zk׮g_=   PH< @☘HOOOc    T[fMQQ_|!t    `x 
+o޼YdIddб   9@ *^lΜ9B   f (+,,\t'|Rn]c   3 Rt֬YB    e˖M>   CH< j5LTrJw   n! Վ9ү_ϳ1c  AP=xɓ=zׯ_zz+:.   07b  !=xںܹs666NNNB   # _%JriiiB   f@v}aիW7xB   V￫VTTѱcǞ?n   <+77j݉'tb   ,! <xPɓ;v4|H   `x ^<P|X,vvv>}t֭    >|(HbWW׳g"    È@CpX,:sL&M
+   ޽{sbqϞ=ۨQ#   K jL"M6t   $ TEE?CD>>>'N:"   0g
+xxbllQ.UVV֩Sτ(99Y   #KVV֯*tKEEEu۷бvؿ  a_dެY3gggJJJ5jQ   ZSNB    k"썀,AQ-ي{kբIqnk:B{/ԺpT\8QY2d*;lBki!@99uow*<
+!B!$wXx B!B!aB!;,<B!BrB!BH@!B!B!!B!$wXx B!B!aB!;,<P+CP(O>
+gϞ:ԩÑ!EjvzK=aÆ:ҥK|>_Ц[n
+b{pB֭[ "Ć&&&F
+}$lLMX뺣K 9~qss|D!\tId	  A[٨<>>^i pQJ==ztqqp㲲Cm[VVF4ۻw/ <X~ wHIRCCC!V}SM!RoZ,??W^RF%QB!|Ъ	x6رc d2?gӦM|w    IDATvHp8ϟ/ׯ_;v,_hxƌwݳgOFF
+
+ӻ{3fSNUUU}/_DJOO葪ԩS!6dMMMLL7[~}X$bI~x<ĉ_zվ}K(HB!${"A[gVr6ݮ]; 8p  Ԉ} <xPB !!!Ē FLLH㘘 #L2 ֭['~)S4@rl PUUBɝ4AoZK]v JBZ>"Ԗݺu+//e޼y7orڵ y暚Ǝb
+ \p	 XlHcGGe˖	 Y ɓ<OЌ<yRlijjʤFeΝիW5wMB!lXx8؋%l	&gff9r	3 "## 0~xǍ Kdmm˗
+ڄeddX[[4	yl6;66v̙ ~LoZ7o)+B@4)egg߿dWL6d?uST-[TWW765 ~
+ ;vۘX+X6.뮚4sIL{ƮT$'u5MZoB5:q3f> =Zp2O]&M9x`c>_	i4׋ ƍT*Upzsnٲ]5Jۿk-[Ɨ8B!*ս\n"
+ku;T*_[VVV6*Ozz: MLL  %%Elcb`wMMqYٳgkjjbaaQb&''gÆ`!	IZk$e  2qV}[!BN %)rR#??NMM!CΫ2d >~X&Oܹso߾۷Q]~ <<<{WmL,';ǏMMMVTTf͚f(Rn毵·nj BR#vi4AZ$*CCCѓcSQQ9s)r>fk=}4 ߿OL{b@SSSt	l68`r!8󯄍#Mbb"N鉉_+@6r7m|޽ )))MXEj9_!ƍdisCUU pe-j!P\vB|322TkJJJľvʔ):u\&^.[\\ŋe˖իtРAcǎ%2dȨQU[[_߿bܸq ,\ ~GlΝ;Ϝ9(젇_&k][3r={޽;99ӧO۷oŊ"B;AvIxŋ o6:tj9]w^ <x `޽u(|y!5jTqqpRooo}||o%">jjj
+%22R6i@4jK֒6LlNj~!j&bƔ%##C*|Y0 0ufPQQ144xuuuhiiݽ{ŋ>>>FFFt:ŋw{;?{{{Ⲅ=z喕/\ZJ֧Q_&k][u7o7ܜdjiiY&%%eM!2!!k׮AbY[[ϛ7uwI&jx B677E>}爇: 4v"Q4eeed@!B2G<$? 'nMGGHH]7~B5,<!z<n4#!BmLEE S#t&&&xC1Y,)c!{w:::di"MMMb!BHf@#
+Ӯ];!Bm	b2L& -hallG<x B1x>GNIl+**+B!Pbhaoo_RR )	 !B)<  !!0 B!dXWW-YP }}}--/_!BFnnnNB `ggbXZZbB!f`Q1G.]>}(J
+B6#77Ԕ-5**
+oo 8B!Pp𨏘£o߾qqqOlcccy<AB!Ps}VSxhjjFDD(>qttLKK#;B!j.6XxGLA=<<^|4ёBƒ!B5Wvv6BSCO>W\Qp%iee7j(He	dGh*MvꕕEvB2dnnJvJ իWRRRaa(!GGVq9N'==ѣGaaadQׯ_GGGIܼu~!+99sdhh=jp.w!;EzBv
+>|޽{t:}ʔ)sqww';sΝdA!Hrr)Z.G<<==o߾4JӧOdile˖C)a d@!KRR-)Z. ޽{gz7GGG6LvV,//oӦM:tԩӋ//^{d@!Hyyynn.j%AСC󣢢F	1>U
+1b#GVXw>}d,K.BH>NNNVVVwUd%324hWvvcǒ-ZCvBHTTTr[x ׽{Eiyzzx		qwwUWWɻwf̘d2Ɏւ  !"}IEE -cѯ_PXbҢUVVL:{ɡ ;WKB!xQQQ9$FFFgΜQX^zEv;v~}llC:vHvB!R</::͍ -NO4ٳ
+KڵkGDv_ri?>vNѠ]]]:]]zB!$s)))xC2I L:ӧO޽SLy!!!?CSSS<haaAvE!,**`8;;EkѣG.]Ν;4J -BrrIt}!sssC&X!B;{{{F
+ 8qKpX<==+**nUUUS~~~DDHv'##Ғ!yI~N5\x̞=۷o׮]S@eggg[>}SN8|۷o{Ev
+BHJJJ޽{7p@tÇ߻w(-*up	ӧOׯ߇(
+١Z1<
+!R/^x<A 3\|}}>}ZYYIvE{sDDݻw/^ؾ}{neeex!RO:::8 4ǧѣGdQr??!C><!!ǇDmAff& `B)̓'O<+iHUxP(;wPށݻw }~:Mv6"## T+BH1JKKOvV@ ~G*zQQrCU#>>O>555diS222444B)Pb];v(++k e뛖'{iggٱcG5xB!07n8pAZi XtiMM͡CFmmu޽1c<뚚di@!:44tԨQdiQx̛7oΝUUUh4W>իWǏ0a+WȎ6M<B!yIEERjD K.-+++=dQF4رc48mVZZ)B!pwww333+<wfH6ܾ} 2rtYvvvdA!>.{#Fh\ +W۷o< ##? 2ׯ_hii-KJJ;w&;B!ݻwׯ~~~di5]x/_|Æ&MtLZZʕ+׬Y@v6.11QEEښ !PwԩtЁ F X|.4 F ׯ_';XYY\ m_RR̆B[AA7ONv֤)</@HWWҥKdk׮ݻw***
+BPH	CЊإKS BmߥKLҚ4  ??.][NiaҤI>,,,$;HsKN4dgQ
+>}!R3gΌ3FCC I:cǎ+W<|P 9`\v uȑ_ڵ J6>>ٙ !P͛ׯ_ϙ3 7œ'O~U\\V{27aⰰ04]UUUǎǏ,8٩9&#qhwpp!\7ׯ/^ ;H+#={X-[*?~ӧOtǎcXV,ݴiSL'}?hnn`0?7 ֐IZZѣ555ϟ_YY)fo۶U]]]]]uǎĳ
+/|2Bquu,9{uuuLfN/_bDrVUU7@!ׯ_
+'((HEE%.. ڻv";HUVV.^So̙"˗/FP_.}'O;V3_]]-ʓAl>O!6bÇݻw|7eʔ=888X,ƍoĄ!B|>?  cǎ Osw\nϞ=d	,Xsέt;vLUU5;;Sŭ[X,VFFȑ#o߾6w-))aYYYw ;Y|9 XYY=y򤬬ǖ»[n ]]Ǐ;vL[[ o}FFAA|`0|#G  b
+fffeeeBF9ydB)"MM? R'Nh~WHXTT )\\\>E?% %X6bsTUU8͛pA\!=z( G #ݻ FI<ٳg7(%% lmms^v%֛6mR@!_6F͉˗/HJJIoHmdhϟ7o>KWUU	x<ŋmCNL& 	7PUU|lyyy F<z* ݛxثW/*B]] h4FRT*U`,**jlo߾=B!233vIv֪YlذSNӧOr2f͚u咒4΁wNtTb Rflذϛ7/11(-ۉL>˗)))^2006l, .ry<qR
+u̳P(ݻw@!ڲea@@ AZ+L&ܹs۶mI0m4
+rE4·oBBBϟnڹsghbٳg%O>nйsg s۷o|***? ={ٳ 0e-;
+iccqB!%rȑk
+E6 888lذaݺu3رcdiK.N4=XXX ۋJJJBBBpZO?ydѢE	/^|邂'OS	U5c 8wܹs	, :zhzzzUUUMMMRRґ#GӄoH<܁Bƍ-,,P޽{;;;WVVʰ[%# xAշo_???	~n߾]S';f:~8p`MMpSNNN"#J͒oY}wءB!%s
+r%n2; t:ٳ.aJn'O$;Trss#""M?ر֖dM8c``>rH}}ٳg9sF|֭[UUUԜmv}Tӧ 6~x333?#;;۷o!R5553g>|ĉҺQ>Ν;#F8|Yd۳ڲe˶m233ҀC-[,//OT/khh!jk6mڴm۶8=PaС+V駟e޹r?>%nW>>>Xu(ܰ@!d.11qӦMk׮Ūd x</_޾}K
+5S@@@hhhJJ
+F#;K?>uT(WW?$;B!Ԧx!C^Ll? čKJJiP-^833ƍd$<<Dۗ !P[ugϞ;wK .\tRPz{{DǏw %""狝!BMիumذ͍,m
+ 9r˗/ohѢ|'O8Jŋ]t144$;B!vM6_~˖-#;K! f̘1Yf}Q)!Ctu޽d ;y')B6eyyyGR廷T)<<<F/6
+p/撝E/^x<<G_zMvB>qѣGmllҦȽ.\x&MpmԩS>Lv1\?~ &;B!Fܾ}{ɒ%7oʜ"߾}ݻw~~~<O#U믿"dP:<޽AB ..nʔ)SN]jY |йs*fĶjҥ555#;?4
+BPOKQ<x0d?j(
+2l0|>ﾣP('O&~L&SN_ƯR?CW5TEEESSi^i2l0cccccC^tA;up,!HliKwA:nbb2jԨp	Y@Rv"ЧO
+ҳgO]ϝ;cǎL&S]]iѢE"o4ak YAA	trAQ|uN_v"m{~gccJEP_T ˗/ѯ^*Xg 011),,$ۢ׷.oR	74+++:t6eeeb=zҊ.zI.H?b}[[Jm[ y );!y6::ZGG~5BJbޑ    IDAT䐝R`
+"6j\UUս{< ҚHСC555r9 nqss۹sgtttEEź}5 4HrA66ȑ#@OOoΝ555ӧٸq @WWwϞ=l6;333((8mܸqu @l4	0iޅ&t[qMMMLL1]Gcl~ `2 dg;XzaaaMMMbb}!|~YYYϞ=233Җyʕ485ܹs-,,)Gjhhxw;
+0aGurr_~ fΜ)U_ 555Zxܽ{ ttt$4{ hhhĈ<CjI  &aƾM.< >eUxv PQw%%%53BC,m9WXA.\@m@jj*N?y$A5k8::ʤ;
+gΜ0`Jǎ-[VRR"xٳgӦM333^^^<K\v"R^t	 \\\ĎH<p87nRQQ;~p?1bܹs+**bTTTΞ=[)"LeeO?Ԯ];K}.K4rĉ%A?Œ2 011Lq!ٔ)S `b]~= L:U$ŋ¢/<|dRx6OYW^:;;@HHp@C!aÆ?{,m9y<^@@ q)ڀiӦ	v"5uÇˤ+Gpppr}Vj]v#>|8 ޽3gD|SSSƎ.`"@T`_~ӧON: ڵopٳg6GlQ ܬVwy H>;t "  H.koo W	T]ҿVV?cclKn|~PP 7?> hjj<yǏ!Vaa7o΢H͛"r"R||<Jr
+A|>~IW;
+G 33˗/WVVFDD'Xh{ݒ6{n:7۷ot:`K˫;ࡅŭ[X,VFFq@߾}K.:<y򤬬ɓ'o&M%)"YhhgΜ kkk6f0]&p999ĭ['M`X
+G-<ĪsUUU ArJ9cAϟ? ۷'^ۜC]hRHq$++F1LB&IR322mF%rmm3f\i֨͋R6yyynnnfffqqqdgQdp8'Nz91Z#Gʊf277߱cL' ֖x6b:.إ>7}Ĉ o>޽{`ȑbG<KRSS@KKxإKE7oTLUUf}aVĔ#Ô)S( @OOOPKZjUַ.o.kgg=\/߅F} mhh&Dmp\i:ٸq# L<YdҤI abccn:vX ~Q!SzzO΢DHfǎ))A۪X*zyrcl&8	Fh4*JR3>tH,޻woa^;bwCw$)xW
+˗/b%}*++KGGT0dT*Fg2""8kΜ9ҔDX[[+f NRҤVgϞ ccc4)ҿVqNN@___dBIilMx<wA*11qߓ@###gg'ErB_d3c&yM>ӦMSrrr ӧ2MxG>|>k׮ 0o޼DT]aMM | g[xHH
+Yfu޽g%vvvfb2bGpՉ?yn۷oܹs<G\.0--؛rC\\e~ >[s @Lw+CwQט82>_x<|PoÇ%677 444!lnJf̘!)L,Xך7VZZÇIaX;
+ݻw 	{_X߸qO?DY;Xa݅uOu"o***k !L``  :uj˖- lٲ#.hvqq!~ v*R8q8|`O/믿 `Ȑ!RT}tuuu%4> hjj6j:]ӧO\)߅v[_D:NӅ7b
+IH>9砺z2#GEE̙3TZJEp8jjj#;K+3o޼ۓx#p m>w? &&&GIKKNLL<|0qTN `Յŗ/_666[ ܹ- DEE7b݇u5///'VŋtS
+r,--TǏ%u PQQ[ZUUEl[
+	_paɓ }ԩ'OjiiՑ4+%11]RRRlveeeBB˔􂂂233
+%@PD~BcxΜ9 0~F£XUUBԽiFFJUUU%6lٲ˗EEEyyy7qɍm+@	DGG
+Dׂ"s9s0LY]-$rrrO\~ duRdG^,]GGGbž\xoLLL%v[EI#FHV*бsic
+EnAp.8E $r}||W(	CH迴Tl"/,--%&Gxf0($i)	Qjjj
+%22RʨҴ܀`bsǈ9DWWݻwA)n::W(w֭
+e۶mdiM.]jhh='U7S}Ǜ1555(ٱc-ɴkkkUرXsN#}¤$fCs!N022j7X}Įq`	#&CL%ԫWwH zL&al߾EMMMMMeu j$		L}8|Yx<ŋ}||tŋ;hmmmǎ%i)	% 7^bҼ 0͍~͚54MCCiɒ%SJ!Զ{{{hu։R$
+_fR߿?00~ڽ{71i=_~!Vm۶:VN{8pǏ=WXWBpٳ~z'OۗDZn\rӧF޽PWWWy+ѣG?{477ȑ#k֬)\~Ν;7|p:B!	׮]vڄ:Zxăp֭I&y{{={wT^^޹sѣG߿_Coڴٳ>}R${ww;wwǏ8P!BTNNίzԩ={:tɉD##F<x $>lw[PoooSSS;.[ѣG
+Gqpp!rӦM]tC?UGKrxGsƍ=zErnnnoV+W#ESZZjffqŋ!jA8W|%K7E-M=A033{iϞ=@LiCEf"GTN.\x3f ;B!Rcǎ͙3gر)))k֬j hjj^reƌ~~~v";Nw.[*lP*6:pĉuuuBz߾}?СCSRRchhHv.$I+(< N8p`׮]+VNrqqqNR؈'>̚5 !Νkll믿gee7E-\(<.|IXXR͡(g^vmEEbFCvѭ[7!2{q㜝ݻbŊI5 [={޼y8-oVZZҰ𐷸+WwA!MRRʕ+͇Bݻzj###ie =|kܸq{!;NKdbbf͚[+`8
+M3Ν;ǌCvBHqJKKO:w۟>}zԩ111/_<x0R  MM͐u-]tĉeeed'jq.]ڱcy)`,UU՚fv˹s~V}B!)eeeW__?  ӧYYY۶m#;j~ɞ={6yd:~={eyـ_>rHtĉtBUO/Yڵk?9BawܹygTTTƌ3b-iG<{;;eׯĉ+++:Nee%Ñ(ʩرcXu j{***nݺ`;;͛7_t)??ƍ3fi݅ ݾ};  `ɒ%ÙvEEE۷o(:::|>=N"^"ܒB蘚gQQѴi׬Y#rٳe2:uZ|9<fmꪮcVĞF%ʹuV&9|BbZ8j̘1ӧOշoΜ93n8c"W^urr#;KB&&&oH HMMmr>"Re7nѣӧOy<ޔ)Svb|~uuu64hB9f7+B,l6;::رc,puuh4%00ҥKdDx;ӧOfffݺu۶mKdkk_~E~C @III{۹>--Ç,k f:thyرϛ]|9??2""#..? ={?~</////رcڏ?~δƍ-,,3C B!$+/_<t{补xx__ߛ7o>88xĉx2rQd <oϞ=5IdiBCCr8mݻ餾Or˗/999bk׎xHL9.gJJ
+ |ggg 8qpGlb5zGnBbEEE]xqcǎر#J 55=z<y2..咝ujUiӦQSN08:uǏ2w^&P߬P"ˉL&XNuYBPC^4M	 fԪkNMM._l6d4nܸԨ(bB!rgdddeeeeeeff~%99999۷o @RթS'_d~ܹ}555C)((~ڵ$77W=E tU! ru;
+'9޾}_zPU^^.fWTT4C===555UUfCMp|EsUUU----,,FݩS'[[ێ;
+/F>m  }}WΟ?Ǐ4h١Hchhu9s{y_~mN=áetppx7o<<<6ܹǏܹ'Xxm ҥׯĒgϞ/?[`A߾}G̮B ***JKKKJJKKK\_bKJJn5BPtuu%,TWW'.֦hpW溺
+Fikk+nebuEaaaBbffffffFFF$jlA7n\~ΝϞ={׮]J;A̙3/\0wܨ(ԴG<BBBƌ#/,X0s̑#GnܸqT*˗/O>=qDDDĔ)S>~xb :t( ܾ} tX]vŋݫ^w~[#ު!T۷|粲2bUZZJ"/g2:::T*U_fccCB5 ACCCEEEPEE?TUUUWWp#vaeeeMMb!Q8$
+&QL&S]]Vhv4)T[VFl6[𰤤fbjkk^UUU_...ς妦ڵkBN$kx_|ѣG{Ev"r$'';;;˗/mϋ-hr'O^B|2%.믿kjj8pZ޽K$3g<~(ol{{Emܸ	/G\.7''˗/l{Du_PP өٮ]viiijkkkjjjii	jKGGGGGGKKK`PrzAaSVVF(8NYY{ 1#:FH&&RtuuqF[[`ŒUQQ''H!99yϟ?ܴirظq-[bbb:v(nlҜX,֪UܹCAU ><x˗/t ٳIII
+vԩ/ĉ۷oOII111f*(o'{.&&FɯJB!
+g0۷755ӫ3@"JTxBBBt޽{ǎKvEvuuԩqܼys=Js>޽{dgALeeeJJJJJʗeddddd444eiiiii١C+++###Z!Ԗ(] EEEV:|:Ծ}{)TxxAN8!|9u38;;˪OeS^^pu ӧO+;;xҒ.҂(3F6L;wϟ_ZZm۶ٳg+Յ˖-;|pLLL:,++IoĉϞ=#PkQ]]Kr)Y:_P *++7lذs:tʊD
+RSSnbbYU\FFFׯIoٳ~~~w!;B^yyy޽{}jj*%sttڵ-^zBu)uA={vzzotR%ׯ===80{ltؿ''}ɤ7ܭ[7???z4ّ޽#)sssggg'']!$,<  *++׭[gOO`ggg)ªUG;wnrrGߕR~ީ!ҕ}o޼f0]vu1BUDEEDEE͛7oÆ"wJj{jjjwޮ]ػ    IDATp{m۶5JhÆ6mzE}VGUmmǏJ͛7|>ֶG=zpss!$XxuKJJV\dɒ}/_3glfW-,,חI6ep޽aÆ+V ;BJ$55UPi{ȨgϞ={ѣG	!HUUU۶m۾}={+V8xﭭOZZ===emKHHٳ㉛#'===<<<*****Ç庺}uwwwww޽)B£^YYYW>sÃ_bq8>}~|opBkJKK 8&B2f߿_III|>ҲwđnݺUU!`Xx4ǋ-WMMM^BBU֮]ۜ~ڷo)YkjkkW^uЁ8UUUQB\a^⢥EvLRjXx4fݛ7o655ݽ{aN${w^|/zNVZu֭Xk{|+W?~#o߾|w***G=<<dtjVNNΊ+Ν;7p[6gx^^^999QQQMʕ+'OfXxP}|ŋ18&</!!ApLB@Ɖ_~}HHoFv"rvv6mZpppzHOO̙sԩ/;8=vwؑ8ѭ[6y,BIXx4EDDĊ+"""ƍe˖;H6=:woZx}Xı`ՁP}8NBBqp`X
+ں[nnnn8g7BRXx4ݭ[~t6Hƌ͛>6&&&x}y]K,ٷoV	+((xeTTT|||\\\RRQWW'jBΝ3Bf=qV^MvfaXnnnwޥR}5knܸ!&'':f+~M6<yrڴidgAL?~O>q\uuu'''999D!&a!%%%۷o
+
+200X~[Ս7o^l`aNNNttt3z]vmĉ/_{I.]޾}+-%ΰª)!6GA FFF......DѥKV7!;vٳ7o$;Tׯի <ydVVVQQQ$99ѣG7nh<{{{߻wO[5~ȫW6ZSySQQQ еkWgg~d!P`!c7nx񢭭ڵk'O܄H񼽽Ң<zjsnii)xٲegΜ%<EѦMvIfo)222VZZz ${>!q@AEE!ȇ\|?8qDW^=sL:Nv$x `0㏥Krʄ	vd2.\}vma޽{7|ߺuԔ8@mmmbbb\\QiĤx<{{{GGG'''h߾=aBDXxQ~?~|ժUxհajkk%
+MVӦM|͛*mCjjMϤIuvU]]]CDΛRSSڵk׮]NaBHJXx]k,?.]ϛ 
+fee%Ҿή@=J=~X233uvĉÇx͛73fؿ?^ZP^^ fff'']!Poذ!$$_7n\˜ťz]AO}#.s环lCf;::())IGG ~:yo>|xʔ)dgD^\.7--.c>} ccc{{{GGGGGG==="j#P7X[[/]t}wuV}}9s(8aRR҄	bcc:DP^zxBkŞpٽ{wd%ϬYN>pԩSO81qDmmk׮}KPR[["|(ӧO `ff_D7G!$?Xx˗/v:vF1cƊ+DNp8߾}۽{E9rde
+%33̬Şp˗ajǏ'šP(K.믿xYr!eF1EHMM%~(.. &hccӵkW[[[<!"aA{ݻlҤIW|S~ɓ'oի7oެxiiifz)]v}U*++QQQ{ǨTܹs7mNFNNNNLLLLLLJJSbb"Qfw񯖖ّB)5,<HVQQq]veee:t͚5zrqqDR'O|Il|>̙3UUU]m*ڻwϟҥKD{555񶡰9///g0,سgYPr?}D9noo/8acccccf jhO<s޽{GDD?Kӽ^JʡyݼyB
+])X,V.]̲W^x;j $$ ""iaptl;UcO7tq88usdZ+ԥVm(%!@$!!sdm|?pnw/x}{-+V\zu3B(..^xO[[3\.7LL&344>`i  0 xL"f_֭[Z-JJJx"}ݼys__hdX|-[nO?#̝;2ў={ou^"##+**&LiVUP<z6WÇ2bDFFΞ=;226c
+  `B\ryXXؠaPl6{֬YSTnڴV5==p_~'OX?
+OQQ3<3쓾!fw}wSV}qӥ8MR  0 xL.;dB+,,VkWWW__Nt:o߾goݺEBz=}:Vst-__hϨ\ˠF@$!Annnr|@ r\.ssB&bF#KMMMKK{g&!atuu=P(,X,""""<<<22:j  1HD_be;!t:]ooVtz~N藯<btww|PH~q8zL&kmm]ptAfl6wwweZFc__!wشFr<}dJII)--CFꚜLc6=""˾  (I$;;;++~`0,˰i&)._hT*ZVTjEF0\q6{!;0\.G>GEEE}2F&t:og8(qutt
+Z|>͛ׯ_'.X?AZZT*ZfR#,,l   <&;cCs]BP(Cg[NX^?(G>~XTF"(88888X,b-0jX,J.E'JB|||(Dp???G  0!xL"uvd2\.ojj'BH$rwwgŊAAA4c;ޮR[[[U*UsssssL&knnV(_P@@@HHX,5km`` p`CFSSSccL&36J'  LuQYYY4!FDDDFF␐`|>9j@ryss\.}Z&p80۰5<<<:::44idb(ʖT 226?*  @$a  S1l3Ǐ=Vb^4c4
+OǻfDDm[  $1.JKKݻWUU%!111$::Z"Ĉb&baBi4ꪪʚ.H̙#JRD"ܹa&z6q)R!!!aaat;00  <\N⒐0o<1bcc?zzzl!$$$HDT3&ڙL&Ri
+n}8NpppPPPHH  -Y,ʢV6=gΜĤ$Toihh(}Lr7,X੿lNR8p[Ot:3~RɓQiQHD_%	   S7`6⢢7nh4Pd:LHHx*gZkkkKJJnܸqڵjgg礤ŋ}}޽{=j4ׯ_
+.[2L&)
+Ba{eP(ݠW  ct]]]yyy:.666%%g]x1fOsΕ+WnܸQRR2000o޼+W>111ߨ7otŢYtiAAޯ~m7ݲn  kTs]rh4Yf*nutt\zٳ/^NLL̜3gGSN.//go|V[ZZryKK}RT(mmmt@-  c0g|...׬Yj*G0<XXXxټ7?`0|GdL&l6G ҅B?JRMrb8   ((H$ь 	   _%%%999Ox嗗/_]XY,ߧN:}VظqUt:_?j^ Pae<1   	8sݻ6l/;.o????''/pvvX,{^^^bbt  5b9y+֭[m۶DG5S0Bs۷ƍt-l:Ν;,  `;vZBBBVVVZZÇO81]S)T,crZjUAAFٹs@ `Xqqq''5J#  o&_jҥ>>>;6k,G0ܶoаiӦٳg'vZ|@  X,6`0Z[[],   LO3.x8q			`xyy۷b+			yyyniiqt   0=ͬASGGG۷7o<I߿_*q|hܵkܹs\.˝;w={_@g{/44%&&&;;~=J=<<\\\"""~mVK?Zv-X,b1~ԞihhXfϖ-[t:}F(f``oۢEBH$Zv+WF.nW_}ϏbzU
+
+F@@^?((`\zujx+V?dΙ3g֭j7tt   0MYg}/**JT:2˖-b0RSS~tRH-YYY9sC;X,/Џ$VZ^^^'NЮ?N
+jzjoo
+
+?3mP~GɄ{ڟ|@IJJKd`67lp߿Z   `FD#\.Ç.ݻ~\n0nݺfպsNBǱcT*J:z({nz8Ί|V+V^MIII/>|xZnݺDپ};ɓ0h4!~=oBBBBzzz
+.KP(FcGGG~~eF.?6zU/^H
+ l>j$a2.\H   x\#c2D"ю;]`tɡC~Oζo<r!dܹ?p˶	!|>2쐗>2uuuH[ˊ+!_8@y`:::gk9{C{XlkvȑڱA퓒ulWU*BvIX,cv<JKK	!7npt!   0͔xTWWƖqrzJ`P>>>FZ-
+]]]As8je2nҰox:>M~D !l6h4ݚ%+t=p;;;S\	!zܺu_lllqqP8B]xzz~zܹ5kx{{766XpR~T;N*QQQׯo~B   `c9	h!cĖ:b/_%
+Vuss~bkkk޽{ͻw^tҥK۶m;}ۧ1Zzu|||EE|R㥛*|||]   L3VjG2ٳ	!ΝQTT!1Qd``Q"B޽;0n۷o}vQQQvԞCm-׮]ŰXz+77roT5`0虾tMțofX;yLGт   75-Z(33UB|
+`}rOOǏjZMgZ\>At>?^ok<v!:`0<|СC-|fY3{j֣dɒ'OrɤRvEr#1UZf9&&~rzq'''LB   `t#s%;a4ya`XdЏc	6l6m#QFHϧ:u9rσ#3lMF.cؒrU)P/B{7ӵZMMMޛ7ovt!   0#Lx۶mm$=I={s8n{ `عs'5>>~׮]alb,dʕ+k׮dٮ_wj~FYxmgBnݺQ{~<뗿e__G(ۿ/lOrrG}4000r_WҨWs!ۂ:VsssTTD"=h   `\͔ZQeӦM999;w|7&ɛar~7V[n]ݽ   0SSL&ȑ#wޱcǲe
+`dOiaǎiiiϿsR   L<_*J";&R/_rzDr={E  2!D*#""?uvv:i  3IDAT(D8NFFÇ]S`6sssϟnݺW^y  `ͬ5C]v:tjKYYYt44r#Gׯ\wޑJ.
+   f<(FѣYYY/6L&Ӆ=zEWWןZ\\  㿬Vkײ?䓁իWG?tti (..?֖qƵkx<G   1SNBRSSWZjժpG0VtR^^ŋ;;;򓟬_   0 xDќ?ܹs_|EooD"]\fׯ_7.̜={   ǘW;wʕ+,K*.]tҥ/r.?RQQQXXXPPP\\j=<<RSSW\zj???G   0oLP]~y.JR[)(------)))..h4)))iiiNNN   `L<⒒r^)}"111$$5TjJhhh`2QQQR499955566   +**$ILLLllllllLLLPP+BTVVVWWWVV466B"""i|7o@ pt    x1L߿w^UU
+!=::prǏjjj韄@ H$sILLpt    Oꪬ|Ammm [(P7Dccd")Hbcc1   fG2Lr=|f}||D"ѬYf͚@566ߚRJ`0BBBBf=+HD"qt    1Lƺ:L&˛B0,
+}}}|}}}}}iviVZV[[[U*U{{;P(CbX,b    )jBZnkkSTtpl6	//////oooooo!\]]{Rl6kV%G/)LFPP   `J@&V+---'{zzr^^^\..r===@ <6By<!͍f3LwwwBc6	!:恮.j4!:Wt:NgߨhZ}...I3A7-    #h4!Nc_ e'
+{ݶ;9#cX#'.<==9
+    Igg'!Bo zZZ,m庸jIɉՕ.`0l6͍pS   `2C     qtt     0!x     C     q     Eq    IENDB`
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.dia ns-3.19/src/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.dia
--- ns-3.18.1/src/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.dia	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,12 @@
+     ]s8~_Ay_<@f<YNf3sFqL^o?	'!NMNNklҏ?}-K ;:ƱDw$gDtܹβwwwfxzYapc^zxڀeneI0ɘySvy㯓$NqqƉqǝWpR;ϴ=&l0ku6MXt?$RюxrM4Ɑ$z$&,n4)ۥ`<ܓw7jf,N.Gq2/*z͒}?=7
+,pW^d m{N^qh.7Eh^QABVvAIk^NO'GkJCZy)z0	|nc*Zv鮯S|b.B%?<iccx,}ģq6EE;SNwAZ[q \]x!Sth_MB6o6]&ew߷pGѐE~~/SvLǳծ5r:UU+ĭJ/5.!\YWV}q".
+e8B#h AͅY L/˕Q$l)c~^_~uQY`:}6^zh8lkKN0-_0]l|BD2HZk
+Zr2x8V,a+XbKpNrTv(*$vR	`!6%c*]݈0++a"pS"<ߵ0}˞0˰- 
+e8v6!${ttl)˙赕c<tJYdoO]x"(+Z|o\y ?L(Ng،<%8$I<U_5&ץᎅu,Rihi*gU#/&є?hyʸ|TXnz_aoaۮ%ɢrbu8!V*0KP!|X~ٔ?$ZM hz[
+H0H)` B2CТv~>tad-˂Co#!jsss/crL%Te.2MXǣͲ<J FUehV!79ԒGcvb}Ep>STjXhD0ۏGhy 	y%vY聗LX-tЫCP@	
+Q,%y:E'uqN急C C/r;//f`vNH@%Xwr}!k:.xy_(mbHv5ĪXK%.SS`KqT8[&0%EGb XLw=7.	Zޢ[.N!$%20Ma,bm?>@5jfb@֑LP K/A?#3A532`G׃)kzHL^3l]NSW{kvQwib/6A`;i93n*Mٵ[<
+ ?ɒ4kUBfc:K܉c-	@[FFno85u3p޵Ļ@J2@="kih"4jQnGր@:]gfwTPeͮdR4@SvǶ? $LPJ@dRDpW, M@IL8^zˋwvKӼ$."\N'YqXƢz*? 6]tM%pK i:Y|\j4kiƏe!/_"HDj]ʗq䣦)DAESÒȨXm_hvXg4>\d4jQZBa"i(V#¤=eȱvs0<.h"
+MU씐S[E+ 6[H4jIatk<	=['ů~A3^G=@mP!luʉbSc"A"%_Hl|m$f7.SЋq3=7)GI!:ӱnc11`=;`Ok3pFwH1
+"VBeTN
+Ӝ~ssݚp"?3ܭ͵b<[R.UN"$c9!];tdޡt1P%5%2Z X^$c6<(w}	*Ţm䝳8z7{!Dy)DTNo<fij̒xDl@OMGi'Ўx`[Rb-;)*m9ylǶ1l2sL`{I*'2ªc3LB\ 3  vY|eh!xqyUC/Ij0d ήnF7TR(MuFډL-H= %ܕQEȟfgt%j՚ZW\h(6"OGU*[mMŖ/D Z좃 7@!o@ƧTr>:(PX[PoU9d,Yv5r@l9T ko^++Pov)*,
+W1wX[J@+[U,c9/V9DZYFhʭBϺUMUoV9duvMý1WfyTV&s?R~4D [S;X	BtD!3Z&dv@k?Zژ̒M@KY/Mrˆ~8f!M`DUsK_S-OAvWN6ƸtDXo@-SpmY<,9~}3hY4ӫ_a7Ov=OR Yu sl@ TY2BuLj{͋)AB(jǎ<j0ㄅq67eTR".(V}gS`+B[5sݳA$   
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.eps ns-3.19/src/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.eps
--- ns-3.18.1/src/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.eps	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-epc-x2-handover-seq-diagram.eps	1969-12-31 16:00:00.000000000 -0800
@@ -1,2995 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Title: 
-%%Creator: PScript5.dll Version 5.2.2
-%%CreationDate: 5/22/2012 10:57:55
-%%For: mrequena
-%%BoundingBox: 0 0 420 364
-%%Pages: 1
-%%Orientation: Portrait
-%%PageOrder: Ascend
-%%DocumentNeededResources: (atend)
-%%DocumentSuppliedResources: (atend)
-%%DocumentData: Clean7Bit
-%%TargetDevice: () (52.3) 320
-%%LanguageLevel: 1
-%%EndComments
-
-%%BeginDefaults
-%%PageBoundingBox: 0 0 420 364
-%%ViewingOrientation: 1 0 0 1
-%%EndDefaults
-
-%%BeginProlog
-%%BeginResource: file Pscript_WinNT_VMErrorHandler 5.0 0
-/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false
-setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype
-ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch
-def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0
-rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def
-/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def
-typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72
-def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp
-exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def
-/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype
-{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint}
-readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop
-(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def
-/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- )
-tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup
-xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint
-tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck
-{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(])
-tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup
-rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}
-forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier
-/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin
-$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0
-ne{grestoreall}if initgraphics courier setfont lmargin 720 moveto errorname
-(VMerror)eq{version cvi 2016 ge{userdict/ehsave known{clear userdict/ehsave get
-restore 2 vmreclaim}if vmstatus exch pop exch pop PrtVMMsg}if}if systemdict
-/showpage get exec(%%[ Error: )print errorname =print(; OffendingCommand: )
-print/command load =print( ]%%)= flush}if end end end}dup 0 systemdict put dup
-4 $brkpage put bind readonly put/currentpacking where{pop/setpacking where{pop
-oldpack setpacking}if}if
-%%EndResource
-%%BeginProcSet: Pscript_Res_Emul 5.0 0
-/defineresource where{pop}{userdict begin/defineresource{userdict/Resources 2
-copy known{get begin}{15 dict dup begin put}ifelse exch readonly exch
-currentdict 1 index known not{dup 30 dict def}if load 3 -1 roll 2 index put
-end}bind readonly def/findresource{userdict/Resources get exch get exch get}
-bind readonly def/resourceforall{pop pop pop pop}bind readonly def
-/resourcestatus{userdict/Resources 2 copy known{get exch 2 copy known{get exch
-known{0 -1 true}{false}ifelse}{pop pop pop false}ifelse}{pop pop pop pop false}
-ifelse}bind readonly def end}ifelse
-%%EndProcSet
-userdict /Pscript_WinNT_Incr 230 dict dup begin put
-%%BeginResource: file Pscript_FatalError 5.0 0
-userdict begin/FatalErrorIf{{initgraphics findfont 1 index 0 eq{exch pop}{dup
-length dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding
-{ISOLatin1Encoding}stopped{StandardEncoding}if def currentdict end
-/ErrFont-Latin1 exch definefont}ifelse exch scalefont setfont counttomark 3 div
-cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def end
-%%EndResource
-userdict begin/PrtVMMsg{vmstatus exch sub exch pop gt{[
-(La impresora no tiene suficiente memoria disponible para este trabajo.)100 500
-(Realice una de las siguientes operaciones e intente imprimir de nuevo:)100 485
-(Escoja "Optimizar para portabilidad" como formato de salida.)115 470
-(En el panel Configuracin de dispositivo, compruebe que "Memoria PostScript disponible" tiene el valor correcto.)
-115 455(Reduzca el nmero de fuentes del documento.)115 440
-(Imprima el documento por partes.)115 425 12/Times-Roman showpage
-(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def end
-version cvi 2016 ge{/VM?{pop}bind def}{/VM? userdict/PrtVMMsg get def}ifelse
-%%BeginResource: file Pscript_Win_Basic 5.0 0
-/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^
-/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/-
-/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true ,
-d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C
-/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M
-/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d
-/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage
-, d/K/stroke , d/W/widthshow , d/R/rotate , d/L2? false/languagelevel where{pop
-languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d/yS/yshow , d/zS/xyshow ,
-d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, d}bd/bn/bind ld/lw/Lw ld
-/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx matrix
-currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit/UtilsInit
-counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;}b
-/initialize{`{/Pscript_Win_Data where{!}{U/Pscript_Win_Data & put}?/ADO_mxRot ~
-d/TextInitialised? F d reinitialize E}{U/Pscript_Win_Data 230 dict @ ` put
-/ADO_mxRot ~ d/TextInitialised? F d reinitialize}?}b/terminate{!{& self eq
-{exit}{E}?}loop E}b/suspend/terminate , d/resume{` Pscript_Win_Data `}b U `
-/lucas 21690 d/featurebegin{countdictstack lucas[}b/featurecleanup{stopped
-{cleartomark @ lucas eq{! exit}if}loop countdictstack ~ sub @ 0 gt{{E}repeat}
-{!}?}b E/snap{transform 0.25 sub round 0.25 add ~ 0.25 sub round 0.25 add ~
-itransform}b/dsnap{dtransform round ~ round ~ idtransform}b/nonzero_round{@ 0.5
-ge{round}{@ -0.5 lt{round}{0 ge{1}{-1}?}?}?}b/nonzero_dsnap{dtransform
-nonzero_round ~ nonzero_round ~ idtransform}b U<04>cvn{}put/rr{1 ^ 0 - 0 ~ -
-neg 0 - C}b/irp{4 -2 $ + +S fx 4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b/rp{4 2 $ M 1 ^ 0
-- 0 ~ - neg 0 -}b/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool
-2 ^ put}b/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e
-{DefIf_El !}b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b
-/freeVM{/Courier findfont[40 0 0 -40 0 0]makefont Ji 2 vmreclaim}b/hfRedefFont
-{findfont @ length dict `{1 ^/FID ne{d}{! !}?}forall & E @ ` ~{/CharStrings 1
-dict `/.notdef 0 d & E d}if/Encoding 256 array 0 1 255{1 ^ ~/.notdef put}for d
-E definefont !}bind d/hfMkCIDFont{/CIDFont findresource @ length 2 add dict `{1
-^ @/FID eq ~ @/XUID eq ~/UIDBase eq or or{! !}{d}?}forall/CDevProc ~ d/Metrics2
-16 dict d/CIDFontName 1 ^ d & E 1 ^ ~/CIDFont defineresource ![~]composefont !}
-bind d
-%%EndResource
-%%BeginResource: file Pscript_Win_Utils_L1 5.0 0
-/rf{N rp L}b/fx{1 1 dtransform @ 0 ge{1 sub 1}{1 add -0.25}? 3 -1 $ @ 0 ge{1
-sub 1}{1 add -0.25}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $
-snap + +S fx rf}b/rs{N rp C K}b/rc{N rp clip N}b/UtilsInit{}b/setcolorspace{!}b
-/scol{[/setgray/setrgbcolor/setcolor/setcmykcolor/setcolor/setgray]~ get cvx
-exec}b/colspRefresh{}b/AddFontInfoBegin{/FontInfo 8 dict @ `}bind d/AddFontInfo
-{/GlyphNames2Unicode 16 dict d/GlyphNames2HostCode 16 dict d}bind d
-/AddFontInfoEnd{E d}bind d
-%%EndResource
-end
-%%EndProlog
-
-%%BeginSetup
-[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec
-1 setlinecap 1 setlinejoin
-/mysetup [ 72 600 V 0 0 -72 600 V 0 364.25198 ] def 
-%%EndSetup
-
-%%Page: 1 1
-%%PageBoundingBox: 0 0 420 364
-%%EndPageComments
-%%BeginPageSetup
-/DeviceRGB dup setcolorspace /colspABC exch def
-mysetup concat colspRefresh
-%%EndPageSetup
-
-Pscript_WinNT_Incr begin
-%%BeginResource: file Pscript_Win_GdiObject 5.0 0
-/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore
-{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d
-/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps
-L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType
-1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d
-/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal
-{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep
-gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b
-/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M
-MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep
-M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8
-+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d
-/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix
-GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0
-/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal
-makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5
-/HS_DiagCross makehatch}b/GDIBWPatternMx null d/pfprep{save 8 1 $
-/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d/yExt
-~ d/Width ~ d/BGnd ~ d/FGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 Height 0
-0]d E build_pattern ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill{O}{L}? restore}b
-/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot concat 0 0 snap +
-: 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ nonzero_dsnap YStep V ~
-XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 -0.24 +S
-GDIBWPatternDict ` Width Height E nonzero_dsnap +S/GDIBWPatternMx matrix
-currentmatrix readonly d ; ;}if}b
-%%EndResource
-%%BeginResource: file Pscript_Win_GdiObject_L1 5.0 0
-/GDIBWPatternDict 25 dict @ `/PatternType 1 d/PaintType 2 d/RepsV 6 d/RepsH 5 d
-/BBox[0 0 RepsH 1]d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d
-/Width 8 d/mx[Width 0 0 Height neg 0 Height]d/FGnd null d/BGnd null d
-/SetBGndFGnd{}b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx PaintData
-imagemask Width 0 +}repeat E}b E d/GDIpattfill{@ ` BGnd null ne PaintType 2 eq
-and{: BGnd aload ! scol fEOFill{O}{L}? ; FGnd aload ! U/iCol 2 ^ put @ 0 eq{!
-2}{@ 1 eq ~ 2 eq or{4}{5}?}? -1 $}if E @ patterncalc : 4 ^/PaintType get 2 eq
-{iCol 0 eq{6 -1 $}if iCol 1 eq iCol 2 eq or{8 -3 $}if iCol 3 eq iCol 4 eq or{9
--4 $}if iCol scol}if fEOFill{eoclip}{clip}? N patternfill ; N}b/hbf
-{GDIpattfill}b/hfMain{/fEOFill ~ d ~/iCol ~ d GDIpattfill}b/hf{: hfMain ;}b
-/mpstr 1 string d/mp{~ @ length 12 add dict copy `/PatternCTM matrix
-currentmatrix d/PatternMatrix ~ d/PatWidth XStep mpstr length mul d/PatHeight
-YStep d/FontType 3 d/Encoding 256 array d 3 string 0 1 255{Encoding ~ @ 3 ^ cvs
-cvn put}for !/FontMatrix matrix d/FontBBox BBox d/BuildChar{! @ ` XStep 0
-FontBBox aload ! setcachedevice/PaintProc , E : exec ;}b & E ~ @ 3 -1 $
-definefont}b/build_pattern{: GDIBWPatternDict ` Width Height E dsnap +S
-/GDIBWPatternMx matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix
-GDIBWPatternDict @ ` xOrg yOrg E matrix + mp CTMrestore}b/patterncalc{` :
-PatternCTM setmatrix PatternMatrix concat BBox aload ! ! ! + pathbbox ;
-PatHeight V ceiling 4 1 $ PatWidth V ceiling 4 1 $ PatHeight V floor 4 1 $
-PatWidth V floor 4 1 $ 2 ^ sub cvi abs ~ 3 ^ sub cvi abs ~ 4 2 $ PatHeight mul
-~ PatWidth mul ~ E}b/patternfill{5 -1 $ @ ` Ji PatternCTM setmatrix
-PatternMatrix concat 0 2 ^ 2 ^ M 0 1 mpstr length 1 sub{1 ^ mpstr 3 1 $ put}for
-! 2 ^{currentpoint 5 ^{mpstr S}repeat YStep add M}repeat ! ! ! ! E}b/pbf{: 14
-dict `/fGray ~ d/fEOFill ~ d/yOrg ~ d/xOrg ~ d/PaintData ~ d/OutputBPP ~ d
-/Height ~ d/Width ~ d/mx xOrg yOrg matrix + d fGray{/PaintProc{` Width Height
-OutputBPP mx PaintData image E}b}{/PaintProc{` Width Height 8 mx PaintData F
-OutputBPP 8 idiv colorimage E}b}? pathbbox fEOFill{eoclip}{clip}?/Top ~ d/Right
-~ d/Bottom ~ d/Left ~ d Top Height neg Bottom 1 sub{Left Width Right 1 sub{1 ^
-2 copy + & PaintProc neg ~ neg ~ +}bind for !}bind for E ;}b
-%%EndResource
-end reinitialize
-0 0 0 1 scol N 1212 3023 M 1212 2991 I 1213 2990 I 1214 2989 I 1216 2990 I 1216 2991 I 1216 3023 I 1216 3024 I 1214 3025 I 1213 3024 I 1212 3023 I 1212 3023 I C 
-1212 2969 M 1212 2937 I 1213 2936 I 1214 2935 I 1216 2936 I 1216 2937 I 1216 2969 I 1216 2970 I 1214 2971 I 1213 2970 I 1212 2969 I 1212 2969 I C 
-1212 2915 M 1212 2884 I 1213 2883 I 1214 2882 I 1216 2883 I 1216 2884 I 1216 2915 I 1216 2917 I 1214 2918 I 1213 2917 I 1212 2915 I 1212 2915 I C 
-1212 2861 M 1212 2830 I 1213 2829 I 1214 2828 I 1216 2829 I 1216 2830 I 1216 2861 I 1216 2863 I 1214 2864 I 1213 2863 I 1212 2861 I 1212 2861 I C 
-1212 2807 M 1212 2776 I 1213 2775 I 1214 2774 I 1216 2775 I 1216 2776 I 1216 2807 I 1216 2810 I 1214 2810 I 1213 2810 I 1212 2807 I 1212 2807 I C 
-1212 2754 M 1212 2723 I 1213 2721 I 1214 2721 I 1216 2721 I 1216 2723 I 1216 2754 I 1216 2756 I 1214 2756 I 1213 2756 I 1212 2754 I 1212 2754 I C 
-1212 2700 M 1212 2669 I 1213 2667 I 1214 2667 I 1216 2667 I 1216 2669 I 1216 2700 I 1216 2702 I 1214 2702 I 1213 2702 I 1212 2700 I 1212 2700 I C 
-1212 2647 M 1212 2615 I 1213 2614 I 1214 2613 I 1216 2614 I 1216 2615 I 1216 2647 I 1216 2648 I 1214 2649 I 1213 2648 I 1212 2647 I 1212 2647 I C 
-1212 2593 M 1212 2561 I 1213 2560 I 1214 2559 I 1216 2560 I 1216 2561 I 1216 2593 I 1216 2594 I 1214 2595 I 1213 2594 I 1212 2593 I 1212 2593 I C 
-1212 2539 M 1212 2508 I 1213 2507 I 1214 2506 I 1216 2507 I 1216 2508 I 1216 2539 I 1216 2541 I 1214 2542 I 1213 2541 I 1212 2539 I 1212 2539 I C 
-1212 2486 M 1212 2454 I 1213 2453 I 1214 2452 I 1216 2453 I 1216 2454 I 1216 2486 I 1216 2487 I 1214 2488 I 1213 2487 I 1212 2486 I 1212 2486 I C 
-1212 2432 M 1212 2400 I 1213 2399 I 1214 2398 I 1216 2399 I 1216 2400 I 1216 2432 I 1216 2434 I 1214 2434 I 1213 2434 I 1212 2432 I 1212 2432 I C 
-1212 2378 M 1212 2347 I 1213 2345 I 1214 2345 I 1216 2345 I 1216 2347 I 1216 2378 I 1216 2380 I 1214 2380 I 1213 2380 I 1212 2378 I 1212 2378 I C 
-1212 2324 M 1212 2293 I 1213 2291 I 1214 2291 I 1216 2291 I 1216 2293 I 1216 2324 I 1216 2326 I 1214 2326 I 1213 2326 I 1212 2324 I 1212 2324 I C 
-1212 2271 M 1212 2240 I 1213 2238 I 1214 2237 I 1216 2238 I 1216 2240 I 1216 2271 I 1216 2272 I 1214 2273 I 1213 2272 I 1212 2271 I 1212 2271 I C 
-1212 2217 M 1212 2186 I 1213 2184 I 1214 2183 I 1216 2184 I 1216 2186 I 1216 2217 I 1216 2218 I 1214 2219 I 1213 2218 I 1212 2217 I 1212 2217 I C 
-1212 2163 M 1212 2132 I 1213 2130 I 1214 2129 I 1216 2130 I 1216 2132 I 1216 2163 I 1216 2165 I 1214 2166 I 1213 2165 I 1212 2163 I 1212 2163 I C 
-1212 2110 M 1212 2078 I 1213 2077 I 1214 2076 I 1216 2077 I 1216 2078 I 1216 2110 I 1216 2111 I 1214 2112 I 1213 2111 I 1212 2110 I 1212 2110 I C 
-1212 2056 M 1212 2024 I 1213 2023 I 1214 2022 I 1216 2023 I 1216 2024 I 1216 2056 I 1216 2058 I 1214 2058 I 1213 2058 I 1212 2056 I 1212 2056 I C 
-1212 2002 M 1212 1971 I 1213 1970 I 1214 1969 I 1216 1970 I 1216 1971 I 1216 2002 I 1216 2004 I 1214 2005 I 1213 2004 I 1212 2002 I 1212 2002 I C 
-1212 1948 M 1212 1917 I 1213 1916 I 1214 1915 I 1216 1916 I 1216 1917 I 1216 1948 I 1216 1950 I 1214 1951 I 1213 1950 I 1212 1948 I 1212 1948 I C 
-1212 1895 M 1212 1864 I 1213 1862 I 1214 1862 I 1216 1862 I 1216 1864 I 1216 1895 I 1216 1897 I 1214 1897 I 1213 1897 I 1212 1895 I 1212 1895 I C 
-1212 1841 M 1212 1810 I 1213 1808 I 1214 1808 I 1216 1808 I 1216 1810 I 1216 1841 I 1216 1843 I 1214 1843 I 1213 1843 I 1212 1841 I 1212 1841 I C 
-1212 1787 M 1212 1757 I 1213 1754 I 1214 1754 I 1216 1754 I 1216 1757 I 1216 1787 I 1216 1789 I 1214 1790 I 1213 1789 I 1212 1787 I 1212 1787 I C 
-1212 1734 M 1212 1703 I 1213 1701 I 1214 1700 I 1216 1701 I 1216 1703 I 1216 1734 I 1216 1735 I 1214 1736 I 1213 1735 I 1212 1734 I 1212 1734 I C 
-1212 1680 M 1212 1649 I 1213 1647 I 1214 1646 I 1216 1647 I 1216 1649 I 1216 1680 I 1216 1682 I 1214 1682 I 1213 1682 I 1212 1680 I 1212 1680 I C 
-1212 1627 M 1212 1595 I 1213 1594 I 1214 1593 I 1216 1594 I 1216 1595 I 1216 1627 I 1216 1628 I 1214 1629 I 1213 1628 I 1212 1627 I 1212 1627 I C 
-1212 1573 M 1212 1541 I 1213 1540 I 1214 1539 I 1216 1540 I 1216 1541 I 1216 1573 I 1216 1574 I 1214 1575 I 1213 1574 I 1212 1573 I 1212 1573 I C 
-1212 1519 M 1212 1488 I 1213 1487 I 1214 1486 I 1216 1487 I 1216 1488 I 1216 1519 I 1216 1521 I 1214 1522 I 1213 1521 I 1212 1519 I 1212 1519 I C 
-1212 1465 M 1212 1434 I 1213 1433 I 1214 1432 I 1216 1433 I 1216 1434 I 1216 1465 I 1216 1467 I 1214 1468 I 1213 1467 I 1212 1465 I 1212 1465 I C 
-1212 1411 M 1212 1381 I 1213 1379 I 1214 1378 I 1216 1379 I 1216 1381 I 1216 1411 I 1216 1414 I 1214 1414 I 1213 1414 I 1212 1411 I 1212 1411 I C 
-1212 1358 M 1212 1327 I 1213 1325 I 1214 1325 I 1216 1325 I 1216 1327 I 1216 1358 I 1216 1360 I 1214 1360 I 1213 1360 I 1212 1358 I 1212 1358 I C 
-1212 1304 M 1212 1273 I 1213 1271 I 1214 1271 I 1216 1271 I 1216 1273 I 1216 1304 I 1216 1306 I 1214 1306 I 1213 1306 I 1212 1304 I 1212 1304 I C 
-1212 1251 M 1212 1219 I 1213 1218 I 1214 1217 I 1216 1218 I 1216 1219 I 1216 1251 I 1216 1252 I 1214 1253 I 1213 1252 I 1212 1251 I 1212 1251 I C 
-1212 1197 M 1212 1165 I 1213 1164 I 1214 1163 I 1216 1164 I 1216 1165 I 1216 1197 I 1216 1198 I 1214 1199 I 1213 1198 I 1212 1197 I 1212 1197 I C 
-1212 1144 M 1212 1112 I 1213 1111 I 1214 1110 I 1216 1111 I 1216 1112 I 1216 1144 I 1216 1145 I 1214 1146 I 1213 1145 I 1212 1144 I 1212 1144 I C 
-1212 1090 M 1212 1058 I 1213 1057 I 1214 1056 I 1216 1057 I 1216 1058 I 1216 1090 I 1216 1091 I 1214 1092 I 1213 1091 I 1212 1090 I 1212 1090 I C 
-1212 1036 M 1212 1005 I 1213 1003 I 1214 1002 I 1216 1003 I 1216 1005 I 1216 1036 I 1216 1038 I 1214 1038 I 1213 1038 I 1212 1036 I 1212 1036 I C 
-1212 982 M 1212 951 I 1213 949 I 1214 949 I 1216 949 I 1216 951 I 1216 982 I 1216 984 I 1214 984 I 1213 984 I 1212 982 I 1212 982 I C 
-1212 928 M 1212 897 I 1213 895 I 1214 895 I 1216 895 I 1216 897 I 1216 928 I 1216 930 I 1214 930 I 1213 930 I 1212 928 I 1212 928 I C 
-1212 875 M 1212 844 I 1213 842 I 1214 841 I 1216 842 I 1216 844 I 1216 875 I 1216 876 I 1214 877 I 1213 876 I 1212 875 I 1212 875 I C 
-1212 821 M 1212 790 I 1213 788 I 1214 787 I 1216 788 I 1216 790 I 1216 821 I 1216 822 I 1214 823 I 1213 822 I 1212 821 I 1212 821 I C 
-1212 768 M 1212 736 I 1213 735 I 1214 734 I 1216 735 I 1216 736 I 1216 768 I 1216 769 I 1214 770 I 1213 769 I 1212 768 I 1212 768 I C 
-1212 714 M 1212 682 I 1213 681 I 1214 680 I 1216 681 I 1216 682 I 1216 714 I 1216 715 I 1214 716 I 1213 715 I 1212 714 I 1212 714 I C 
-1212 660 M 1212 629 I 1213 627 I 1214 626 I 1216 627 I 1216 629 I 1216 660 I 1216 662 I 1214 663 I 1213 662 I 1212 660 I 1212 660 I C 
-1212 606 M 1212 575 I 1213 574 I 1214 573 I 1216 574 I 1216 575 I 1216 606 I 1216 608 I 1214 609 I 1213 608 I 1212 606 I 1212 606 I C 
-1212 552 M 1212 521 I 1213 520 I 1214 519 I 1216 520 I 1216 521 I 1216 552 I 1216 554 I 1214 555 I 1213 554 I 1212 552 I 1212 552 I C 
-1212 499 M 1212 468 I 1213 466 I 1214 466 I 1216 466 I 1216 468 I 1216 499 I 1216 501 I 1214 501 I 1213 501 I 1212 499 I 1212 499 I C 
-1212 445 M 1212 414 I 1213 412 I 1214 412 I 1216 412 I 1216 414 I 1216 445 I 1216 447 I 1214 447 I 1213 447 I 1212 445 I 1212 445 I C 
-1212 392 M 1212 361 I 1213 359 I 1214 358 I 1216 359 I 1216 361 I 1216 392 I 1216 393 I 1214 394 I 1213 393 I 1212 392 I 1212 392 I C 
-1212 338 M 1212 307 I 1213 305 I 1214 304 I 1216 305 I 1216 307 I 1216 338 I 1216 339 I 1214 340 I 1213 339 I 1212 338 I 1212 338 I C 
-1212 284 M 1212 253 I 1213 251 I 1214 250 I 1216 251 I 1216 253 I 1216 284 I 1216 286 I 1214 287 I 1213 286 I 1212 284 I 1212 284 I C 
-:  L ; K 
-N 984 13 M 984 248 I 1445 248 I 1445 13 I 984 13 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 1 Lj 1 Lc 6 Lw solid N 984 248 M 1445 248 I 1445 13 I 984 13 I 984 248 I C 
-: 0.668 0.727 +S K 
-; Pscript_WinNT_Incr begin
-%%BeginResource: file Pscript_T3Hdr 5.0 0
-{version cvi 2016 ge{32/FontType resourcestatus{pop pop true}{false}ifelse}
-{false}ifelse}exec/Is2016andT32? exch def/T32DefSBCMap{/CIDInit/ProcSet
-findresource begin 10 dict begin begincmap/CIDSystemInfo 3 dict dup begin
-/Registry(Adobe)def/Ordering(Identity1)def/Supplement 0 def end def/CMapType 0
-def/WMode 0 def 1 begincodespacerange<00><ff>endcodespacerange 1 begincidrange
-<00><ff>0 endcidrange endcmap/DrvSBCMap currentdict/CMap defineresource pop end
-end}bind def Is2016andT32?{T32DefSBCMap}def/T32RsrcBegin{Is2016andT32?{
-/BitmapFontInit/ProcSet findresource begin}if}bind def/T32RsrcEnd{Is2016andT32?
-{end}if}bind def/AddT32Char{6 1 roll 0 get 7 1 roll pop pop 5 1 roll pop
-findfont/TT32R get addglyph}bind def/AddT3Char{findfont dup 5 2 roll 1 index
-length 0 gt{cvx 1 index exch 4 exch put dup(imagemask)cvx cvn 5 exch put cvx}
-{pop cvx}ifelse 3 -1 roll/CharProcs get 3 1 roll put dup/Encoding get 5 -1 roll
-4 index put/Metrics get 3 1 roll put}bind def/AddT3T32Char Is2016andT32?{
-/AddT32Char}{/AddT3Char}ifelse load def/GreNewFontT32{5 dict begin exch
-/FontMatrix exch def exch/FontBBox exch def exch pop exch pop/CIDFontType 4 def
-dup currentdict end/CIDFont defineresource 3 -1 roll dup/DrvSBCMap dup/CMap
-resourcestatus{pop pop}{T32DefSBCMap}ifelse 5 -1 roll[exch]composefont dup
-length dict copy dup/FID undef begin exch/TT32R exch def currentdict end
-definefont/BitmapFontInit/ProcSet findresource begin/TT32R get[14 0 0 0 0 0]<>0
-4 -1 roll addglyph end}bind def/GreNewFontT3{11 dict begin pop/FontType 3 def
-/FontMatrix exch def/FontBBox exch def/Encoding exch def/CharProcs 257 dict def
-CharProcs/.notdef{}put/Metrics 257 dict def Metrics/.notdef 3 -1 roll put
-AddFontInfoBegin AddFontInfo AddFontInfoEnd/BuildChar{userdict begin/char exch
-def dup/charname exch/Encoding get char get def dup/Metrics get charname 2 copy
-known{get aload pop}{pop/.notdef get aload pop}ifelse setcachedevice begin
-Encoding char get CharProcs exch 2 copy known{get}{pop/.notdef get}ifelse end
-exec end}def currentdict end definefont pop}bind def/GreNewFont{Is2016andT32?
-{GreNewFontT32}{GreNewFontT3}ifelse}bind def/UDF3{Is2016andT32?{/BitmapFontInit
-/ProcSet findresource begin dup/CIDFont findresource removeall/CIDFont
-undefineresource undefinefont end}{pop UDF}ifelse}bind def
-%%EndResource
-end reinitialize
-/TT353ADb00
-[74 0 0 0 0 0 ] 
- 256 array 0 1 255 {1 index exch /.notdef put} for 
-[0 0 0 0 ] 
-[1 74 div 0 0 -1 74 div 0 0 ]
-/__TT353ADb00
-GreNewFont
-T32RsrcBegin
-
-1
-/g400 [29 0 3 -35 26 1 ] 
-/g400 [23 36 true [1 0 0 1 -3 35 ]  0 0]
-[<00ff80
-03fff0
-0ffff8
-1ffff8
-1ffff8
-3fc0f8
-3f0018
-7e0000
-7e0000
-7e0000
-7e0000
-7f0000
-7f0000
-3fc000
-3fe000
-1ffc00
-0fff00
-07ffc0
-01fff0
-007ff8
-000ffc
-0003fc
-0001fe
-0000fe
-00007e
-00007e
-00007e
-00007e
-c000fe
-f001fc
-fe03fc
-fffff8
-fffff0
-7fffe0
-1fff80
-03fe00
->
- ]
-/TT353ADb00 AddT3T32Char
-
-2
-/g381 [39 0 3 -35 36 1 ] 
-/g381 [33 36 true [1 0 0 1 -3 35 ]  0 0]
-[<000ffc0000
-007fff8000
-01ffffc000
-03fffff000
-07fffff800
-0ff80ffc00
-1fe003fc00
-1fc000fe00
-3f80007e00
-3f00007f00
-7e00003f00
-7e00003f00
-7e00003f80
-fc00001f80
-fc00001f80
-fc00001f80
-fc00001f80
-fc00001f80
-fc00001f80
-fc00001f80
-fc00001f80
-fc00001f80
-fc00001f80
-fe00003f00
-7e00003f00
-7e00003f00
-7f00007e00
-3f0000fe00
-3f8001fc00
-1fe003fc00
-1ff80ff800
-0ffffff000
-07ffffe000
-01ffffc000
-00ffff0000
-001ff80000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-3
-/g437 [39 0 5 -34 33 1 ] 
-/g437 [28 35 true [1 0 0 1 -5 34 ]  0 0]
-[<fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0007f0
-fe000ff0
-7e001ff0
-7f003ff0
-7f807ff0
-3fc1fdf0
-3ffff9f0
-1ffff1f0
-0fffe1f0
-07ff81f0
-00fe0000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-4
-/g396 [26 0 6 -35 25 0 ] 
-/g396 [19 35 true [1 0 0 1 -6 35 ]  0 0]
-[<000fc0
-f83fe0
-f87fe0
-f8ffe0
-f9ffe0
-fbf060
-fbe000
-ffc000
-ff8000
-ff0000
-fe0000
-fe0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-5
-/g272 [31 0 3 -35 29 1 ] 
-/g272 [26 36 true [1 0 0 1 -3 35 ]  0 0]
-[<001fe000
-00fffc00
-01ffff00
-07ffff80
-0fffffc0
-0ff01fc0
-1fc007c0
-3f8003c0
-3f000080
-7f000000
-7e000000
-7e000000
-7e000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fe000000
-7e000000
-7e000000
-7f000000
-3f0000c0
-3f8001c0
-3fc007c0
-1ff01fc0
-0fffffc0
-07ffff80
-03ffff00
-00fffc00
-003fe000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-6
-/g286 [37 0 3 -35 33 1 ] 
-/g286 [30 36 true [1 0 0 1 -3 35 ]  0 0]
-[<001ff000
-007ffe00
-01ffff00
-03ffffc0
-07ffffe0
-0ff01fe0
-1fc007f0
-3f8003f8
-3f0001f8
-7e0001f8
-7e0000f8
-7c0000fc
-7c0000fc
-fc0000fc
-fffffffc
-fffffffc
-fffffffc
-fffffffc
-fffffff8
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-7e000000
-7e000000
-7f000000
-3f000000
-3f800000
-1fe00038
-1ff803f8
-0ffffff8
-07fffff8
-01fffff8
-00ffffe0
-000ffc00
->
- ]
-/TT353ADb00 AddT3T32Char
-
-7
-/g3 [17 0 0 0 1 1 ] 
-/g3 [1 1 true [1 0 0 1 0 0 ]  0 0]
-[<00
->
- ]
-/TT353ADb00 AddT3T32Char
-
-8
-/g69 [48 0 6 -47 41 0 ] 
-/g69 [35 47 true [1 0 0 1 -6 47 ]  0 0]
-[<7f000007e0
-ff800007e0
-ffc00007e0
-ffe00007e0
-ffe00007e0
-fff00007e0
-fff00007e0
-fff80007e0
-fdf80007e0
-fdfc0007e0
-fcfc0007e0
-fcfe0007e0
-fc7f0007e0
-fc7f0007e0
-fc3f8007e0
-fc3f8007e0
-fc1fc007e0
-fc1fc007e0
-fc0fe007e0
-fc0fe007e0
-fc07f007e0
-fc03f007e0
-fc03f807e0
-fc01f807e0
-fc01fc07e0
-fc00fe07e0
-fc00fe07e0
-fc007f07e0
-fc007f07e0
-fc003f87e0
-fc003f87e0
-fc001fc7e0
-fc001fc7e0
-fc000fe7e0
-fc0007e7e0
-fc0007f7e0
-fc0003f7e0
-fc0003ffe0
-fc0001ffe0
-fc0001ffe0
-fc0000ffe0
-fc0000ffe0
-fc00007fe0
-fc00007fe0
-fc00003fe0
-fc00001fe0
-fc00000fc0
->
- ]
-/TT353ADb00 AddT3T32Char
-
-9
-/g17 [40 0 6 -47 37 0 ] 
-/g17 [31 47 true [1 0 0 1 -6 47 ]  0 0]
-[<7fffe000
-fffffc00
-ffffff00
-ffffff80
-ffffffc0
-fc007fc0
-fc001fe0
-fc000fe0
-fc0007f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0007e0
-fc0007e0
-fc000fe0
-fc001fc0
-fc007f80
-ffffff00
-fffffc00
-ffffff80
-ffffffc0
-ffffffe0
-fc003ff0
-fc000ff8
-fc0003fc
-fc0001fc
-fc0001fc
-fc0000fe
-fc0000fe
-fc0000fe
-fc0000fe
-fc0000fe
-fc0000fe
-fc0000fe
-fc0001fc
-fc0001fc
-fc0003fc
-fc0007f8
-fc001ff0
-fffffff0
-ffffffc0
-ffffff80
-fffffe00
-7ffff000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-Pscript_WinNT_Incr begin
-%%BeginResource: file Pscript_Text 5.0 0
-/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d
-/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^
-length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets
-{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{&
-/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get}
-if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{
-{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get
-StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $
-! ! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ length array copy
-put pd_CoverFCRange}if}{!}? 2 ^ ~ definefont fM 5 4 -1 $ put fM 4 0 put fM
-makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M currentpoint snap M 0 - 0
-Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d/ySP null d/sW null d/sSU{N
-/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N/sW ~ d/ySP ~ d/xSP ~ d}b/sT
-{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix astore concat 0 0 M}b/eR/; , d
-/AddOrigFP{{&/FontInfo known{&/FontInfo get length 6 add}{6}? dict `
-/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d/OrigFontStyle ~ d
-/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS{makefont
-Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 copy ~ sub 1
-add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for & E
-/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}b/mF42{15 dict ` @ 4 1 $
-FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 add 255
-idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for/FDepVector
-Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 Encoding
-length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName length 2
-add string}{FontName length 3 add string}?}? @ 0 FontName @ length string cvs
-putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ putinterval cvn 1 ^
-256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 $ put}for & @ E
-/FontName get ~ definefont ! ! ! mF}b/mF_OTF_V{~ ! ~ ! 4 -1 $ ! findfont 2 ^ ~
-definefont fM @ @ 4 6 -1 $ neg put 5 0 put 90 matrix R matrix concatmatrix
-makefont Pscript_Windows_Font 3 1 $ put}b/mF_TTF_V{3{~ !}repeat 3 -1 $ !
-findfont 1 ^ ~ definefont Pscript_Windows_Font 3 1 $ put}b/UmF{L2?
-{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName
-get undefinefont}forall undefinefont}b
-%%EndResource
-end reinitialize
-F /F0 0 /0 F /TT353ADb00 mF 
-/F0S4A F0 [74.477 0 0 -74.477 0 0 ] mFS
-F0S4A Ji 
-1055 153 M <01>S 
-1082 153 M <02>S  1118 153 M <03>S  1155 153 M <04>S  1179 153 M <05>S  1208 153 M <06>S  1242 153 M <07>S  1257 153 M <06>S  1292 153 M <08>S  1336 153 M <09>S  
-7 Lw N 1055 161 M 1373 161 I : 0.668 0.727 +S K 
-; 1 Lw solid N 2184 3023 M 2184 2991 I 2185 2990 I 2186 2989 I 2187 2990 I 2188 2991 I 2188 3023 I 2187 3024 I 2186 3025 I 2185 3024 I 2184 3023 I 2184 3023 I C 
-2184 2969 M 2184 2937 I 2185 2936 I 2186 2935 I 2187 2936 I 2188 2937 I 2188 2969 I 2187 2970 I 2186 2971 I 2185 2970 I 2184 2969 I 2184 2969 I C 
-2184 2915 M 2184 2884 I 2185 2883 I 2186 2882 I 2187 2883 I 2188 2884 I 2188 2915 I 2187 2917 I 2186 2918 I 2185 2917 I 2184 2915 I 2184 2915 I C 
-2184 2861 M 2184 2830 I 2185 2829 I 2186 2828 I 2187 2829 I 2188 2830 I 2188 2861 I 2187 2863 I 2186 2864 I 2185 2863 I 2184 2861 I 2184 2861 I C 
-2184 2807 M 2184 2776 I 2185 2775 I 2186 2774 I 2187 2775 I 2188 2776 I 2188 2807 I 2187 2810 I 2186 2810 I 2185 2810 I 2184 2807 I 2184 2807 I C 
-2184 2754 M 2184 2723 I 2185 2721 I 2186 2721 I 2187 2721 I 2188 2723 I 2188 2754 I 2187 2756 I 2186 2756 I 2185 2756 I 2184 2754 I 2184 2754 I C 
-2184 2700 M 2184 2669 I 2185 2667 I 2186 2667 I 2187 2667 I 2188 2669 I 2188 2700 I 2187 2702 I 2186 2702 I 2185 2702 I 2184 2700 I 2184 2700 I C 
-2184 2647 M 2184 2615 I 2185 2614 I 2186 2613 I 2187 2614 I 2188 2615 I 2188 2647 I 2187 2648 I 2186 2649 I 2185 2648 I 2184 2647 I 2184 2647 I C 
-2184 2593 M 2184 2561 I 2185 2560 I 2186 2559 I 2187 2560 I 2188 2561 I 2188 2593 I 2187 2594 I 2186 2595 I 2185 2594 I 2184 2593 I 2184 2593 I C 
-2184 2539 M 2184 2508 I 2185 2507 I 2186 2506 I 2187 2507 I 2188 2508 I 2188 2539 I 2187 2541 I 2186 2542 I 2185 2541 I 2184 2539 I 2184 2539 I C 
-2184 2486 M 2184 2454 I 2185 2453 I 2186 2452 I 2187 2453 I 2188 2454 I 2188 2486 I 2187 2487 I 2186 2488 I 2185 2487 I 2184 2486 I 2184 2486 I C 
-2184 2432 M 2184 2400 I 2185 2399 I 2186 2398 I 2187 2399 I 2188 2400 I 2188 2432 I 2187 2434 I 2186 2434 I 2185 2434 I 2184 2432 I 2184 2432 I C 
-2184 2378 M 2184 2347 I 2185 2345 I 2186 2345 I 2187 2345 I 2188 2347 I 2188 2378 I 2187 2380 I 2186 2380 I 2185 2380 I 2184 2378 I 2184 2378 I C 
-2184 2324 M 2184 2293 I 2185 2291 I 2186 2291 I 2187 2291 I 2188 2293 I 2188 2324 I 2187 2326 I 2186 2326 I 2185 2326 I 2184 2324 I 2184 2324 I C 
-2184 2271 M 2184 2240 I 2185 2238 I 2186 2237 I 2187 2238 I 2188 2240 I 2188 2271 I 2187 2272 I 2186 2273 I 2185 2272 I 2184 2271 I 2184 2271 I C 
-2184 2217 M 2184 2186 I 2185 2184 I 2186 2183 I 2187 2184 I 2188 2186 I 2188 2217 I 2187 2218 I 2186 2219 I 2185 2218 I 2184 2217 I 2184 2217 I C 
-2184 2163 M 2184 2132 I 2185 2130 I 2186 2129 I 2187 2130 I 2188 2132 I 2188 2163 I 2187 2165 I 2186 2166 I 2185 2165 I 2184 2163 I 2184 2163 I C 
-2184 2110 M 2184 2078 I 2185 2077 I 2186 2076 I 2187 2077 I 2188 2078 I 2188 2110 I 2187 2111 I 2186 2112 I 2185 2111 I 2184 2110 I 2184 2110 I C 
-2184 2056 M 2184 2024 I 2185 2023 I 2186 2022 I 2187 2023 I 2188 2024 I 2188 2056 I 2187 2058 I 2186 2058 I 2185 2058 I 2184 2056 I 2184 2056 I C 
-2184 2002 M 2184 1971 I 2185 1970 I 2186 1969 I 2187 1970 I 2188 1971 I 2188 2002 I 2187 2004 I 2186 2005 I 2185 2004 I 2184 2002 I 2184 2002 I C 
-2184 1948 M 2184 1917 I 2185 1916 I 2186 1915 I 2187 1916 I 2188 1917 I 2188 1948 I 2187 1950 I 2186 1951 I 2185 1950 I 2184 1948 I 2184 1948 I C 
-2184 1895 M 2184 1864 I 2185 1862 I 2186 1862 I 2187 1862 I 2188 1864 I 2188 1895 I 2187 1897 I 2186 1897 I 2185 1897 I 2184 1895 I 2184 1895 I C 
-2184 1841 M 2184 1810 I 2185 1808 I 2186 1808 I 2187 1808 I 2188 1810 I 2188 1841 I 2187 1843 I 2186 1843 I 2185 1843 I 2184 1841 I 2184 1841 I C 
-2184 1787 M 2184 1757 I 2185 1754 I 2186 1754 I 2187 1754 I 2188 1757 I 2188 1787 I 2187 1789 I 2186 1790 I 2185 1789 I 2184 1787 I 2184 1787 I C 
-2184 1734 M 2184 1703 I 2185 1701 I 2186 1700 I 2187 1701 I 2188 1703 I 2188 1734 I 2187 1735 I 2186 1736 I 2185 1735 I 2184 1734 I 2184 1734 I C 
-2184 1680 M 2184 1649 I 2185 1647 I 2186 1646 I 2187 1647 I 2188 1649 I 2188 1680 I 2187 1682 I 2186 1682 I 2185 1682 I 2184 1680 I 2184 1680 I C 
-2184 1627 M 2184 1595 I 2185 1594 I 2186 1593 I 2187 1594 I 2188 1595 I 2188 1627 I 2187 1628 I 2186 1629 I 2185 1628 I 2184 1627 I 2184 1627 I C 
-2184 1573 M 2184 1541 I 2185 1540 I 2186 1539 I 2187 1540 I 2188 1541 I 2188 1573 I 2187 1574 I 2186 1575 I 2185 1574 I 2184 1573 I 2184 1573 I C 
-2184 1519 M 2184 1488 I 2185 1487 I 2186 1486 I 2187 1487 I 2188 1488 I 2188 1519 I 2187 1521 I 2186 1522 I 2185 1521 I 2184 1519 I 2184 1519 I C 
-2184 1465 M 2184 1434 I 2185 1433 I 2186 1432 I 2187 1433 I 2188 1434 I 2188 1465 I 2187 1467 I 2186 1468 I 2185 1467 I 2184 1465 I 2184 1465 I C 
-2184 1411 M 2184 1381 I 2185 1379 I 2186 1378 I 2187 1379 I 2188 1381 I 2188 1411 I 2187 1414 I 2186 1414 I 2185 1414 I 2184 1411 I 2184 1411 I C 
-2184 1358 M 2184 1327 I 2185 1325 I 2186 1325 I 2187 1325 I 2188 1327 I 2188 1358 I 2187 1360 I 2186 1360 I 2185 1360 I 2184 1358 I 2184 1358 I C 
-2184 1304 M 2184 1273 I 2185 1271 I 2186 1271 I 2187 1271 I 2188 1273 I 2188 1304 I 2187 1306 I 2186 1306 I 2185 1306 I 2184 1304 I 2184 1304 I C 
-2184 1251 M 2184 1219 I 2185 1218 I 2186 1217 I 2187 1218 I 2188 1219 I 2188 1251 I 2187 1252 I 2186 1253 I 2185 1252 I 2184 1251 I 2184 1251 I C 
-2184 1197 M 2184 1165 I 2185 1164 I 2186 1163 I 2187 1164 I 2188 1165 I 2188 1197 I 2187 1198 I 2186 1199 I 2185 1198 I 2184 1197 I 2184 1197 I C 
-2184 1144 M 2184 1112 I 2185 1111 I 2186 1110 I 2187 1111 I 2188 1112 I 2188 1144 I 2187 1145 I 2186 1146 I 2185 1145 I 2184 1144 I 2184 1144 I C 
-2184 1090 M 2184 1058 I 2185 1057 I 2186 1056 I 2187 1057 I 2188 1058 I 2188 1090 I 2187 1091 I 2186 1092 I 2185 1091 I 2184 1090 I 2184 1090 I C 
-2184 1036 M 2184 1005 I 2185 1003 I 2186 1002 I 2187 1003 I 2188 1005 I 2188 1036 I 2187 1038 I 2186 1038 I 2185 1038 I 2184 1036 I 2184 1036 I C 
-2184 982 M 2184 951 I 2185 949 I 2186 949 I 2187 949 I 2188 951 I 2188 982 I 2187 984 I 2186 984 I 2185 984 I 2184 982 I 2184 982 I C 
-2184 928 M 2184 897 I 2185 895 I 2186 895 I 2187 895 I 2188 897 I 2188 928 I 2187 930 I 2186 930 I 2185 930 I 2184 928 I 2184 928 I C 
-2184 875 M 2184 844 I 2185 842 I 2186 841 I 2187 842 I 2188 844 I 2188 875 I 2187 876 I 2186 877 I 2185 876 I 2184 875 I 2184 875 I C 
-2184 821 M 2184 790 I 2185 788 I 2186 787 I 2187 788 I 2188 790 I 2188 821 I 2187 822 I 2186 823 I 2185 822 I 2184 821 I 2184 821 I C 
-2184 768 M 2184 736 I 2185 735 I 2186 734 I 2187 735 I 2188 736 I 2188 768 I 2187 769 I 2186 770 I 2185 769 I 2184 768 I 2184 768 I C 
-2184 714 M 2184 682 I 2185 681 I 2186 680 I 2187 681 I 2188 682 I 2188 714 I 2187 715 I 2186 716 I 2185 715 I 2184 714 I 2184 714 I C 
-2184 660 M 2184 629 I 2185 627 I 2186 626 I 2187 627 I 2188 629 I 2188 660 I 2187 662 I 2186 663 I 2185 662 I 2184 660 I 2184 660 I C 
-2184 606 M 2184 575 I 2185 574 I 2186 573 I 2187 574 I 2188 575 I 2188 606 I 2187 608 I 2186 609 I 2185 608 I 2184 606 I 2184 606 I C 
-2184 552 M 2184 521 I 2185 520 I 2186 519 I 2187 520 I 2188 521 I 2188 552 I 2187 554 I 2186 555 I 2185 554 I 2184 552 I 2184 552 I C 
-2184 499 M 2184 468 I 2185 466 I 2186 466 I 2187 466 I 2188 468 I 2188 499 I 2187 501 I 2186 501 I 2185 501 I 2184 499 I 2184 499 I C 
-2184 445 M 2184 414 I 2185 412 I 2186 412 I 2187 412 I 2188 414 I 2188 445 I 2187 447 I 2186 447 I 2185 447 I 2184 445 I 2184 445 I C 
-2184 392 M 2184 361 I 2185 359 I 2186 358 I 2187 359 I 2188 361 I 2188 392 I 2187 393 I 2186 394 I 2185 393 I 2184 392 I 2184 392 I C 
-2184 338 M 2184 307 I 2185 305 I 2186 304 I 2187 305 I 2188 307 I 2188 338 I 2187 339 I 2186 340 I 2185 339 I 2184 338 I 2184 338 I C 
-2184 284 M 2184 253 I 2185 251 I 2186 250 I 2187 251 I 2188 253 I 2188 284 I 2187 286 I 2186 287 I 2185 286 I 2184 284 I 2184 284 I C 
-:  L ; K 
-N 1955 13 M 1955 248 I 2417 248 I 2417 13 I 1955 13 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 6 Lw solid N 1955 248 M 2417 248 I 2417 13 I 1955 13 I 1955 248 I C 
-: 0.668 0.727 +S K 
-; T32RsrcBegin
-
-10
-/g410 [25 0 1 -43 23 1 ] 
-/g410 [22 44 true [1 0 0 1 -1 43 ]  0 0]
-[<03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-fffffc
-fffffc
-fffffc
-fffffc
-fffffc
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f800
-03f800
-01fc1c
-01fffc
-00fffc
-00fffc
-003ffc
-000ff0
->
- ]
-/TT353ADb00 AddT3T32Char
-
-11
-/g258 [35 0 3 -35 30 1 ] 
-/g258 [27 36 true [1 0 0 1 -3 35 ]  0 0]
-[<003fe000
-03fffc00
-0ffffe00
-1fffff80
-3fffff80
-3fc07fc0
-3e001fc0
-38000fc0
-00000fe0
-000007e0
-000007e0
-000007e0
-000007e0
-000007e0
-001fffe0
-01ffffe0
-07ffffe0
-0fffffe0
-3fffffe0
-3fe007e0
-7f8007e0
-7e0007e0
-fe0007e0
-fc0007e0
-fc0007e0
-fc0007e0
-fc0007e0
-fc000fe0
-fe003fe0
-7f007fe0
-7f81ffe0
-3ffffbe0
-3ffff3e0
-1fffe3e0
-07ff83e0
-01fe0000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-12
-/g336 [35 0 2 -35 33 14 ] 
-/g336 [31 49 true [1 0 0 1 -2 35 ]  0 0]
-[<001fc000
-00fffffe
-03fffffe
-07fffffe
-0ffffffe
-0ff07ffe
-1fc01f80
-1f800fc0
-3f800fc0
-3f0007e0
-3f0007e0
-3f0007e0
-3f0007e0
-3f0007e0
-3f800fe0
-1f800fc0
-1fc01fc0
-0ff07fc0
-0fffff80
-0fffff00
-1ffffe00
-3ffff800
-3e1fe000
-7c000000
-7c000000
-7c000000
-7e000000
-7f000000
-7ffff800
-3fffff80
-1fffffe0
-0ffffff8
-0ffffff8
-1f8007fc
-3f0001fe
-7e0000fe
-7e00007e
-fc00007e
-fc00007e
-fc00007e
-fc0000fe
-fe0000fc
-ff0003fc
-7fc00ff8
-7ffffff0
-3fffffe0
-0fffffc0
-07ffff00
-007ff000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-2036 153 M <0A>S 
-2058 153 M <0B>S  2091 153 M <04>S  2115 153 M <0C>S  2148 153 M <06>S  2182 153 M <0A>S  2205 153 M <07>S  2220 153 M <06>S  2254 153 M <08>S  2299 153 M <09>S  
-7 Lw N 2036 161 M 2336 161 I : 0.668 0.727 +S K 
-; 6 Lw N 1214 584 M 2118 584 I : 0.668 0.727 +S K 
-; N 2186 584 M 2153 604 I 2153 563 I 2186 584 I C 
-2153 604 M 2186 584 I 2153 604 I C 
- O 10 Lw N 2186 584 M 2153 604 I 2153 563 I 2186 584 I : 0.668 0.727 +S K 
-; N 2153 604 M 2186 584 I : 0.668 0.727 +S K 
-; 6 Lw N 2153 584 M 2099 584 I : 0.668 0.727 +S K 
-; N 1392 440 M 1392 529 I 2009 529 I 2009 440 I 1392 440 I C 
-1 1 1 1 scol  O 0 0 0 1 scol T32RsrcBegin
-
-13
-/g44 [46 0 6 -47 40 0 ] 
-/g44 [34 47 true [1 0 0 1 -6 47 ]  0 0]
-[<fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-ffffffffc0
-ffffffffc0
-ffffffffc0
-ffffffffc0
-ffffffffc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
-fc00000fc0
->
- ]
-/TT353ADb00 AddT3T32Char
-
-14
-/g4 [43 0 1 -47 42 0 ] 
-/g4 [41 47 true [1 0 0 1 -1 47 ]  0 0]
-[<00007f000000
-0000ff800000
-0000ff800000
-0001ff800000
-0001ffc00000
-0001ffc00000
-0003ffc00000
-0003f7e00000
-0003e7e00000
-0007e7f00000
-0007e3f00000
-0007c3f00000
-000fc3f80000
-000fc1f80000
-001f81f80000
-001f81fc0000
-001f80fc0000
-003f00fc0000
-003f00fe0000
-003f007e0000
-007e007f0000
-007e007f0000
-007e003f0000
-00fc003f8000
-00fc003f8000
-01fc001f8000
-01f8001fc000
-01f8001fc000
-03f8000fc000
-03f0000fe000
-03ffffffe000
-07ffffffe000
-07fffffff000
-07fffffff000
-0ffffffff800
-0fc00003f800
-0fc00003f800
-1fc00001fc00
-1f800001fc00
-3f800000fc00
-3f800000fe00
-3f000000fe00
-7f0000007e00
-7e0000007f00
-7e0000007f00
-fe0000003f00
-fc0000003f00
->
- ]
-/TT353ADb00 AddT3T32Char
-
-15
-/g24 [46 0 6 -47 42 0 ] 
-/g24 [36 47 true [1 0 0 1 -6 47 ]  0 0]
-[<7fffe00000
-fffffe0000
-ffffff8000
-ffffffe000
-fffffff000
-fc007ffc00
-fc000ffe00
-fc0003fe00
-fc0000ff00
-fc00007f80
-fc00007f80
-fc00003fc0
-fc00001fc0
-fc00001fe0
-fc00000fe0
-fc00000fe0
-fc00000fe0
-fc00000ff0
-fc000007f0
-fc000007f0
-fc000007f0
-fc000007f0
-fc000007f0
-fc000007f0
-fc000007f0
-fc000007f0
-fc000007f0
-fc000007f0
-fc000007f0
-fc00000fe0
-fc00000fe0
-fc00000fe0
-fc00000fe0
-fc00001fc0
-fc00001fc0
-fc00003fc0
-fc00003f80
-fc00007f80
-fc0000ff00
-fc0003fe00
-fc0007fc00
-fc003ff800
-fffffff000
-ffffffe000
-ffffff8000
-fffffe0000
-7fffe00000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-16
-/g75 [49 0 4 -48 46 1 ] 
-/g75 [42 49 true [1 0 0 1 -4 48 ]  0 0]
-[<0000ffe00000
-0007fffc0000
-001fffff0000
-007fffffc000
-00ffffffe000
-03ff807ff000
-03fe000ff800
-07f80007fc00
-0ff00003fe00
-1fe00001fe00
-1fc00000ff00
-3fc000007f00
-3f8000007f00
-3f8000007f80
-7f0000003f80
-7f0000003f80
-7f0000003f80
-7f0000003fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-ff0000003f80
-7f0000003f80
-7f0000003f80
-7f0000003f80
-7f8000007f00
-3f8000007f00
-3f800000ff00
-3fc00000fe00
-1fe00001fe00
-1fe00003fc00
-0ff80007f800
-07fc001ff000
-03ff807ff000
-01ffffffc000
-00ffffff8000
-003ffffe0000
-000ffff80000
-0001ffc00000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-17
-/g115 [42 0 1 -47 40 0 ] 
-/g115 [39 47 true [1 0 0 1 -1 47 ]  0 0]
-[<fc0000007e
-fe0000007e
-fe0000007e
-7e000000fe
-7f000000fc
-7f000000fc
-3f000001fc
-3f800001f8
-3f800001f8
-1f800003f8
-1fc00003f0
-1fc00003f0
-0fc00007f0
-0fe00007e0
-07e00007e0
-07e0000fc0
-07f0000fc0
-03f0000fc0
-03f8001f80
-03f8001f80
-01f8001f80
-01fc003f00
-01fc003f00
-00fc003f00
-00fe007e00
-00fe007e00
-007e007e00
-007f00fc00
-007f00fc00
-003f00fc00
-003f81f800
-001f81f800
-001f81f000
-001fc3f000
-000fc3f000
-000fc3e000
-000fe7e000
-0007e7e000
-0007e7c000
-0007ffc000
-0003ffc000
-0003ff8000
-0003ff8000
-0001ff8000
-0001ff0000
-0000ff0000
-0000fe0000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-18
-/g28 [36 0 6 -47 32 0 ] 
-/g28 [26 47 true [1 0 0 1 -6 47 ]  0 0]
-[<7fffffc0
-ffffffc0
-ffffffc0
-ffffffc0
-ffffffc0
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fffffe00
-fffffe00
-fffffe00
-fffffe00
-fffffe00
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-ffffffc0
-ffffffc0
-ffffffc0
-ffffffc0
-7fffffc0
->
- ]
-/TT353ADb00 AddT3T32Char
-
-19
-/g90 [40 0 6 -47 37 0 ] 
-/g90 [31 47 true [1 0 0 1 -6 47 ]  0 0]
-[<7fffc000
-fffff800
-fffffe00
-ffffff00
-ffffff80
-fc00ffc0
-fc003fe0
-fc001fe0
-fc000fe0
-fc000ff0
-fc0007f0
-fc0007f0
-fc0007f0
-fc0007f0
-fc0007f0
-fc0007f0
-fc000fe0
-fc000fe0
-fc001fe0
-fc003fc0
-fc00ff80
-ffffff00
-fffffe00
-fffff800
-fffff000
-fffff800
-fc07fc00
-fc01fe00
-fc00ff00
-fc007f00
-fc003f80
-fc003f80
-fc001fc0
-fc001fc0
-fc000fe0
-fc000fe0
-fc0007e0
-fc0007f0
-fc0007f0
-fc0003f8
-fc0003f8
-fc0001f8
-fc0001fc
-fc0001fc
-fc0000fe
-fc0000fe
-fc00007e
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1392 507 M <0D>S 
-1435 507 M <0E>S  1474 507 M <08>S  1518 507 M <0F>S  1561 507 M <10>S  1606 507 M <11>S  1645 507 M <12>S  1679 507 M <13>S  
-T32RsrcBegin
-
-20
-/g890 [37 0 0 9 37 14 ] 
-/g890 [37 5 true [1 0 0 1 0 -9 ]  0 0]
-[<fffffffff8
-fffffffff8
-fffffffff8
-fffffffff8
-fffffffff8
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1716 507 M <14>S 
-T32RsrcBegin
-
-21
-/g89 [50 0 4 -48 52 7 ] 
-/g89 [48 55 true [1 0 0 1 -4 48 ]  0 0]
-[<0000ffe00000
-0007fffc0000
-001fffff0000
-007fffffc000
-00ffffffe000
-03ff807ff000
-03fe000ff800
-07f80007fc00
-0ff00003fc00
-1fe00001fe00
-1fc00000ff00
-3fc000007f00
-3f8000007f00
-3f8000007f80
-7f0000003f80
-7f0000003f80
-7f0000003f80
-7f0000003fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-fe0000001fc0
-ff0000003f80
-7f0000003f80
-7f0000003f80
-7f0000003f80
-7f8000007f00
-3f8000007f00
-3f800000ff00
-3fc00000fe00
-1fe00001fe00
-1fe00003fc00
-0ff80007f800
-07fc001ff000
-03ff807ff800
-01fffffffc00
-00ffffffff00
-007ffffeff80
-000ffff87fe0
-0001ffc03ffc
-000000001ffe
-0000000007ff
-0000000003ff
-0000000000ff
-00000000003f
-000000000007
->
- ]
-/TT353ADb00 AddT3T32Char
-
-22
-/g104 [47 0 6 -47 41 1 ] 
-/g104 [35 48 true [1 0 0 1 -6 47 ]  0 0]
-[<fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fc000007e0
-fe00000fc0
-7e00000fc0
-7f00000fc0
-7f00001f80
-3f80003f80
-3fc0007f00
-1fe000ff00
-0ffc07fe00
-07fffffc00
-03fffff800
-01ffffe000
-007fff8000
-000ffc0000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-23
-/g94 [34 0 3 -48 32 1 ] 
-/g94 [29 49 true [1 0 0 1 -3 48 ]  0 0]
-[<001ff000
-00fffe00
-03ffff80
-07ffffc0
-0fffffc0
-1fe01fc0
-3fc003c0
-3f0000c0
-3f000000
-7e000000
-7e000000
-7e000000
-7e000000
-7e000000
-7f000000
-7f000000
-3f800000
-3fc00000
-3fe00000
-1ff80000
-0ffe0000
-07ffc000
-03fff000
-01fffc00
-007ffe00
-001fff80
-0007ffc0
-0001ffe0
-00007fe0
-00001ff0
-00000ff0
-000007f8
-000007f8
-000003f8
-000003f8
-000003f8
-000003f8
-000003f8
-000003f8
-000007f0
-c00007f0
-f0000fe0
-fc001fe0
-ff80ffc0
-ffffff80
-7fffff00
-3ffffe00
-07fff800
-00ffc000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-24
-/g100 [36 0 1 -47 35 0 ] 
-/g100 [34 47 true [1 0 0 1 -1 47 ]  0 0]
-[<ffffffffc0
-ffffffffc0
-ffffffffc0
-ffffffffc0
-ffffffffc0
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
-0003f00000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1749 507 M <13>S 
-1786 507 M <12>S  1820 507 M <15>S  1866 507 M <16>S  1910 507 M <12>S  1944 507 M <17>S  1975 507 M <18>S  
-N 2186 919 M 1282 919 I : 0.668 0.727 +S K 
-; N 1214 919 M 1247 898 I 1247 940 I 1214 919 I C 
-1247 898 M 1214 919 I 1247 898 I C 
- O 10 Lw N 1214 919 M 1247 898 I 1247 940 I 1214 919 I : 0.668 0.727 +S K 
-; N 1247 898 M 1214 919 I : 0.668 0.727 +S K 
-; 6 Lw N 1247 919 M 1301 919 I : 0.668 0.727 +S K 
-; N 1318 809 M 1318 898 I 2082 898 I 2082 809 I 1318 809 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 1318 876 M <0D>S 
-1361 876 M <0E>S  1401 876 M <08>S  1445 876 M <0F>S  1487 876 M <10>S  1533 876 M <11>S  1572 876 M <12>S  1606 876 M <13>S  
-1643 876 M <14>S 
-1677 876 M <13>S 
-1714 876 M <12>S  1747 876 M <15>S  1793 876 M <16>S  1838 876 M <12>S  1871 876 M <17>S  1903 876 M <18>S  
-1936 876 M <14>S 
-T32RsrcBegin
-
-25
-/g18 [39 0 4 -48 37 1 ] 
-/g18 [33 49 true [1 0 0 1 -4 48 ]  0 0]
-[<0001ff0000
-000fffe000
-003ffff800
-007ffffe00
-00ffffff00
-01ff80ff80
-03fe001f80
-07f8000f80
-0ff0000380
-0fe0000180
-1fc0000000
-1fc0000000
-3f80000000
-3f80000000
-7f80000000
-7f00000000
-7f00000000
-7f00000000
-7f00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-fe00000000
-ff00000000
-7f00000000
-7f00000000
-7f00000000
-7f80000000
-3f80000000
-3fc0000000
-1fc0000000
-1fe0000000
-0ff0000180
-0ff8000780
-07fc001f80
-03ff807f80
-01ffffff80
-00ffffff00
-007ffffc00
-001ffff000
-0001ff0000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-26
-/g60 [38 0 6 -47 36 0 ] 
-/g60 [30 47 true [1 0 0 1 -6 47 ]  0 0]
-[<fc0001f8
-fc0003f8
-fc0007f8
-fc0007f0
-fc000fe0
-fc001fc0
-fc003fc0
-fc007f80
-fc007f00
-fc00fe00
-fc01fc00
-fc03f800
-fc07f800
-fc07f000
-fc0fe000
-fc1fc000
-fc3f8000
-fc7f0000
-fc7f0000
-fcfe0000
-fdfc0000
-fff80000
-fff80000
-fdfc0000
-fdfe0000
-fcfe0000
-fc7f0000
-fc3f8000
-fc3fc000
-fc1fe000
-fc0fe000
-fc07f000
-fc07f800
-fc03fc00
-fc01fc00
-fc00fe00
-fc00ff00
-fc007f80
-fc003f80
-fc001fc0
-fc001fe0
-fc000ff0
-fc0007f0
-fc0007f8
-fc0003fc
-fc0001fc
-fc0000fc
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1970 876 M <0E>S 
-2009 876 M <19>S  2046 876 M <1A>S  
-N 1214 1590 M 2118 1590 I : 0.668 0.727 +S K 
-; N 2186 1590 M 2153 1611 I 2153 1569 I 2186 1590 I C 
-2153 1611 M 2186 1590 I 2153 1611 I C 
- O 10 Lw N 2186 1590 M 2153 1611 I 2153 1569 I 2186 1590 I : 0.668 0.727 +S K 
-; N 2153 1611 M 2186 1590 I : 0.668 0.727 +S K 
-; 6 Lw N 2153 1590 M 2099 1590 I : 0.668 0.727 +S K 
-; N 1377 1446 M 1377 1536 I 2023 1536 I 2023 1446 I 1377 1446 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 1377 1514 M <17>S 
-1409 1514 M <08>S  
-1453 1514 M <14>S 
-1487 1514 M <17>S 
-1518 1514 M <18>S  1552 1514 M <0E>S  1592 1514 M <18>S  1625 1514 M <16>S  1669 1514 M <17>S  
-1701 1514 M <14>S 
-T32RsrcBegin
-
-27
-/g38 [34 0 6 -47 31 0 ] 
-/g38 [25 47 true [1 0 0 1 -6 47 ]  0 0]
-[<7fffff80
-ffffff80
-ffffff80
-ffffff80
-ffffff80
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-ffffff00
-ffffff00
-ffffff00
-ffffff00
-ffffff00
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1734 1514 M <18>S 
-1768 1514 M <13>S  1805 1514 M <0E>S  1844 1514 M <08>S  1889 1514 M <17>S  1920 1514 M <1B>S  1952 1514 M <12>S  1985 1514 M <13>S  
-N 2186 2932 M 1282 2932 I : 0.668 0.727 +S K 
-; N 1214 2932 M 1247 2912 I 1247 2953 I 1214 2932 I C 
-1247 2912 M 1214 2932 I 1247 2912 I C 
- O 10 Lw N 1214 2932 M 1247 2912 I 1247 2953 I 1214 2932 I : 0.668 0.727 +S K 
-; N 1247 2912 M 1214 2932 I : 0.668 0.727 +S K 
-; 6 Lw N 1247 2932 M 1301 2932 I : 0.668 0.727 +S K 
-; N 1377 2823 M 1377 2912 I 2023 2912 I 2023 2823 I 1377 2823 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 1377 2890 M <16>S 
-1422 2890 M <12>S  
-1455 2890 M <14>S 
-T32RsrcBegin
-
-28
-/g121 [38 0 2 -47 37 0 ] 
-/g121 [35 47 true [1 0 0 1 -2 47 ]  0 0]
-[<fe00000fc0
-7f00001fc0
-7f00001f80
-3f80003f80
-3f80007f00
-1fc0007f00
-1fc000fe00
-0fe000fe00
-07f001fc00
-07f001f800
-03f803f800
-03f807f000
-01fc07f000
-01fe0fe000
-00fe0fc000
-007f1fc000
-007f1f8000
-003fbf8000
-003fff0000
-001ffe0000
-000ffe0000
-000ffc0000
-0007fc0000
-0007fc0000
-000ffc0000
-000ffe0000
-001ffe0000
-001fff0000
-003f3f8000
-007f3f8000
-007e1fc000
-00fe1fc000
-00fc0fe000
-01fc07f000
-03f807f000
-03f003f800
-07f003f800
-07e001fc00
-0fe001fc00
-1fc000fe00
-1fc000ff00
-3f80007f00
-3f80003f80
-7f00003f80
-fe00001fc0
-fe00001fc0
-fc00000fc0
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1489 2890 M <19>S 
-1525 2890 M <10>S  1571 2890 M <08>S  1615 2890 M <18>S  1649 2890 M <12>S  1682 2890 M <1C>S  1718 2890 M <18>S  
-1751 2890 M <14>S 
-T32RsrcBegin
-
-29
-/g62 [31 0 6 -47 30 0 ] 
-/g62 [24 47 true [1 0 0 1 -6 47 ]  0 0]
-[<fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-fc0000
-ffffff
-ffffff
-ffffff
-ffffff
-7fffff
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1785 2890 M <13>S 
-1822 2890 M <12>S  1856 2890 M <1D>S  1885 2890 M <12>S  1918 2890 M <0E>S  1958 2890 M <17>S  1989 2890 M <12>S  
-1 Lw solid N 241 3023 M 241 2991 I 242 2990 I 243 2989 I 244 2990 I 245 2991 I 245 3023 I 244 3024 I 243 3025 I 242 3024 I 241 3023 I 241 3023 I C 
-241 2969 M 241 2937 I 242 2936 I 243 2935 I 244 2936 I 245 2937 I 245 2969 I 244 2970 I 243 2971 I 242 2970 I 241 2969 I 241 2969 I C 
-241 2915 M 241 2884 I 242 2883 I 243 2882 I 244 2883 I 245 2884 I 245 2915 I 244 2917 I 243 2918 I 242 2917 I 241 2915 I 241 2915 I C 
-241 2861 M 241 2830 I 242 2829 I 243 2828 I 244 2829 I 245 2830 I 245 2861 I 244 2863 I 243 2864 I 242 2863 I 241 2861 I 241 2861 I C 
-241 2807 M 241 2776 I 242 2775 I 243 2774 I 244 2775 I 245 2776 I 245 2807 I 244 2810 I 243 2810 I 242 2810 I 241 2807 I 241 2807 I C 
-241 2754 M 241 2723 I 242 2721 I 243 2721 I 244 2721 I 245 2723 I 245 2754 I 244 2756 I 243 2756 I 242 2756 I 241 2754 I 241 2754 I C 
-241 2700 M 241 2669 I 242 2667 I 243 2667 I 244 2667 I 245 2669 I 245 2700 I 244 2702 I 243 2702 I 242 2702 I 241 2700 I 241 2700 I C 
-241 2647 M 241 2615 I 242 2614 I 243 2613 I 244 2614 I 245 2615 I 245 2647 I 244 2648 I 243 2649 I 242 2648 I 241 2647 I 241 2647 I C 
-241 2593 M 241 2561 I 242 2560 I 243 2559 I 244 2560 I 245 2561 I 245 2593 I 244 2594 I 243 2595 I 242 2594 I 241 2593 I 241 2593 I C 
-241 2539 M 241 2508 I 242 2507 I 243 2506 I 244 2507 I 245 2508 I 245 2539 I 244 2541 I 243 2542 I 242 2541 I 241 2539 I 241 2539 I C 
-241 2486 M 241 2454 I 242 2453 I 243 2452 I 244 2453 I 245 2454 I 245 2486 I 244 2487 I 243 2488 I 242 2487 I 241 2486 I 241 2486 I C 
-241 2432 M 241 2400 I 242 2399 I 243 2398 I 244 2399 I 245 2400 I 245 2432 I 244 2434 I 243 2434 I 242 2434 I 241 2432 I 241 2432 I C 
-241 2378 M 241 2347 I 242 2345 I 243 2345 I 244 2345 I 245 2347 I 245 2378 I 244 2380 I 243 2380 I 242 2380 I 241 2378 I 241 2378 I C 
-241 2324 M 241 2293 I 242 2291 I 243 2291 I 244 2291 I 245 2293 I 245 2324 I 244 2326 I 243 2326 I 242 2326 I 241 2324 I 241 2324 I C 
-241 2271 M 241 2240 I 242 2238 I 243 2237 I 244 2238 I 245 2240 I 245 2271 I 244 2272 I 243 2273 I 242 2272 I 241 2271 I 241 2271 I C 
-241 2217 M 241 2186 I 242 2184 I 243 2183 I 244 2184 I 245 2186 I 245 2217 I 244 2218 I 243 2219 I 242 2218 I 241 2217 I 241 2217 I C 
-241 2163 M 241 2132 I 242 2130 I 243 2129 I 244 2130 I 245 2132 I 245 2163 I 244 2165 I 243 2166 I 242 2165 I 241 2163 I 241 2163 I C 
-241 2110 M 241 2078 I 242 2077 I 243 2076 I 244 2077 I 245 2078 I 245 2110 I 244 2111 I 243 2112 I 242 2111 I 241 2110 I 241 2110 I C 
-241 2056 M 241 2024 I 242 2023 I 243 2022 I 244 2023 I 245 2024 I 245 2056 I 244 2058 I 243 2058 I 242 2058 I 241 2056 I 241 2056 I C 
-241 2002 M 241 1971 I 242 1970 I 243 1969 I 244 1970 I 245 1971 I 245 2002 I 244 2004 I 243 2005 I 242 2004 I 241 2002 I 241 2002 I C 
-241 1948 M 241 1917 I 242 1916 I 243 1915 I 244 1916 I 245 1917 I 245 1948 I 244 1950 I 243 1951 I 242 1950 I 241 1948 I 241 1948 I C 
-241 1895 M 241 1864 I 242 1862 I 243 1862 I 244 1862 I 245 1864 I 245 1895 I 244 1897 I 243 1897 I 242 1897 I 241 1895 I 241 1895 I C 
-241 1841 M 241 1810 I 242 1808 I 243 1808 I 244 1808 I 245 1810 I 245 1841 I 244 1843 I 243 1843 I 242 1843 I 241 1841 I 241 1841 I C 
-241 1787 M 241 1757 I 242 1754 I 243 1754 I 244 1754 I 245 1757 I 245 1787 I 244 1789 I 243 1790 I 242 1789 I 241 1787 I 241 1787 I C 
-241 1734 M 241 1703 I 242 1701 I 243 1700 I 244 1701 I 245 1703 I 245 1734 I 244 1735 I 243 1736 I 242 1735 I 241 1734 I 241 1734 I C 
-241 1680 M 241 1649 I 242 1647 I 243 1646 I 244 1647 I 245 1649 I 245 1680 I 244 1682 I 243 1682 I 242 1682 I 241 1680 I 241 1680 I C 
-241 1627 M 241 1595 I 242 1594 I 243 1593 I 244 1594 I 245 1595 I 245 1627 I 244 1628 I 243 1629 I 242 1628 I 241 1627 I 241 1627 I C 
-241 1573 M 241 1541 I 242 1540 I 243 1539 I 244 1540 I 245 1541 I 245 1573 I 244 1574 I 243 1575 I 242 1574 I 241 1573 I 241 1573 I C 
-241 1519 M 241 1488 I 242 1487 I 243 1486 I 244 1487 I 245 1488 I 245 1519 I 244 1521 I 243 1522 I 242 1521 I 241 1519 I 241 1519 I C 
-241 1465 M 241 1434 I 242 1433 I 243 1432 I 244 1433 I 245 1434 I 245 1465 I 244 1467 I 243 1468 I 242 1467 I 241 1465 I 241 1465 I C 
-241 1411 M 241 1381 I 242 1379 I 243 1378 I 244 1379 I 245 1381 I 245 1411 I 244 1414 I 243 1414 I 242 1414 I 241 1411 I 241 1411 I C 
-241 1358 M 241 1327 I 242 1325 I 243 1325 I 244 1325 I 245 1327 I 245 1358 I 244 1360 I 243 1360 I 242 1360 I 241 1358 I 241 1358 I C 
-241 1304 M 241 1273 I 242 1271 I 243 1271 I 244 1271 I 245 1273 I 245 1304 I 244 1306 I 243 1306 I 242 1306 I 241 1304 I 241 1304 I C 
-241 1251 M 241 1219 I 242 1218 I 243 1217 I 244 1218 I 245 1219 I 245 1251 I 244 1252 I 243 1253 I 242 1252 I 241 1251 I 241 1251 I C 
-241 1197 M 241 1165 I 242 1164 I 243 1163 I 244 1164 I 245 1165 I 245 1197 I 244 1198 I 243 1199 I 242 1198 I 241 1197 I 241 1197 I C 
-241 1144 M 241 1112 I 242 1111 I 243 1110 I 244 1111 I 245 1112 I 245 1144 I 244 1145 I 243 1146 I 242 1145 I 241 1144 I 241 1144 I C 
-241 1090 M 241 1058 I 242 1057 I 243 1056 I 244 1057 I 245 1058 I 245 1090 I 244 1091 I 243 1092 I 242 1091 I 241 1090 I 241 1090 I C 
-241 1036 M 241 1005 I 242 1003 I 243 1002 I 244 1003 I 245 1005 I 245 1036 I 244 1038 I 243 1038 I 242 1038 I 241 1036 I 241 1036 I C 
-241 982 M 241 951 I 242 949 I 243 949 I 244 949 I 245 951 I 245 982 I 244 984 I 243 984 I 242 984 I 241 982 I 241 982 I C 
-241 928 M 241 897 I 242 895 I 243 895 I 244 895 I 245 897 I 245 928 I 244 930 I 243 930 I 242 930 I 241 928 I 241 928 I C 
-241 875 M 241 844 I 242 842 I 243 841 I 244 842 I 245 844 I 245 875 I 244 876 I 243 877 I 242 876 I 241 875 I 241 875 I C 
-241 821 M 241 790 I 242 788 I 243 787 I 244 788 I 245 790 I 245 821 I 244 822 I 243 823 I 242 822 I 241 821 I 241 821 I C 
-241 768 M 241 736 I 242 735 I 243 734 I 244 735 I 245 736 I 245 768 I 244 769 I 243 770 I 242 769 I 241 768 I 241 768 I C 
-241 714 M 241 682 I 242 681 I 243 680 I 244 681 I 245 682 I 245 714 I 244 715 I 243 716 I 242 715 I 241 714 I 241 714 I C 
-241 660 M 241 629 I 242 627 I 243 626 I 244 627 I 245 629 I 245 660 I 244 662 I 243 663 I 242 662 I 241 660 I 241 660 I C 
-241 606 M 241 575 I 242 574 I 243 573 I 244 574 I 245 575 I 245 606 I 244 608 I 243 609 I 242 608 I 241 606 I 241 606 I C 
-241 552 M 241 521 I 242 520 I 243 519 I 244 520 I 245 521 I 245 552 I 244 554 I 243 555 I 242 554 I 241 552 I 241 552 I C 
-241 499 M 241 468 I 242 466 I 243 466 I 244 466 I 245 468 I 245 499 I 244 501 I 243 501 I 242 501 I 241 499 I 241 499 I C 
-241 445 M 241 414 I 242 412 I 243 412 I 244 412 I 245 414 I 245 445 I 244 447 I 243 447 I 242 447 I 241 445 I 241 445 I C 
-241 392 M 241 361 I 242 359 I 243 358 I 244 359 I 245 361 I 245 392 I 244 393 I 243 394 I 242 393 I 241 392 I 241 392 I C 
-241 338 M 241 307 I 242 305 I 243 304 I 244 305 I 245 307 I 245 338 I 244 339 I 243 340 I 242 339 I 241 338 I 241 338 I C 
-241 284 M 241 253 I 242 251 I 243 250 I 244 251 I 245 253 I 245 284 I 244 286 I 243 287 I 242 286 I 241 284 I 241 284 I C 
-:  L ; K 
-N 11 12 M 11 248 I 473 248 I 473 12 I 11 12 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 6 Lw solid N 11 248 M 473 248 I 473 12 I 11 12 I 11 248 I C 
-: 0.668 0.727 +S K 
-; 204 153 M <16>S 
-248 153 M <12>S  
-7 Lw N 204 161 M 281 161 I : 0.668 0.727 +S K 
-; 1 Lw solid N 3155 3023 M 3155 2991 I 3156 2990 I 3157 2989 I 3160 2990 I 3160 2991 I 3160 3023 I 3160 3024 I 3157 3025 I 3156 3024 I 3155 3023 I 3155 3023 I C 
-3155 2969 M 3155 2937 I 3156 2936 I 3157 2935 I 3160 2936 I 3160 2937 I 3160 2969 I 3160 2970 I 3157 2971 I 3156 2970 I 3155 2969 I 3155 2969 I C 
-3155 2915 M 3155 2884 I 3156 2883 I 3157 2882 I 3160 2883 I 3160 2884 I 3160 2915 I 3160 2917 I 3157 2918 I 3156 2917 I 3155 2915 I 3155 2915 I C 
-3155 2861 M 3155 2830 I 3156 2829 I 3157 2828 I 3160 2829 I 3160 2830 I 3160 2861 I 3160 2863 I 3157 2864 I 3156 2863 I 3155 2861 I 3155 2861 I C 
-3155 2807 M 3155 2776 I 3156 2775 I 3157 2774 I 3160 2775 I 3160 2776 I 3160 2807 I 3160 2810 I 3157 2810 I 3156 2810 I 3155 2807 I 3155 2807 I C 
-3155 2754 M 3155 2723 I 3156 2721 I 3157 2721 I 3160 2721 I 3160 2723 I 3160 2754 I 3160 2756 I 3157 2756 I 3156 2756 I 3155 2754 I 3155 2754 I C 
-3155 2700 M 3155 2669 I 3156 2667 I 3157 2667 I 3160 2667 I 3160 2669 I 3160 2700 I 3160 2702 I 3157 2702 I 3156 2702 I 3155 2700 I 3155 2700 I C 
-3155 2647 M 3155 2615 I 3156 2614 I 3157 2613 I 3160 2614 I 3160 2615 I 3160 2647 I 3160 2648 I 3157 2649 I 3156 2648 I 3155 2647 I 3155 2647 I C 
-3155 2593 M 3155 2561 I 3156 2560 I 3157 2559 I 3160 2560 I 3160 2561 I 3160 2593 I 3160 2594 I 3157 2595 I 3156 2594 I 3155 2593 I 3155 2593 I C 
-3155 2539 M 3155 2508 I 3156 2507 I 3157 2506 I 3160 2507 I 3160 2508 I 3160 2539 I 3160 2541 I 3157 2542 I 3156 2541 I 3155 2539 I 3155 2539 I C 
-3155 2486 M 3155 2454 I 3156 2453 I 3157 2452 I 3160 2453 I 3160 2454 I 3160 2486 I 3160 2487 I 3157 2488 I 3156 2487 I 3155 2486 I 3155 2486 I C 
-3155 2432 M 3155 2400 I 3156 2399 I 3157 2398 I 3160 2399 I 3160 2400 I 3160 2432 I 3160 2434 I 3157 2434 I 3156 2434 I 3155 2432 I 3155 2432 I C 
-3155 2378 M 3155 2347 I 3156 2345 I 3157 2345 I 3160 2345 I 3160 2347 I 3160 2378 I 3160 2380 I 3157 2380 I 3156 2380 I 3155 2378 I 3155 2378 I C 
-3155 2324 M 3155 2293 I 3156 2291 I 3157 2291 I 3160 2291 I 3160 2293 I 3160 2324 I 3160 2326 I 3157 2326 I 3156 2326 I 3155 2324 I 3155 2324 I C 
-3155 2271 M 3155 2240 I 3156 2238 I 3157 2237 I 3160 2238 I 3160 2240 I 3160 2271 I 3160 2272 I 3157 2273 I 3156 2272 I 3155 2271 I 3155 2271 I C 
-3155 2217 M 3155 2186 I 3156 2184 I 3157 2183 I 3160 2184 I 3160 2186 I 3160 2217 I 3160 2218 I 3157 2219 I 3156 2218 I 3155 2217 I 3155 2217 I C 
-3155 2163 M 3155 2132 I 3156 2130 I 3157 2129 I 3160 2130 I 3160 2132 I 3160 2163 I 3160 2165 I 3157 2166 I 3156 2165 I 3155 2163 I 3155 2163 I C 
-3155 2110 M 3155 2078 I 3156 2077 I 3157 2076 I 3160 2077 I 3160 2078 I 3160 2110 I 3160 2111 I 3157 2112 I 3156 2111 I 3155 2110 I 3155 2110 I C 
-3155 2056 M 3155 2024 I 3156 2023 I 3157 2022 I 3160 2023 I 3160 2024 I 3160 2056 I 3160 2058 I 3157 2058 I 3156 2058 I 3155 2056 I 3155 2056 I C 
-3155 2002 M 3155 1971 I 3156 1970 I 3157 1969 I 3160 1970 I 3160 1971 I 3160 2002 I 3160 2004 I 3157 2005 I 3156 2004 I 3155 2002 I 3155 2002 I C 
-3155 1948 M 3155 1917 I 3156 1916 I 3157 1915 I 3160 1916 I 3160 1917 I 3160 1948 I 3160 1950 I 3157 1951 I 3156 1950 I 3155 1948 I 3155 1948 I C 
-3155 1895 M 3155 1864 I 3156 1862 I 3157 1862 I 3160 1862 I 3160 1864 I 3160 1895 I 3160 1897 I 3157 1897 I 3156 1897 I 3155 1895 I 3155 1895 I C 
-3155 1841 M 3155 1810 I 3156 1808 I 3157 1808 I 3160 1808 I 3160 1810 I 3160 1841 I 3160 1843 I 3157 1843 I 3156 1843 I 3155 1841 I 3155 1841 I C 
-3155 1787 M 3155 1757 I 3156 1754 I 3157 1754 I 3160 1754 I 3160 1757 I 3160 1787 I 3160 1789 I 3157 1790 I 3156 1789 I 3155 1787 I 3155 1787 I C 
-3155 1734 M 3155 1703 I 3156 1701 I 3157 1700 I 3160 1701 I 3160 1703 I 3160 1734 I 3160 1735 I 3157 1736 I 3156 1735 I 3155 1734 I 3155 1734 I C 
-3155 1680 M 3155 1649 I 3156 1647 I 3157 1646 I 3160 1647 I 3160 1649 I 3160 1680 I 3160 1682 I 3157 1682 I 3156 1682 I 3155 1680 I 3155 1680 I C 
-3155 1627 M 3155 1595 I 3156 1594 I 3157 1593 I 3160 1594 I 3160 1595 I 3160 1627 I 3160 1628 I 3157 1629 I 3156 1628 I 3155 1627 I 3155 1627 I C 
-3155 1573 M 3155 1541 I 3156 1540 I 3157 1539 I 3160 1540 I 3160 1541 I 3160 1573 I 3160 1574 I 3157 1575 I 3156 1574 I 3155 1573 I 3155 1573 I C 
-3155 1519 M 3155 1488 I 3156 1487 I 3157 1486 I 3160 1487 I 3160 1488 I 3160 1519 I 3160 1521 I 3157 1522 I 3156 1521 I 3155 1519 I 3155 1519 I C 
-3155 1465 M 3155 1434 I 3156 1433 I 3157 1432 I 3160 1433 I 3160 1434 I 3160 1465 I 3160 1467 I 3157 1468 I 3156 1467 I 3155 1465 I 3155 1465 I C 
-3155 1411 M 3155 1381 I 3156 1379 I 3157 1378 I 3160 1379 I 3160 1381 I 3160 1411 I 3160 1414 I 3157 1414 I 3156 1414 I 3155 1411 I 3155 1411 I C 
-3155 1358 M 3155 1327 I 3156 1325 I 3157 1325 I 3160 1325 I 3160 1327 I 3160 1358 I 3160 1360 I 3157 1360 I 3156 1360 I 3155 1358 I 3155 1358 I C 
-3155 1304 M 3155 1273 I 3156 1271 I 3157 1271 I 3160 1271 I 3160 1273 I 3160 1304 I 3160 1306 I 3157 1306 I 3156 1306 I 3155 1304 I 3155 1304 I C 
-3155 1251 M 3155 1219 I 3156 1218 I 3157 1217 I 3160 1218 I 3160 1219 I 3160 1251 I 3160 1252 I 3157 1253 I 3156 1252 I 3155 1251 I 3155 1251 I C 
-3155 1197 M 3155 1165 I 3156 1164 I 3157 1163 I 3160 1164 I 3160 1165 I 3160 1197 I 3160 1198 I 3157 1199 I 3156 1198 I 3155 1197 I 3155 1197 I C 
-3155 1144 M 3155 1112 I 3156 1111 I 3157 1110 I 3160 1111 I 3160 1112 I 3160 1144 I 3160 1145 I 3157 1146 I 3156 1145 I 3155 1144 I 3155 1144 I C 
-3155 1090 M 3155 1058 I 3156 1057 I 3157 1056 I 3160 1057 I 3160 1058 I 3160 1090 I 3160 1091 I 3157 1092 I 3156 1091 I 3155 1090 I 3155 1090 I C 
-3155 1036 M 3155 1005 I 3156 1003 I 3157 1002 I 3160 1003 I 3160 1005 I 3160 1036 I 3160 1038 I 3157 1038 I 3156 1038 I 3155 1036 I 3155 1036 I C 
-3155 982 M 3155 951 I 3156 949 I 3157 949 I 3160 949 I 3160 951 I 3160 982 I 3160 984 I 3157 984 I 3156 984 I 3155 982 I 3155 982 I C 
-3155 928 M 3155 897 I 3156 895 I 3157 895 I 3160 895 I 3160 897 I 3160 928 I 3160 930 I 3157 930 I 3156 930 I 3155 928 I 3155 928 I C 
-3155 875 M 3155 844 I 3156 842 I 3157 841 I 3160 842 I 3160 844 I 3160 875 I 3160 876 I 3157 877 I 3156 876 I 3155 875 I 3155 875 I C 
-3155 821 M 3155 790 I 3156 788 I 3157 787 I 3160 788 I 3160 790 I 3160 821 I 3160 822 I 3157 823 I 3156 822 I 3155 821 I 3155 821 I C 
-3155 768 M 3155 736 I 3156 735 I 3157 734 I 3160 735 I 3160 736 I 3160 768 I 3160 769 I 3157 770 I 3156 769 I 3155 768 I 3155 768 I C 
-3155 714 M 3155 682 I 3156 681 I 3157 680 I 3160 681 I 3160 682 I 3160 714 I 3160 715 I 3157 716 I 3156 715 I 3155 714 I 3155 714 I C 
-3155 660 M 3155 629 I 3156 627 I 3157 626 I 3160 627 I 3160 629 I 3160 660 I 3160 662 I 3157 663 I 3156 662 I 3155 660 I 3155 660 I C 
-3155 606 M 3155 575 I 3156 574 I 3157 573 I 3160 574 I 3160 575 I 3160 606 I 3160 608 I 3157 609 I 3156 608 I 3155 606 I 3155 606 I C 
-3155 552 M 3155 521 I 3156 520 I 3157 519 I 3160 520 I 3160 521 I 3160 552 I 3160 554 I 3157 555 I 3156 554 I 3155 552 I 3155 552 I C 
-3155 499 M 3155 468 I 3156 466 I 3157 466 I 3160 466 I 3160 468 I 3160 499 I 3160 501 I 3157 501 I 3156 501 I 3155 499 I 3155 499 I C 
-3155 445 M 3155 414 I 3156 412 I 3157 412 I 3160 412 I 3160 414 I 3160 445 I 3160 447 I 3157 447 I 3156 447 I 3155 445 I 3155 445 I C 
-3155 392 M 3155 361 I 3156 359 I 3157 358 I 3160 359 I 3160 361 I 3160 392 I 3160 393 I 3157 394 I 3156 393 I 3155 392 I 3155 392 I C 
-3155 338 M 3155 307 I 3156 305 I 3157 304 I 3160 305 I 3160 307 I 3160 338 I 3160 339 I 3157 340 I 3156 339 I 3155 338 I 3155 338 I C 
-3155 284 M 3155 253 I 3156 251 I 3157 250 I 3160 251 I 3160 253 I 3160 284 I 3160 286 I 3157 287 I 3156 286 I 3155 284 I 3155 284 I C 
-:  L ; K 
-N 2927 13 M 2927 248 I 3388 248 I 3388 13 I 2927 13 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 6 Lw solid N 2927 248 M 3388 248 I 3388 13 I 2927 13 I 2927 248 I C 
-: 0.668 0.727 +S K 
-; T32RsrcBegin
-
-30
-/g39 [47 0 3 -48 41 1 ] 
-/g39 [38 49 true [1 0 0 1 -3 48 ]  0 0]
-[<00003ff800
-0003ffff80
-000fffffe0
-003ffffff8
-007ffffffc
-00ffe00ffc
-01ff0000fc
-03fe00003c
-07f800000c
-0ff0000000
-0fe0000000
-1fe0000000
-1fc0000000
-3f80000000
-3f80000000
-7f80000000
-7f00000000
-7f00000000
-7f00000000
-fe00000000
-fe00000000
-fe00000000
-fe000ffff8
-fe000ffffc
-fe000ffffc
-fe000ffffc
-fe000ffffc
-fe000000fc
-fe000000fc
-fe000000fc
-ff000000fc
-7f000000fc
-7f000000fc
-7f000000fc
-7f800000fc
-3f800000fc
-3fc00000fc
-1fe00000fc
-1fe00000fc
-0ff00000fc
-0ff80000fc
-07fe0000fc
-03ff0001fc
-01ffe00ffc
-00fffffffc
-003ffffff8
-000fffffe0
-0003ffff00
-00007ff000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-31
-/g116 [66 0 2 -47 64 0 ] 
-/g116 [62 47 true [1 0 0 1 -2 47 ]  0 0]
-[<fc00000fc00000f8
-fe00001fc00001fc
-fe00001fe00001f8
-7e00001fe00001f8
-7f00003fe00001f8
-7f00003fe00003f0
-3f00003ff00003f0
-3f00003ff00003f0
-3f80007ff00007f0
-3f80007ff00007e0
-1f80007df80007e0
-1fc0007df80007e0
-1fc000fdf8000fc0
-0fc000fdfc000fc0
-0fc000f8fc000fc0
-0fe000f8fc000fc0
-07e001f8fc001f80
-07e001f87e001f80
-07e001f07e001f80
-07f001f07e001f00
-03f003f07f003f00
-03f003f03f003f00
-03f003e03f003f00
-01f803e03f007e00
-01f807e01f807e00
-01f807e01f807e00
-01fc07c01f807c00
-00fc07c01f80fc00
-00fc0fc00fc0fc00
-00fc0fc00fc0fc00
-007e0f800fc0f800
-007e0f800fe1f800
-007e1f8007e1f800
-007e1f8007e1f000
-003f1f0007e1f000
-003f1f0003f3f000
-003f3f0003f3f000
-001fbe0003f3e000
-001fbe0003f3e000
-001fbe0001ffe000
-001ffe0001ffc000
-000ffc0001ffc000
-000ffc0000ffc000
-000ffc0000ffc000
-0007fc0000ff8000
-0007f80000ff8000
-0003f800007f0000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-3007 153 M <17>S 
-3038 153 M <1E>S  3081 153 M <1F>S  
-T32RsrcBegin
-
-32
-/g876 [29 0 0 -53 28 10 ] 
-/g876 [28 63 true [1 0 0 1 0 53 ]  0 0]
-[<000001f0
-000003f0
-000003f0
-000007e0
-000007e0
-000007e0
-00000fc0
-00000fc0
-00000fc0
-00001f80
-00001f80
-00003f00
-00003f00
-00003f00
-00007e00
-00007e00
-00007e00
-0000fc00
-0000fc00
-0001f800
-0001f800
-0001f800
-0003f000
-0003f000
-0003f000
-0007e000
-0007e000
-0007e000
-000fc000
-000fc000
-001f8000
-001f8000
-001f8000
-003f0000
-003f0000
-003f0000
-007e0000
-007e0000
-007e0000
-00fc0000
-00fc0000
-01f80000
-01f80000
-01f80000
-03f00000
-03f00000
-03f00000
-07e00000
-07e00000
-07c00000
-0fc00000
-0fc00000
-1f800000
-1f800000
-1f800000
-3f000000
-3f000000
-3f000000
-7e000000
-7e000000
-fc000000
-fc000000
-f8000000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-3143 153 M ( )S 
-T32RsrcBegin
-
-33
-/g87 [38 0 6 -47 35 0 ] 
-/g87 [29 47 true [1 0 0 1 -6 47 ]  0 0]
-[<7fffc000
-fffff800
-fffffe00
-ffffff80
-ffffffc0
-fc00ffe0
-fc003fe0
-fc000ff0
-fc000ff0
-fc0007f0
-fc0007f8
-fc0003f8
-fc0003f8
-fc0003f8
-fc0003f8
-fc0003f8
-fc0003f8
-fc0003f8
-fc0007f0
-fc0007f0
-fc000ff0
-fc001fe0
-fc003fc0
-fc00ffc0
-ffffff80
-ffffff00
-fffffc00
-fffff000
-ffff8000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-3169 153 M (!)S 
-3204 153 M <1E>S  3247 153 M <1F>S  
-7 Lw N 3007 161 M 3308 161 I : 0.668 0.727 +S K 
-; 6 Lw N 1214 1254 M 310 1254 I : 0.668 0.727 +S K 
-; N 242 1254 M 276 1233 I 276 1276 I 242 1254 I C 
-276 1233 M 242 1254 I 276 1233 I C 
- O 10 Lw N 242 1254 M 276 1233 I 276 1276 I 242 1254 I : 0.668 0.727 +S K 
-; N 276 1233 M 242 1254 I : 0.668 0.727 +S K 
-; 6 Lw N 276 1254 M 329 1254 I : 0.668 0.727 +S K 
-; N 470 1144 M 470 1234 I 987 1234 I 987 1144 I 470 1144 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 470 1211 M <13>S 
-507 1211 M <13>S  544 1211 M <19>S  
-580 1211 M <14>S 
-T32RsrcBegin
-
-34
-/g374 [39 0 6 -35 34 0 ] 
-/g374 [28 35 true [1 0 0 1 -6 35 ]  0 0]
-[<0007f000
-f81ffe00
-f87fff00
-f8ffff80
-f9ffffc0
-fbf83fc0
-ffe01fe0
-ffc00fe0
-ff0007e0
-fe0007f0
-fe0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-615 1211 M <19>S 
-651 1211 M <02>S  687 1211 M (")S  723 1211 M (")S  
-760 1211 M <14>S 
-T32RsrcBegin
-
-35
-/g296 [23 0 1 -51 23 0 ] 
-/g296 [22 51 true [1 0 0 1 -1 51 ]  0 0]
-[<0007f0
-003ffc
-007ffc
-00fffc
-00fffc
-01fc0c
-01f800
-01f800
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-fffff0
-fffff0
-fffff0
-fffff0
-fffff0
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
-03f000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-794 1211 M <13>S 
-831 1211 M <06>S  865 1211 M <05>S  894 1211 M <02>S  930 1211 M (")S  966 1211 M (#)S  
-N 2186 2262 M 3090 2262 I : 0.668 0.727 +S K 
-; N 3157 2262 M 3125 2283 I 3125 2240 I 3157 2262 I C 
-3125 2283 M 3157 2262 I 3125 2283 I C 
- O 10 Lw N 3157 2262 M 3125 2283 I 3125 2240 I 3157 2262 I : 0.668 0.727 +S K 
-; N 3125 2283 M 3157 2262 I : 0.668 0.727 +S K 
-; 6 Lw N 3125 2262 M 3071 2262 I : 0.668 0.727 +S K 
-; N 1937 2118 M 1937 2208 I 3406 2208 I 3406 2118 I 1937 2118 I C 
-1 1 1 1 scol  O 0 0 0 1 scol T32RsrcBegin
-
-36
-/g346 [39 0 6 -50 34 0 ] 
-/g346 [28 50 true [1 0 0 1 -6 50 ]  0 0]
-[<fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc07f000
-fc1ffe00
-fc7fff00
-fcffff80
-fdffffc0
-fff83fc0
-ffe01fe0
-ffc00fe0
-ff0007e0
-fe0007f0
-fe0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
-fc0003f0
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1937 2185 M (!)S 
-1973 2185 M <0B>S  2005 2185 M <0A>S  2028 2185 M ($)S  
-2065 2185 M <14>S 
-T32RsrcBegin
-
-37
-/g449 [53 0 2 -34 51 0 ] 
-/g449 [49 34 true [1 0 0 1 -2 34 ]  0 0]
-[<fc0007e0001f80
-fc0007e0001f80
-fc0007f0003f00
-fe0007f0003f00
-7e000ff0003f00
-7e000ff0007e00
-7f000ff8007e00
-3f001ff8007e00
-3f001ff8007e00
-3f001ffc00fc00
-1f801ffc00fc00
-1f803ffc00fc00
-1f803e7c01f800
-1fc03e7e01f800
-0fc03e7e01f800
-0fc07c3e01f000
-0fe07c3f03f000
-07e07c3f03f000
-07e0fc3f03e000
-07e0f81f87e000
-03f0f81f87e000
-03f0f81f87c000
-03f1f00f87c000
-01f9f00fcfc000
-01f9f00fcf8000
-01f9f007cf8000
-00fbe007ff8000
-00ffe007ff8000
-00ffe003ff0000
-007fe003ff0000
-007fc003ff0000
-007fc003fe0000
-007fc001fe0000
-003f8001fc0000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-38
-/g349 [17 0 5 -47 12 0 ] 
-/g349 [7 47 true [1 0 0 1 -5 47 ]  0 0]
-[<7c
-fe
-fe
-fe
-fe
-fe
-7c
-00
-00
-00
-00
-00
-00
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
-7e
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-2099 2185 M <17>S 
-2130 2185 M (%)S  2179 2185 M (&)S  2195 2185 M <0A>S  2217 2185 M <05>S  2246 2185 M ($)S  
-2283 2185 M <14>S 
-T32RsrcBegin
-
-39
-/g395 [39 0 3 -35 33 14 ] 
-/g395 [30 49 true [1 0 0 1 -3 35 ]  0 0]
-[<003f8000
-00fff07c
-03fff87c
-07fffc7c
-0fffff7c
-1ff07ffc
-1fc01ffc
-3f800ffc
-3f0007fc
-7f0003fc
-7e0001fc
-7e0000fc
-7e0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fe0000fc
-7e0000fc
-7e0001fc
-7f0003fc
-7f0007fc
-3f800ffc
-3fc01ffc
-1fe07ffc
-0ffffefc
-0ffffcfc
-07fff8fc
-01ffe0fc
-007f80fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-2317 2185 M <13>S 
-2354 2185 M <06>S  2388 2185 M (')S  2424 2185 M <03>S  2460 2185 M <06>S  2495 2185 M <01>S  2521 2185 M <0A>S  2544 2185 M <07>S  
-T32RsrcBegin
-
-40
-/g1085 [37 0 3 -37 34 -4 ] 
-/g1085 [31 33 true [1 0 0 1 -3 37 ]  0 0]
-[<0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-fffffffe
-fffffffe
-fffffffe
-fffffffe
-fffffffe
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
-0007c000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-2560 2185 M (\()S 
-2594 2185 M <07>S  
-2609 2185 M <16>S 
-2654 2185 M <01>S  2680 2185 M <06>S  2715 2185 M <04>S  
-2738 2185 M <14>S 
-T32RsrcBegin
-
-41
-/g367 [17 0 6 -50 12 0 ] 
-/g367 [6 50 true [1 0 0 1 -6 50 ]  0 0]
-[<fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
-fc
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-2772 2185 M (!)S 
-2808 2185 M (\))S  2823 2185 M <0B>S  2856 2185 M (")S  2892 2185 M <06>S  
-2926 2185 M <14>S 
-T32RsrcBegin
-
-42
-/g393 [39 0 6 -35 36 14 ] 
-/g393 [30 49 true [1 0 0 1 -6 35 ]  0 0]
-[<0007f800
-f81ffe00
-f87fff80
-f8ffffc0
-f9ffffe0
-fbf81fe0
-ffe00ff0
-ffc007f0
-ff8003f8
-ff0001f8
-fe0001f8
-fc0001f8
-fc0001fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0001f8
-fc0001f8
-fe0001f8
-ff0003f8
-ff8003f0
-ffc007f0
-ffe00fe0
-fff83fe0
-fdffffc0
-fcffff80
-fc7fff00
-fc3ffc00
-fc0ff000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
->
- ]
-/TT353ADb00 AddT3T32Char
-
-43
-/g282 [39 0 3 -50 33 1 ] 
-/g282 [30 51 true [1 0 0 1 -3 50 ]  0 0]
-[<000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-000000fc
-003f80fc
-00fff0fc
-03fff8fc
-07fffcfc
-0ffffffc
-1ff07ffc
-1fc01ffc
-3f800ffc
-3f0007fc
-7f0003fc
-7e0001fc
-7e0000fc
-7e0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fc0000fc
-fe0000fc
-7e0000fc
-7e0001fc
-7f0003fc
-7f0007fc
-3f800ffc
-3fc01ffc
-1fe07f7c
-0ffffe7c
-0ffffc7c
-07fff87c
-01ffe07c
-007f8000
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-2960 2185 M <03>S 
-2996 2185 M (*)S  3033 2185 M (+)S  3069 2185 M <0B>S  3102 2185 M <0A>S  3125 2185 M <06>S  
-3158 2185 M <14>S 
-3192 2185 M <04>S 
-3217 2185 M <06>S  3251 2185 M (')S  3287 2185 M <03>S  3323 2185 M <06>S  3357 2185 M <01>S  3384 2185 M <0A>S  
-N 3157 2597 M 2254 2597 I : 0.668 0.727 +S K 
-; N 2186 2597 M 2219 2576 I 2219 2618 I 2186 2597 I C 
-2219 2576 M 2186 2597 I 2219 2576 I C 
- O 10 Lw N 2186 2597 M 2219 2576 I 2219 2618 I 2186 2597 I : 0.668 0.727 +S K 
-; N 2219 2576 M 2186 2597 I : 0.668 0.727 +S K 
-; 6 Lw N 2219 2597 M 2273 2597 I : 0.668 0.727 +S K 
-; N 1850 2487 M 1850 2576 I 3494 2576 I 3494 2487 I 1850 2487 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 1850 2554 M (!)S 
-1885 2554 M <0B>S  1918 2554 M <0A>S  1941 2554 M ($)S  
-1977 2554 M <14>S 
-2012 2554 M <17>S 
-2043 2554 M (%)S  2092 2554 M (&)S  2107 2554 M <0A>S  2130 2554 M <05>S  2159 2554 M ($)S  
-2195 2554 M <14>S 
-2230 2554 M <13>S 
-2266 2554 M <06>S  2301 2554 M (')S  2337 2554 M <03>S  2373 2554 M <06>S  2407 2554 M <01>S  2434 2554 M <0A>S  
-2457 2554 M <14>S 
-T32RsrcBegin
-
-44
-/g364 [34 0 6 -50 33 0 ] 
-/g364 [27 50 true [1 0 0 1 -6 50 ]  0 0]
-[<fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000000
-fc000fc0
-fc003fc0
-fc007f80
-fc00ff00
-fc00fe00
-fc01fc00
-fc03f800
-fc07f000
-fc0fe000
-fc1fc000
-fc3f8000
-fc7f0000
-fcfe0000
-fdfc0000
-fff80000
-fffc0000
-fdfe0000
-fcfe0000
-fc7f0000
-fc7f8000
-fc3fc000
-fc1fe000
-fc0fe000
-fc07f000
-fc07f800
-fc03fc00
-fc01fc00
-fc00fe00
-fc00ff00
-fc007f80
-fc003fc0
-fc001fc0
-fc000fe0
-fc0007e0
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-2491 2554 M <0E>S 
-2531 2554 M <05>S  2560 2554 M (,)S  2591 2554 M <07>S  
-2607 2554 M (\()S 
-2641 2554 M <07>S  
-2656 2554 M <16>S 
-2701 2554 M <01>S  2727 2554 M <06>S  2762 2554 M <04>S  
-2785 2554 M <14>S 
-2819 2554 M (!)S 
-2855 2554 M (\))S  2870 2554 M <0B>S  2903 2554 M (")S  2939 2554 M <06>S  
-2973 2554 M <14>S 
-3007 2554 M <03>S 
-3043 2554 M (*)S  3080 2554 M (+)S  3116 2554 M <0B>S  3149 2554 M <0A>S  3172 2554 M <06>S  
-3205 2554 M <14>S 
-3239 2554 M <04>S 
-3263 2554 M <06>S  3298 2554 M <01>S  3325 2554 M (*)S  3361 2554 M <02>S  3397 2554 M (")S  3433 2554 M <01>S  3460 2554 M <06>S  
-N 243 1926 M 2118 1926 I : 0.668 0.727 +S K 
-; N 2186 1926 M 2153 1947 I 2153 1905 I 2186 1926 I C 
-2153 1947 M 2186 1926 I 2153 1947 I C 
- O 10 Lw N 2186 1926 M 2153 1947 I 2153 1905 I 2186 1926 I : 0.668 0.727 +S K 
-; N 2153 1947 M 2186 1926 I : 0.668 0.727 +S K 
-; 6 Lw N 2153 1926 M 2099 1926 I : 0.668 0.727 +S K 
-; N 813 1782 M 813 1872 I 1616 1872 I 1616 1782 I 813 1782 I C 
-1 1 1 1 scol  O 0 0 0 1 scol 813 1849 M <13>S 
-849 1849 M <13>S  886 1849 M <19>S  
-923 1849 M <14>S 
-957 1849 M <19>S 
-994 1849 M <02>S  1030 1849 M (")S  1066 1849 M (")S  
-1102 1849 M <14>S 
-T32RsrcBegin
-
-45
-/g373 [59 0 6 -35 54 0 ] 
-/g373 [48 35 true [1 0 0 1 -6 35 ]  0 0]
-[<0007f0003f80
-f81ffc00ffe0
-f87ffe03fff0
-f8ffff07fff8
-f9ffff8ffffc
-fbf07f9f83fc
-ffe01fff00fe
-ff801ffc00fe
-ff000ff8007e
-fe000ff0007f
-fe0007f0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
-fc0007e0003f
->
- ]
-/TT353ADb00 AddT3T32Char
-T32RsrcEnd
-1137 1849 M <13>S 
-1173 1849 M <06>S  1208 1849 M <05>S  1237 1849 M <02>S  1273 1849 M (")S  1309 1849 M (#)S  1330 1849 M <07>S  1345 1849 M <19>S  1381 1849 M <02>S  1418 1849 M (-)S  1473 1849 M (*)S  1509 1849 M (\))S  1524 1849 M <06>S  1559 1849 M <0A>S  1581 1849 M <06>S  
-LH
-%%PageTrailer
-
-%%Trailer
-%%DocumentNeededResources: 
-%%DocumentSuppliedResources: 
-%%+ procset Pscript_WinNT_VMErrorHandler 5.0 0
-%%+ procset Pscript_FatalError 5.0 0
-%%+ procset Pscript_Win_Basic 5.0 0
-%%+ procset Pscript_Win_Utils_L1 5.0 0
-%%+ procset Pscript_Win_GdiObject 5.0 0
-%%+ procset Pscript_Win_GdiObject_L1 5.0 0
-%%+ procset Pscript_T3Hdr 5.0 0
-%%+ procset Pscript_Text 5.0 0
-Pscript_WinNT_Incr dup /terminate get exec
-%%EOF
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-handover-algorithm.dot ns-3.19/src/lte/doc/source/figures/lte-handover-algorithm.dot
--- ns-3.18.1/src/lte/doc/source/figures/lte-handover-algorithm.dot	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-handover-algorithm.dot	1969-12-31 16:00:00.000000000 -0800
@@ -1,21 +0,0 @@
-digraph LteHandoverAlgorithm {
-
-size = "30,30"
-
-GET_MEASUREMENTS [shape = box,
-                  label = "Get measurements from UE\n(The eNB receives events A2 and A4 with UE measurements)"]
-CHECK_SERVING_RSRQ [shape = diamond, fixedsize = true, width = 8, height = 1.0,
-                    label = "serving cell RSRQ <= servingHandoverThreshold"]
-LOOK_BEST_NEIGHBOUR [shape = box,
-                     label = "Look for the neighbour cell with the best RSRQ"]
-CHECK_BEST_NEIGHBOUR [shape = diamond, fixedsize = true, width = 9, height = 1.0,
-                      label = "best neighbour RSRQ - serving cell RSRQ >= neighbourHandoverOffset"]
-TRIGGER_HANDOVER [shape = box,
-                  label = "Trigger Handover procedure for this UE"]
-
-GET_MEASUREMENTS -> CHECK_SERVING_RSRQ
-CHECK_SERVING_RSRQ -> LOOK_BEST_NEIGHBOUR
-LOOK_BEST_NEIGHBOUR -> CHECK_BEST_NEIGHBOUR
-CHECK_BEST_NEIGHBOUR -> TRIGGER_HANDOVER
-
-}
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-handover-campaign-rem.pdf ns-3.19/src/lte/doc/source/figures/lte-handover-campaign-rem.pdf
--- ns-3.18.1/src/lte/doc/source/figures/lte-handover-campaign-rem.pdf	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-handover-campaign-rem.pdf	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,1218 @@
+%PDF-1.5
+%
+3 0 obj
+<< /Length 4 0 R
+   /Filter /FlateDecode
+>>
+stream
+x+*O4PH/VЯ0Up
+B @@
+endstream
+endobj
+4 0 obj
+   28
+endobj
+2 0 obj
+<<
+   /ExtGState <<
+      /a0 << /CA 1 /ca 1 >>
+   >>
+   /XObject << /x5 5 0 R >>
+>>
+endobj
+6 0 obj
+<< /Type /Page
+   /Parent 1 0 R
+   /MediaBox [ 0 0 609 363 ]
+   /Contents 3 0 R
+   /Group <<
+      /Type /Group
+      /S /Transparency
+      /I true
+      /CS /DeviceRGB
+   >>
+   /Resources 2 0 R
+>>
+endobj
+5 0 obj
+<< /Length 8 0 R
+   /Filter /FlateDecode
+   /Type /XObject
+   /Subtype /Form
+   /BBox [ 0 0 609 363 ]
+   /Group <<
+      /Type /Group
+      /S /Transparency
+      /I true
+      /CS /DeviceRGB
+   >>
+   /Resources 7 0 R
+>>
+stream
+x+*23T0 Bc3c0˥h^_a S
+endstream
+endobj
+8 0 obj
+   42
+endobj
+7 0 obj
+<<
+   /ExtGState <<
+      /a0 << /CA 1 /ca 1 >>
+   >>
+   /XObject << /x9 9 0 R >>
+>>
+endobj
+9 0 obj
+<< /Length 10 0 R
+   /Filter /FlateDecode
+   /Type /XObject
+   /Subtype /Image
+   /Width 609
+   /Height 363
+   /ColorSpace /DeviceRGB
+   /Interpolate true
+   /BitsPerComponent 8
+>>
+stream
+xwtR;!	A=X`APDQTEH! U;	J(4QQQTXQĂ~s7kxwޗg=uϞ{f_8w? ѪO}}$懇cP7wGK̎otѶ{9_
+/wDߞKN.h~Ggt'k>c^YGcX{3G:w=kgX/2?MO<*qq/]?cb_c{x-S&gfSc^,˺dadMU93RNI4;!n='圌gɼ$ʜJ}bnfK9rfjmڌPste?9+֥&vY勎+O:pBX}vmɡ:Wϫ=5i-<&TfN{,뢚F1Ą%?7&v-l 9y<f<AcߘP=>~G>*vz8ђ4h(6h%C1>mmnymRPrVE(eY6֡šUၫcHMhO1_!b~f}6:Frc~}$f}W|~9)lDD5G-;)+?HsJd5&u}~LYi]g&'BM+O(o/.Rvfjk8wDJ}V}6<d|n=#7]V
+[&f.3.nsu?FVq98j
+B'gJ1?}N8_:GoZ,C|8/xRMG-lF^()n"t>?pWPqcxp/!)Yp}"nF.Zýh代7w\e|h&74u~hY٠#1=h.1?}])] y8dXݭ	Cso6:B<;uAJ=	9܈ Fž]u)R(Iv#	gysٞ4rfjOU:Sg=:WdZu1*61<{*Oy촇s3fނhfMN=%qԤQ=y0U%|#q4qfj>j~^˲SeYgNL(4vZ<z]qۥwJX)EQ6"y(h"8v ]YCSPɎ h9My8f'Zhy}SQB1qʓbU>L4jPA}t}X{76x(&W{	};'56OK~LL,Iqq+3S{`&* xC*pl~^J.hPuU/(ouvUY)t!^hrY4KzbM`u!,aAgQ:^NJe#&%uk`ye-فa}>n*1x 'Yx](h8s[[5;)F&8x چ{> ܞfrDpCN,d &ؾ7+EE\)XEdRg'N	9"q>)q68KC1GXѹ߃gLJU]0t+ϺvÇ``籄3RzMM%,B|4+} l>-y7FG{X^^?ؽGQZ6g%E;n
+mkSfaR$BKiAn3Z[.-CXG`0
+nlǻGrC^<oz08BIld:Ng҇(	b$ 2ewq+~#k;", )Cj#4omD'3_%y *d7Mԭ*7NNJ@L'䴤0.ޥ"ywJ{tzJ?TDQ7ǍR؊ǃ #z }q8, w^k<3ܬ'yi<G!VE}xW(._*H̏( Jb{e?K|R<1b7@[0rpto46n59Pf~C_8~l/1cg|bͼUB5t,w0!~1㛚4Vclf68uRb w4ny+(i@'6?.O?A:D9:?{4V48sZPke+#]S _#MJ, bޱ0*I,xȨ0}C´!h`W/GkB7tx4mBMaPl怪4WDr^A@'Be7۰!N&c{
+2#0HGȑoG$bC`	 wkch			0ZMrG`680M7!;\SL_PӨP"x2HA\kŹ^@ظ5`%4I䭁rHytx>5|^Is+ wexj$<y2t%u9;\JCP[`p艀`|wGZ\%uiJAdL.9Xm+<4DO^HG9A<y#q/děќthlr/WǠRvhH#8Z\3 <^5㷸H^! y.IMDfu4AO'?3>*χqph,`n\r|Z#29YL)"E٧Ud<#Mq$WCq>x8Q5=y 	Ós VN.D8HcCG+exzKt^j;h#N20n# "Zr0f/VXK199|sjBG
+X `r/'WvKőp;a&Sì8f^+ nB<=L%%ІyQ"Eɺ {˯"ZzB5\$#Ϋ=X) xu(L;&v@*$Z lvmnۆdsB;)ըط0& gFazɸ!&`;lG:;}0ܕcqgB0E7"+Л]}A8ȿ\Q"Ю2_5t˜(k/Rt$U,09xb7godk<.E
+x;q2_\a!n8<Zfn3Rb᱙H%έzb0q>``&qV|YE%i HbJ3nb OU`A,\ɗ3-h"~'z\{(R\ܼCBPv!Va4xUx̭af0Ѡ\py||b 1NAb?uU1t(,y8@4Ñ]P:;:v|\qe9)Gvܫ{o4&P,y'y;F\^PX^ANE&¿E^&RGq#(ǃlLJ(e' Cr/ Jڀפ#eY`\-F芈w.>rKn4傸vW
+GO'7ʙ<`!9VWtl>+zmWhȑh+6ӇX9{NPO/>	&7@E65&n$jtp#_(>{/D3/A?]dͪļfb91hzTCk 5DSL~/R^0"o7[zmunmʜc!٧p0N.TEŖg#`({l2+O1U8)w_L3
+W7Lcx>tve@h=45.nC'p+2&͛~0с@-<>X]G0pOhwVCʝn"/A9AXNA@`w϶Ґ]e\#6_~su7p+翀K^gbBoudzIpF:|M7y@#"m3)͸=+;M'% \
+A``߈+gBA77CC ex=ǀxl{k	`'Htѱqq?t@^wCE" '6AY7!q1-a<Ȃ@=ch{P??,Ls7}X6?.EwGo|m;FlrJ/dsܛ-﴿ X,ÐC=hAE|`y\;K|Zmr	)cb_>C Um4Zj P_h^(`M^-<8alDI7=߆CMUqG$MF1z!	9V7L)hWV
+\b:$*\\\g w|fBwޘ̔":	ݛxJ88ô	05P׃}?a<jo3 ib7Etw->2b}B:[d*brVq +Ѝ1/{DƽDxڰw>h7L
+hoI7Q	U2Na1S}movho'jArsPlT뇮ҥñĜrY6lp59gMޑ\ja)h5y$ںx^UJ3ڬԠ#N]*@XyԖ#T
+cI,Z 2ŻxPS(	&$԰A;a -\F_\ap5	qah ;D얭M|Bɣj\^
+z($EC &n|_ Dā[Tf /4M hxs-RΉ5Ii	50>@-#l}r\}`)s0f:5i[W&tѻ
+&8jτPQ^/pG޼mo|sG6#4U+_+n+Caa+ L%x0+OB_piuS-FSͯh1z!F㋯GZnZ,d- t@RN#t	>h%퐎pHeBkCAF.U @-OiQ@Ad-wW rB2<[č¢#٧=sS%nx6 ;+Irwo)OM=>a2A{	9-0I
+f|8	|éI,V'=u0:7cVX;0D?ZB5]ɿpt1(ѶCc1s (OawOtQz8?RD&S5ejޱTL=Ћǻ}hӴOeX :?a	``tZ RְGcnͼE@kV D`1AUEOl`WŹ7sΫ:F\ vr
+N񚔼ToZN0NɃ 9QR7ZO`7 5j-*7'Bׁ8O.b?;E_6ZBa*xK˯ #u)+z0s!!#0`[_Dzn.nR}5x·,0ץ]!=w38ۂ@ƽb0Sa,AO>^
+M2jh&#G@4pfLkc&֒`$^MI>N?`+y|kj]mTwط\8{@%=BѰٸF<Ib0_qEE0u94EPKwTdQ(h|^BdmU
+*?`mM+PT|#H|H".M{O5)zgV Ye_1_~ҀVhQI fj[ Puzkx#_ 	o
+a' tcra wFb}aUY(nN>x*=;g#i]/`X>qj'?S|N?<=yO4[['/П
+!Va(֕N5W|Gh1؇`pJ}Th(_pLXbn3[P%{[>#PHOCD=^-ECẢ	
+xY{QZl &*6)_tgҟðENA*lƫ[50;8 ]tA%(f;[NG˚Z
+s5n\VoȥVnT:0
+9\vR:xHV P?I`1 {qP݊hMwZeで,LD47-B)@	%`]Z_ 4J|sep,u֡B)%17al+`Vh~1G#Y^_c<-d8ƙpo\ݏGž1דqWK>C0gngx<4
+ZL 8=xOk+Xㄗ%)ï4'@1weYo26nx6$Öl^?z踻!V ړV_nEҰ.	w6)EpipfnC RkD9hsHuDʷ4O ׇ|_Q,1\֝-MJkb|kXw0o9
+v`
+h(q~/1F,MB; /2,(yHL=ByÕ\I)ӒV7Lj,.IP eiz9-q8"T<($%ki.Q9T դxD.CidܦI~HOS,Ѓtޚrq"$"~CUGPlDv}8h(*O<v6zѧ{*M/2ҋdYaߢ |0A=6yݰ:_h|2A;p +\5Xqe7b2Ĥ{W48<|4EJ
+5̓H7gg OI=ަ	2${'s452]qE,?9(d{@CX}:h:Sh(A̾|[+g/?hl9)OH0DCv0B+Ã'nVa0йuj V0K5WGf;F[0em
+'Pe0:;&"Ǉ5&@?RmHs"azRO{
+l#VzhQ%˃+`ؽy<hP459qTyP4;o8<lr|c^=1zqtBG.0mh־<t%GB|_uA	8L4#׊kJrG7")C=U/<*UuBrHYMiO_99X/72\Mq'fKDtZyvpA;Z+\XZHC:\zlSu\ѰNYӢk(#X):yNFkb]oS$p[:A^%G4P5aRe1\m=٬Ǹǃz%W6Lf>~NfT㫣1jcJ, TtE/<*ڇ<.1;oD,}F Ge}|(~$G<d4S EڏXWèco}n4aF{׽,syʨyљ-n'Y
+#m51k7jzF9R4-8Y!}gs0BLYdUnnUNK|\
+4}:l줘fDvFJoԪaAFg"^jP&thIc,T'0ĺ.pa޵>?v,L#Z
+ pu!hi.!V-cA:D6wG6=ȺMO"G4#KȮ@=R>`|C0a!''Nk5^ã@&y8t@&(sT0:7Sn8+;AHȸ8KCL%P:4M7wx,@Wp2*z|bS	z^ٮ{Rm`iIxiV.A"ZIvѣ/m8)yn*DpO'z2M~xJ+6<v(0O4{)hˠ[Ѹd~H>
+
+y^84s^@ptz/C\&N^%B0Q7a$IWO1{>+N
+Ռ>/Tu	qd
+i	h2 AtI	e.":J'}KaM.{c@I\2Strs%g1f?J{wwCV+nulG6bO,u<Q˚认J+-TʈRއ;`OٌJGU_Q.1ߡ)Va'QmT#ĻC_70Y8X1=wTP$ѫm1C=3DTsaUgN/iO lt#|4YNW/
+uOW
+ŭkXqaǍϋ8coʉs3z;/돋[yq0S	m偅>5Phv &7C+q0p?&o?ab E"ུ1ԸCW0.~= 6?jZ)SA?:%_Git2L\#;HG +ZX/3%q*ؤ?C]@7,'1	<\} "SiT |D4j) Vd1K5Kw1nXKdT+gycc?
+p0mV	"OZx#!~K]ZCDrBD]Cr75YT43	 
+
+W
+倠Y5OQ"¹B<
+TR>τ5_gV;K;?*)_R,>Dt.X8Xe噝T<<3kXOxzJ̒wRHx9h0$h>z82Fq5B_ĕŧZ4tf3$
+?LiF.E3x8Q8W_N&/DSF*z8,Dny(hUyM3]s6;X
+jm#Cxb9yB*H,6+r~PC4݊SBKO<b1'jѱo)l5IGUh"dɃB9-sӄG s9"'沓^j VB}䲯"ԫ&4@Rvl; vz%NC3+O@3x`57_Ř<'bX3(Lw&" Ń(wuF+W-?3\xAh¯@$82+C[L	@E1BpјAcq:v+5Bt'<K8QB`9{&G$8>bfvWzˋpgw+Oizs2nё9Q`hO4 @\j,הeG8KO)|b$UHGNJ^Cx#0/=j>/AS nmC5IAׅ}&pq] O6	񓇀z:\Pj}=xݭhh|jDͪWa<ccwȑ0*@u2@흀kb{4@0[d=4_}C0G쌆pA/ŀT"
+LKW RUb	pYA+jnJ;LH1p=,y-<˳ǿy<rTQD!7~lt常xSY<Ȑ)E3Rz[dJ?Мϫ8fWy0D?Ze]bvYӢ}ЇVeB^cwz(\Ae3QF/A!蓏5%9ؠ_W*UݪNM|3~=Cggu8mjFoxdUN&n8[77Ҍ;'FV0aZfyhq;|;@  `
+fW65~
+4L@$j
+)op>^x;YqguBRş\@,UJ~#<=^#pA?:x=hcA.wUx0 (pkS]-i뵡漪<"laƭa:T0-sK`AIzJ<ƹP1U4ϦM ڍY(:.7كI0Ho&j|`(} 2` Xf$L Md(տ
+|KLhp6+d\Q-\ޱJs;`tP[F{ z`,@^\hjroA+4yP -K+e/|@Ǵ9AYGy .tr>\
+"0T힢?i#OK#mwsXPS=tETH ]@e	8,P q]S!4j\RB{
+)/+`'Hx>7wZW8ÜS\C@IqĮUZTXfsfJ*hȷбiU_Zdzңp,@k2MpZL}TgJ5!h[XfS
++tEyk4~<ìnc^4 !0D?Zy%
+#1~U+LC`*Ǹ01X!&U
+	xI	b"vn6?b)WY	I@NJvLwT#5o*uTrsLL@g08ŕ<2
+UpjE9i4cžt ߜ:Gjx;!8a+NS8RYɗhg<^eca'QGTǞi%>vSYa(ڮ	O\Z_
+ׄnp3 b*/y$iʰvKNՌyQ62.P0KemC.} }Ë.MRU
+XGC΁U)Is:6n:MJc;cXx`h9Kc9a8eNFK1tWd>;QڎiiB-'7S JzeVqΞ{˕Xb\
+jq6=yAL\te(CUvGD˱ PEAp
+F/'+d+]T}4eDi;aiq3dۚ¶"#hFO)õzs- RJLvpE{GyUoq:flbw}=L>jIsE>l5 oF(yzT@
+f>LH2H0ʐŭwȈuG?tNđ	ᕨU[͐ugIzZiFJ_kz q*yBZ7?V&}ѪW;Z/s] +h磶K&v^L3_um>^
+X)uk @Cl#nP|+Ǣ(jP-Ϗ_zrM4b%#+ (A'>CtdMy*Ϻ@	=})vJP^:PP>;>ˡ<404eVjgO<`~^]3f?hɛw()P?N_@y]ҴR830iƀkesid:<sahqѴV]ioiB!(o"e%
+I6[؁|QU|LD\<ۓ
+)」R"X~!n4Ma$-`ƦеX)E$6_ajl&HT7LVcV,666S=DϷXVc `Un.7FXWz%PN\PګOC40[@0"($ ܂t>ECP{mBՂ -*H9R
+TaAIK3UF
+/0>Pg sARҷyUxEE6Jƍ[$'Y] 80Qxec^*T.3[$Mn=h5q`n䁵윜8UU2iC}].XYStQ.R_Wc&DsQ7lXTJ7̱2n=ᤁƥwMJ(;BOyQmq %$DCG>W0z#P;P֯q13C	OmZ=71p;S"\=><1J>CPXpӦ&-{_$_LOg|tf	e8~s3@!єyٌT\[\XyE*GQ-mw]yE: O,~U%N1>v4J$Z@ljx_el`UTs_̃àfa"VU(@COH3`J--quVDos:4RmB\OmgaLO<9'}J|R]5Z7aNjT&MAцM | Eh:6vS5+x,Ӓ Wγel%r.4y/zjNúlXH$㜌
+mB"0 `yBώ$PSxg.Ѿ"/N<Y0
+%Ұ_}-ᚻJq]]!QqB|EYs9Eu?pY3$ް`IN7Jq<*0D̷
+ux1s_͊K?H(":l(LOE|T@1|Z'%c^K؇(1{ֻz:FipTph%+6:X]/-Ey
+kj<iX%U[lw+/8^>[g9s.Ƈg1`!9Vz@dJ/'p.#'6)Wf/~-g=x~'c<L9[qEVIr;\@xxq5~Z,/z\/UH=1jpQޥߎ@)@C:'aUn6h,^fJũ
+TA ns2[Q%fRB=54bNVfqW3^vhRasks37LCcyTOZlK̫5Zls"q+UO.	g~h«
+7g(`%mmxOjR}ex5;|ࠍ4_]#ARU+EUob5c*"Ye<f*P%v9g_[ax$h`PȪFlf\G+-z.PyrY1U9yC/5)SFWd@Οr:p$2"~:\yS*2
+e4 b00yA@(hn i/5fY>p1ĊF~Q
+DL6T62 J&k=wZOYS]Ηx,Е/LFO#;Usb'YMy4+٨.O;=2mTvUjJTb"K߷xc||˓hQpxU~!A`.eP+ LהXSi ԊF>\s2oMXTj@=-&%X,?
+s+.vYM"7a<j[1+zaZ%2T#.E U,;ZHJj_ZW&cξ?ЩPU:J >Us݀>``{?G3Y/ʎ[1!@IqH/c'fJhbK&g=DO3{_K,\r4^=+#W]e:>ʊV7LV[ 7PiyqҲFx<bk	_j>[޼+Hop*+B'@!=[Y+zvcJ(
+0>kjqsWRyʇNU_iqmXҖZHT>.Kט|%MC\݀=t,2zւD>ˌHJyz30[JI*O86n1*;H鴚#=Ֆ3ӬCB.ԞM>[4s^7i|Z;		mpZI
+[)P>ZOU;Z>cUFd+N8,(yVa8jhqqˡo'U6x$`&~e4\D@沜EW9\K*x\} ׋Ȑ/*?w>@Tl{X@,F-j5m%Ǎ0DKJ}\P[neX)τDUi)Rhf>*/ߗ5!x]M3l[Iݴ*'wNfI#-;HKEIIsqfvU=Twˆ9VEU= /T֍|9/C-C=b+ʑbWzf+6Z>~y1-볯=TψZlAc)]+؊	U2$-&
+C0N{_u}
+DA8EX}!QIzG2=cǼGM\ַےO,0ųBo5G fԺrevUn-;@	;6` ,A^>Ik	3]ɊuҪ[:o%ӗ]]ug32k˔iƭ}6apIfoz?tM
+$(8T8s59"n񎐾*@W!A~8"%67j`诚3=%bh
+p
+8UהѾ [E^恾a$1WqyьX|xUMTdtžH9X	2Hs2[(ixSiϠ0$Xg礄9S'8pYIPЯuzHe*hȵZܯ]bvz"?hjs5^lEixśVhŔƾ!J?u+@G:MJK@@R,wK޼>-/S"}k@ӗskBLh6Zؓw_dU/ҝ2 ;l\MfZFjg!ZKTnv6@9B6L(M@gz][lWSICO4N#4y)y#kj--Z9?/V>XHm<:j*`4nU0+;;C/nzG#l 0X9̦|
+λWۂf+)ћ06
+-P{<_|D땡&\u)h?bAL/&,˺`G>;iTɃl$[b _۳ m?T'mYIKota=%K+DŮgMVf䱪- GsNr<;Ag0C-(XCp[_]o+Zsbs*lY0_eҕN Ŋo?Q*w|$b/xK4-CqPX؇? \ PEIUϾꄟ=;$>o*R-gp+Vjgbls5䂭ú}#	X!C1`TAs:YP|hd!'8yy1z=2J/q	X9'YX`WͶztM.w$̵BKk=\Uy:ԯрx=-B	nI0ED
+htzP7zȟu;|X)[Wm;zuZSlVYdV/4+W	YMeWq_x[JЩ / _^;g^ܲT!55i [t4+Dv^;#yN>r*Ϥ(ZuS7]ÍoneiνJۏ{q*'aE&GZQ)}EJoSaxǠ<~E@ mYն/xg1T'y=@	p'f"n:Zc)p	OTWg(xfJzJʯt!CG^ߣӇ:x! &Q1+{{A#K!jZ	b}*
+*Sk#E*bE}tGܴbg b=Hw#q}K;(c'Yixx2ݎk5[D6ڠhnUd_Lysu˞-4riGwP +^YT}W7F'AOQH.5yތ+N㹂44*7Q		50lrc\RQ	|:eEooP%qN*<'q(-\
+l7Jd!bE!z{_?ݦ1/(Qze|_"}_r3d	3tg'6nıx|>&Üà̯ȭS}"n/cuh|3nlAMX/vT}
+GVm{<ۨ"Yr_ܫ' 0\[!;kM-oG`iaFPu%=yOBr0nĴRr5i~8PWJ+JʧxT՟sUU6,X6^ҲU%'XRӾDKZ%{Z+i^4	Sh^:%q
+=AfI$)pC,^fydh8h$Y4xʜZ"Q
+	285ile? +:t˟j0h5 YE_ GmxA4;fA;iL}ʂ=6Tk<۔ĩ*}1k"a<Zc7S݀NZ7O|;ìL姐cpm@d׋b! s0QdYjN.4Oھ͝FӇձYI	s Dt}DU[!_C_Kk}c7ijTkEm19yJWz%@1jo1;hv1CPk<ڔ"8Z{m6E-b k.80BEq̓bǚ?>8@ $EZ}'
+o,3wye:tmF 28VBa|PHwu1U,҂
+sTR> \j#>];FXߘfGg1`}f_Be?I	 Wzxl*:6LiM<,-	UO7&m><Gt +$'saskj!k7LTt=vCłUBv=kZWl4aPa	G2R&z}}t˝^F*"8#mF=٩U:Hm壯}8Ã#X&;:}>"/x"B+&ȑPǷ^DZ+sUU;=2yJ.w3j>F@!}_;{FǾ0 >	.FHq#9KCTDGp>}.6$u`/9X@bY
+
+	kcW<PocCT;Y4
+Yɉ=`!rCG;	*CDAֲMD~|{PUD60sjO=}2]<(SE_
+4R<?kk45i'x\:!VfW U4qA۪,!Ρf^H/<'sوAбjk^F`Ua07Y魻p=+Ӣw>SNSbE\zeǂɸ}jxYhкBڐb5|0[~EZ߲ګm;x=!PDU}9FAOJr#5̦b[~F'_SoI`ns0z> (RoJض-$Z` FkQ6|ʒNRօ\!P\smq8,'ظQE/R^31
+tx71RhRQ_Q{Y9;{'
+KीI[iQ=
+q,`|t47&˼L5'~RbQ
+;<;=yP-1ø5S[22BX>X}XD:_ޤ8X&_
+cx*iҌ4j0l?Ž %HIX,[e]į<{ʞ(
+k^JΊ|!W:	.uJ0t*5ACг̛(8ۢu'hpU8W+op.6is.oT~?;Orտ9ϗTS1k^i@9
+!z_>)HᓵJ^G67Ek0}9>9l5_Yŵ6ʝS^UVGOlc
+S`. ~/gɒoOQ J1;ѩIcQ%_2hJ{pF	UKl#$Q^[`β<εR ĺ=ጆtnoCoզkd.6ꖙKt/6oI`%d 
+MD+ySN<YˆXc-<ЩI	C g<'}q[l#5\MSxrbџjtHHzR_w߱Wv?W=^m ij)%+_af{fj(1FYօp
+@οe]Lkp06JcA-1̑}`Hba(ӒóZtLJ7cR0t@Z+7	#UO>C񟅾AGN|/G1޾ƽMvXSuo+ȝ
+:[+8mhy2yfP<)k-2.Ro O'k^'_f5}-1D]VHǘVU'򨤤`\֡u=a?g=3|y79q&'Bn_ЊD;$MbnE?G16 1>:)9ZvUdIZ(*ϺwZmմGU4ꯪTm*SreqQkiT}9)"hU_\E=BIKgV`p_Au;7*f'۞aKF/b1.!O8.a}m#XocK
+5eʹ0 (q凌a^ ciƝn}2]iF;#yuQ*0~7M	6Z}XK֝B:'EZY]\޺Y+a6zMS\:SI'a٧.+OVO(^>*{{(0"`iB!KNĊ?^5YyV+" .Bl[fxiA_y3hMG@wIPETs'WaFU&<}r`}V屹6'kR1>:]ArVXe*pyFRtu6-zrWC2bZol˖Y\CDlG[%b1tl#}<vg^N~4Fny11=lJؚ,ۜxdm-X|~-2Sy[3PNJ4žM~VUO!N|l>R`}:c'Ч'$ qAQԃkr@*~cĂ9Bsط4il-b?X	 zIXL*Ҫ%] >1Doe<W8VBmaBߍvW4wV)sMt!ϫC9Kߚ#.8,ZO_fkfj!>3L"ݩOO:V7aޤg93;M.:ZIaABO0D?ZKÁ^rVX,l!9 ~bS:cXTo|i`ebNb?
+K@Pޟ1~tŰ{L&#W1.gz3[KA3&%Zp:x*GfvR7_V<`:Tz?*}/1P*@lhbCF/
+[gt|#| bE˾0
+dSlxN
++*V\ZӰ9xUoeYxM~a-k1Q00ڃ'}%sOv{@'=]k*kʃگGv/b6Hٗ z(BT|M ;<sV9 eE\dS,gH-ظ("u5;l"ǃ*IǷ! PգVUϕC,-S^77gj6myA|lU˵D//rx,K wŧO }7*U``46n(tZ'D+EYxY$1i^.@x}9^k / 2kJC:o*0PU <TT7.n9'r  Mcq8YyKiނ&41=2$J
+ ״̦^8`ųUHDY2Xu$%{Z᝞L T@.~Q|ÿ<nه!V0@%,ֺV{ F=܇@Sg1۵*爱+
+)3ZG\1n{!+=="P+kӍ}AaZJ ;GUwf@yT!wA3R4
+:74֌R20ZQY$qx`<! PU= bNll㍆q[QvpI0Wli1/hҶWiR+vs4˩!Pk.O݇|+ 6ы|-P^br^OփaL;+9 .k}l}=> Sk++؀4d>Ffd*hS_UW_B+Gd))b&̫%bX̱zWg]`\QߒҞPuAwtÑ&Sa`ysz7IΧXV&]
+yq(3]ZYQo8y*Qgk|oD^u -ġRM&~<xEz/P:-q)-;ZD+	8>տ*qBV/eVx
+}_39I癒8Y)$n?.nr&KVV_[czM|5kNk[IY{ZWtQ]V/(j+{`LB0M{L/f)h#`7.[}>&4; l[58't4Hl@!c[uO0D?Z]%L_hW|ʖkHӨd-&g%m9.	dh7uVjCz.vuVtڧ$أ[tz5ϔiG9ǼγZ
+zu섹m(w~[WkvZg QXYU6;!(
+8r*ǂQϲ`H8Xvk2CR60@$]s`ӔM,H3\+q|Mv[K۫*PK=-R8'5^Q̈́CVjFb||-{2ؠe<;Fx
+ZehޥqOt %#W:ձD|QZ>@ zt4<ֿWw h"7"xU=Y`IFHv)8|Rtr/i*
+o0#z6&>Y y|Iygz:F*JDڇgS$ &OU͙'A.}FZp^JBm?-IdDǽ$k_To3ne]6&v-VU_l6q
+|I
+ã [Wb (qt?zR:.n]ae}HwD4a!cnSp_Lg- 9.МtȄ1
+킺Q,D-]ZJK1G%aaD:y.'WÏh/_$D^w?!PѪto1oה/<P6g\b_߽&:6Bӌn%XU'xs.̴e݀B_ -_645F[tZ"#Rޠ&eL[KY0*g؂W[2ah83;YHq=^Y`+v^
+[V	:^j{6oT-:D΂yfeα4bc*Ϻ,h/a\Γi1__Ly7h?h=74,wmiuuɯfRd.,.Q|V'}E|KN[&Rqt G/_Fыq k%yz?jytՏ?BxّՓė*:e"y<g"X~sp|ꆩlxgq$m@`KX/~z8_ԩ9[Ӓ]
+"٘eʆc W3,9ۢQk&ep(O#)HŪغc&'ζ:q+ukVy5Yir:~:%q
+ЉZ<e=}T4g/HyjmZPNQ.--q
+@ᚼ -
+,hdqMZL=xeV;6{DBVa+%
+E?i܌)}xM-Wɉ3v-g뽈+-@:?E^Vi͇T~m;AMNeYzqUn>WwaD/vk㪼o^\16hYbxsGq RV  '&jBV]tֳZYZ+87ʺʘֈͯw=>*6Noi*Ij'<'VFP+R}a7L.t[22D4hɟ%<qv@>.iM6hIgm=԰r|r>VT,Io_w$OSDAKB%}NPQ"o-)2X܇C=	QO}09 81GT3򔑽c*G֬SאHK%(R򈏽w;4ٚg:x]]*xVE}URHtK='vE4/S?pl@ S->
+/І4{e?Ԟ6}@}kko>ʆ}ni̫=eY1ʪ%Pc=P͜4'2d7n3Ud}GNG:k1ϔX8U6g'_XD@P'g:)laes'\M]AJPUUmPDh +Y<mJvlU=<cRbnx]4w}Ƌhr5%%9)ddAZP=ڑk68-yO5;ӴoԲhs@iC_xFJG߆w{laC @H(cqƱ]hR+"JP
+RHMH{/Jwu[
+̜?0sczw{?ϳ׽Y^|]n )^mhʫOO.V+mrXw4$Ev\$PrG+O#zVn7_Ͼ/UV'Qh5XF{8ζ4ih @谇 ;`+YlϥVa|n*Z+HsfQ/4C
+
+c=zUHQ*%N8,fU%kydL⻘ab5^5sx
+T1YsD?$4dJjR!#%rwV0(DDzbx-kJ3k3UAX+@G/z;Wntf^\$X &p-&EG`G],ǛWNb~iU	~Py[#>a%`Trׅb<㦝MٔBwz|
+d{=zJj\gyqGQ'r5e1ok*ds9/4RNtٿp+6JىrD\q8>viLcevfP?hᦠ+FOGS	E̻wlR+eZ(mJWʄT%&O4|^P`v8}*.t×>ϿZ)a'9-1&$ˋ((' .3Jx%M(4Di]`tu&Qa].#z@NlxN٣[.-KOs-"G,y@g$J#<xwɤ3c`0p$)zhnಃ/N	yBqҲ!h
+:ʍsXOq\M]t^Jjh"o䢍RK<B[}xrTMبJ{=*dş2xp1i1'qӹ_ ?Zמر$a;^lxm»Ta7ûnhRD.bN<bG
+FUpōB
+mX~gT~VCΌkS76<qp<hQdAXlhgd\٩%0-v:*<Ǣk{fܦR^ΓԸUC:3ea[miQlY-5,^Nȑ<),PG.ge'=>U5v}?A;GqyB+H$ֳln|] $Vw%$.Ƃb(.r^UСփZaFSjHV.StY';ǞOih/Ƿ9ɦnl[]bHβ|oXi@陏VAjZ̽86lŪUevy\uܐX͠nd}"mZ{=JG;,SylR]a}y1)nH?+N}'ʬiI%,bs1TV_F#Q~7=|%Dve8:v|DIFh! wNJ8_6zhLy7)&ڞ-YT_6zO`ףz,4<I1(g"iW:!wb@3uZ&5Sbwj~Eue"jUg~0߳\6d4˰OE\,\!Q2qX	nskǆ[
+*- ]J)V=Zn!Q%@x9f_?{(W\BÇ_߷ox _|э7>}~;w
+*߿s[{"%xJWйS.KEj!KNJC0ĄrbaBKى9}یyMB<8VGU
+B߉vK+bp.EsxZy(x@ge9V,٢
+XrQZ|'uk4?aX$HN
+я+9*XTJx<kA!/*Z$-vx{]㌻߰Xm-kBz0/fX:ɳMP8[hZt/&2+pb-a"Ji)ڿQ%/"17+kg?gk=QEK7q X:f&,{ü!k,9|C˰\-[Va<==K	z/`hn~*ih (qWX`p<IZ$EϮ31wOTqN<.$7S*ڸ= DC}gY;ci^,6iiQ ɔ
+
+{;,̦vMqcy-X4TB_ӷNki,R3O-3YIL~{LF`8<ue~.f5yf)Lv59q @2Vwa9@PF;iq''\=O-^9=6ׅ@.#}GZvy,UВ8xt|ol3o)Zt$~qRPqH2P_, G0Voo"/fgqqqO?-2eJ2e@=?~\rM8q˗~?RbZJx#&
+4]Vl-khc]̹Yh.aa0đC_	=7UFҾۍ6az.v,H~y哮
+~C	7ؓ"?qc`(GtU^BkB|KHVɨ+̕Rq/e<w 3#&5Cc-> %\ r0yC{&]¯]̲dK*ڜG<{4+ Iy'4>O#Q X<EO`%)LP@8GkԲ0+9A%nxӿԪY	" #VkdHqТ*i:!Ba';1e89X-]yc3p_zm#֌%-Rhjh#! &	e&pI0YU:UBh޵z޹q|qrυ`k%
+s [Ԭ~wi/;	ˌ^$z5d@di>
+0!;MyuWRѦ>B\·$cL!< edK|⇚#qpv>HCp\=}\S<\(o@s<)&bpw3 KF9g}r^\Nƍڒi:,/=#ׁ3)t r^ǧq88Έmc,U 'Y`N+?%u{t4-@Px_wsZ3ыppn"3oH[vȿKNNo*lѢ?rH(;wt@kyp0v^#EXE'q vk \\jc;q6ONU+HYrրWx޵C/`d5sb,IS"Ƴ~M	^U`1tws ȘV26[082"ﱪ.0+=]}Ήd]EYqA}V	v62p ]7mf|`&nb7uLq;?C׃uN6͋q"Չ<J籫c!4\eu^gX?dXMbgBB b!΂`b>pm4!-< T%w(;bDaʔ	Ob01ݰRxIJCv14tվŗk]ؕ|>|}l}]v5-֚XjyY=l^0J,s>K/tѴydW@f҇IƄY`ubńPn_*F2AQr)O6I*?z61s<%U5-TR0q9.pI޷<ig; M!b=rKO	 ܎)@z乄 ݂68`E>Vc=CE=sxW0<ӹKӁȏxB)HW9 T¯3q51 qO83 ȶJLc36 >2Jª$i/6<76|<Ր&nx {o D^H/_|||xxO?wȑ#%%GwygstfOgsN
+ge(oo:JiHis&DOXKb3&"xTt>d@bD=<AdxGTUt\8l~0- +[b~'}wL56{X`iCR)5ûa"ۦZ ^6,rfǭ{#v}*ݘʣ
+TFv w4yLR/!&# x])u9
+;&z_U%yLм[T8\u8^S{[0-Y_fW+;
+^YEQ/d.{B''c~BFǲa.GXrE"ݟ.b0<ጀ ݱ1{F Խ >Q3mj/oc#cV86XU7 9#`f'm)-#aSUwH"ᓨbvÁ?ڪ6<6I39#AFM\J+mD4vfW*$vfp(_wȻ_\J)Trq&fndR.s*uY%&`j>.ՆXIOp0FR$)6,o+*>ǸB@=J-W҆#I̿-i"JN+4wgJD,Ϟяt=uk,Wh;H // 믿;>c+K,O<;8cWLi슷߂aE̮J*S7EL%750p ÖE`[5&MuCxZ 
+bGVJeFzpW-H`ǟO]%Fg=q^$">/m32N)^'Ws'dfrHYe('{EpddC7ȃ6#kqO{6]|jY,VvmvZ':L])k9A㱅pzzINU:eLS0{&Dv D?u<ZBgҠ<G]y*CSuKJG=φM~Kku8=E6	mG[\g:Rꉙ8i~Ʃ0>dWQP0a&9{T,P!-{6Jϸ}+tw/vE%>UFɢXTUL H.q3{2oksn9zp+c!8^krT]dh:u[I,)ޚ([q	 XZ9M`ٰL%N" cݪ__/i8I=`ɃXm|%V!m2sV[,X#A`KRraP
+<TX_g*Rj`TւV3j$Nj*/F@(t=?*٢/uy+h(<qqu|NC`Vm".Q[oOq
+z?Dm
+˱3S>qu)7_˗-[/_OD3:]B_Sv<k{Hjv'hk:U+Bk0Ft8R[h[+Hy#YA<Zhb3(VPkt\˕\WHSsFC.z+[Y!Q>?)c8["YX-03ѓ|ZdPidi1#ccsUU|:l)[53@P>iS[`qsw2snke\X ͷJ̾=HlkEgT紿Qb~1D*%ۀ &i1 pybĥ"՘RŤoxÛY:70$'XZͭH2CspWe):Zߓt"#-Z43eIV?uײu;Hj`l 0H(	rX	G-֦jDO9ff{60Aa2J_nUt\4f\7&ze-|Bi8/+
+=Ewt
+_ŀ&/L"<W{}nh&ս%^'2z-fGж|xhO.N(<0>ׯu1w 'm/>)я%GR@ilWԧJ4<D|y^PcJj 2OHUmOSHx*-	qNM5kzU~q+*lA|%./LKz	>[JVV9Oӧi9tEZP"x)gqxX,WퟓnS'Ȼ}Hk|K*hb<A.|LjG-3*6GeѩK4B)7?]rDsIRxvP
+x*/l ?$-`gPvH4CD($V=0'r=a]F0j0nh!N21@*ݛWkʿ<QvTZ;W1x|ӡUP<x:cӦ,Vܑ{5XKTeI[[gK pg#,;tߑ>4|Ӎ+Te3.32*s0.>#s}UF=852tM1_KUat8)=~1fRѦ0b-04+W"l,F .j`yR];S~-6*f,ok' EU]j\6=~/>'w2ک=@) o5ȍDV;wa%*f.V5;8I#\viq/l'kE06b~ǕӞJ)VU,^_wy\?߂q%i2lŖSşy6s~ത/M7,^2(520CW
+mD:,s0Q	Ix,UpLt,&.L6OnZiEILb'vz)xuAA+C\!qѪb5<:`qE[&gQ:[.WPQ66DDKZ3fRhvY hgɓJ_'rw]LYU)Vpl/<ȍ|-ɒ5bՕZ,<DgX.JfSh%}0F!2f_k!Xr~믿#U:j\1*A2 #_sU^xS 㼋4/W?Zx:P3Hjj5
+&QxƓKB<kv0^d50IU-~^ ;^|Tj)<ObwS9]װIK]<i5
+-H`
+by03:cjA<ic\-TTةML˚-^,0@	f&omXDbebPA5q}ϾQj13t_G:x%VM-Pf<Dm+f^q-MF՝+~K$P [fd[RJ0x#yׯr][}irmPc83WK׻8]r|N(˳ke'K}0%i(e@T1<7~Zliޡl80k$&`hgׅwSeׂ4q{l)|v.Ϛ
+dR0A^kghJs)XjK@R`bJ3C	f\do
+p*O
+l8{";q(r-_tq}]8i	LH>þUc;֩kǄOإsy0H^ۼɡ[9ܬUl̻10v2i;]wGoѮn]Of	gWhi3h"-UkͨshgYssD)h+j5}.tbWKn	@(G@ASkq*Pٔ)xhܝtBG»GX
+d3_禸;i7 ܤ}!7nLHHNgϞK~*UDGG/\p?k6/_{ۤ-W]<KV}z`/c,Õ漏^QEfWBU|Uv6
+v
+AFU\1hjwlBꆦcW?%uGIpUW8r`|A\~:J>GZʷJYsTf`T=0O~6\f+"jfTfx_4úB N!-Zˠd?IpbppY5dmE$86ZR[- HtUnz	ɂ sVd?Xmy!2IE˔b/5њN:CĄMVK"|,C.,+t.ZxMuݥi.u
+:qAdm6v4T}z	GO0շ鬅|?qޤ(`" Hld4znR64޻mږfI쨒ӖV4TmU(L`lUƅcYe@ҹRK<IZ:8?̩IM&ui1)J̬:a
+ڪa@Ii	0rFC>h6OI`!Ngt(8R$4e,W9^ZKIl:6z _~UO >0	Z>Ozj6[ _a|DM^ewwi&$n!?Os0ΌsV O1SF7sTu2$Dtd<<ɨ^ 4ע)rx7t.WzsjJ_ _hXo۽{O>%J ¿gK*j(y~ky1L+ŇT);_r@k1DӔCz	L|Q-]3HlpFx"Ƴf0s 7CJ'9a[w_redv>S4(V#e`C3!VbX@˼(GFp	ٺB"7H.U9j6zC9~l t~ 5-V	C 4&70U>VKWO0Ua(P>)Oq$Oᑲuư5L4kٖlS|u)G^Wr,Gp?CNlqZ\4(ASu|n=ﴻUdz8YVw[HqJYsιÓ2-/iU	N=Փ;6}%~=-GB`eۉߵ\Vi%c`ٴpQ楖x,%ҕ=uJ*&[	d`cbڴR9*bc`(ҳ@?<I`jp#<G˲0̈́t=8yKZ̽\<oܕ,/ g\WgtT~/\`#}<^|]qrB+mkZ{(׎/4JAOC~iIi}l|YE8=Fmnl7D?)}ԯ\\hrцZB5|z@[yJ_1L5*i@̝2$ W*0Ncne
+تe*X υn9FĲQL$	Fvtn/(*U 8'CF!r;~l6q9A4UeF~U[pjP!ʀ[7vRk9: "/ ;аZ0~hqa 2ZA*VZA
+g`'yAg8)W-xngnxWM_L%Otחa/PE\Unrk(I,Kο'Z؋D@0VFI#&k`{CC1gG{al\l굾͵rkpQn|&f9@Z*{MϿ1Ll)anAO.@	E/'SebDo gyx4/9pĨAd{Ƥ[YݏsoN?-m^=ץe]ʔR?M?Jz*] }Q|a:\FTxM
+Ո\M-ZvX~߻:X83)|х&Ez`|W".m.АEa429M.VH_pl`9 T>]/sl	YXpI5CBؼ`_
+,VeŖ3B Gz=G0
+<J4  }}:Qy"xRh:KgtKKy~@[~|?0ݥuɃ`_Hj\`>ȥ[9ND{3brօ[!@0gb*IT	&@++,{.Oh)$!XHrop~焞k]0YQ/|/	qB-`z23VE׏quyv;~(D0b(3I%z%5JU"(MπzyXTOdOкA`W741# ۍCk!UB9lryɭaciUkAfSpKxO+C\zz2e1Y:F)%2!,+hӬ2|Y?2sc{yzX!xIn
+\{˱>fM2\f{v<e^։aa#O(<G:Jgk鳋0,YN,+C͘k6coǪh>99TKfOU)?'i)O]`O[Zh`ܐW&cHj}pc0|x/Y1Et(CT6G0S֠ҡt0|6Sb1 vLX]j[TɌWn߯SܵWS D[vn0Ofg#묝_G=AMl9vE5JGx<w')ivM>
+[w"o(4q|eXwƼkU=j)E^H- A0F]QRf*>rrT=SVUǔb r%I)}UU=`ͨqL%ZͩUz<h|}6A60ීJ_'y9bqf<ĈK<·hFqBU34qszٺ%>~O(	u@y. IcȨQ5e-j]Kk0Ҫh4ͥ1x,it3XiܲZ3v;o|r<ayn"ό/U:V0Y<= FWgt)68tɍX߃DPELC+<ֲAmCC)J0x&DiP#4j0ZWFy,a&	AH> t\>	Ø&M$G\:'x&BS@,~õ5#P;#PH7{[^783@r=͂G;>WOOVŰ߾`p/W}CRC+S؃I~afQuɯU\R4аDB/C%`JN-^gZgN|D;.|%5y}qiNNxi.aoi:/т_0#@2"sbT,b_sAvʫQ+qVX!OfUzk ,Ќ%(HY4rW5y㪶41T'L&Z5mW/qG~Ǭ_M`ǈqlQŭФ.3ȴ[0]{O6nJˢͪYcplBb{w`(rdQ\
+1RY72Eco菪,/=K"ߥ1UpǙvpVԉ'xO=|hlԭyhoc3&%o$>[UdjTm˭A'"1$A0IVǃ
+&)&+H\
+j6xW9f`W7Pn{3zZ0-$;wj$lIȦ^"o#(XlxB䘛}?s"^Q]e~O˾^%༂!$N;J>gՂ/a$k鵂TxbC렟Atz0NJ0 VjɻaJ\ő|96zTX'{qa.a,.'4ˏbLHx" $DtP0_8@13lzk/_4s0גӫVlliP%c}c19'Α3rETYM}q狥YbDk!Vq2"0²2+]fpg
+7ט/Mj91n.jJIhcH):Kִ+IﱾoiߩCrw*mczo+r|=(utЀl?Ig3Qf)qNVjq_J`֌eESVP1٩Pxh;.޷mfaev6`ci"qn<궡1r4u՚`~G?jR^L/WJٴU}؆K"?gG:Ng:d-	>Yw,}$z:
+}'T$Fc䧕,-*+s1OJ*&u ~
+2r!^_<ó⨚}*t%*nϏ̿26<":ym*!k4hyIW;@OAÕ N$hj{@$fGStp1[Ҭ[%UxK1CAlpR)؂<9> WhTJE˕irX/D?Ek< jZY*.Ck@9ơvp+#A2'tAh	haK	MgO`Z1k95W;ou_M~rj/^uF`ͪZĜ|A}|,vGX!&"A׫`%YVcۓTq>Ь2IE>H*&vvY7t07%B>ePҭ/olgx=a˹DK*85҂vtk%nf~{hK̟ogd$͘fޖ]iޝfa+Xԥ\ yb*TZ4/`xq -n[,cSRaB-KM:׽_Ava$b3|Z};#7}4pp$$_qm=-5]J(ҋ2@O_hOb?|yNU#nςz.qou48z64J^JqjU}F?)h4G>ol-BZa5Uĭ|jsC=U*|mS͜.:ΧmJeRԕ]<Ғ@&4\96oa]o0Uէٌj|F.R
+cӌқTp3hj(ŅI =pFIPNX]B}f26<s]V4irA1ΏPP[Cʌ7gqB\$?ש;8j ͠JHRo?Ǚ8:UqԯtAZ?tC%o;ϋpi.Z2:
+s	w/h [Fl9#z+zyz;~.V.6Lg~/VW?yD:`.MnƧ:a,/nP$q5Iwy!Z./L쿤f0|
+_5	\VFS(^hJd|#MM@˃BOxZMj2ߗ^ٜ6)8ȑ<IE_-N.0HsH*R`+JZ90WA00e`(=o$qClr~Q)6w!#81`/ś3`" ٞ/45q!W[5S]uYQ,r|..쓮)rS`W"A:L=TZ9o:ʘ2 3zIU2v:Fh+pIǽZX"VS!SP/Uim1Vs+. `	3L3p1/kjksMm
+Oa9м4o-wW0y96;B7W۬;R'O~NLXv|uzAVƖ)즕$r$UtluG# yxz#/A3'$H495xk幂=Fs^#9AwpBM=
+e_qN[4I|Cș4jգt<tsϩ<FUjE*s ,
+ÏDMl"*~g>Ͽ2}
+4uAjY
+fklje$ږxSdbp\^]ʬ0}9f_@VuM~OW\JkTͦ2t}><zؽ.{Hǹ^׮RrwiV^L;/P=J,c !m!qO-ފ;yҁ`Kf>j0fnع:A&ە5xXdкZAZ^wͬv~9AJb:prd<(B<qoQ%8
+6Qvٌ5S:{5dK2rSe%E1}[>1dA;ɯRAFs>_ƕ~%w37OM3#u6V
+.|9Ig$}wWbM_]za_ݩg?8|kw,AzŜ#Q*RŹ6+A4{
+i819b8)!̵Ci޼c_j;QPȆtcnl
+2aAH;GjZzë"/ЉY$uXGQ60cY!w!s;xEƀh/;4UǓYpir#ojУSF:f[Ǧg-wS~"WK^X>DƄ4[}ogL=:ਞ
+[[wggh&0-uEi@<h"-|8-bZ>oԫ
+1nj'G4eb5 H$Rx#5c$gd J	'is4":ȿĂrKK39'(*LT@X$>ͩڜC"ZxiVtc&C(a`y>#ی y  iq>s;8O]U>m|DgV(!iCRxGtI4+sٚ+~es.b/q3,m`2o7".@d|hi>颬CIr]ĵ>2.5to+k$Î{krW'*RKPNrН{[fM򽲃z0!u7sl6hV>x"['4Z0c`AAb}FqK@:A.vI&μ: ^
+yFP<\3³<A.I.ı#/ࡘ[2%q<1PpLOQ-}QjyTwR!"98;pF)_3vI3U}kI'&Pu}# ^Z]2Cg[dR{l2*Wt',_1ͭk.cK="5XkJc*'E~OK],	C=&<06|B's'byT=ƹAUä]FԗT:Y4
+ax	caR59 􎃵2Ԕr _N7>8[S˘jbmE6]C pyCp!-81-l6$曌~8doBdC>Uwo0NHć4Yg2mkYv]7;W@fd{++߱ճ6U/_3+{0Ջ6hƕ_kgyLO9!M,+@%vQM9/cA́41\\3 A4*|hѢi3_E~.dHgji>UCb[!0` ҷ-DZjN{#zL\pOKhѲMYdWMtV07w8|oq5k<7r
+A<5
+M%%1EH}Bd'FOL{jz62b
+q~w֠SCouQ\B
+'w}o|9h
+1rN3qWӵLt뇖qV<SGwC)\GӪE_*VaWfYr&[>4l\܂!-k8r0䅠odN9'F D#_6zy0傖^|sr&<tKqM0jӎ9'*w~EƅO,3jOru,0(HM{1xtpvd)"]rřs.Y\#y==ژ&R ~//HoW[lVy:0m3mCY\ɜg[-l+ίȂ,7yaܽ;bpɌ(ʚ}D㘗yҲ4k|Q؇!S=4Ș$U]LxΪ+)c<P
+yhH p Azivw{-4ÿכ]T䕅L;eyPn`
+GQMBזO_xxdaT,XJ+يIi6%~necy +h3Fstݚ><dڠon\3?0iݯ^)kO_[>AiB6/oZ&9x6٬9Ttg(*^Fg1J9B.Mʵ-Ҧ#;eq6F옖rb' =O9<;B\P%/a
+	L%020W݌"hK%pȓ:])\;(Ӯx\l6|'xz=9%SU
+iuE)IIQG_䅘=Ԕ{.%29\W}au?q>P-)ŪpmPN.OS}uDZ	79ѝLKK{JwpZ݋qqq{TuV#FoU+9,!^>j: z[dy!Fm8͐eqr"8b-' v Ak->.B@s|2xB*e`"\`oqf-!7PQ{VnR	򇭴@*хOrشLM͵gy`;_xov&P*ǎE;tw#]oK yAfğ?6^e1엾ｼE&S!9#vplX#C|FZ9.>Mջ +Ͽ//W8LveܙAbyO,XEa4at{;48E+a^5FM&d
+e}'9-Îwb1잞=Uq18<l^/dgBRX"HXu+*0/=nƣ_`鱿M-Sh+<XcK
+.fٺQtŃ-sFiC_|,DЧtǡ;'{{fm! h=8>lw,Ts˲fnA!.-7={W{pY:7tei'~nܯ2t1a5@Ȁ0&ўU16H\0
+DB9Ra	&k\p
+'0(QE+
+8<s;:6|Je,	Oo	yL@-j[Typ&3{VV2[VkP)==v~,VxJ<@61ϧ@N)^}(;q?>Z\%ΡTY
+]Ni`Z D|DߋuVPLм;T[< d1 5<ӐSxq,[[w:V#m@>] =cZ/$Ӡ4mc{#l}:hR5TP\/>-idPB+G\R 
+%AWd>I``0@_(/a*`f#Yg|	x@xlc3K<<ID`$y11ޱ:q^ lNF|T,2xS˛g]ޔ|:O;5~Y{[,e+@;2H
+@	[4O}"eȡ1?
+ʄalEvF	MT΀$L:J>01r=sgƏqU	<B#5-ZQMz5zKe yWHetƃB!l0,{.[NZ^f$mb"XJc4ŊLD"9^g':g@ĸG:y~yֲ<²|ǎB
+?7gM_\M:3sđM823sO͌_DfDY5-V}}ODsR$ Jn}+xY՗,kY%Lj=&GZ!7@Xn_)O@/9@Tq5_PၘñZ3|մڢPq@@eyYk4Iy1T{=oG|wHn5rutݴmY' &F;КE4R~۹aJ}rZrpGm;jIP%,fb58h+yDN*򾫣sOH~ʹʭ@nSBEtȂΝTR͛7pQ~v(#x<&*S~tE)E1_.`4:/Ei0"DGLYFe P+H*m9|N8w9mgf/CAw`F s#My(&q*˯ dA. ʉ278	2=c2Cr8ůԼQeWc2ʔ1L~Fb~&~R䇦{ӦJ6qhl}ό|9i(Vѫ@D@q.r]l{mVBg\9ӺaM-CS+-hI[*KP%bl'JpieT׊`g|˂Z#z{_	P(=YF%9YBĝhIHSfŠ]`,<t JoZU=PjJ8=X?l.JpP=Qa780r#ФN}n%ں)a*}<?chm37-B*!6Ez.:۲vclvߚ\8/PJ:VR6^I X;`⺤Sfl(&%zrr 6nf|ˏQFN:)a¸tk2&G`I}jX	F5掁\ ^9}(kg9R}󓞟'Pq$)90nwƵ^pd;N8+y*Ger\Hb\LV>gK !MQӦ2g	iR%Jfam&DU{k-ebPsLѸA<>f_7	SLIJJZrرcccc+U?Aݟ0jU=."W8%8UנcxcmI+embb+wւ&:g,NYu0f`%60s$|кj0x(/C_	>oZ]#d=t|.VXPㅠ/<wq6Pz*Ao>+%XE*/::uC3T;_8Nˠ,msNiQ>It ^65b5q鱍J,f_q5$ݎlة+)o$v <eۊ*imVk]jHojIw	Zf5OYΊGhCNMmasόRE b)"Uhy8-pnw%geL5/
+.gKU͈rq.2D0ơ^Эy:.٨ɐ;bV0qR݇D0sw4abK-J{(It.t̸_XnAqJ9"0y
+iUVy׎tyZz
+-R`6A/%#7
+?-q.}B
+zJ;LẀcL$榗1ש+pݧhՙKAg,N$mOқØ>Z -PZnp0Ŵkrc&xz=MhttRbw)Q,U̒z-19I廒i
+]A7hN(]GHaq\ 8"&72I;nxc& 2>-'QYKҺlp4Hv
+VG~~+ZtSX^|ݪ[R.%=ISiKʻOon"n0|k׮?v̵g:Լ_ڛ^U
+8x=eҕcla^IYl{ķ7g, D]+TN0z@&#YE=L~3 j0qk`LPC G|4x	
+|>{A=LnGBJA߭&J0㥜l:OHX{qixMR]Cdl~(>;;<gr%GU`nf<	NaZF:tKK̀_)>֐`;ͯXL7ȮLaXW?|lwξ>Ba<k2!Cz̝:l2I,$:i|	!;UoT**fK3ْt6W!OJ\moIhU!-hy5̧tGLg7ٮ|R0Glv
+AaHk˼G<Ae)z:80$NV_AAɍM0-`۠4&Hn9'u&$|A-W#NoPՠ`=N/,#]H@??C7-y%f٤uJE&G
+̺-𬍌QX, Tj/Wh*4xe
+T@M*B?-s:l(=.P5~6]0[Wz2=rvԲ
+k#SM}SaS"],+یeQ`w*x&Q@u~NI*qvwhwE.T4-Kw`[<{dx?^\W@I)&ߠ-iUՅ?0/uc`qS7"_/_9s	[WMB-N`(=P;)N10}PO;oorLMآbk{C
+vy X	GnZ)vR@*A炏8rO|"rY -mp<TD@FX(BM&rm 5y@YT׳RsU	o\<sf@.<Q0;Z'ӊ=ex݋hLZb<MJSXE8>9~8fy㗷9%
+1˧	3mϤ`M#)=-ւF=JEC-AI̵q/|zاŖI~ji=4ox'1cA++U"1tJ.Tn
+?-q	Ӏ͵,f'h?\:AHkC*rA˧0?Uat7À:Gl__X/DsC+NON?jJ	h5f}pfmsX v0/%ˬ&#&Z2~J/EGױƇn= .>]-P']O(}+yH;1um=&U&L*>NrJ$G}@R.i0EfuMGOa?Ͽ
+8`; Bzy)l_8Bay5a3&^q]R\`AȳZ9:vUg=Y*as1ZλaPXl>~:&<idZ QV:$9ЊrBSMϻaG<z66?$峬sk5oI\6?4&|3s8mڡ 泟w3v9^u_`>.u!dSqBFߞRʹ5cOGC8gyкݒ=*VKg<qZ-Na?R	`JG{+dMCUt'Q2D_y<?<XEA_P4|	|"PPJvM`#A@AAO8s5a" V<7	ml>\Q]Ļ5Tnz@C8K+^I9&;Q%MeR+gA+OfcY6UyfsaͦzIu1WTjYͲ32xGKv+Jܯ_VMOLl?p)^0.Mjz\+g`L
+j/f%:.u֌=-CrIs%tct;}Ah*L_03ePwjP2)+Z'-ou <GFȒGϡ?x9s>V*[H*~9˲YMb5%T)8$ԄX@]iك)sTt68S 팒T-iN~=TĴ[b PFXߒ\R!>sv31^l L0h0AGk4d61 ǰrTCmO 3yѿ
+z x^ks;_C00Ty:Z|N)?wHѽm$X>|uy@1L\%wIj,@'II'c4rmb8)n=SUx/g^Uoax>-Px<=|V&r9`n@_{5̉p\ooܸ1!!gϞKߨQԕ+W7.66矿YtY*| `	t5#-߻6^ðYՎgYckv(C;slUZvAʼp@E_ H< qU\T #j0!z@!ǃǂO炶LaZA#-mo4Bݩ C\!LUX, W*
+.px1VO!)E\քv<鱷{2]+;8Ǚ	}g1yiIb~H4zNG6=ueXc<>	,0۳D{O&G^%}S2;&EYsDf3D8hb
+ɋ}h8aE$=W	i^P2	2s~w͐w(tX>xB~`ܳ5$Oj0k\!/`spS-Q`2W}ms8n2p+s|%Z9_s~iS#]gri9$tMV02m9!Fkf5OZ):D%zF;؉3#gJ}/V)U 
+mkR/?^6*c.ݘ9`q}hޭV0|2_,JYσ=XMC)Ѷ)c=ɻ[iV5<ψЪwR#=I(図?bt8|lίU,8b5Lm5܃?U"6c
+sĝcdrଯrrJzJEpf
+؎ir*吥%3X18sr"!C.[$&?Y=suϋO+.dZJ(3g[oUVD_ V)lǱȀaq＄Vg͜xM!B6伢3%x~>ǿjLm'V7(1f|f톡*⩠~ЬǃWoZ<b0v4!`ABdLl,%ߍp響S'@0{ڒA,qSZ	F$7J62LP	UZ8+;i<h+PE	0Vaؚac<]3x.5:m$Y']7W60;liFӖyP.317kJu@a5!#%O,"9δ Ϫ־FIHBSfǱEb(1 *XDB*vŮJ*R|ߺ|{y\g?{˺u²eyar`(,# dL0	ҴFQ-nгoS'嵬:{׸"	|$(?֏rJr/WK\tMןL?;U+ş
+s֌]5m.l
+".od"t4@5$.\.YWrIQi Ǐύ#|>ʸ
+ĨJz?@~$QMVʾɄW<o|Ӛ="@ۦ1紀3cTJso\vaͦj,%@à&#pDi k
+gRy3v=/j,P-ޔW?j8޵Ҩ >ufq,_G*2.=Tٞq\+EQ>gm\KX<ySuxr'N'T*U-Y*[?}^^Í2<S}_ֽ?{ȏ<w%V	uNjaɏ'N{aSEݨẵAjnuNIjq3#S`zOF_^~ 3'ߝw1'yXk&	INA̩` ̗Bwud*~p\?:("sm>hf'[=%!E͌:Y#H Me?qGPblE>i8_Z^$O9C#'XaܮkbI\SNS%>hZ1ŃCxVo)m)T<=x<a! 3ELa$*P=װZs)dvǀa?oaQWSN(E$͎Z!}3CW2T c4fp(pg2?K+bXBo|e \k_A5;'GJ2A`%פ%\Q:+#0J:%,g2avhy\ʾorA?(wq\x\pGty_]pSG·Na|,hD)e)GW7CEjOmcuTCzD3Y{P&_Tj&<(dkvԻqbHi|A)b3fHiKr	\r\r[\C{iܭScJ5ݐuOOWunZ=,4#95KMlq53O]11x*x9E{!SDU	願C)ᰩ$\E:^u[4H|YlB5PX(/YcQ|ra0xrSH~vNb`'0K:<S~II	OJz\
+rq@ޥ=#.6Up	z\rV.X۬#DfQsfCO&Ҥ9ExvJd{@C0˘ٕ AQv>6Lsޮ\`f9°\s:넰on.>9l;Pr?ճ?5]C]۶yu/tuQ#C34vn93sчϱ
+c. DƧTMh*«s>x^2I[t4]V2p>S
+Q'#uй~ߌQufe-NU3Oh/"G#xe?	r t/T+;ȋ1~ta+zyG|w`_en-ϿB9@7$@V!уOԄ.9繞\5
+e6L)nƤe-.l0ҔfM|	BAviٱ<M(+-x~;L0]J_+k;nc˔q8
+tVjr.rN̨˃rUKF3B.[oj1ǝ5\/]gH}n/P|TDTftempp]g䚹nY4'Hw+ZI/۟l0YQ|7@Ƌ"CЪ@C]V`fp*+]G=YjOyY0F"ܖ;؀uz==mEvn hr7*:-D.IZOf sg'#J*8;ylr+sXg;9M3:<xXlr7	tp10=0̲R`㾖^?),TeUTq0bVmy<,ml2>H]7&̿4氌Ɔg̲e  E8g΅i'>'`ycMu>wTGF{W\n}ur'L?6?QMYs&7$ЌO6Av*o?iyi4:QcA,SG^.'YSNJC/Kߓ{Gt6ǯM:HN2G\#3U<T$pGX.;h
+_s$' fP,8B:\@0wړfY4=L gG;|pIb|^*6?Z\2t|[[ 8-S ,NȽ}BmIp@#Ljy
+h'TE1.āLaϱU1@$,gZJ4&\ZnqXF-r|zQkKO)4tFDUb5WfHh)" C4jk1i;EU`7G}I5H`QwR2!|z8v't;vߏbThBs$}0p?ϳ2Ks3D&B2xGB[w]p2@S{/o3 ]"KXNg5fX+g"C);JKWg"*WN)(:Ldh/x@+V`)\>U]NU#N28dvxFi#+M#|Q4qeގU̫F!zFaN~ϥ@5V 83jgTB1{Tj
+[
+$TB\ ϋcˢ+KTҷ(p6=걱95VtMdĢU$$ggeC8N\3%SB	O@_T!	z>Z*\	̂<˘{ɚ>!.b<fzF9d׮q_n Ѽn{HqP/]\>5Jx9>j/U,sV|u&*q㨨IgKI2/Fh5=YpE$h|1
+z>;0D~fI8(G=S F_X%jQM`L(!>%Bny8ִ)诲KG:	r>yp#st % |+Y#6*16^5t t2+{ӿpUp}$UY	.MޏRMc/nZWR}lLK(4zG෌(:fPokc[ U?"Ƥ+?=10nkQvW`T3â #h[ځ].cu!Q=_{!UǞN8j#<Њ1b8:%Fcӷ2DW|VfAUG%9gKW.c`/F>rY>9&S*+꺁P^4}21 nGKnLx&f4IFq)'$շ*
+H	,#
+VoPmh>p%:U̮l)YF킔Eu00%1bo L.ke`7RB,VǺ:auu}J]rG~|~j>N?ubkX5wm)mai~ɃUlơ<1(=}.Zի
+<0^zDE$wg.I_ (c$'sE4Wu&ゎcgwW[\U)NitJgyh(cq:GEΆp6@L\ӶKnv2k7z0$.Pu*Ft`ԅ;Awӝs*je wu/q]bY3TE,kaᔶ9Em܄;MAaƲE'e.7>nˎmP,gLR^}tbmPq_	ktvM^Xe<Qm2stb{eu-Eq	<c.hy<F7/q%J$y]!THL&ub]wOӶEZ]eii+J21_~ç<x$Mz4A?S,CЪt=?VbJgcjUaHMz`[=_<`
+Tuy:t*2owk.XOC
+nwL됾N黪3M5\Ns*ɣp)yyҹ!aWen,6˿\Q-tH2$T,5ʙQYÁERiSHj[D1Cxaa'ay@ 
+EJcH3Pz0u#cA@80aLS 񮧶۷<=D ԰MKuhs-/_oq#UJsohNȽ?my!M_==+m2JE6vt{#Jar~w3>/vqXtM֟T(NۮoDg&=+,T(8ȑgbGe4gPuR&,_ᙱуKn	IAx4A{ldlTV,ߕ矋U,ͽ{FbQU)oz8N_.U:9$4|I˭ڤ3Z	k5m4uWi.GdV<,R{tp	>H'd-V<^əhnM<@>pIz,0	#_"Z2N+@eVK<r_W)Iֲ<a3R0MBo @ItgW^6wت5jŕEV;EbuXcXMaIOWxQ<+smBh8b\n="ZUr%XE' `l똕R^"wU}t5S*R3l-<m]ޢr"$vOI[{Q[)]b&әS 퓲
+~s&r]L쐾e%/Kgt|g;|`-Nr>:V+FZ'R1B:	9]*Z?)IUc^Pkb	/gĲqgH8}Bs)d\py3	_:2syFg<JH_ę!
+;*_Yu ׶V׶mn*4O`|7M4 {4Zݚo]XA>%DԅDXab>7(v>-y'Ǌ'p!x=ޑ6wܬ-7}+uNGb`  Q-phH9© ax,@䪇bSծqW>1܋C~Эn`is`ui[aZ!%V.QM[I՟GÏ
+
+㭲Ѱ``:l,_mT\Ъֿ2
+s+l_Ιsӆ5{
+K/#gٻSIšU)'b3<wYOC
+;P9bqu&*vVœ笐'vI\Z![]YbuއSz_#N`yZZ="ˏ_䷸2ǽ/H[9c!Ҳ[M{-.iB(9v!"Z䝐XTP7sdhLcSIKFМ^M#500H[_(yE!#!ͥNZ:]Wxv},*o1}2t)VrF2P'2R	⊊ϙiWUzvOC1>%pTw!gLC=r	p*ZTӦ6?J0a~Uml#}&
+EA1s;4?!r DPrɭ9K>;  ["f1h4@oވѮis@(^G[bWKq rXHNh&̃Li#"kOȹj\)) 9EX&d[F>da\4ٯ
+~*[EzDNPÕQ-·=3gu9=%u*&:dKE')kpl@{k(^Ӧ-݄y۟.^Q+9&z%\I7I2O" WeMk|N7wMa+\`UV$*]o/)R^X@{ֶ2z҉mYK/ϻGfY6-)xR~7 ]3	53*q=HhMRUQxT)m֗}UP7|`s%/1j; y弞h2T([+Gb5sXU,h)th7}3fpW`(^:~g9Əd#jf=aͦS8ΛÁ؃=_GzCTyTDKuFS"lOp؜չ_V5~Յs5P|p	
+Șwff6+2\Iqe_yu?hiS()` 6Eq.8}҇*mAVإ yU:5gώY&S1G c:SQ%;/ts&;=zz0ykZځ)M'O?]Iyr?Ϩ-kq9Fiqac/&C	u[x[pΊeՏRgwy@-Dby^d*fw＆e28"
+Y#s \Tֶy;m&PtTV:@vqVnbFf0<flpYTz\O1򞾳
+։d{OYo;w
+Iנx5cQ,C.reIсn*tQybۋ#F;࣋|ִ1 `:$⽿G;HTALpY 1!E+=qڵFZxz"y{'wSU< >m88}eyp\gPU}[i͒9'A-CS!vSqA'kph"yd<%Ƿ1 /W%`hNE!γxDVM|Ξ/B)\)jIEêu@0љLmo0vSp"gwQEm.f9)'![<kvߩO9{i}̋bX=$b:ٷB
+{b)99߮]s*n5"+^%86oCd(~^!~hiNʫq-?alc0/Ens`gKڛ/<2=)ICTt~?x^Ws%~c!(̆3;C01g'#AF.8JI1h*zQ9h]!64Nclh,ӅGlwEqY]ҮɔvM.ŔEaUjGWx)l/橽?#URsYx)$Fx0s. u||	NJwKmނ5L?
+p-k@mvʑ-Vc?>؏+82>; tϨ,ͽ;,:]t:-:Ѯ+'Vw }@F %:gEiC01NEBkJ#\/'F+#gDH7nbPv*Ď#+x/ #?*E*;I4."ytϥwx-1
+HKvMl91f1_	bXp_ QL= Up9|9 eiMey4^lÚMo	;3S֢thyDArӱ1[`cKK%@M?!ȗ^(.FGv22>b_FnݕT
+3˰"].ݚ] ϝh[q^KPX;ϪkBu%R~JG8YDRnȬ}#U_bnt\+bT#im;2<i?S~wU֖L/-3kHQJfTSB,2sT"TЄXX[P"N*^rdxFa
+T\.9˭8"Wº^ճL)A.PSH0q#cCVu~F{ue14d#yIɈ3ǀH:9dX.7\C+F=3E$.?gr PbV>mgFk2.:v.OKF5.?Z
+7Bm|1#2&fQ(n`\vIUa],]/yHU? mxdHt\6=3,(YkM'+b3bQ]`1fW% WT%hx]%lhwe\)+s*;<OpckkԸ0kwHuP̥<!6@Og!O\]]p( XEZ`A.,Q#4qٽ yrxF5^^m~9]7<2"~O\2{<.Z2)@Bkςw+zKJ_tj^ɪ[LvH*m06w8ڤlS0\#ՒʻO!?[~:z+EZp!(GmQw؃3GRdfX|wXH.tv٫+Glc
+_1a^=ǧ4^O=ܵv4ZB)D}_{!Q^'a$3~%Q/
+\XF`LZY|ҥOSVHXN+N"w.em[f/N'3$rFB(`cGK71'ՋiM6`J5N#_~'erӗ|t[%`y7?3T1n23Դ9";~
+g4&Nni?E+pºF1Bt`.:^6r$˔tB	\68[6ByA*A@N4#謩qn	sGU#2)/}kcâN.eV6ӭ0B-#aXiXŲ1$7}{l( Rijh#-qi&]Lw0 @ɗ/{=;)qN2t&	AEص ʣ%̣AmVi),_)ΎnCiAI J㽣|FF|86wlv_ڧ"7"H
+Cď#OF䄜QY#h:`:(	9_	&I? *ZT*+$=*c Eo,?W	[@>RcG/cCтN&! MBJyxKzT˻uk9犱!F׃
+_gBz*1̵F>[R,3K:{_ƊОE"J^oF-!%]Az/Z2HԞ׻\)fDD ]Qtw<GԢTe㏟l:])7|NRH,4?)9 @yufpG#8%B[k/D?M_c+'(bq/qSMRv.Q_l.`6=1CHDEԵg{M)\j6qZe,\Rt!uG*'_ūS6<Ԍr)7Gtޓx
+A6
+*W}_w^
+ ALe߇| VXD2BFun#b3t9eXf#gJa190^9)af+[OO}1r0&2iN;.|a1alcEtSmZC-]7XKP3s\1观	7:n*,Qc7J;s	}R1}Xim80CO 5͜y E	T+K5tK0՟DF
+̯:i8NS{xYc{xѡAXjdFFu|hIbHӗ-JMaxY0-:C9tխc-*]U>xs&I7qfsK#1W.Guq(*
+wDQG[0AS"Z'&VT`Is2r`$*ÕE;377ب\Mu\ڀvb/c _ѵ>'0bfXlvW:I߸2-UpԲ2Jz0nEO{?Nu^VwkOV=ᤞiGTxjŘiIZ‴ݺ7@V>?jg(SSY+Vc?*vD07WѰZDݥt`CCl#/(S1}jp
+O8L@%+74X}Y:ry:C,l	XPix,0& bA'gnbFgJfYmgG-VCM~S5<{`lD|x~|v:1cdeҵ>/ oZue Ua?y0{YUH&ȅqmi1y;*sTa3C30޸f%OyaoGeFGg=Ǉ5:Pj!Xl,/I*g._Ϳ +k@S--Ce @S Uq167qU?gWe|pU:trC(|EqXaB`JL7P6gG7~E-\i88''="a!wL83<2SL<\YW.b8y:	6t`T*.VJ=́0Myk@ێ9!.cQѢfGVѭgrtu=[2ǋiIP{c-FrQzZJ&hx67;B
+BY̳~V_U`,Wg+7@SXƑ6ʱМ]A23rW8^m(P+eŎ	s_Z,(cUID;F(=xקos*v|Gs vDQ΋#?ˍ߭&itUz"}_{!U{.bPޞϙ%d1 6{ALcŉ!uگB!M9zaq,}v=+LI#2^>#y삤d#y߸9oT=+&S]ّǋ2eC0h]/}e8rN/hbf	<\WmlgqXP sR .| 8TQe1s
+$YR-CcpxF5{aUrw~KcZt	,XK.c*^B<pf/bEөtv;֢ߡMa3n|0*QKH(_3Ub*qiMoA^.ZFE|[W(T#VyB<O:*k6
+-%0z 4Vj?UƦ͘Gpd17J"IWJɥ3r$Ԋ	ˤ8B\ɦqAz߀xgZŒN6RvN-O$2ҠS-M0RS== \:|G`ىRJF.M7;8~}cDfِf/kso\ȤJ<nqo@RE5;x">^xgTiYR4;׳9CJa(b_Fu_.*C˫:pAFp	%~mo2qq'^!kíٓW$vrbUxX=\	Vi-`%:=7}^!~Eg^mvㄜ.xWc0m})l)ם6:M>d䀀d8aEZXlZ]Ip'RYƨf<=T@$ai;rr]\8kh7♼T.EŎ̄;KsoӼ?- #W:0'܍Үamaˊǖ]#/-!yd]d?,vX](LP8yu׎a?/򊪎#	tgy\DjWo҂[JWe7XRw#+'h{Ha;8i&p\(ѰO)?
+iwG6fEfzzow2PxBRt~RfOpyP	20)QIRDYPzmXS`F7OlqEU#Gh>htfbĲ"2~:\z`>KQF\u#E.:(O)ZXAюUd.fў#b}<9X	jfq|Ũќ F9Ψeat"]}VTvXƯv
+R{;w~X/4/GE6S%ךjS(kWWp
+ptuKႡ
+;ݧoSlB8PrKsBml֡@i幭c}g/I_{icjyEAJvhQ,s}Qܖ7kx&vlc`cĥ̵ޑjC`Y>m\y[^s<tue}_{!Q^moy}{ˤܸN	$Uep8YK
+E(J5\C;%ʳPJbp~oQ3JY V(UDb#CaF5f
+2KWW=%XJUNE qPcۼߤSq-fa* הvx_{S5TɢՁz`2rd@pgKO\׫J3wc-
+4B%Dš}Ud?:Q6GeWyCUw*c7αF`Q@Z^\x0FkXIpc]פ+ަcxj]yQ4ي7H*ˑsZZjv=~Dh
+7	qmeS LY5m5B5xϣGhw8"L:'ętY:<56館aCA%?j5!MC@k4tؤzɡ-o)IzexD`bE FZb\vOH==+킈(v>Vȷzk-uԌsn+[Ds8`]oM˘ٻ4w9X}T19D9Mӄ[2e*v3\".Hj4p)[rhxnǬ/@x)st^UمeT)ی>.>t7~˕UERmawj56L{QBC,l |*/Lj".b$#gZC0>%fS]sh2f@{Lvm/$
+80U1@`
+2LJfyxQ8Onvd@tl$qVy<Vi
+
+cFQUס |tEk5mvm\l/H. DXIPſuήP/S%uX:G0m=qI1h
+Wc1UT9**ЖqsvUvj_>oc{rmoUǲ9}7OǻL,"Y.d睚<b'_%B)Ttb_nwƘsı0Ӱ*Й7Ϟ1,2dG$o҇`oGHlw rptEvR#22hX;x"#!ٍ.PXRJޟ$7E"/9Aa9@2<=ɓFYT|`삲"k,z.ʙSƁA]Չ G}kSm{erDFܷڰg2ƙkV7K%hrgõ1ǌw^15w˽?L&Oqe`-<>䎖wfE Rg֩~BG*{w;	QQwP5io+U;sCah
+%=Q?sLVVVH.[/4l[dɿwz
+9ÚM7-cv*ǘ``.[ɟdxdVlx1;hLGyNb/ZYg/1¥T(|8yD[c:Y̼V319ǀ
+&)&)l-5Ъֿ	ѹKEآB$kQ
+>I
+94nFAȬJNEHาk攵&mzJixF}Ypcuh2CRk*J6l(gmR#MaeG]V[^˼]aS<\RƱצ/LjAk҅PU9S,ϷҷQz`r~nHΘ2ǀ7cEb)ϻ(mfV*LMiZ
+C]p8'QEE7\Murxt4o0t!i#x@M,0;/czs${]RO[<ܑ-#2*%ӽsxF
+M?52b=q9Ӂsl-_'j^:n
+A_&]01DR@8N`(T%0 Z^R&%Q^hbpl"Nk-ډ@+zhej)yaz{ޝ:]kפs#ӌ/bdv48IƘwWs]\گu2AYAIa^vs*qNBdH ~{,---))y=z?vc=v8X	Bb'f5"m#ID#c8<%9'RyZkz2-Is1qư7<AJc(Y(⬰pEGXl~_L([oSXU,?wA.P{jQK[\Yy@GRlѩQ-Ojʖ[ARqq$zP\S ycC+(} xJƓ+ &`|ycuצKyRX$c^gҙ JFl.&؋Q*kxG#@	b,MwpH!7]uN@:E0':YצK[2v3bՔMiX_1
+Y{͠Ò7.iC>^JyyKic=/8f^wOus,۩hy>ׄi2C]\1z+c}Ο>t؅x"'9ŋoS7^f#STHGx#_8qyk^Ӌ܍/\mJqGxr\3iƟ#,Dh9"Ȅ^ﮔA+EmQo8 ԡFpoê\47iIP/$ڭGЅk4ˤӻY[F(L/Rqq9%Qgm.#OɿU:%H>r3eY_O#0v%,I
+J^$^yo~s4}khiPQ(J&>{Y+c37·a/`Ol1_#`n("R^tPpYldbWĦV,t'\:kE2=MJ~ߌA`Bבu?V75I\p'!g@Jlv ߒ,kGğpYqF6(?eP
+^P]*! r&4%w^Ls<uL_s lS籺`
+]wࣂޏ8;ƞ Wx&rAR[,hveGo5_-INpI@ApԤ/\dp	gsO>;IFgKlCmgצ蓼VQrl7U>Ux/=X[bj+kT>L?s$/G&s8[[/p<K72Tey-ĭ_ g'#K*h˵e10JG
+#gIvTx?,7ٷq<vxX"5:"5F_x΍9Kp+WMg\li}ѳ|^N#6T\Ns<ǝ{"@mm
+"C}qFnۛʓ]Zs_09j'/#0oS˧_iۤH-ǩIEQ}v= \\(#vZ
+![EYi47HTdN5~#QSiz[3=ȅW}m۶}٧r	tP޽O_w\qCC8hd؇0"aZt`f1<8KX:vd|2W+[[߀Q2H6yRZY-cS-V%^<ar3Hy蛼b4ZoFZ;yXEoQ>&kਬˤ3.,i>iXꯘCKsI܌蚃Jbf~};PX;_UT<	3)KI2:kWfFj\}v2}ARs|r C!cNiKXZH)].g:8H]Ƨ4'o7gқ@3"+&ivΙ``{PRd5wBr7TdIS~'UNq#82d*U:ugXMSLiHLLkPxGֿ8	fS1U_<ecb-7Jr[;.l'Dkʻt<>yN:J<g@/E㍮5Oөvm{}h'l
+j,dPo<ϕ8n56,$Ľй>BarX"ya170XN0#VVVKG8Y\'̛＜K +=M!q) srNBp\#oPVg\i4T&ZipC);'Ìd-Wx׆g|%3\A!kP	owL׮ 2e5WRv=)D^}_wB+sO_r7[1>@ho<W2,1I``0AFed`θlAL*JWܯ]~	nOW&`uazƪ4;DjuQb-| vJ1L
+2<ML}JPvUoǯ_Ԗz;2tt	9]0AOe?i =#U'XTR"00{iӏ(bÿ*Z|75	sB<ˇU+l"-OfiOދ9#פsrd*J"q1Z޲7e@/`gZb+ay .I Io6r},d߄?IFq)mV?+D,MFG3̰x<q <,,=ђQYCڨH+<%!ShP]g;tN˳j4H@>urj|j\v	MޱJu)؋d0c9x֙y:H9pLo&"=d
+KLfzzmSšzTΒ$"~A,|mHÕC,@>HWgq$ϩPJ$uJ}Jvu[ݭBNkZO]@/MKO2tK;^"n]#)rI:]m=sC$P̸v+ߢ0NZ7uH{i>eyfuls^zEmsēlrľʸ~y/DCtB~S 4,bf/ܯ":
+p}Ҝ<T͝P s9Ѣ71(V2L=Fȷ'\KN1b*sCz]M4	XnwVF]^5tQTvE0#2*&<C|T؎u0/Z0SQbmXo.M"Mns w82sSdM_Z馋ӗG穏In:-yqmuY:CHu[{s%:^Sv
+8AR
+<=yD>K`gh%F+<{_1}ÎtZ5#ӭ.s~豨/m'VQU{36.YO*1X"`jHmLD럴GXe]z.ȿ赊'[(1:	0a8NiS<-y.83X\k:q<\`c\ag,E(֪`p)WpdH;g@hn7{}4˓:U񜛸\.Z<>|r8cwJbvId2>-p۸9bEGsԜo.Mmibi:۾HuZVt#ɲ`Y׷B˺\siO{0Ԟ-YJ#ŵO|4hXGARe\q;GV)T`,枳}
+.i&-A*.J27Ds*>#Y5
+[!{\ wTg5<YTla4B?Q#|%RRh0װ*[xT!ȕ/?OrwhȨ% =PXխcC+[IUĐ5aWi
+qBBz12~himaڶb6cL3mӚփ(-&iºDN$#/H&T:>o%e`%ð}>RhӇ^n=2[9h.Xw)Nr'"p2>6kCԗz rIʉI7
+9!zJro&S7n	Wϗr.C&ܡJS>h3ؑl"Dxt,r\v/#zg^WNiפI
+.r-첼Ϣ7'92;~hg7y:Aia~S>.4å	[qWZt۬1<gK?6^+V0\tc85ѡb@N\,F0Ջ9t
+>BR7=}gρvy
+]jz屌fЧ^Mm~ <Wq_֓.^
+[Rku`%7,
+t<w	ibudIb"TsJYM;;"=O9G2d.	/OPֽ>n/D<dvxP|3&Xl<
+9bT2Y푆kȿ_C?
+|x(/ E٭\Z^Wj+3Me=:-Ӡ  е>FQ$&r57+arA16ɦK hEi-7h/oJso1Ye+_%?/\yb+\r!:`⛿}+vYceLu*-LqWC`9zzةIc1R?	N]='#u'R%oYfn̲l?2+{R,ͷ ZV]>ȕ/Hj8[<1)>?<+y##|n {MnL+:c ׎Ȝ<*)GvOPՌܺJuF80g҅y cfLȽ=zM(\XP6OEժ1Q/c?,zDQ~t8/)?%?9鍧q\r] {rEN➫ai:\i+A<h!;wևt>0c@hOm#fi'hxq0YDH\J6&: h2;h[$YL3޼[AclaJH	*CCȷ{}~"qd@oi,6JumjFVSB^Xf l!_jsxC3>Kz
+-tҞύy_^?VYb}/#V,H79{;}{/g͚5~xg͛G}ǸqfΜyz2cϏ?hf_!c>+˻r+0*Kll~ ENW=w'dE~.9	ʪR;Q\	#;߱N};ˉ%
+c?)WTS(DƿdQV\qLƂQiDfJ#2dxQ)U0굅-]"pt֐ܛa,ϐ8.Y-:@u^67W Qq<XB1Ϲ·{h))OQd(6d06=9:錅97{RstLn
++$]e蔾*15@mhOLiC|DB􍳓\Ga90Y[r	pa<Ы&*aH]9z34Ϋ
+SQ2ʢx2y9am6mT(p"QE.iڶ9x,QE:kU?{)k_C=qWN.8fg$#cstu{fA5-<Sy$X3}brq~RuzlQwLb{i/62hI 6o9]SG9oԻrh=j9xKzu.rST&L,m={G\XG B`³;΍9ދ:^HS2Y^_NK/KbgJr|[lbnfLzg=U&>	e()xoK0z{BsFsPL?R$_W;E$FqzCZ";~{,--M?/կ_֭[|@޿&*}"ng%s
+]0pQrGåBC_7V:m㏼
+;sJjq5l~x0S쿊]
+M+pVҔߨQ(\~Nsf[^a/Ug#̎`ڕ+7)s>;7%FeT?Ϙ7t=YGNlљ * l*.Ipҩ
+Inw0+a+Z ˋTfB9ݡy^'i-h[0GUb6_K* ;s7pOp,Y0ރP"/q'aIĤ{[\8S&,B(	h> k8ENL*u-()B1j4ZQG;Hz@c?8.~a(JČ=:-l
+2GNqZ#e[6"']`g?:ko
+G{ { Ҙ'%%'wqxÀS8^/&&R@v4XcL=I~iIKG\2wR@Ȧq&B)41zq#>;8՜uȄ2#<o "m,K~sv_BJ:`߅Erڳo2ow*=vȋ
+id_+?@د~FW-)`*mK?q'wƺ~7Cw}O~hUk	Dc6QaVkpさnjeW/%
+Ĕ^g%I,k-;{C(`r.6\7鼛_R1+o4Z79\L,ƿ^gxS*LZ4	C&U#A҉-#ۮm;e;
+C&Q怲Iu&唶MU/'׶m(BciLgT:Xsϋ?j \?Oı''6@!8xn2d"I^ UiC(>gQJ zgn3>?&9HJU$c2c[aLqBZ1'_')P~8}@
+'zMvAYCSQ5{
+5pDpXƔֿ1ZZv?:q|	9wa8P3GMpoo\<\5k	DE\pP$e-G'yR(OGt3Ѻ
+m[P*[rц
+.zsmYw_+
+sn}i6nћ/}G*NwE2p\u%"M=Od	Z|-]}Oߜp_{?CYw:<.isnX}egP/D5ã 2	~&qs .xZ7yr5In6+q~^%-i&oAgMQV-	#"vC"Q jօh	^93*k舌
+X24X#I4~ReoԺs*DV9#^R:αߥx/\F[T"NFfpI:ByjKU.6
+\9@Wa^.i0ѡ2賓"ȣF`A6mgTcVF->Aȋ>L.8?g#68V<ΫZܻitP	2L.ͽs\Mj,Bhއ<93|ZQI'L1ɃLsJ\ 5|ƔZsAK0cH?%a|7)QB9_XߓIn )8dnO ɽ* ZMOvpڵ+T(r{Dr8iC=?"cǛjjQ6)+PYoeWIXyU# Z\^UѺϊWմiǟ8יZ?r+2h|i64:<PL1υk<)ZZj*^Lɩ} /Ή8_2~	m5"aRD/{H3zݢ`5Y\$@ʀ	8\@ꛚ/|GfEioioí≸fh
+F$S0dn:G҆1{E:aV~UZ(TQn/ߡmwVZ_I=[@k7?h>+_l]7y:H<|m?%esLJS:Ef6^/C¡v(ó0`֗ۯ,#;@/mVɞcT|Θ3%:G+.g۱j2MKUWz)f|2+j4Z`NN<ˍhXWKIQÇ6{eȌgkt,m (v 9.2hN#*[g!#GiHe9n
+[@!^8jZ8aj@" :!)bt?1! ) |bVbcy$d+{P!l)-|KӒ;0D4/&7ő	=pVAFl]N	*ŝ_DWJm;c	OEǣKtO18U<q\v	=Bj.<܏V>oX?B?gpӷAOnGk^*Z!;Adt8$78)vh]P$-R{_3:[ڕ㼢y|6}e2i6Ձb6]am|]nNb:f%</:{Pa)R\;
+>c\ÑqWNycI0O팙i,EEܽZ)Z(|޸ak2yN˟g@2ИNٸt̀e]~yp<*>gu*8[aO!?
+]yRϨ!W`Ujio1㰰csTH6p!M_4>Vj<d&z_5X8ܨNKv@E!v㼂]fց,\jGKC5)6YL1/RZx~;$8<E'q9p=~|Nֿ̀LiYSXL^-PغTcUz@Rc
+	]cVÒhl>(٣2/}ASLIOmQf;$\ߴMXbM¾9oZS='}\r'd$P0dr
+dn&퓉@6 k[+iz!sã!"1~i	_5ltiL{-xvkLn^i5pQeQB$Y&i?t,^`:JZA.vxRlǑ)0 oS@ځS+r6M\1;!y3,\L(z$Jڹs+/Ps9AHn
+3KҗCqM:ݡpd4:"ERBm&!Z5scre:{99)IoA26ȌgnZ<+)nmRxc=%}8ߝCC1ȥ#?%8k:uHVl-J5B
++]m?ouɮQ>g{s.CЪ X|8 &x4!^oYSX8.d=.ӭ;zXqF3gLcGAP@R'Bz E"(2;u|3Gge=y.׾)R=	)z9SP^b݆{g`G$'miV(1,Kr3lp:Fz_YwIwHʱD[IL[;bFTGMFʑiA}
+rze2y|,Xq@?w2*ŘOuQNчĀcR'knif48A3TAUZro@{V4%d{o5̴7hr0wNxyQVc,lUhs[@|k933fC)WbM"~ljb5^?;UЏ ]"XS9L[&(Mr%I	Ax[BxJVTIh%+I'W'I3<jL`8:5NoAafJE>im?2r6'x&/߂BcM%&> 4>ն K'	h(89V|Ey=sN3_r)ǲ>elMp'a<JPM|'K䶐72S29O<9@Q{mhOID*hXvc(m{y<L->&|Q\h#U&]i9f'E-[""5nϙC+#c'qB?GGlI+ozk	EăXo,UaFc  1;{O[@o㷜w:*̰JoP/ `A,c3tK'3""?UKQ$&	6q+X]M1̸:9rβJZn ĹX
+ۂec+<:u-\k<ƝGbl']a^2h5	?Q<
+"tpvj\$Zk=J [եdr{]"B3߱KJYUx|$owbPILh.IzM!V;5r(sC"V:+NWG	!^&չ)tź*Dî9WN^7t"=gsȑazj+G5_D9> e	)gu*#~A%9 Ĝ\/qf<bn?]֤g_I\ˠ卲mdѤ5M^2XO،tK>9VNr)=ԍ\JGC#"&+b֒3N]*Ȥad.gfB#Tb44ĴT#M?W%=	3QZ":F),=HgY`]Yy$˰y&|خ\߈S\^^~ liiTW:3sX@ĉ@t9g;58POц&⮲ߥϩC_tut{'LvS*`_iݵTod!S}"?*AbA+lhiӈك׎xZ]kTS)1Hz< ġ ;Hשb7&Ti9`6Ƈ3`ƥvga,2#MŜjhYh~Ǯү?(`;Ѳ~K]p>n!#$Ih,)/4weݥW|'uɷF@PUbW
+VEn4߀DB5dlA'ٗW Gxb%9Kc #7vPNq|/9EP5]q6wcI+0 ^qZ.p	KHm:F9-x]h8&*JOa,VŋlcmzST$bsɌ4*3 3EɁiYx8vTC8O;e'3KSRr|g૘Ix7sT6g1JU'1HɖkyB$/=#bض[=_=3{XD{zvɈǪv:Ķ^ [ir~N\FH6-ZdL8٪=⃸Ft7&Ym8Z$
+77#8ciC'p$P{$aaW[pJQceG t\QlM}INK!}|]a.8歰&y@~&RNLn/>L\\( {^b,2dO:]kD7ܴ.cd%րOV	n.aszy\ddMk\tԘZg M<$59*n<1)զജ? ki,	(E͚fq*kԡSL`(b
+Pgu,t塸7,"\ΩM<>Fx3-v35 D/.B+q,xу725x&|LUt..n`Jpx Q޼>s6)*Ж yAh湂g^6 ϱW}^_*B,5ʕ1t1uW;9Nh,ׄg0e܌5gҴuZ<bv5>ꮔ^N<8F)c{rt&e4cnZܴ<2i:#-n
+:9oNXfpߕ\  J@0HtW4#4#u~TbF|q nS<h1=~Ɣ;| y}&BoF7%*ҘHE9ޠERbCZ4z<;Kdf.Rf,$|g5F,`g@9%itp|0vXޭZ먎FGbx>_ ӥ-V.5i<󊽉y?xBȗRW3{pT#VVMp޼zi/y3<(cSO"U_q "qX'; 1&u( 5:e4BrJsTI)넊>"i+WK|y
+(#Bv|;Dl5$R
+D:TY7RfacMŭ:DR,\ѬiYʔv8<i,T%+D1ƲUSE}
+	03'TkDȑT2ªrKE:4#Ϩ@uamS2zGIHtLg#<=妮#zWQ1oR^$Rs	shXӌ5naZE%N!&HTjLȉJsNU C,.Kq.b1\EfL~nUthp)L]J%cʱ$L#`TZ?DRnq'T>,Z=NrRI|6ƴتf3|<Mn~
+ ͡7Bt,Qʹ^o++(<F+z(5q~Nǭ;#C䗋&Lz&ಣnr
+G.q*靡X+Lw]X
+u3KΟ?fɛڶq[} :D#8Z]C#N/U:Wa<\+!Z3t.jfr*'jCsL9Sgk3b>6S.l4_{1$rrpT;yL$		M{PY1yHirV-1	R{dtˀ:c	6<?!(2J'`X03DC
+b~rLz'ǌI"TukgΏ1.bjbobURK1M'zO?t"2J`:ifVneRB @g%IƂArpIWmONf<Q	,D&UQ( G&OND%&nWZ@OW)/Vl8e lʬuU9)cpD:ݥ@`bbz2yQ̩8L^Pa 5ikinZe"3{%|йٓ(AbL)g]rWWbtl ;Sm`&a=~7J|Mo1AD	fmO<]J\t'0N `V?K3FeȤL%K2L`c֙%䢜UeDҜT 
+Vc
+ӛ7+9((qe#%Ma%b5uѽ;s#0WlVknʖt1-oBi<m4\ZW-`Pˇ9iWa%^h0`1t%H/3׬7A![fs@$ǻ4(y/Ffv<rry"f@mUZ4HaFخ7]-ބ׭ .W܌3l=-~$ښoܸn@;q.̑@w
+H#鐂Hz˲'к	ZUۅ$1/:r_
+NWRqɫկY1#ܴ.zw$t.9q{WF1㧢i*NLPmnC Že4R;,dCcJ`,6ٷdw+d5Ȏ}Pf*S%p}'+Dֲ`ciqqw5"i61_?an`D_ܴn@d~zkqt.Gb((̓
+ʟuRQ3.~zMml/J\l[6tfv(AyuTOS]@̝02=dtaBUn`6!U1kׇ=cK9LgD~,ӤfTzG vW>'D+_b	O4E:|e]D>K12<# V	/|%@p\*ktRvzw0E1jGM-˘NiFڹt.p0/wzNmE׎o~Uɐ4uAy
+QmAI%kzТ6{{ɘ{[ ; ~!tR Y"2#0 ʔ<l	^Hy^,@G=S	cjca­a
+xg>7hH
+j~Ã	Kki9R<Eqt}(QS
+<ƒ/˝u	h$@$*GbȕJ>.&,BdS}"?w	A4+W.^'OPmcL(4XFWy 
+SSG-M$Za5o^139 `>`ȫK4.e<D6kQ^8ÖaBkI\2ɇ3}#1;4$~WKKˌ<'X*~"z,r:cR;/NvnTݪ2v˒:z=T!DOOI`  xsk3eZZkfQ8S)qn3c*T}+ʝ`82馥+إFkAVm,,qW
+H}5fQsUxBiĄ+7~{*6쬻#r¤TQB!U:(q#jc)U}J;stMX1^Vf\HJohd*28{`h[nN^c!ꤺGs?viq5hKtŬQgCjn*?섐nh{:y|DuU1I >E-$"*zVۜͳڡsjELk-%?0"k?hqϘY$ᷪ)tŮ-yF3YLY(	iu@0m18kR큄~
+~뒓>읃ZGݔnCqG5z(fD3k"2_t)Zk+F]^HgܶOFiwy<1i]MIu'DoC(X R7^ʇؖӁ >W!Eۧ5X,#fTi>%U[QĒ\Dpyo'/,"7c()	ϔ~k1WggY Iv:\.xG'96CcAk@0\Œy m'(jsŕ@SVnQ&1	gth C	!ߊamKu%8H,_[1D%}Td-|*M50_b-ŒtF!WqX+s*qf~c* PWpN0TMANt((uWVIokEL\kS={ڗǔf.7GWRf9pc
+<˘0JJ1r!~LS+:WLPQ/:s8,mʙ6N	b&]j}rǋRw],6]n2
+K<a [̌j1GEo,ic9KQU92cR
+gM8%#ƥzt.>~ ʚ5J䢕`##ѡ| wuSׅ<WK[LJ~?A2q8Ef5m*I5xH`2BT	vC	KPQ/NFq\s0lb2O'8iL+ʣniyX)^E@1Ghyܻ9=,.tmI2vL]}S}"?ދ3sӺM9<' 5!lۜQW\`@crR6J.լ͛Pn<B@s\Z/Ё3^N9jҢ:rKJ"f]0r90bap95UX:}D>6Q|SůNkT	`vI2sRZ*ǋuѴG%O65MpI`qLꈸp7g7ZS)/BOY\YiFlu t
+;t#ɛrPPt7kecQ7<,N޺r[5Ҟ7Eh}!eiS}8Т>O]a0`6Lcdk΁$c+kpØ)ǄoJr=ŗ4:$>cp)!Řu3&uCK:Itߨө2^1\Zdfe5 s6֘WILjd㸝r-/'5j[-e8`!s{R6t@Ϧ$k;<W.+$3Ĳӏ2%FgN"Gϕw2f4D]𒒻i n𼮚iF	{M3L3L!tVSW?*<Q?!"$e Du"Ot7'BT.Yw.)h%%#
+e91џ -ep:hy#\mkQRQ"@C_E"=C©Ъ\rb%bM؍"NTζj	\fl5䓜p
+WNUT7#qM$W<JKSp)<>q%ru=c4&]s|`s:.fFႬ_Yѹxw EI Vt\1o|jsv+%fhv%7iŴp	<AJ6%l@>Ɍݟ/)<NP?VpV!Vpq]!OĴ$ȱ$S2f6PuZ4)fG7+iviAo{isZ#R`"(r1҆hjeo.2maB1u0B;A)]
+`oUڦa
+Z0W0G]vN/nQI!z$tMn8<1Ԋ]1SSok`m
+4BH"H͇cANПcM¾yft`\֢(_*aBgq9Akȇ-v{wC)+)Sy+ 16Jw1W-Ca-Q@u%^y=ifU)2n]n
+ze"ǆ!a	-Qׅ6$̪yFڗ_:Эt(%#s2$n
+G&P{w*ir'ц`v֪Koj3Xn㸤oAI-{xEwmh%}K_p^b16MϽM)*|EeCn[bԗx;YvUuOcov̙78nbŊZjzϏ"7cؙ#f3<fRrq|(M]37vm|j
+9I*(ܒcr	Uoe%CbFF9ԑbxt m
+1#Ɠ1b%5.#dc3^VzϋҦ?d)v{<asT!o>^$sJ1Hha{If$+.?
+;13|E+#t!DbYą
+< E1Pm#qUڽC;jIĊڛ's+|]n	GzxWɩ"v93cU3:n1eŨ}qxwu鲉v(	`b?6`Vb`ro>u^|zI*PL5\i_f"`bB~%]f2~XFļGisF1HB՟9p9+~]/,ַ̛gDy7.ٖO ]tw崸FNUUV7~s %'Yٴ5v0xQ H)vib%prz!љZBG	9O4CI-IBa-E d0shf_0^9+Nvb2yiRP60mZل<_v
+{3s/qqrJcl[i:9_lmpƚW$W)1>u5^RbIeln3NAg$DT_?8D3;7o3gΜzk뮻RRRꪥK7ЪU|F*LhXyi	T	E;t#یHCXw_qs2ѩ ]Qz_3KL9ªI|jǨ;J,ZG%)%96yR%T}cm׷<3nX{v0O[Y]TÌL&N_!@D rEG}nQuXҞF]-#A|RDsPN0bS`Ҍ-&lfUXi9]P$mƤޤgTŵo|śhXIK+@\Ka1db$ u_k<խkc-$R@uY4k|ܛCo]+(÷D˹M,.,=*܆U$_TҰʂER.exz'NxOq؏ϳKV w⿪twb.LXv Lqʨr*%V%:s@SxM|'\42r[1̶A13@_"zAC֖1r\TVVg+h2JFq &XE!t#"M(/uա	C;|RWo}.Э7WM*XHY'<x>jF)mEHf{^20T\&㲠F~tb3#@[IgATb1vc{z	ƛ1&slZ+	3u]p#G7e˖t?4wh%L4&(7>Ǳc+:8;KzJ4QS"W,2ݸjb
+3G(WgsXSw!V~Yl<]fIo0c_Jĵ
+úFlt"`Ft>7uY䱶*9|}N|x[R
+{p4h26M)=9EG!xJ<N2/)䅘k9sRi%ʯJΉ*Ld31Y`f:V;jC,UP"P)>9 3յ|cbKWtj8n
+N嵡*7nG70I+iPNSX>qIᓑ,Fcu)N|y^}axn9ء1s11.+E>5+	j5pG(f\0EܖVļ۴ZR2l;/4ߚ?yIRh-U1	~♇99/JOTȓ%[&!&ݫxeAh-Ў1L  ZބqrnZM{uhp/
+].Fz4a#G` 4&k+@Mc|ZB}Lqx bAx4ϵ$CbuQ+)}&Ů/I!5S4#Q{Ȍ8LNyQNha	=[I0hŕUsi ʍ$DT_?8DC∂h)/II}Eqc#L*O*5"+_Iq̉^%%,PlXSGerKvrḴ^jaF`Nr9Lvω.ajVRNc!cBD6Iop{8ۀy/Hn	da|z27N)GMRRll;	B(5-%ʂavp¸ #@ i.Ӑ#5$/W5@2_uMSx	 N(A&~H<"YÐ\F!4:՜6bx_NCpxs7Q1{4Gć0sQ*rsa뼔LN
+5r>wIPR?h{S5;=.Y\ȚGF426Nre7-,F
+RqGƏ3<(ʘ˝c)?gڂ\LKɗ଒UOnjn>UǊTGkh=e}2kG$vAb2XZ&M͌cUB_aMs9wlm6-^Ox䆟LpK[wZD2ՂB&!!$=H2)U PK%NC)tѼNu)4#pz?s{`>r37RXSc-0Z
+VЮƽFL8frCHe<3?)7)t
+y9L.:o-_#|B?Tf>\3`DVׁdAg֮6b7nH"<
+/NWyrL0u_?VЍT|NrI53r9Y\g+^'
+V87U&.&"iZgEDʸK*?`%VZDzZ+{hST11p潼UtG-סir'UoLW?QFhD	1J|)yQdXY0&Q`u',q1&
+D:1J.iQ'zYT~kJ"/f+̉Yhper%˷ӞVh8*-'!a~( xl|1'7S+CDGƖ4opvRHF|&׉
+, [Pא3b~NejNʖׄgACbvB>~,]4sm8p&;z2ageoA /x)A/xn	O'u!SE15v9gqsdvSF4EAotcdjX"az-o	/^>.	W5#p 
+JӀuS]Hw=;>W/@=aǕ4n2t,ՌbC	ft8F*`Vi0K(834B7ŕ򖍙4U-4Ey!Zʒ^OWI(鐹]z[4&A:I\~~<y;^ve]t燾C?mF:o&W*,zĚxÈ3p1I:x0(ĚPqi=g4)4??%qQgsR_9ܴ&GԸttcFڐ+' Ѓ7h#dTNv40dvbJMʾG ˀcxK6fx^YEt9Lr&2#V1RA0Hss3hc}H~UbLb1}aKT&!yǉ~t2BLKiLm^b(rsNy 4#s5H$a8B7:DEAyRK&vϻ8*YǳPtqU>
+sq~O{UlwT
+eγ*Y/#uEͽ&CK>+2-3!lGD=8!}+if%qߕn&ځO/ߩD<USzg1	~MޱB\n!wl<1n(ϊa=#1m=3[d!7M~\g$Ŝ&ny:͡iE7o]sfr0JZk3"7sRU!N#MFYB rӷ  @x0ꖮsI5YsS}|3zJʛ㺩PC<̏hu}wo#ۀ?xd}q-)vH׳o¯N؎rI2bjVdGKwy͑(Yv,D^sDr-\pA޽ǎ;o~~>?hݤ6Iڈ	U&$t,^I˱">!$'J҅+b^3_W\ªjĚ>?uAf_EAg5N..4WmfW'F+ʃKH3VZ%Ц
+EhNo'W`x`T%a	|׹O/5q`+;\p-^9P1oRk+1麊$Ia61ZF!grSvL9@C :h$=Mb܀1Qbq8ڱc2Bb+4$E5*ۣⅈvcf2{FhhF&RB|v9ġY|0wE/&16ÐPЦRu.P{N,]ƙGh=/	dPZ{ޅ4ia*VAgC[woEb0rm_v>楸FMtⵃ:DyZ6X˔zr&9EYK"/P1CN	=ax*<̮Qu$GrQ!s$IVUk\}]՛=gɌ>O\Wq]#Au~wexWnKm_0۲I "[0*9ψW'*/v'x5"5as=Gp&C1ݹ-W& ׊rp3,fv#|"PU&Q2a:qD]YվzyS-y܎+'tX?O#	hk؉rE[i:z\!211wV-qDI]<O8<RҠ-L9?U秷G$j!żv#LqvJ!_T}}qwǤPĚ~nPk̳eփ%5(	$z"nܸ:ؕb0 Q=\"1WK)qUA=ϪlqdAY|̽\!ȕ4w+s-f9~rnZ&~g8\K%ASȊ/3Y}>gZ]m9{/x/W|?0 }|S˞T"Nʙ'w$nxpm5FXq*|-qMXƲXY&6NV)29i a!gJS{2?/^w)<,fր(jُdwE	≯_3դZR>Ef$;T:ʉjYډlNf	303[CB'5L({n]'Sy9+&H'3ᏄAѰb*xx8bEH gМPQ`nYA9)`jG-qb|UzٗH쮌,.-Zc:FpZnkxRW\.\Mɫ	nWGo
+ݕH__~moQaJ<;zgH+8"Ud߫zϥxׄi[o>f3h&aw#jǞ9vIhUg.c,&XdKzOi{[Yr.LYXiqIB䲫Og'R;\ф)̄ed2%A"PdIQKúiМ~WVlu.6:uM]}ƹaBջ
+3^is 
+@ִs*FφH	ª6	t}dcHz#%!ٛxubSSE&Yg]j@Sc͘,޼,9Q|qTg1l\)O]c.cf
+SlBWjJ5Ξx-!R4?Dzb	u-VB"KAj&[
+>	{R	kLkAt:x@)=Jk|>z{WXnS(Y4mp7AhɷL5E*]tOl1bC#kرTڤYԡ׽H;8g'VOQ6y1(jܼ]}b&_*~Gt۸[ӦYX-v&CDpќ7;'4c*f_*3<VicW"j8|nZIo@d17xpd_v3x:ȼc=l$Xz;lkģ5!Tx븇23cә:I	µӧCЀ?	. \I"PR}ЊFZt}ip7b)R*O}2BxP߉b3ۦE<}Xzoi#N"&ƃ^ ,Y~/0+|ڵRL<xk?~0V/4wOXYPJ@ob	l9u:uꤦrΝ;_}UV寽?a
+?+VK6m|?v1@Oq:7bGDtsvlꠜ<K_y^SjЅEg$䧷~Ι"BLIl8>QG.q2c[u&\2Gt\Z/՘c7ptb2q^8/'%WF A"Q1=yaƕNpSbzt]"ls7 >)Ka`rU\<2Z$<dm`֛yDݗ{"^hұa^wMhq_{f`sD>yhB3˵Fʳv.#lZڨurq7UU񙭷Ks뙿;T\E;dHߕKGhgoyw,v{/	Z⁄®1@I`H{OpxE<V2S%v(VuGxc/6#9]nI&	+XopZ`穨s/4NXI.uA%e8%k'_\cr%NjvGq~:Z2B'!tVqҀoS
+*"ͼZi	帠)!1hJԸNj;}K9-@%uCVw[Ð߆	|lr;B1tsxE=ܟBOGmVڍq%,/&ޯiNrWU>k:UorHg[qW	]oM-cG^e[=r&eg
++wb5c<ɇٿY]kG4Ȼ'*nP.*h~Q{|S}$Ddee?A1cʕ+7nܸ{k~?XYt^??l?0[9OoKlqLOi}u6@d 	ԸV\N.i(7kS@9(.9)g9f4LoUTߧ֮y:bQV~Y	]Ep7a`nr0T؁kPȣ{$Ro0 2G1[*UbVYb~,	b=DE-@,l\`q|)9]^u*޵YL-bC[:%$iFzsYs\#vUUiu`Aos9ԞL}`?\,Ty.,kZM-fͷT-э6qH҂Y:JYiIkfrW|oQCh?pKGr}QQ9BE墇9F˭_9tj	$i;ٌy" 5E|F<Ҟ'~p69NṔQ% %iܺ@x^L@Ѫ'2zb_7B(e%(7+~˩4Jr:UZWyN+*)96>	׉Y8^-N0ʜ5v%¥	'vc%Nh.ڊXqiZ4mB[+7>49Ø^8Ս#x}ޑEkR?OL+ڋY:@Ōu+*6JKcΦ^O7 p2#11
+eۈV|F*lҾ>h:qn&_&+F&p+vtw@>osiO-,D^q@_|qf>JHHx^@E]t^zϞ=;C+IlLTkq\^DX(+˘$:
+15SNW"ª<ZHªz%5.+xp*"{$Z`^f<TP9$%o$7-+N' ˳lUFT0izj.]g6u/#5*c,ДeP{f骉T!%]ʜVR8[uc|Iܕp1A7^%̻'a=	RoLEPc+ss)%n0c1 L:߸3~3V |RV(y?xXJFSa]·x.7cm*;+ǕPg1Ē*:0n<FXd{CJs*,p20wq{pBS1h1 mmGN(D٪%]h0%IߖnR;`6`eHעaKrSP*-fNN\'ɘtѡܤJ|ki& ӊ,hp7xUEH4roerJ1L+
+#B+{	3k_"x7.$\}mxwKK.\Kh	hq-+KWCt,+"~A!$KA%h;A'ml@_}b.0DJ@kU1iL%VW@ע^erLïMxokshUxI/ɫ,D^~S#G~%%%' ֭(P5kwl?&D;<2MwĒ*I:>I09M40(ֳƕ}3Ob9?@DL.޴STU\@pyatH]i:I	BySjOotpZNzc;&a
+dYek<1IJL!ϙLjmJdlgPw2Paۺ'u6SqBUElv`p,RX
+Lw+ +wIShL=p%8TQ#"T4H2RPFm3)4i+fwE],a<VŬ[4Ͻdb;E~촏Rp1hD3MdC0hZd^ ju*\ˋmJSFR]~o6DzcjДy:ݺ* l#x)F.NzA̯Ky2ǳJ	+SLZ'z䧷eJvj"72i61_cGfxaj~z+'RA&|B_q-/)'JΩ,yX_M_E%աٕi-RzT'nwWf)6F*To(NzY_ߺף[<kHih:Ay X4*k`Ȃ#f#=;GYU	alNJA[=%1(qףb-T2C7BIB仗T r׮]`\zO=(iԨСCwl?h|p}Z"v&ɼT7Uf'椌a:g|b?1[煂*ۗĥ)gMy	qQ8k~J횄xs{ڬ:֯9z]ޗԸbb?Ti5<G8e]c&ѩ# \#ӈ ,JͲh1#@8d;&9csQiNKN0[K7a-*R2AzE5ߚa%QX{Zb@uU>l0:hCt|,Ɲa<gDM(6|n+ik1=/ݨc`^z$>G>bй_*{'Eu19`[F; Y*vMe>ycQ[ðGj=XGbu %Fj'I+=hg9&f)N4_D%tC0$,p?=ejk+Yh{qHXDG4놞DRa4eoyʳ缗qmxkZn}[$YL1%8^B!gkGFɔG"&&Oe:vM7.8@r)N)~6<T7&w2}.Ty:?.uEȣ{6bjl5{3߾KkBڊ?	mO0}$,/~f>[&W:O0?c4&<t&K"
+Y\M̠씰8?DlV)1kY4M۹&R_XJ,E<Ǻtԑ0)Sˬ9I_-?"_xᅌƍw|?IS:2i:y]bªu!S
+M?#,LaFw"FAyi`_~zK&Us^ =	S:{rV~_\CN&N>'߷.	|Ȭ['Sdu0i-NJi
+3bz6ć!w5?mK+Ϋ)A덋{UxLlQ$W*40~#u8[/08>э#1a׆JYDPLTE,)J^,aK0osǎM+2
+EĜN`"q*;5G$utT<4=N޸i.y:\g%ŴW\	~d-&G{ce[C', (`-᥻T>z/ӱm"PЏ`Xv=+Lw)D"9\t={kzsxQ˽٥,{EgЉ:ɷ BKÝ NHE:{Nݝg&z`-pƷ2ebyi1=}>Ī2EQuvNyel24&&e|zߴ+M=rQz*al72JtQ>ƀXWț{Ɛ:sEzWiAꉟp5YieBdZL1p#UBlu.07&h:gF<J*56	a-cW"HNSM{% ,j9y~˸`^nL"QM~"3/EMz'(y#z0dKOYh~gah%ʄ+;(`ǇwC+.-v+>-F$1`*9ZB9qY	K^YTLUNſ&uAqk]TftOBQ[ys۩&>ЌLL_ũԸj\Q %8֯3F&Fth&ھXZ.uxf 0L,1uSߛBwkrS@Vq5.]v6r~lkRƒY	WDgpj'ٱJ ?٦|y\jyQse,ω-,/r8޿;LXיb&Tn(y)l  `tԉ^RDvԍynm1j02E̙MVFǫ
+%ߓ0V!d@ks[=0 Gx6Qh16Y0Qh<gY\u;9mH7~͋7rMxV۸(I;r3Q7aA=9yp%W?@Rh6	[ydg|=s]j9M%uI#fm8Y 2
+4͙ލ		:7+2Kj\ɿM`2j\Ʉ-pBFVG3EŖ@_ucD;ŉj\G02yjZѨ:]ß4cQ rzV;k\I¶⠉\Pl(ZЏj(p  ׵f`p1)SOXzØ<cY	>KF-9K"\ b1?Rd;w}#ʼ=\lzLq}*0eI=$!򝿜Ǔ$ovyg<u&mDb/]!D½Tu+Ef<hVigr$ =5\e>zaE_8gu+p$Yqw-~dTycȋGpf;)cT:DbݹHuK"	BRs;f3"po?je^$<|B\Q7+1Eq	3N6n
+]	!S"hȝa$_@Ӊ%x*,\W}ΜN\nr_ĵr0/cOy+'魔>7.Ά(\[$kG򖷔0hs칲Ky!H!x/)@}tI3Û̖ #ɒ^<z_7'Ĩvyd1q.BB$N`iyߏa":i<%~& 1th:>Wa g<gϐg87i*3^ywȪѸL<9*yL{2T\A{2q7;r_hb(^T[LI xC{L7uƬju|O9'C++F5b8{kq:Rd<;%2<X"4a|q18O7c{ikڌژkuLPfrf2x_8&)C%& c+`h1hG%OnD:5fb3hI\&RX%̍[x@.ʃ+soP؎)Vo|r-r`*,99:S}ⴚ2oh/eD쓄%>IBWXsZV|kW[qرc~T?Js	o6f2JpGAfUω/1qwH_*4 :_$[O1֮:ɵ~1\WoA@@Nb(SO ɵ.U.[c'7dVL>gX<dVi1Mtͷ\;NxGcTo҈c힄P^w9),[p1@	qivݑP0egFA̋ޏ#==u3JXT7pWBѾ*<խ|S#6g5IXqQ-SzYOs:KI;Lqi=5hܴnX!N1]螶Kok,q9˨0hpde9<wTdQL_G
+Ow{(=,ob7Ev3yY"L7D'hA:7>zp3'b.f;BDwH&x$*
+Kn
+YW^``J~bx?皼k3bsZW~?è2n |)Uk%Cfvv2n$`Q[]iyT뗄	N9l/Λu~`Lyɔ}  #$ӁL)ϲ@98q"]{p{4㖁̋<Mb}k*x璁NЪw?Z֎jc_8(o{y.+eLJ "rue4b
+b$#ڧ$8	޾7ėB):\Y ֳr8$ujgB]XZ^aWvrIB?"y޽{׬Y"G?`cڵ>]wQFˢxkdt0)|* Ȑ pMB<	Pg</fLɵ~ŗ+-~7 O8PevTGtg]r'T^\i$fOCnM sPM07WǌsZ#`g<NBc攜ؘdp)ۈ1~boDgؽa裭åk3Xi* ".t39aZ+|錱>0 w?N%B{f;Rz`-3~mhBB!m7͋֬v:
+zT,;Jhڂr|>UzKD\YM\=ʖUΝWAq~VK 1yi4
+Vpo2Ů(HzJ줅-:IKN8:	cKRa`7jZјb!KX?'aG4GFRX,Kks7˩1])#	wE_(c*&xMtǸ2N7[JǼvHML1YHa9?,]<qO#Ŕڵ2}SW3bR92LN]̩IubO;;b2qi=iT`BrfsP)nU)QӼ6AE]k'r&,J)M*n( fĄ}"an3+FݱcrLRkmۧt^[gBS
+iFj1hmCQ`=e&hl~cwQ#O9Õ'9q9`PAwP4ԶF/˨/ȌR鹮{Bܹbݴ,LTnJv^'O@?UVիW3شi^x_~;w.?aoQ]X\1A%ȐI:SC&7~O@fv9ZQ%j	μf2$|Z(-qĚ,0Tz,ô+-1	-><d"JRsQw*5DJ܂eB0="R;e +8M	kδy+]ZJ#-%}@cENZn>z3i\Q.T$bя pAsKx@ܗKd1c	8$Y+wN
+Ol$]$h!LUyMcG\LvW<	Fń"[tɵ.CbLl5mQB\t̾By'*+Gb>ЁF.i8И!~gB	ObU"xO	h!z
+Ra<n;m֯6K_.q[K2/](nYuC//! 8 ^:"`A('M<|,R#7PPOjp%A"LT<&՟<1x&SkWR6}Z?~N9_7Ryn35d8yaT3#]C$0h0}<VD_b	y@ZԲqe2u<|>{Xq->(>[tPc\EJ(*!!}pOI6ҨPU5,0foĵhuE䳸xF<+o((X=iGrX#%#mbmx^%ҫݩ}˱!9BOCv	26j/?=#yyyo8]GEle00$:\ˤ@L[,  fsӺ傒sSj׈)y>N L	n/o>2	*'K<֯9H\L>Wb0 {3,Oŉox7saQ͊#z̀~0W @	t%u7Fswyax1&M@jGt3ü6y?aVbK.	&	EbuSrwֲjE	]1~)UЁ7NՎNnFngV17x,z%ɂUr[б(7?U<Ky Rq%6f` EKڬQz:3/ BV1ޢr"KP<͋rUx(e~>4+Ba0q@v]h`»'KIJunuJNOwFo\/%%,hިy%$׆xp/	"80ĩ "f$xX#Z£T1G>[&TLu,0	iJ6 qi=k@<x7> (t;{cq<M8?sũS4&Ѻ&UH;93$[[*iQeDĄX[JLJPlI4ɌɍXê8B%7t3ť0ŬiMtd|''EI*&8XaD3دmJ29V	_dxIo`
+[\a]	if5A'1Ҵ*=M+fuէeAz;I\S}H gM4^zbb"<cƌXgOVepqǥ7SUK%;#-M&Vղ 5$H
+Ztǟ.QU<G #3u<yﹿ/B ϲZ'(5!7lX@""6.Ei
+4QA%^@B:)$zK )ґ"Ɔf&p}wد}oz;s׵f"Վ+qj#Kb6cXx"|"Fq
+|]w;j$u|Phc#fA>wg[2ٻ6FtzDC٨Y:54BѺKݖbX0bwƢq';4hs΀δZN(?eW8՝PA탏u@F7V5Mu"׷LX(W]zcwTAF/4rRtAyz;{Dj`^|).A唬^8͌20BJɇ?x&Pw(կLvh/;-^t=T4w6]Spi	Baxx41X tg@UZXKVT.p:_VMl֣<|O<7ϱ@j9}r˭%Fbɛ5^_[NC+8)+RnCR}hg<A@+#+#K45 C%;	1&Epd7*ӳL"$E"lT:WI bi&8;6!xc<fVq٦݌ЪlheCyMbqbhH9i8Yh~fސ5AMNFoJ@3ZE/\I|t#ӏAn3LbJ<gMbd0f!{Yhx<%{&3=hlô¸X7	F=L/jc-D>g?Bd֭~իW߿gϞŊ;z_1?FK2RЁHcD!	%kp"V'}
+DS릇< izuispMUScL\&l<TA"6ApDdEj̰Jx,V7!bZTq(p^s 1x(RTX~mZvq)yj,ǱU3 A=]g>H^4y$4js'8?w k;5d<ژ+4p`كfF4E$9qqA49@~R#:It4M*B8vA%h^Z3-_a)M9H9h/ZteHz`S\jJ%88fx,׈D)͌}?b/$_sF 1*pyS~G~+o8A"-6ѳc/Yưv)USiuk)_W'O7 wYk&<w]cd-]јsqc96	D/w_8^j*%km~?G@4,s<$Q8V;3?ͥ$Tf؃JBSK8#KAM"9 X"k*ȬxLafR)ѯ;f$/HxҦR|IF4&]ؙk	ZT
+I`쫳\!]<&amF\oe|禺oТRpAt-Oh,hVtFw['phI-n?JpM:`K=ۇ6fi/6ZPuhXhYd<̉Q}&wC$[XTul۴tNMe<<Z.!2ҟ+!~?+Wmƍnnni,TzF/['[\"@hDgj*`vdqKE#dvr3=rCs"DCT,OKy&Eb~)g>$YU^P,u{@kbD>,{o= 5@7j#YCNȍVjGS6~j%yE|AQLnQ_LJ8-Fuhk>YY1zLnp"9CS/VvWϵX	i5l8xۉƥjLE\; |ay<VmՊqeABE5fHSzw23aT.'%NUI09bA?[^Vxjf0YBk	PޮihG)mK?a2a!4t&WqsNלluםnl;:hs3|L1`Ú2Vֵ~/9 1t.
+R'sաExk/RuuV__w>Dc[iu})KEv[地݋ZZg,ז~͝kόmXdGx"bBV\|ꘔVX8w16'ZLH>5kFf裸`1<2yk>#cXBX13VwR%1KP)4jTA%eJy}4bha*v-)]?
+Ah!9^fĨ pxUv\yεj6x<l9P8K3qҹyQ[L;]F kiW!#ҒR]5EIYߌ)HEiGWR/b׮]wgU\̙37oޜ1cϏ?Y4S$[3crt/0uhEKb48eA+AIXH7Dӕ$GdY_\Sys~"8z2%%q_
+>4aĒxӹhe-\BpQ#:;t##
+S	$g܁IU.X7(/Awtqqt4SP/#Z4a  ơYfr3I3 >F괯ǯyinrd(vcml3ɖeDsȲΒIAa֓G0{(K6ݗ՝
+iTj/X\H,C43qxα5245<t4Ά%@}zRG-tqҰpejm\hN'򸐵_vԦS4;5ԣ2RPNOz,YhC.K?ѺbGrM-vS"09졅-VMZ:U+mw"JJ?hk ?R(~`nWP{8G@]'@&2hFrrt|mᡖ}ڒ2y4v^Bap3ɿcFHŴiAڋ,k5+F)Hu e<?wq;S}d:Ӝ#S;Tx3/2}7%ֲ^a
+
+jq =E65gt~u82Z)/ 3KXrBJrNJǅGP8N#p/(;#`[\
+>Q A\qՀ>,+8Z\ǖ/$ 4]B$ϟ;;w<Cu5&&fҥ֭7n{YF͛7ߣ cӦMy7??R`+1@_#rF;Y{Fy203(%GTI6\,"{afI+4g.dGW@jzH%~E1n+-sEmvfs0r" &ȶ8eef	u->NjߌDN`q{g Kg3EeiK0ժ18jAA88mMYDFak5 Jws)@KsM|UG25ӎ^wtjз8/_DZ+Ņٌ>쭍tԷ:nJ-T.N3BNEXB5eҭY^p2}.==y%CuLE/UPO+~+5qyM>~'6p&Y_KZhZSZ>ۊQ`i0xy9>;ACL,&qEDQcXF|O[NΧ1Z2	H
+:6$c(y%6&,-+W,̍lhߕ #s{x\3QM(Cr"n{pP#/Ⱥg
+L֜2n8Vt:xn׵,$2ܩ8pмVyJ+ÄF!p]4RE]ʪ3|DRVf,B30$ XqEj`kqטg{&-S1R%&L_`Ksk@*MCpM+[
+J.vQ1⭕4~=ӹt-PJM[$n*<JvGXn(㋟B*8e95trwf!YN+~Y\\\Ϟ=IIIC
+
+Ξ={[-[v۷oσNDHA]v?4Bi>~Vy >%ĕPb%}#f17NL_@JᑓÑTgдVa?!Qj2;q$G(ԵfrA.f3B]:C$A䨿rkPx
+YU4*@kZ- _zj!'TMW{˲ή(a49
+i
+%ۣY{RXHZJV}u>o+ bgVSZqqpUV\|(KISҞ6VJ+F]f5C|}(!|TKKs
+g?~DWba!Z]OwkAx:iarۚ)!Cm[2\9y뗝[^u:|E4&-<)H)Zn",5Zq|ia
+Y;[Աv3N[iAgsėٴʆw8:[]`5]PŨG5QgkCX&XpM8]ӭ=66^fN
+HsoR`x0G,N>*?UG>>ŪWiI[^48c,R\;A%jK`wǾ+bni_Hyo5 U6t*~MjH_+C"B4mRN``=/kp/3hCdQL&$1Q^39`r5][iжI~h3 
+^TFjmG-[WI"9:;vXG޽{6mŽ~7;{!CN2~A*v'3VcZcgl R*c%8=K9:͸/GX"P|2BD̑V
+}Dˋ)bn6^K~B3m46R~`cAx8.i9rǧ n~x.6<$_UN{ǙAJ~3U&6ѲV
+-HdPLPBqVD5'8X\E/`øӕg*
+_)_sF7p&qdmYxs4D7AveKjq#ߴ:/"*DA-3K[-AoԘ-BIq9q 'G6P]g)yZ*Eab<Sjg>C
+X"ω[8k9]9-u#$M0KѨ&)QR M-Ҥ4)=\r<}{FUS`LZk:	dzgPER*  x%kk7,}ؕnch|Fg$be+$[=Ǵ઩uA@~5ۋlHycK|cL"D_ElN3;HM"5fW 	cj_:#v4 r_|}zmKmxރxl_4n$9M}*J4[KP)J52cYzHDN*6q>Cug)P##Q0F4DrMacu_p@W`ɣ4jDvj1/|ɒ;y EoOm9lclJѺWK)7:"y(.r#+q"?CS[nOժU0`Y~}2eceff裏W0H břMs<\HZ4n0c:|-7`)0v$##E_Erft<ly]Xɯx˲`ӚqȦGװɹ:c	PWT+økos'S@v]e~8PxRϣT1(ڵcb,gS).-!N1@LPG.EɃ@px鏷'¯}N1<@IjpeԂ>c!K`DF{eExn>鿉H36^&>@afΉ,)
+7Ho
+RH% R׈iEwT>zRg͢zqEW.б9՝j9916Ur$(fdQJ%$*c졿q
+ΛB6YZ>6R ]={Eb``JYg":3o]yFȝ0HrѰi5(ՊX-D\j7he--[HU19X֩KJ=wd~@.G HE{0Uo/s9.BfU[.DmN-Q+OLC!hW`wx΍-xE]y5ᡖ:͌SN	lU`EUG8@[j`=4	'-7ㄖQX.HwR96枏Qz1\2d?VАWX{r,@IKr7-^y}TQ">VCd0]2th,z'|Tjժ=WXTCɿEGVfrʭZj߾}_}uֿcW[@|I·\jF]L30TϾ)qDs5&2%Q_FcLĥeEX+v[aD?&v/H!s&rE-umk5#B#Ϭu(nSzw ɪL@?~5cU|`7qix\X_9ȑ .WF7~l.W)umܤRTl\x0qsA8*{̹75zvgwB_ksr }$Wevb[tf(dvB_i4LwЪ%RObnʎ,E,ۚFNN-Z#{8ϣgTVO=>y+Ac(.C;jL<tTfbT;3_~`^ۃv~ZBo!vV},ul(yOpnEFuVu:H85+CKl
+YBՄact7}Mj	,Gg੬Zw\jeJ`co<Ni1Ħ[eKID|LXYJ7%Cʴ,zV<I>N4э*!F|57r$yBWrz/lLlZԈwKf23Y8"Y:5c>L6U"}!O["6$ސl<R{W,a3ߔq4P@x"sshRKtwFo=t1}paֵik`1Ȣ#he:>̻HzO~)Dk.00sΏ?k3,[lҥ+VlҤl}w	<G^$gϞ:駟?b{6Z^1u>a	"]9+u>KRCqI;HFsy-Q8Y1օZ?|FEZ$AK䃀[ΖW69ƴήBPx\Fd{(Ѣ̏S33eʯ}:^#$ A˳jVo\DaZf8<M ja(>bEuir/~
+8k#Ы <K̙ᕜpm@3Z뒺n2]քǓc`O-4('Z :jgb}ղD?!6;xfy& GDt<8U2C3mO*ӎ/~
+</<m4
+>4ꮕE@'.޴&nmOWgWDc |BYe#&e,Wc}lp^)Szh`e7
+nڜ;c98<$TMRs?,C+Zvj%KYѺ(ɕi4_^k(aɌԸWAJ%l^a1s5[DiY}"O4&l߈͗I<qޣs"GNmwEVK=z 5qtFz1ٵZ->w#s:Mѩc&q25+K#`'pRGb?{RL~-K% H+ c)=@
+_'ѐXZXaePrYb*aֹ^Ӂ\J#G-@qОQvErD)~I߇.4xcUФ	 >|:^zUT@qqq~~~06<!Jzaqכ3Ih=- AHyVbfWW"1)8ÕT
+@d٢ف-5ue~UH=P;WpMK<s-˝!pA])	YN	O [m]%-u
+ N3SK"%J r!eh14aʿ}$&JZb\Gܰ(YVQV
+lԜԵIxɻNr}g8M
+CB+eeCsev:")iqD[]l*ާN͹-ǲ#DqR^o1]*˲/eZ Zb?i>+G,DiAZS;N"?Ɩ{
+~j~F6883=^=yR'Xkyf+L+n!
+ɍɜm@_8r3?	yd}\v8g!'k.h4M(5Cs40IHo/1*xw.im$d [@XͥkV<l.-d \0+< [H[[}?m˄mHb`![]K(Fh=3NBp_-+d?}Z?>xHh(s
+)ZeG@-౒+0䬰O{}'s<r_^6bZW9Y4WfFy	+ا|7a)zLwsΗjX+gIRc<c]!KEeui/@YXl"ddn)Jw	ԟSt\{޽ƍdm2֭?[ZO}(ۍwWsc2BjL%RWeap~PY8%=E+Z`~,k^s/>7E9k[M9m	l[I$wAX$
+2=YF>P0pVYDeљtiA!JyQ|B5{tI')USm,tUNq>i*)m-_Z+|Ψm%}{R58߼Z3k}+j-.zr^tRՍ)bKdVsjȴ*=Q(^F+	5-zY/Lzp^B`LQYm:._2 >Z;9Bd,ԊP}KOrEw)m+}*]D4GEa+0TQq#vnm_+f o۹vsYGp\kZsFWsZv8O:l?,<\l[G<HJ^9(иZI?cUzM*ed|%" *GU4UgWvq{Md*vet$@9Ĩɱl	]N+YZØi,_95L6^"
+>wАVs+6RvDi: "\UzhVu
+*E|߉1)3C5mN
+I7h(j޲Yf-ljw+eۂU;97,[q9'I%tR"|8x\# %޷J}  ;!|cDgM<S]6zqO-D>g?"}lXbwG~;֯_{`cLs_gĞq.ұx~VuF*.910ؓ495
+MJe]
+a gc|bւ2qx;eGeŢ^i{ΎEl%e`+_euR2#ŌvQ3y#De;KX|12#eh	d
+Vժ2ECC
+	zI!|0aa8_]Nk;']'E0/3Q8'J0`IVv6<F[ aJ[0K$H7>8Cs$3&޷7
+*{,eFtPVrq4ąG߂}67NO_jmQX;?]bXi(E$K]QW3|2XhւKsBG)7@׉kg+gǅ_\4fMFhhgM<&dUjB*5\$53n~S_-K[bJZVq1	52a@3g٫eKZ)hosZTwZKH|	 `~Gx.+##4r欩 " #1&p6A&*HeԊ^&s*.|c9P?bHQzפ`b/)U/,Jez8\JJ<W0!cd	=੥6*xjIj=e+Nx7&oĝz =:I	h%c/Krh~Л<ͪ9cJ`X4m5ܶHeѪsֿD6hРfS.\+x;=XSj  1	jX3R8S 5ihZܖa9e\
+iuR oAxDGx"H="ȣ@v͌#NݔZxN$}UO*5N)0ZNhI"V9XcC!4rRQoO##8Vclq+cu4O3X]	K@]s)?QVR4@[Yn$<?9QJ}g/s]9+]$9<@{"i @)g(>mtFWD"/>z'e;3tDYI5SU9>̽ÉR=, q8_3ѕd+Yjw3:˯wcjainji~-p|K_38t%׵s=BVSϮ)ȸ]y$r5;,H敠'qSD &"0s,*s.&Vn+ZZ#-k:wTyT)OGA{yI{_H:ewC '\ ST8TK꣱:Z͎k]xj̲x~,FoX$\t[кzX2ѯ;G _N҅U~ht%p@p(=+~UFR	i5HY4~T]:yF?_"`5p:/#0]7¥Pۍ: '@W-V1B0PQiVEW$^yiVFa_I-eEBd߿sI|{xwAmIZoXemtUpԟ3O@al?#ǊK'[c/lRlFt[,h$7 x2ZDl{Sz^(2mFe!<30Dx@I8HE_FciG0gxKe@ggdv/%PL쒋F2Lc'Lޒ(uet26IHh"vvp}Vjb
+<olĠ1yfNzS'kq_K	E-^ xNPXݞy.wZD@_X;ѷ<f	2#%E92wiqo%P˓]uacN-BTK;+w:51cӀtm>LMF{{nRt
+_ ]~Tbﻖwp5fNgi8.\[Fi貐ջZ-%fvAxΓP;SRxl$\?MX9æ8bFim$\]w֕w8Sk%b"XRDLG+ZڜoKYp-ChQZ-]=Ȣ:eEEaiXUf.
+ (u՝4<f#KqʂPS+%	~T3LS̰yZt\%G7rKMzKi9_fvQL%:g~zS92x8bSV	ky2l<1H+$.Q<	"oIFsw?Y.n՘8%x٥Sr3#|*9?&ϲW'%	dvdDO-'MeJȪ(?dۘ2~%z e_sA}-Dih/}?25aܓ%1XfLu :4Yc1)W$e♤(!&ZLYvV78_#oI?vQIXVh[ Q'DiG)v7h91q@Ct5T1:)ImwsJV,N*AF3 F]\Ђ&rEXnX/Gd&TDF¿B_U[
+=	ơ8u,5.0`-)x@KHǦn<L%%|4ǵ֙yqmk^售7Esk,DiO	Oe .{UMӆ]{2v,`}%yIжMxH
+hr0Jй~;:Wd
+ɥvb?GO0/^^@JȊ_ڟF>APVỖ9XF"|UmK%eA^v>?^A gѓ!VHxG˴ãSCŘ%ܣ )Oa90jّŁOH/~Q-5nFe/<I/e}Xo`X +`z\r7Oݙ975FQG%;=ID~|s<&jmN6#*g
+'KY&IRectQǔO|]MXz:ɟ;\9%I^߫ڶm;˗x<DsC>]3tGtU-#x@VN$wb^$|AH$a!3-ڒ6v/^	ҍn$=b+pw9Gbi"JQ[D©|`t]GS+`X2α )澑u2(M	x_LY,C0e!PXGsf-SX[E3wꫂMZDv*{mlW~-'JC^OrF6tjTFƵkI'kC]gėEpGkݲj\YM0'@fҨ8VZp5Ԡ@#ۈƅa{osىFcU9@;3)*n@U./tނ,1nj/`f@}]S0PeU'ѯ3֎q]CsTNh)MFOjāJ GQ$}53Ú;Y`}(mu_%(q^'}Ow̒YZy}+42TlAt^\3-
+XDV)&(sǗ7/*dBzPGN
+љp] lRg@5Nq\)ςn ,m5w,"[$CfVe
+ LKw*d>~*MeSw vr
+.MT~~\txT#VM7nAXdV?x$fExq4)"غ :A^ddޑ>c! 7c%{5aiE$ZOSNd	;9+hdqǍ#.!2?wYw7r\Ev-ZGO-:-bTE46
+j+l+F҂_Q%Tl338-9S'9`AxG-r8#/G>y$ `Gz4LJB]qZ˜jjvCF$s-u*4	X'%)83maw/~BkM1V AF)n3ؚW]?#{ԙ@Vo%&(εXm3jk:0;N6CMu6gŦ(q$#Ow,\a~Л(OĀ7 >*R(=O]GhAEqPM㶀^h 3n9|ċmM~<zZ;)EYB҃_ee
+U+7/rDQ:-+sYY*K\3$'U",!´z'qzaIzgIZR}ڊN5'[`>}_krq\к3ޞXHty_W}_,CHzXmF50$pIEmA?KNpERAY@ysP3wcB n+̱ŐM`p]W [PB6J畒+PÖ[cIVD?$I$Fu&3
+(ysf%w59w׌8SzAUYƜcpk<b,!γ%U'3lҌQJ<xj-|^/hȨ\ڵk7oԭ[wƌyVp-j!|1 0< \NT9dչkR2ėdYkQ17Z8{]z,ӡN(͵UJD	kio%Rlnܤ:IZk<n-a['X:a]e6F3ō&N79!㙀>9+h	R}#6;ki1g<AKSXQ՝|7qs|Tj*}4PS:	cKp%lZF+ Pyq>;BbE6bǯamמmBAђ	<DHFY1R;I ZTq ^$G1r#Ϧ?F!n!eԼL.Y9a0@bh4HHxm]03IsuZ{]4pmm[$rS	<nW$x{,<tU\7*
+Uo<&d}f,isDVrm.4Odi2HQ" #ЏdmlLP0R]â~gc؀z ~HK|H+\		-1fll_W[LYR%6<D3R!qrCwe̒܌9#O'}F+-F@0`H=ı̰60ɿ58cӦTB.ì"ܙseIdٞIJ+k+iXiOMUe	f`0fpG]#.!L?@<e˖?_ʖ-7'ǻ*M*\3h-*]\'m:aAjҥ}I6"ѯ;CTHi^(#3.'wtEvHA@gb_mH=JxsvWr:JC'pdm`Pĉ6x\si
+ajt<[vd13E(g(vwk{N0>B(C1@*a DU=)H\lu(b q}ʵu%m}R k	*TZuoFʪ}dOXoW<&fKh2WFOc.+bO=*1N$Š-x1tyURLXw+en`?	T)iড়>p}&d7wGfb`Dl3Jp[Qj}8\Q%|ZQv쿮u5qv0ڄ1+S%9ANa`8lJ$H
+,_lJL<zPo\"8i.,l/is5 lrƨ  @-+	/zIb֑%Z2_ ceI +и'e\JLEl0-Y6.5 	gҪ4M#@7VaRY.,aN5,)A=4)GKjưF[CE%̸B$p+3B0-5RM}Si	"/7u!ACpoOLyG6y{xW`g-$R_~EI%v*Z~Fͣƾ~S0M4OC}vaBJ@DI8"ǬyD-0#	4B@'}s*d!rO3xJݤ!8VMln<QWE`BVx2zJd'$Y>#OIAZ۩ $b`T13}5*sZ9=J+ZK"ԝ4ʢ-Wz%Lגך9M4uڸ64q~Sn&_5i%k>*ВP) h	[0HDI?
+P	A7}-ŝoʑt0΃YAP;
+m,<i5(hmoTjj!  es|
+tt5s<
+0"N=>~0
+PgS2>(mbv&iZ)N+~u93֛9}.$_5Fl[E#p-*k1.HzP8Jt] \ ViH =Oc:Jԛ"/ !x %-G>ӴS8Ť,9%F gGܡ>NBuU]B}pk<!%\p0U˧䚌"6g,axR):KHHa5X2m0McekxVM5@
+>
+b3XIx)zSWS	ȑd}t3QnVrztS2 eױ*c	_bE<4tIGKZjKGbp* yi/Ȇ/_~ժU87nرcG͚55j7hy&w~饗݋?^Fd)EfNױTE`'[џٶxEwǊ۶VuG.]=KgTJhΉN']MtIL # %Q:w}eJ)D~]ۥ^Rõ&Av49ETVgA@Brʸ{<R̰s":
+Gゆ( 'է)$xh8Vb$T})"9EC;Av]Z%;mq7tԒ;NuFG\]{T?ZcE$sVa$!FQ^3B*JD<_I8h96#Ʊ>(OZҘqV(/(7<IShZ]Ja礤!ιug
+]GGB~"V#%}Cq#(N=[ͬ<0a#:'E&
+p3077׏D]>r[cE19R'(kw<k=`vlQtgNX&̥t H\EJYIpKy6p1mDsz ?" t1α%oLS#;ZOe^0?ؙR
+`rXmVC,Wߢi#XB?T`ůk:)㏠m!yO"8졻%'ZiuL,1:w03!ELhja!\ʳG	jZ,c PsLL~-qCށ2AC dVAcZ󍜊'Ȣl~@[ik\@/^lٲ@u֗.]J,ya6p0Ϝ9c;q$݋?TUOm^Ehퟺ]ƊF[N?=Z
+G."X_=k	,b}a)y{FFAɘ7eqoxQ2f0xfβv 8*?|)jm	
+͢4J[kOU-^gTST0EKbWqŠ})Fr[	t-؀Rl13<V ;0m;xY**I(h[GcHKWns'yMI4zڅRR[o+*eelxB< 1k6n/e,6GiMt
+>#IkIdϨx$')@	[=OVZRSN2YlӃlHw:BɂhnΘ$\?ege4JIF&(=?eS<1Z cuj,oW9ؔxY;τ.=n	&u)]󆴉c-oYPSmH]x$H	zf8׸01?$F#	 -$a$Jw;ON8s1I"b*48@@y B!=Iե7+MqXȦk*jzI&]Ysٰ pӪr+Y2(;`6f-]x{Ȋ%wRfGH	l Jm "q3A:V)UɪiRT:=y]ooF4`QYq'em!Pt 8Rp̎tR0?qhQ!f,wϿ,/~ڬlTXqҥlT^O>׮]KMM}5_G"5R]9;TQ7cc@HH1'{< xVS>c0~V? <̈@yU_/ꁆhc|IX<#:YsK Av4xrb AFSi!6crc{RI7sVZk_N497=q@z	_OlZ5:1qCxb87X$[Bnhح],WCCW7vb;N36p&驖MDFc%m\Q[gA0GNB`oZ2>xYk[/rLIE.+rfx.'_|hU)F\Fh)s|9e5_ޱ l*%}d .5ReVL4JL<t|c3\;lkjE|oJ)	Ob=ܮ+ ^1*>c,(\838G|vo&PCw`}\9^"{Q.-&畻uְxцit@ϋ͖`wazs!9?GP=t6$}˔,h]Ɵp
+@0!)#7.xa?8{1P.; +O,gEmU0ؖIdԚEl5-jw6@0-2#HC|LRF!OchZ'ap~ۼݲ(y>Ct'ceAtqd}˸.Gt2T,G3WeSJmNXox%i]4Xgոbn}X.!rs ƍ11113gdcƍ~~~<~kT/qOП6yNy~fKf,FY21?NXi٠;AIxR!0#	Wj fI"/HZ%Dbim9=F(PP'(pVu3ޔ[׎_ZRJ');1)?LAg[4a5*JC^EH1YDF >ZV@PץmK,Ɉ_40d\FQLch)|{WmZn4v|!\߽kIj;=O`OЂ\jYtkEmdc;f<TUg4&wxsvyPϕ+*^V#'NfVj#6Tu˫䅵Kq>m'f!f?+2bO2L{nɉcMZYV<&.DRs(Gb0-&CΦ%N=+FK{Fg~QXid]'n}ڮI>kik.S]'p<ofR9SFdUy󠃥t%%0x;8OoK%}s xb;3^>skJmu"'xҴã+ zm'/o.h"M~րZO'/ϖ؏_ˏK~Lѧ¸^E&6.6Bה,maacy[ZI`|:9?譬D=dkX|%I'sZbRUD'ЉyL'b<cc<r:R'ZXeLBJ\DJJL|+ 5zȒje\CKhLSLtx1yZS{D>C&L8wkAA~{or=z{Gmrv10Jr7[}2H	h}|$xat}Q)i,.e"RjYrjTb#WYlZ[Vd< ^L<s995\3Gur =-*!$sx'?oۥmd~b+{UqC-ךVsBf]n"kqޣ}[M),jN_*bVCPCބl'Zk>)E'ӵ0%):\L׼*o:w&q'ε>8~RGxeih\jk.8/̋Zb*i x.qs~ӈVKDk-TS/<aAr>Jn[]uqk>fVEhDGRu-ѐ[e]Fϥͷ}y+:tle=/g(^|J@Sl~1s ԓݠ2YR#78{2rGDf
+'XD*ZC6%9ڵ3}rSfƨ?vh%#4<dD)/BaJb8kRre~2'6L?1Ѝ=ؐ@$7ie,Dv]\ٶ\⶯Ww'ҏ'umv3U̷Mo\<~t~y¹ű>ȑDUyiyN}L+ˌ
+".@?S3%r}4rƐ_yI3{%~c5&WHb)Lژ索VgpP	@pLj3#!VJeEzp.R;X\Pt.7֥[HOi)+gȑ_%D7;ܹsg-ZJΝ;2dرoٲ#<ѣG.WnذaGwOhU^ID1X4@i u(/0WrѨύ/~QdMұal׬q4
+B'[M [
+Ix_-H\s.&jB \eu8qӊrjYy~S/o]~bVbW)cO$ͯxLT22;hgCM^[,R-}DF>z]-$ CrY@b4?b5<J-)ψh;]gN0Ui+ך7p>ٿ19Ɗ>(vݲ!,>-lSJmA|daK)ȳe 
+CĻ+Y&#PhrzgnNk_ڸp%hatm-識c9VkrxSۣnGßQ}xgcinBPW}Z3c%~(:>j K>q7[(Vv{6uq1T@ؙ}R* .qt$0g.0$n>M.Wf,]"gFo8wͨ2Һ^5Q%}-}\1D`/͖3uxi"t%BDo^ە5OtlBSHƂ*{u[~ozqY%ݷEgㅥxRtJaT$FW|H[a#<QZLN}a#b!Zˎ,eG}b@>HOel34ë<AR4{?蟉%&<+'܍m?dCǤ$Xld2Z[z{>wvt!?26ng}^|_~orwwǻG*Fmgps'%}iZ,H73f0X%k4?d:C][`e1h1fFeIBBCKF65 lYamyMN8Ź,Ag':bs=F|]Uβvy}TeĨ7}`ËETr{Fd8 d5f;ɿv
+zxY҃ղ>k
+Ҥ{&vcnӛ<"aEr$H[F!-OĪxnlGSc5Hec	Oob4s2TtGa[g靱ώ+~Ԟ5m|O`xylO*,6*wU1WbD@`r܎nEŝ]ȹgS*
+ھwљk~ڤ
+ؙUF9]ϹU9RyѸ)_OX13&5oy1Q4#@j$l"74
+iVm,S^SPbiZիbCI/ВŻJtoLlZm?-]R m];N~*Ro6"GdVzM$~JKT^Ѻf^4揟8oX^ʤ:2<$gr!$}e4N(qv8BR5Aɽ͜_UH}9<L9p߭=`eLl!0sdp}隫Wl~$fVܶV[v._YfS%lJ^ّc"FE<JHvZ$(p;%{SK{&Qg|`@X"(9]	_Y>&2KÂnX&)MH
+!&\F!:w݅ਫΚ<ZBѡZ֍:%Z"=g?h5k֭[V48pFd]RAOtFl]NWL(2)Fgg$b,+-<`Uc<FhE$1/}$ҙ̗<JatyE0(<=Z؞T\nP'FtzVGtxA9_Z3։?;>7/im^-``3b"a;a_"1"6HGz2\MPѽ(hFhPiVepG҂+)Őho:|=8uI5;5_s:7tn؎;hSeX2aF32GNbhyc$)},ˑ0G>E1zBS.>?zʸ䅵9{;k_Zpaٴ|x|K󀲪J9Mj:!aT&E@MJ,HɠdɹɒD$IrE؃0WUWk?35﮻}{{W}_]sZ%)OH6/Ε-c	/Lj-?}~bYί\xnf>A_sp%+xW軞Z@p8\zD]L,tV$ܡ[o.W	 5og';zRY3Q˒njrb'=Yu\1|d1K7ȴIJYV}vSf	wer=7Mq=ɕ,MK:>K^ܐK{b[F]\p~?o}GjpkYQ~;ѭEVUӱޖO_ٜyGUTVT$ݤS릣-<vAx]=ۚ>kO=kLP0@!<$5145%xNHO]H:*:bdg ď-ĤIy l~5#cfG8Jci&	CzE2eU?EدɁ؆q-Wz!zy>@>Y̮ጯd>Th.j#`|ѩ[w8i-8m_:L\8Qw{Hmw/"*1n+g!`x""u^_-e1cheE=@2ֶa,ߎ&:W8:S/ZOOƁǻ0z)CVX`skW>Bsiٛi^Io@D4L5qmZ9hJ$&}Is pWU;
+:@lqVXgyMC_?n'N$fyiO#8o6u7Ww>#$,hI봶2$[Ӓ5K\BdGA甕xЀ4,4U	!HǻJ&'oz`+!	^8T\«9g{=b̈́irת&n&mLTvl o--S ])%#Ǹq>QVJ,>mGEt%n랂t9H΂,[Y`uC MMmlk]-[9c
+㪈-{r1"siҷ ֧K/Z,IK$t-0Cx&g~;6i ĳ0C͜s#CO$<{yeH):tޛF+iYJqgŊP.gcdHCzU7Wz쨇}ᢐϜ81Z$kFcwo,)i.MrΑmJ+	ٛ]̂#-"Ԃ=v̓53gcq"a2"+AZkX%)~keN΁a	[w^R	"~k_U+:=9 3]wky·v}'hR T'K1y<0mQ7AUhjHҼ*iږ4hU{ectn_4㢁K^J2=.*l˥/|lzdC@dOl̱z<1ΩDQGڊ'0b8䍤̕L	`uMpxJ͵{cIi3Ab֡^LPX&lUhYʬ./^}xߦn
+o6D<\kxxaUgDe^5gdӭӥNh]'pѿ
+D{Pdҽd;	Ը"{eQFgp)Z3Ʉo~tp{=5>g2"_ ":0+(BfI	bN%=E,uG5Q*hǫi57J&N3d#y`a>4?GtX?7%9EF
+yr\{j޴m5{ިez'3B мx#ܦ!Rhm(vӆknX0(}y	3}T:j\h!`%~;꥟d-7aqԥG{e.+U"I"|)(EC9	?̶XRϤ#;tC @!
+Q%)ZF}d9$\|γѢ=şD;T_޴孴ϷIUH>CfG.eVe5Eg +8Aw'4I;"D5޶5Mb7)*DJ'fM[aDrgJhX2]vq2lsoӧOHHHvF9wu3Z5ޙ{o+9}1aB'3Ϡ8=IPSәm +?w]7_ipDc<@psrtZq
+om"fc!T~QWǅ!1~?<֑6p8ӝ+!`67On'uoUU&0j&⽦%sV KL	YJ	.wkcj.K=7T9 62XX7	|0;hM}uuh+gcwu~Ajhe	馗w	ap^.}SNe^8΄DN#w%7خE[z4,	Ӫ1ZssC;qf~xupz1MQqP]U(DET',"=&k5At--JB Buvy)aQEeFEVmUs#B_j4*^6eU~=D*K;xMDPK5g`Gcsj4\VtzaJ4;CDXW=N+btL@jzV!جŕ2T* uKkxnƹL~+}[H'e^4{tysa?VSV5מj.i[	><H#ݪY_Q;(rmi*ݎ[aO:EY3G2AWjD2}`]mlE@xo>;xPNU
+wtǳĞ:Sia\aDߍu2H(zFQr0)<d^X?D~w>M$r˦̶iIp-|o!O_?UqĐ:ox1bI0s~i[ۙh.	[ P{#EWKw?!$h{sLq{@#{89ؓGzٞWU@Ob}柑q]|]/ez2yppc< nÕ*WL
+mHˈYQ>XOz4D⠄eNtq"MAƎT{%*5mٯ vϔд\N^.JbS!.7AhQ&u@hn$yǙLOUto8]K9Ouq/8U beg \KnΌNxg:G 9`W#0>}8[=hɴxS$p'w%fݢ#u%N!BD6@+e#Ooʣ7m%	S8y[ܸ?)</%МQȝ?L̏ﳓ~י
+K/ڞA?)-.t&n7@[=\)I<=g`3\-l쮁]tM1OBuzG eswO5gKNGri7EtW.ZaMMim+t<@ҝ@敮ӄ7bǺcS-nXđU 5cx5Ɓ&b/JlD*ז|֊$!H  >VAAI\٢尬ya͗grIgž1C$\2䘴:Zohv*◑Y+g,8OuGd* KT$OZBTdѫʃ|-LxǊ	V
+Bewhu٣MggZ;؂w@j׮CC;p80a+GS}2rD*v]]M̨ :F~-~ܸ{o~UIm.sg?AQh{9kE-_uQkҝ?Dsg7Tph<Z"H|7.lsnn,8qa`Oa?|S56bp)FT(Ғ
+=-uSYB$37d.5=ڜDLf	3Lo,&=9Ə{;ZZk-d`A^j~tX$iX I?EI>ˋp	8wޯ̪ꌈwTp4zya>#J/m]Wyr]Hq jڟ!^pJaM`R|l=;ëO؈nu7A:D7yD:xfB,)swk#U)<ٚZĄR%$)&u#+O[fD9pzghkDZ+K8MmZHoѕĳ_ۺl[MODtmoFh4l<\qC='y|aӪ`MNľ-f@[{<{0_2<s8]<sݚ5kxVqz,UiQ37.[q,!p^by}պ9{ɦX/"^YK2b2VNMb<u@Vm䱢ZˌURY'^^ 6dZ 1a;sC?IⒷ1*8pљUrplTϻ'}i1oߓ]RsU (C;Ua-rf`3AK{_ȴTܑU.6FlכTEyEC\{{}ќ9sxM<+rO?vJN;D Ce㝩 șq`_50q"l8=֕?&QG2$k	b󞬫B'VQTsו,dOYU/¥@kD+1psN薄IZg#<V	Eh%yJU2ZiZ"Eq+ZjcIy5SJ'/d1Q4d_4ok'?oHk'oTW"x&-5	cP $pJf	Ch GnrzAE?Z؄uW;_ \nҞoeҳVB-jH_	"p5,,7Q#kXiIo%ze)HhDt܏NF_&DLtəs>+JOIk[kU"\[IvktIBجOW'Eظ@& pweJPl/I'LВ?RMB[%ɒpWZsk[ey*pE'XC Ď!tPg={-,5+&a5F?\slUYA1.0/	3bi4Bg;"zmV:x<A+K4uG6EYX$!06+MYt;I)O}u$U%ӡ:tgk$b<Vn"GwՇ1E:=+UfGx9! MEqSLwaT-1vZ\ZWEĀAf-MġX/`7jaz\̀`5"1T,Ff_65WL{&-uns{
+Cq]dɒ
+<xpr弽[lgϞ6lɒ%o>ݻJӮ$~Ļb8R=ZÙKi!Wqb2	:#s64|5jD-(#'|]3uN^!`L2Fzk &,[b,X%ܳ 7{)]yn,+RTxciDX)XrPE6,[U_S WM8c,{2pEǦ_R:pAOWY친(JBnAXt쪔<;&oxyrXDu$UbUM: vpKk2*@tZqi7 {@fj9s[^rl;Zi[Nb|hG99H;s|0U+N@r&Jω-eEj
+<$!jNHH5}ôh2mj4ӄ#=3H<9n@e]yB"U#[ kiQã9uj]fL|V2ڪM!oWE8G3A+HJvR~h@5~jVqy{Q9@Yɢ /;pRx4Iダ|s/S&n:ڑ筘h0hmTk-צ;Dϡ`L䊪Þk2"X]DRĆt˿^yE{d;Z輍ݶWG֔,H6wTeJ5F"PF*I'u-2;jD̼c5`Ad1$-Gt9;H(zF`hVYHp*#%T~[6<'Z4.԰fRuG-F:?Mb%#"{$ZJr:R*_ 0	guhZvc
+3N˂ؖ.-|Ax]BCYedΜ9˃7q.=YU~uwsπ@'m8ao]'=f_/!:r~DM}dCUI[ɟ4= ŨY1xG"_I'~×BkY rf	R@ )9s_~뫋n#>X4@y(f;q0b>Y.G3הY|ވCNx*2E&pg;[;C3M_3lH3MB*tOՇ^y0\US@>dLEyvH|/^ӯYUӊNOƚ=e|Cu..ok
+\n#'3rЫZg%D6,l˓ #'q\/ѐGѤ}{2@_ 	rmV)>[JA4-޶.=Ȱ輫FAdOTi(>_ħX$4sZ!KB w4+>.3b՚,oS%4+{bcw-QUYQ$X泰X#*Tj0[-L]Ԝ`P>+;AIh@)-Mq[&0NKbti"/A˓T@*&$ČE?ʓx,+Zc`62a\3%i&8NYUzaa8Y0X^Kyt.;Z>,IXY˗+7vFD
+	iux0X$ŕK2=`朐ĚDĘct4ƫe8mSL].#rg (ch1~ bأ]f\@$@J9560y#:Z(yܵkןUpfOA}xpAF4{=I*i9zv b=9#g[4C7V	o{[DǽYD5g871%;HkK{d-cڲ]$^%; @$:  YM	`р D]P?OgF*؂ZM_Rwq=1`p߿%x]D.腱~WFd
+VeIj=)Nضﲔ
+hMVj?[B^+VZ+Yg+
+ĒwJODheFӧ3Src"M>[z`SC`R$A7YF$~T(kyn JGiLX_5jt*YVI(pI_𞘑nO܋O{&ZP04-h|{unq3΁CXU9햠kɺ)~hpS2W#I1ۦD Sg4Ӵ3}Qܛo:ry2VqZ<&p.^WptMX	7WR3pX^-HAiy=|4Kx~,.wa wttCֆB$ɴJ7Nj6u
+KFӱGހVx&8(*Ǫ(;>>s}VΗs$EguE/Qy=Bs
+eEdFs2ܚqYpq#,"#Zk@j%ZeJHt2tb_eVxra\q>{ CP- T)!&r2{s>uVh-꯰,Vsnj]!:f8CyO!/}|~?zww8>	@Ps@.|3 Xt.0V._1R粊Ò~'l!#32~P/n%%[zDq>7?-IFeZևbߎd`n'oH=r1dlBWgeF3+E AӺ'<EU073#_6<c^XK.k!@<h23pw!6pDYOȸ@l$䙐#D[ h.ͻ4ih_!*.{lnV9NkNO;W2toFzϾ=+GTHI6L^Z<) E"4L~7AD6x<bR>x)Ѵq)mCM9YD6=OS%JHr=?$>VMd{H;TOݨGxT7;#p*>4αXޱIK,zGe:-NBjqqS5'H'zKxVu>K0۾A[DʖhQ \4VH߈Z+&z00R/J8#e~qd@.́`\ K=j:q,23}*e3RlؠY5IV^<JBGI.{ßEmry++1Jud~!Ar$+ѥ;c,9;JDaF~kӂϊ|PqF>inh'Y*)LOJ>7"> N쌖92wNHur#&@-r aA 62ڗ8vdj;y!zMAYZ&{9>{ϟ.߮{wyŷpқY Ѥ)$}5#?3؈-*XqQC
+ch[wS"T@M LE[i" x(oRY}Y$0G!64Ĵ{WR,Ipb͑ødzJ78[]W^´q:	*uU-(\%&Ӫ0+knhG,w{ئ%?0. -gTc'V#梑iӿa|%ӪYpn&S]OFf 8L"Y2GoMgӰsbpt<G'ᑸGan_
+ń[>̛6)>Vb
+,0@dT3"+MgBD@	q<<0o	1'x-BYVe	mxHC٠Z)5<ʉanvКPKIf3
+V?7Q70tBܖ5V;ڍ?P@]hSۙK@c4x?=]K/@`n
+zڄByu&ax\aVb,-7dn\>x%Bm(D@Y'{j,VRO˞G7|Übj;Lƪ!ӛ&<}Qγf~N^|^dyblǸtG=}gJ2lޢnV?ݹ67K ``TtzDa =-fzgEǬDwLU!9 	_$Z_a^JZ-c u*70)Smk"=j'gee-[vݺuׯ_y޽{~ɓ'߻˻wZ{ )7E_T)G&`m#MPqrƉnܸi8X9㇡I5B91Q''۴꜐\xQjȆޕ7~#~c{:ܿwV#|S<%Mh\֍mdsZ9($n%Z^UQt	U٨ʮ*QE.b(bʟb.pU=NيZuVytV	$h% 6$|tMFWfk:3333<=hS#25__S3رNRÚ⣠R鸔<=o<Z|n<F:H.iQ}$U~we xXw}qV`kyIO:I\ʜ\okmE_8<QCV 𖉾 _믹7ǴEUo{<$@itteQx͙X`9!Css>ӗ΍(s?<4W	Lqbe?=B{7Ru/4pcPmiͮh!ϧ{tyT`p(MhhwUyI"I,>djsŒ2pz+pS	ʞZ@t)u̫8JEiVÔ|&W=8rLIO:KlMwAҳv$ZOBc[aɍoˑkuL̊#=lgDnhJaʹzV:ynh{,Y>-nfrbEԄvY=1^ƀ L[/Ef`Zk W(	>[(ﳖCA8^O["|%IM=*~kYŞo?rڵ%Kn*W@Iӥ-}Rp6j"wR!6=вmAJ؎ H0)9IV00| 
+b/.cK;;?G-*^ 6T8)Y]􊣮'0
+=\'<p/5"n?l6aqrZ֢#7ȉ,,a#G_D"R┆ӰG=kk҄Z9bP<+_f\iEu\?bp4ToK{x{nz-nݬ)@{X}9|R;%
+.㜵$i.Aq`.ZJHKMY 4-,)*i~ii-+e"-am6쯛u%z4E/EsEgoD0Q%I&z@/[<*%H:^9!WsL(]Ka89EA+ew5ǚ;-4~JiQᢽSs_z/!$Ö/rpe`L+<{2y6`Y0n[`T/D
+V*7Űȉ-~eh(!vóäG}ZZx
+qc"!,42awy	Р@2Y(+ɟةZŋb)22ԕk@] ۙbbt6qʵ/)1_S=4yO(t 	DUiʫ9ƼEͮ@пw$9)!ls@eϣ:%1§0R鳕хOU]xD;We%4z,~\	"m#ӟSs7hmţҧOU洈ޯhUGKx~H<y$pq{[da|#`hf> ^&!WCnwLsF/Ro>ЇAƽJg"nAY>u뚹ya4<QW?N7\-ۖI)^}ٙʬqHg;&_.:ʬx?h:wOZ5A񱯈0Uz}^"|q{]p&pM\+ex]c|Js~7Q9i)HPˈ|W&chL!_@tQJ@;Ҳ]ys:I(ow>ΏZ_s%5#`fȈD8]!̮F$X%0/%>-#MtK!Gkl.4Yy8X(`|mkbZ!mg99j	ئ&4a5͠eJV_9#8i|VU2C,Uhvh)R:|XKsX#jExcӡpi
+$᫷ˀ=ZfBG`~;ZhqEYhIg'pk`%wMJeG$*Dt}X"(߫wo^KT~<"u،:o8يTzJhގNK-Y@8YsVst
+(u0A+<&g!:]KYLFdE)Ɋz7ތAõ(@a3/N0TpGFzg[?[؋x~Z&S%CwITL( ^M!2wY>5j<cW&xqƮ]*V.=hUZDi_SR=ktD^.X(0ʳUQgyai	5[<hFԱ]^S`ƐESm w%fʻa웧%j{}Y:UÊg&x8jSI\&?s 2"$-Z|t]%3>ra Ȃx40xpPuϤZ5ٴm"_nݣ3ۖeb[ZM[LUS\n[T#w%A"D	bYWX99DPvT!t+O-~Ֆk^԰wA ,Z d_#RQvF2&9TЯLZD6-՘ cAc܃xz1)YQ@Ne05\jN}t LGhrQi*m\`5AO#zەP!1$	|Sw3eϬGlO{/L`sϸۉ=NGqOXnl87Kmi|q1:ѝ*X]WDih"c["+	,PD(u7Js,}$.yn<ARggZfn #XmV` N[: ,cCKM[MbWBw
+ǴDHV%ZEɼzE[:\{fPq`fttX=.}@Kb xh{z9|	iv[
+ٌ#a^Xs8tzYA5[8mg]'	uJc5,C;BdW_ŋ5jt;Q'M4|򽻼{>R>ZPr(WIc]gЩ!p6-Cfdb?}z,FDUul?ک_3myILF2ɟJvďVDwqR7ĸ:qR?97sJHW8$&Q07mvCR	٧G͉)ӆ`Kzyl
+|R9,H)uzw7!Y1Jv>9{UUpbhT?IylE~+[uuQ%;y]wmg\k(' gn瞑9V8`a>7A@
+r?q~K+
+ˊ_WDW$o+kdFr*hpTUvYQ`^r s"Yhfgɬx<UMkY3't|`&8"rq#2#R,[HU-gb0CxgKچ8ɸ|ҹYHvl=[h-=KS7p[+t~-~h`E=BxB({_U&+l3&c
+TYzE𸯶B}ɩ$k^Zh芿!GNYå5JZ=JG=üI#Q)r KY=Q~TjAlbkur4d!8W|,چ0˶FӔ{OoLL֌Ί*٪-A:c$׊3ufgJ02o YpZm9ʉ2/T%cMw?4]ͩjG/kh%c=Ğ(3Y8'|!E!Df-D?<jԨ%J̜9~^zҥmͿ|-{Ĥ?JLsU!A	0IqꀙubI?弧8js5 -w>ޯ5>lԉ#XO"<!/'@֢8j-뾛/he8%3TW #_4FH<r{Bxnq/"_lל؅:֊B'aB
+qjFn "Q$S
+rsbj]s;&0GRI"kTp:9y#ƴzt55PnY 4c@r
+O 4?ii5[6XE5zf=ޏ<-#	qkVҴ̆DmQO/?϶65sbrU:77#p*(#J	cMO5J6hv7rAÈ[!o+[kEj;a%`&ݴpjȯ隖L8-`"q[/@p.Z 1,B/ZD$iIC y꼡[܋TD*OBxHqHv6rƂ5z3z5)~:{.V=Z*W`DxY/~D0e`*8$-nQVӟg$p`Vj= 3&
+_۱/JaVȊz"$^v·D
+id%xx#ژʴx@K39|]Ajtkx*w	>bΌXƫ$pi8r#o&j˪)DFT"oܸ1q}_~s|}}o޼oۏWT'  B
+}ذaQQQoƱcnVQfXgT0`t
+|B$c36qFz/A L];3"_$)oz#bcn6q6w)rN
+Jݞ:x	gqu/Ic0*eC|IN%`1b(bPTuʲk1=,s3iGyKQ v<9!l*._BoqU'2LVWi𡕔oh-/;*'^f9=Hțuwt7tDMLҜ+B+:g0[gfiez*#qFL"8nY_gUsEOƯ8J#RϱuY2,K"%b64u5׮rgEj2RFh"bAWڕ$mZ `bjcdl؋EҭNs;Hۯ%޴Cp6O|PGl	CkӌV*Q#DZA=ӓ_ #Q?I/#HMƂe[ЄhJTm&i!"Od1EtNf2&ʭqt X@nD6Ubwxב%UgwM6輶Wb:+oT&T!	<,G<3X(WӖIݙ򧭏,+)cU1m~T[AF^9bKĀK%%<0d
+7s*T҉+t$tЅ|3fn<1^*⭏Ӱ|!E2N@Lx8=$40'Dc׌ʵ֫b(]J;.|
+䉾>؃qzc`ZrFx_诓?3!E5믿06<BH3z˗Ӌɓ!!!7^lنƎk*T(99yǎ?-AUwiyY_YTR#!b1q>&8R^m;7 YifQI:&oy_ Z㦨mE
+hIV\ePhQ#2}]sr
+b!)~9nل3-m"0KkU˯~M	[osℹ_h?FjNBya-Ji)|":{u~=EP=UYr9pݪi9rff":N[Nf#^5yrKsw]!?ahikrq,0m/8 &K`qq;aT[xГ  Λ*yGO'Fv<' rAl vz[4Q/ llid{=o*0~'#tGyGd0vԽ]ÿh0=KƉYI)x^*E~xasww6Uln$nvN'Yk]4i˕T%A	ldfE,:|V
+ia*M|5h!!k-EZpdOhuknH9lhSpBݱ)yؒʗk9lmUK*GiaS75l J<MG e=YQE_4e&gjb"4%XAnqWUq^%8͍/TedV?Y)av#N])5	/rDhVŝ*8i|kts!lyaZ@*` 1phd0Hx	>h`%"NxJ*I˷%W[-w!2=]>)D>C =z {%7o^bſ>SOkޟ>}u+VA^zd&!GFqJ*e2 &I{jػiDƹMEFm@`V)u֜25拸N~VIHPi8+i=Q&951Aw*@+Q0@⍹=^KjᢸF;0?d4F?)Khkbv`G#jkhV?"b-m yqOuMݍD1ďō-ܽ/8JN0ZP"
+x6pSN:PX$ÍKt&'(ԝ1X&r-t"DE TՔ<cDyޒiI 1eTȠMth9>kȸ-Cip82! &uI4kFcT͜k|D5wZ` |-M[m' .Vfo(	'>mrҖ]:}֦']iHQ)(](%c0 d u~[TjLbBe%gVJwB/R)boNm@]U<	Poreyy=#EȨYHsQ[.a?b#\'5٦Jd
+1s)dV\N ,(lM	6/
+YY'plYdb#NԪXqZ;\e؀AJ<[gp/x5c:8Ye$mfXOd:f\\çClʁn.3i^Yc逴w:Djm/N7T޽K/mܸϺZ/_>߿;\!fT+t.X:L&=:(e`&_@3ؓ.}݅q0'Fi^¸B _Q	׶CtXq73dVj "u#=8.Rtz{fl}V ^6{_5Aa] ٛ&JSqnh3\x3zS-Swߦp$ MUEX"{{j*NjBUGS@L5v9`;5uzN6n[S̩̬	m>@ZCwҞ[\eRYXetSP_kD-R&mD)Gp('$qxnWz']<.JRyOFPzRiyBW0L蔫4;G˛ؗI*C񝱅it
+ oOQ>D򣶽"ISyv^\CSwJ"h:`s;x}_ɢ *@qgTcvw0s.~J3O譜Sr_GC@<X Cc40Ep mIƷ}	Z4}xgGu>c8lc^X~N@p(?k][06nIw/ ɥO:2yBN/;ĚҞUH-|Ga_2H1ÀQqTk6lR|GB6<%4d}VﱍWK嗫|jvp&-%Iy0C'ʶUf$-[#.[7R2lN!2]>";vѪU;H]vwQpQFܹ}?~3Knݺg:t{s,`)"\Pڶ,4&Y6I*%]4(èϟ	\`c_{cT1uȅxͲvUr,9ĺ䲾"ojJo+̧ ME_@317O&k.kkTyLMȚj:;ᓁ9h!Bki|X*]Vu,7T6!vx'qDKDrॅvGJ+:ź#$$,RMaț]lN*h_e-r(]L\55nnYŞȎzhapiIx<<MHi5"`[m#b͓(ϦZRB?;?3tʃ 1\m;/`>Q45-CQzzϵ.[MIutcO\%ݧr/-+0gdT,Mm`M҅Zc+酏2TSۙ=NwTKR(()juS;-o.B~G*At/cZsEJ<B#lH}{I?E8@)c)kvZ;nzRSf4cCcTf#W8,Yr2\Ē\bΟ[^GU>o%XL\lQ'>?򵥺ʄ"@36 ;KUc܈rU%S'P]W8-f7,ubB憶<`Vj/t'-vI?UʤP/׌ɺV> J&mSZ1dߞP#4sKb+5>$|B$..w*UǩSScscǎ{<5kڟ7o,QD~nv$4VUWjĀ'v oBf &2h)(51VmP,V1||޳6[ΛՕUS!쪢eK;eYiVx/f5=wp,1R;Fɤ:9A9]K)%0WL\Y&?|nqLQ^.!S&|jλwIUzk
+@'hΕV1m	d Ot|LS qbM_27}ԣBpTI-G[Ux9"A. ,~ْxGa0=SY뭶!wԑ\8ZRNfnMr*	h2U7+Y־S׉kZzU8{uOWvK6qLHKMg_/nVY(4oHlʺ ʀpIx<3QRf2 Pc.C0-MN:͞wt)5la%%F6RcLeb$=4IxBғܳ$G<r35hF3LUԓ9gfg 5wjn+MiPYv2@0:':FdDΟ6Ckm>
+F ㇏,p55) { ?68B B\3|v^&`۲/d@p7Jr8M73R|5DIOݑ>w_Ԃ8y=ȑOU#>gM٦㖭"4hp'g`q]7Ryϝ;w~ϯgϞ|7[h/hQMY>FʫR=hQ%.++ ,aAfkx4D䏾oYuOR`;;<e,\SJ+Uy9I
+	;(ˈ˲59Hࢡ)Cc|V=]_=cew+#rᇸ}:.E|/ٻ)i1>_lTg5AZzUq OD
+VKlĠ993o8]tq2D=mćv9l&Ze^U !d"HwCgux/)黖>-igWU!;4;YW	OzT:EQvKos&>?K_& ;- XDlKV8:@TLeDRn
+ܘGDB+%n^jk@~MM`5te$j驺:4keE'-Z6`,$wӒ[v[J/G^~bn]]/ց$:@}71N AB- ¶U_*ńFRFW#L֗(UNbJ%t&{$aYFf_mpz@
+&L8Ki_F\|vԃ-ƃ&nUW c̒?ΘyB ~iUN}o8_l02Ucgjf$0t	3n
++_ⷊOÅO9ȗ8_xd壴+ayn4΁!'J}qT#rJ>ȝ$ָCwlll6mpGU/|7'oFwC7ި]uO] 4+yVX<	dYHZd0L]q	Rbk𺙁cX6-nl˽1I^9rgV"O+Ҭ~+ˋXC.+njZ q(6g~Er^r'lFS(?uj$ek6ybᚼs#)0"mlxcP)a ;_Zm~4k+.a;@k8uK[:ÅrfWu>m쮍wnrGu糺N&'7q׃.:eA.RгZNi^s}'5JBze+2ED:qOi?Cߖ|ReE_]J8+	f"h%B̢:N*1@	 ?	Y\ q-`S|sHo*N~ia +Ti: 1]G7!<q1-&UۙWO^蓴@2<-eM?Ƴj&"YQm5-΢uS:TEӦ<J-bWU	mjjP@$\)@	̹ h^oeVkfqc޶P\A*=hnU臢l]Yg]ِU3)
+iZ)>~DszEA>;~jT8'Hm2j{iаY6+.!ay;wGz)|?w=CML[Y4?4#` 5swڄ{fg""!2==}޼y7o>}ztttJS"EܹGZdI'N?_?qğ1{l~B
+=7}U5XgK.w2zpcdi,%->^QЊC$hÔ~l#lkrf
+IqJ}_a&3yMPGDchn<ZkfE_R;#~LЀKIl$!!~Oiywxt3. 2BN5AZ@lcn|=Jf=E`D_uZ;8|L9v׊玬ƄEMd^
+t
+0ҋ?Hbxm\w?nh}ƤɡyZS=U3 oi5y>0.:?FzeI4~='ν=;M]h	[Gz(jd'b=vj#\K8M~⛖JcUc;\Ч-Ēu_y$緪95DKq7WKw؎zsp_uMKJ^No2=`vd=l1.9h.z@qP,(o5PDOъe?"ȸG29_*qeE=JZs:,Sl7.O*7E.Z{ 4$Y)exAn911J:@Rr
+|U!T` |Ȩ՗OI%+hKLƗ!G13A	vOל`01!~`蛯idns5f4;H@'.
+;[BVImZ@UdB4Vi+;ȿo>SpYf:t>?%J e˖ݰaC-V^"9G!ş)$U~Q7#pdkSX/;a|.Y̢a&K<",Y;F;өTFeW$f	xCP|gfg-8] x$8nNS0	^T{O54kiS6oFtOJVO&qԺA%junڞ:_piKru]ْu2םRW+qZ~qMgHr樾/W|%j&ch<UHB&*RHTk&C<GĻj	ZVn`ВusL* J
+D{qPq>{aZ[p "5
+!tA+P~P-c446<݁͸26[l3\[#BNke+0`MD 9l~M^әhoQ\aq ;(c만D6;/ľT%oPB4҈⸈-lÉ%Ky6ӒGr(qg6-=<<))iq>\î0tHLD Hy`,Jă!#rvJJ@:sLk+#y6K*-ǽg{&%c	Vh(U-ZI9&#-8 $MW
+VZVͥKg0oiM_h!@+G_b@XY袝}Vd/_E
+ 
+,a&á`w0x@ 4X9n32@EBL!??m/_>{?ZlY~s͚5@pwE˖-+Yd-A>OTIg|p>2 Pb<2E_VHx!Z
+|x ~6+
+ak@=I
+m>s-ŁȾcP)xˉcG_V2-ɪ*ЭH<*#uAjޑ&83Q` :Y՜tu=NK6>'3?c)IyqUuVe'{L)p;.[=.+zi\	!LgPcw{NΘJNg"ȥoLlw[P՝F$E^{Yҫ 30煱ŞKk8ܸ9qQ4Ĥ>`t7!D`$\Q[PrF``D%`m+Ip	u&.{XÙZV{}]{o%5m(KB6lË)@"%0m$rHp$Vu>.	;_u7r?g]	EGeT=d:   (@y ٹ6-Q"{̚vw^X3M_()'&[nL&x>KeŴ<Dݛ32+YP %Ɣ:ϊ`ʶZRQU@v߳[P0gň9  ADs,IP **
+ "JkN{;qsg\kZbq_Ĉ+i>)B1"a
+jL$lQZZN^dF_}nB҇f-TR#dd 1-oSAϮS_axmD?J9q9fጮxс@;(+y򯏭Ĝ=Geh	!滘4gxl=3gbtWV봫D/!bC'ۃʯK*L~i/r3AC0џ?S\?~Lfȑɻv[J*eߖ~p*2-		x>e6C%LC[N\.Ybf>#A%1Ռ\Iy0iU?9wr.UhCX]3t>sl=/屢b_V'AKcL[iBLV X+a%VEJʫl	|}fr:3t~)s6q@ u4д"hKJ\}~[JŃ]
+P|h]Eۧ!0u19-pvz[_7Npv;r3iq{Ik԰UEv,/V=MA;zinFD4^Y BS\<Q11ErH<U15M,m=)5Ɖ0=,p|c>Bu8MjnMR=1,G 7dubrR{3;Qf1WIͱ[s \\o-~vǰɝ_b]K쑷ͫ|}\Wk*Yc72b_-3"@Fz~%L~_CF\$#Da V iӆ`g*d-zm^(Py̼E2"6wXF&D\~@+Rx!YT
+g؊AsϸJB]TpJիGcc|nA{=N
+]L{e5ra‏Ȟ\\2>B#q;&2@@?J8"ɧi3FA_5(ㄚiYZ<t,!^$_; \	I˽Ko?TX'zA;Bf8BdӦMO/=v48_խ[w޼y裏Wڿ?
+
+N8Op<W_Ƈ_H,+@gTcE^Тl΃hΙWFܷ5`d¨_2]0H^obu(g `	%̢3^yg|x\ucz!;%0P]T6*aqwf$t/(veŋyW;u^37xMc[ϤuqW[]qFL͍84	[]}IuV:\*.e/dDoQxm@us_ޢ jA#ٲO߸H֣UvD,[}`Փ$;2H*RjLes| *xnf33k`DT
+9r>D/(HOxJ|(ƃ$hz.>;oOA51:׆s0*.K〰C;(@=8tŽ%)QU:4j`f:3\Y|~3̗SOsk2qz4e,hM59#̓̅˱p]woI{/mf7}W=S%G39>)^Ԛ	v41m8"D!HS$	_ܣD@"gVJɥ%CicDGz*+YO{U>xh?,Mheb6yw^{
+;*qJ
+<OT7>Q#͑i"XX 8Y`dd`s2"
+Lm3RRQQ(a:Dvafvc|@ wD40EVF.Rc]$y!4%>vw*,N. 1Wu"ʚ5ks1wUt5k3
+2+N^?E(jE6آ{x`T>sݘT_lLhz?Tia<oAL=RqT	?s-ic/OX@/JcWC9ʤwXu06P֟NŒx(]g
+UvCf9RIzkԹIģixT5JsP}4o%L~,vz\|\UNY	%6痌 B崋8z5dV`;X|EKf^4Ӑ&4`p[m<yq@^9/'U:y~gnV	DPFæ(#d=E4 )iJQ=|tǖ+uadjz4g/8EU9B'mY_u`σ5-~,.#]t*NMמnǩln-J~ѷaJx<QD\~Cf:X)|i:1Hk
+M{	pZY^@0'J-+Q== 7t\!Uw쾫'+gٝ/1S5DR~å_A9usG:%	#s*am"Sv0gH*dшbs:||$nR]zL00
+(s-UqضJ?G*`Pb+&uȝMYf:Z6č.eNrʨEU8)ﾉ[;. $ ]\}7 7 ś~R⹟pr2C"Tjcp^_31vvUVV-5^4˿]7S8P>;6a)DV|(T5j<ynn?z饗=D'ES_*C,H?3*diB!|ܜYVFa2QQw濉(Le7¿`wqʳ>\ 5ϓ՝|D|ʦɣ.B92":H~ߺBǌZacrq#}E;@%v*dT%h;'/!>ȥiEwڛ,sV&+z^VSp~JA)ߢ6ܛ2+M]OMP*lp(  H}]f)3pd7iZ6l=?UiiUi)s".pw/U(LT֘AXcƫ0nR.Jqm(,6J+veO='T0/kٳg<ax\MT̞5h$-x~ut<4az~ 5iH0=sat >ȅ=Gr~)<%6ӱ QS? δ*ñTd>[DOau0ӣ+p9Nt	4럗:G_1E1U]fޘ;{OpRf^PUl7N73,?bz[)+|JT$_ >=bu?)ů&Ed"(i3k[yV΁ $FJf'>+0}8x::
+t>ha6IqENR͋"&	88)ٳFQ78R7
+׶,rQC73EU3ӈ:	CfcVX?KluØ*PQnTizh֫$HGʑVܹY,FJȳ˿̍LO͛wVuvQ~x s/ग"鄣|S!SOj
+ܳg>ߓ'ES_*}J~8t)xQr(t݄>i<:w8jhX\>^TZ*&:GХȻ7nUC&pEQ/+/@åAp'q9*ԩ{ujr:UTjL𑯴aڿK\MC)Њxg;@3ҭ`hCW:ٻ?h=Mn+華
+{[-@e5Q|Q˰/^&r}|̛3J3 礖h>$t> |e%<˿r9(o/o9Sjg;r^L,#ZjBVVX"4nD#ikZf\NVqyA@q\g^6\
+$;|A*`lD/KmxJ.Lb3n9b.2Q:F6d7(m 	dWd_W;zvz:1v,;NM1v|tν%㎂fS:9޷'޲[={uNF_!ZJ b 
+_Q9ca+_oNB1B%Cs8<QD'FxVgU 2滛L..Vsw]Rt7N
+s8Jf^"平:qEfl*3 ʍ|ohjjMK$*k䌚Y瓫_(AW+'a=Zzļ8qyNNy@q*Aʙ
+xEwxBb.Z]N@
+#`cTy\J<!RlGBMN:$n5mڴ96~'ES_h}UϫwoeÌZWd_ q3YX{ bTƩ;)nQW/[1ќ$p]SLV'kWqOSymf2U>k 9 JxqЖ'q@=7e^7Nq].\e޾>"O}.{{f*q,:3%u%8 ٚKB	s}i  &LPhlpA.P<xI(FqnCdP/sAt[S6ļV*We,ռ>U6濉׀ 2PS^{A՚joAXqnB' (w;c.T<fT[c\YӝZ*xtQuA*:͡eIQ&i_;̥K1B5>`0Mu-]rk3Oqa	ک'S?1WӰ¢cʓ}sxڹ[L?	yN
+HZ	¼cCaKUw:5ӂȝ{l8<,_890b7.A3Òi (<Of34*ʑک.t쑂5JAT&d
+ I͑ReJC"f7;N`*e6hT%xb!g2vுA
+Xm]cr5MU'1AO.OĴn;u{Ӑrr~d߼:BmV.0u"K]El Q	?gб 2fUYf/GhB
+~m߾Q:_۶m#"y/zUK1#ݣvfJ]"˩5t{Q<r IFd֯E	3S^%ٜS Nvy)u/uຝJ.]bJٳTwFz3jr	*ڀT^v4]3weEOP*(S4y]S#PjEUrWDc(>)Wq+<{QhNF=- of\K[lݴgQܫIF i	1A* QJx^fWkA=qr@;(V[ҍX%"?k*VT;Zr{MT*9, &*&DJQq$9JU]
+k 'T.@Cr/k@[ERZFI[8
+/v_ΗLǛ*<}̉;bt##}CK(z~qz'4!h(q='oOOIWs#ǿYcW_>Q\^$O4$R wa-G=H'Jo7<
+V!LTt}5ZCkbCtZV>2PԣԘw
+D'9*^3u٥9>9N& jP*_\Ub*Jw+i41:ӧ&隸;tI]G1T18ɀKP`{,(a_ƾ@mpp@5›;8`w)us@^aǁʾϔm/qhf:D).aA%`3(lzk(+YyظOM_Ur8VWy-(QI\~:~Nyfy/s9@31D呮mmnCQ6Iӣ\NIyijWk GğwjƬ:5y,ʅV'	x9	ULI7K8X;G(FW1EHFfQhۄ9ɯ8ߏ+sm-Ez#}Cz	'tv6xqv Gp+Gߖy"b [P8 ރ&_¨"\-}AޘY~mI|L3:y>&*++]T %S?ӁTC'2+
+yAd	DMkil~R|QIvļӪ#Z'4B3LPUPLfts.bqנĤ
+ {\;3-f:q^%ؒ-K}>lMGP|`ū9ygf#C@ON
+4I,#K(Ƒ_zr_ůF9ra(=~(@.'B+ۺkNiw]Xۜp*Dp}C*㜎2vUnQ<[59?F
+ [IVq'tYEd92pv#F,^$C=s]\xeF:TzID~Nd6aV0#\3t'EO]7"v"+1jC۱{1L@ .s	b+.Q`+"ߝ|#{U<ʿ.҆"3aq_G"h*G##g #	vn00hmXtO2ia(i'S!Y0g
+8sDvBCvÁfy
+!.˨AICWd8d/
+tέѹĵx͚^s0Myr)tf_-Uꌚ'w-L޿q{xbV:Nab^ "WZ93¼g"狀_23qiʐwoF(# \H.:3OYIqcU9|-ʯ$.L/*1<-Roɝq{f?Asw43I
+$1s'84TB&AE2c!%`42	(.QrdU^J<alTz,T	EHO+du`êW8A|||-82ejm ,.t5Wk-\Rj:ϔ!M]ZY׷0!1R/vuWhvei,i<OMѱDzR}3G#h$,MOO73v@!1gRS'ĳҽ8P899i-hb0O?oj"Bgp] wN]
+CMQQ/Z韆9n`ުS1
+bRHVU2̮S}V:;cVߪ5(A`q5>sC&I*\01[0W~ؼVrƗz'V5(U%8٢CS痊	mbv6ޗ:¨ap8\l*g{ bO^dT0sI<e\
+E Wenɕv1k}uw,b-|Ly[[=MGG|9(?S^$Ҕ˿4C<1
+UG*>crޝizD㙺GTJ80V
+]b G6"Vpv*3jt/bpL9w\ۛ;b+i餼{@9u ľe7Ҁ@
+ "Ձ{KlC72vnʬ6w[!(sD ˩܆2GKq(j4+ oPg1]
+EZGQ5NFh'~pzjKyiB\]7eV<TkWƲ׎Ux)|A|ezIU.F5b"W
+qRh]0K"muAWs0칮I,GEȌIl\l5\9_ciNOȶϷ8^Wf͙8
+4%:NVLL0ۈa\b}/eǗqϵ=,Rt*<'d|1x8^?t;~{ֵA[X駟%;Pa5ѫ<>>&\`A[̄3)=^iiP.qƬu7?z@@}S)cLVD-2@^XyF߈wנ?>3fg3"L*/f3.,$O8"LBS8^Qه|WXJ]DMXx=w@}nP*JA{Nv=xUM\|UqG'PD`O*St-9en<mDU9
+0ab𝳇8åU/}Mw5IA}ɷ<r9*{Q89{;w՞yѫ)}\GL!&*$W }WG0HEf1ѢLYCyN\+u^$~?Kt6OD\	"OgdjƴT}"~~/V@Fuj#kI0Z"5_߄o>ieU8.`6k+7x1n&0ƱʏQp("ҍkQbb-;"zDxIAHjm	rE_OG4s$h	dE{ 7I
+:g%#=&w F?FZш왌*\BVdϧU?_@):}ڂ| 8׋6|."&LGXt~C't~e=+|ppE=2𶕧d<?r#e_~k2az1;AmY>evJ7Wzk,TrHcnv4N}wh(`B;_ /btR҄7Mθct{Zܕ^T~5_*x1vļ1T0&'VnY;V	&vc!}(X1gJbj%Wl
+}yͲm"aL]OXdfl??uz3~_Ek*A1;IֺaL*ʃnc6*(k˪e%s7Y/r:bUmպsVK6nsNt1ߺpHj*!<՗Gpقa- ,vc	Gۮ-7؊9!ipD'?=GWK1S$婅fש2i
+U%eJ zXYVb'BK"XϮۈkɽLRT`]_Lqӟ]
+w_'YTZR/AKzWv uEj+SB%yt#H4a͌_݈ ڈ\)[5vpFo4%v$>ˢ
+0fh R3(^l8,S|qoS "|njN__Z(´|r"0!obt%Ċa1$Gד^1ʣr+Po`U52{H$*ꦇ2鞜R*g8r>+w&McQiv$0\(aXI<6t5؄Z}TEdDi+ =~H3/$w{Klkz5r*e/L84sk=ⴍ!Tt.
++3[ٗ` U]{ F02dv'9ʃ9	?7sgծ7?Qb=p$nSҊUiUr̙DS#UXq_kZk}nμ9Fg0'FЁ#Y>o>.Ƥ^qwY3o/rKF얊ǭt %v 49,B`{Ɛ6
+,i^S|4[v^ܑZݦ7sh5U;>4J EL̘r>828@3E p~\!Y6	<d!EǺޠKQ|@y1Ǽw-S՞y3͉1}/rСGY(	n6hDƧTwcb6|;T- jSDxum,V[GeRd1:?4䫙}lcn%I|3#1A̜tav%ޣ:J(U^YJDI"N@n~_8 Wgb#"@]!8[JGQcc+In4`b3Qx7*FyL}o((%\Krot7S|@=5o (Xb/+ e}~;GC2#Īe>VH|@/a{xlDv9Qj1(z@	om^b7hK~csڏI 9VD? **x6|ܦk\6%t(L3m&R0	<]&@(?˷f"NərK?%{|Fڨ(TeJv==tE
+7A[[RP4 /eˈR?lZWrdb*L,=FAf, (
+?5S[0QS8EgʭV?NewUE'؏v/ZViwx4 1dHO%VsO)E|v
+M~kdkU3z6MݏpZ;+ٮ+]F*biugV I5٫\Cyxv=PzQ5!y'2;"{V'Z"2s+'Pxkwiv͏X.3v=ȫ;;-.,<BQaQ8YV3fӧ׬YjѼM<zB=>`,ƔjȞnĸE'WGd-5˿<~1Nsvj{QOF^U{YAD3*><n%9B6vщ";ȔW`.Qv4̈́d# B{_ȵ2ߘy]8q #n)[t<<~zKB*0YAZbQKsF\,~K²]([#caz(D{^jqR\p0pH ;z^t]i7^r<a?Uq탊m
+-]0zpB,匎@*1sƠdM'gEi)FsPtBt>!eVV/O>+h:CZoLOt6э
+ÌB/tU:N|}26<Xb˂ `X*
++p!P=nFgFƷd]A$YaM˿"j*Ӫ73g|K\]IWUqsrŘQXARB6UCd1:2{ʜW FzHIXUKz+
++Bd0c乏`PZ܇Aߞ8+ܣuvzXwXہ׬w[:
+Llyх">h>w^UAw`tH;'2Wf65QFGCU>BiząZ=*zxM0JDh%.A&=y7sdLn9o!Db[A/rnE#0!g]2?E8gd|0NugdE,\?70#sfJ]k!ʼVέWJtWXU.5BUkYjψx4@<pq:|z?J-M(hIQ5(4GQ9*y;E	%1pGKF;P
+Qŋ@QT}C2?3zk:8[h '؁EEXd823Okݵ3ا`ᚠ'Ej&88C:~DʼtPq(	Sf(-BD[#㯽!ګНYK!{I!*eO:QV8W6P4"_u!{X7vt4qp/~?[Ѽr-q=r/L*"-dâ-NS3$*XG'fY2u$VIe0Z:+tk*@UBl-$	AGѫ,߬-8C^;H!:195ʭo&SyQLF&Way3nWC'TnPWX0bKT(ڂpD~}I)]a &NC00):̓{sK<> ڧ}ML|5]0ԅM=rj79ҬP=9&Ua	)Rp::y7?b/bZkxdpCdSIrF1R F 6,<0NC=jUY͎)9rn'=1}F?3G
+YÁ}5ocqZlpWyaK()U},iaF1ر
+7q՚0a&\N~.[TX
+]?N^@
+r?/-*Mg>&Vg1Vk;8" \ytj4u 1fXrnRW .pOio6	R 5,ެGC@RZ2F?mF@#H`WsIۉfR] 95fPߠQ PNF9slUs:`&X-9n)*-G*h~.yN"wBqd{x`/T]K6R)(p -!<od@wOKs̢`[fVIH/65]5dF'0Do{wѱ2p*f+8LBt=Ρ?[1m΢)\m_?ݥR#z~*<-5s?+ax0(O.6uOGS:(PahwѾqby/\BE5H?kwI'݅`|jw	 Xb`^FF&i YS19]npW;?A<}K?tFY龓SSGSFB]S:!,;1u#o0EEWOhw;ِc]vʹE23;ʨCT;+@(;àmܑ:e:pKq\κҨo=ŕոKEL?ojc-~-sr&5Dm]i~?&wbh8B(?k׮]ݖ^]x		/eڮ@ݖ=SVHA̡YK]Re>.\$6EUoT]EFN\K1/z3T	~;9/h|1*ǯ,zY{+C˶FZf	He%EcJ"sςϴr*4'B,=yi-U@|	ibTͨSL~03/_	C.H]e+R-qs AIZv/\,{ۊ}$dԺU
+rioc	.DP~X cLQ׎qZZ>#vBaD)(h|UbXMzVn5#f̓fa֓''*fʹUGN6H%aܕXx>9ú0%9^Sz,!\^$}㹋Yt> 1e{[abd	1"6ab=L&vE+$y	Tԗih3w訜IXs"zt"qZa*e)- g;䅫ͨY3fz?B,>ȅt'msԖQǣ1XȖ@$tdtϙQp>Ko/J=h ˉrKFbve|6Sg*B&E9B_1X<H`}V9D&>78cɦ>njWŖBWBwȍ%߮MA4$<H6vI^'_uvEAA_8
+
+ 5XvonQbhb7MI{|(r>ژ܁H3_o,24QE.#QKUS%)@d`f Q(
+S6S:5'W}\؁Up6@yL`xVTۇϢ*7q%Dڔ|y(pбf2GU(vűH+G vne{%,|ޏi^s[j0&kc-o&@DbGC4E<xX"m4m*^E{F;zz@BU0*\>_l#.?Z6,SŽM0+I<rbiZ.t8D3˪@	=Qpl7f^t^F+IL|fd(ݡxGeza`i`(g#K/i!}WKmr\SU:Cf>Cp/O
+C~\;k{%I`hf9ɸ9"PZ5]m5C8CT
+ǯ^qkWCX2Vv3/by4ܴc|
+.2b`U5dsCe?/4㒚*r#UQ4
+c(=6D61yKp(ԋ37{ΙvS粣\KxE x7#}bخXs.!r 
+4P);~_-Dc
+; c@ɈwBjeBr%K|Vy4dV8fJ0X*25ءt;6GR?RJMv8N[f~Z|؁jz	~3(sJkk`W*AE5&y}Ӣ\])m%<Sz*w}+-14SaG~)Nӡ;4}x1&g~Qte.TK'a+r@vmPBV91ΙmP oXkP &=Z.CKAh^t	[\mͷ"܊J|Z0XPn:4̣Qa']HOGfOaM5|a~6OhhXze,Ёmx dA]7H8-'t?&_l`y4SmVWXzyg(8pZ(ݶGCP89uvƅ7UV _P4K]l%ykskvN=	b7]W@9\YKQqlnbr;@LΠCH25)A`=3ֿ	qÊQX ^!r=\ʓ>aZ&|gTxNjX?݅M0K/McISG<n_EƑ5H;o2cm̟+4Z0`o:rA.1fv=^ft;u2+ѤLë^W67S}\eUYoZE	w,`# k4z^-fTw]uh-ڏsyC/?B?JZưs̐y0ˀ؊}&Vn-(ɷrƢ?'5.1n㌚' k:Q*RfEQDT 3kY0ĨpW2Z2byǦIyw3oeҿ;CW2uAP2>]־%zkP3[˩tvN;4$yiU.]=#gxq_Q`Z6dpYΦ+)Ywm{A=4rrDج*H/(s=^F?3>@:)AI^!xC&,>qEǈM%/L^ep[ YuPnyj!
+;׎QV-ln68[\c ]4IK(([J]r5F:([Qpꜽ9?_(!L+5F6N$&<\<M,b	.0z.Kus}fiG~ \1=ϳFVa!]=:))$lRzO3U{$fᐬgWEKy3kc+LvZ-Bq[Z\p*.>t2a 4nx@@;35"ʿ+1ptp9xѿNJ?L4QtϮi[WU?2:Bp0_+ŨU9W;*q06|kF3Pe2B8ջYr!?dpqu1V:MNJ?qv<k9b|(ܲ|8:g#[TqH*ʮm=UQwB|(q6,5N#nY?I81mJ<WA7vq'2'n\Q9fzAG猞ZJ]P*w@LkL=F? Rԩ!ݘFR ؿCo(ڪ"o;D T6W1OA`T,Qp'dT_(m&@l9#ΉǄ:B]-nBVo(ւ޳UYJ|M/GiUn$rX9SƇ:3é)
+OpB`6iQ_^K82PHR/[JRg@Ooɼqׯ4.LQ܂
+$DL%08C^8(Gi?S폅ւg!z1ߐYM:P,Xɪr(S嫍`m.uһŚX9<{.c7:gԤٙ@S$;3Ϣ}U ;GXHΆD~[91!QS+d'Rfq)dǣp-TU+pjc:tCtYSUg/Udŕ` =վ7̌|vT_lƂukQҌJjP-D?RbҟKΡ{*iÔvzd	lN"t])<Ԙa.ZGOû	27;MLee@!D*2?ܷo[TT_~_Tl29v=Hq7:1C_=4Ͻ>Y8X.'?n,W||	
+&Tn;Ur`"Qy0Vs|/*><ZCw'Vns,nWUȶC,ʛD>A.Uֈt``2ߝ٬ltaҙ^eu,N @96ۏW _;]y/4o,Ⱦ 歙<XN:hyɕyGf
+Ⱦ6}arľR2yO""墔\Ϸ`(5pV;qs~WZj+~<eI,U(F,had4U0
+bg9ٝwߣS{ϫ![p8qhP[\N5#8n91/;p`+U)~6	v]z9>;xսp]Zu*'rsGIsڠ18 "Wc+{<W[/'xsnAU`M8b%ֆKY#}g5J+Mp~*8=|f/__K]L˹O'@'=fSZ$cqK&i ⦠܅9ܺ>iE#QʙV.XI_~س:Fy:1>>By;ɾ5tFQLZA͠wdޗ=l[w+W[|)eu(ÈzZ\LPx`Bjz?ca 0cȮ*ʒFdʚ^/*wvJc+>>	k4n'_4Ok[<
+njFա}?%ŲZ;D-!qZ1Z%{*i8,eĳPf$
+`9Q>bkAZ|DA]d
+D]-pko$2T%27fX)DqyPtN\(۵STwc!8ȍ1VDgGqfNZPr(í*kNjgAˡ:)]kOh<r	~S@_į@Q{bΚ ݫ]6=$~lfPz
+_X*2P0TR+¬`A$-b?#R8n{g8W<lC8G"~2bw|(evZ6p)Og?BOsѽVK7O𕀲sR+qA_|Cù#2:gL߲=냡LZ^dFį}W39XU{$߂n1
+K>4sC)ke`i? uu\!/jU>eХ܎0!cmfs=νDƑJ#)UTϖD*Nӣh+fX]͍aQsbSC8mu!ڽ^I6BrkCȻG?Q֭}/zC'z8e̢q5w؊=_7r;͡Y&Vn5:gA`EދҽjňY뗈' 5𧑃χW;N$S4TL	9cGdBkZw}&s= ff;-0o42jeU}ލrQJJ6||[y#?ϪUmҒc]Z<gf[6nƾmJgVV
+PgfB;խ<H[?H?rmo$)Vי]Yѭ_ڥ1z'o"Nsz ͑b~>:AqSϡPn
+hհw|#i*MOK(f+b"=|[j$u8bPx-N6{xXԻŀ1*VZ
+w<&vbԈ4?RzUq0;ޙho0.%_{'+'w_ۮs}.@Dz0"Hi`2e\w+,x% 􁘪2B6X#g.X*>S;b,[ڎeeDKj{LF)N]ejާ4%;1J6?RMguiډ|I/O|*/(kQ9`A8\U޷gֹ|z#zV\vi}#[e5e6{:p6šGmeޠt0抲Jl4cO,ad\H̓Мȉa+GA${mDMTrG*DxEUoV,wUX:`WǐsƜZGN7HAYOϨ;_]3K}̦[Ef4ҍpw2AW#Lmzo&:<tOnTj$~j-_ߊq'ʋcNB\D5dKuzy=QfgZ!;{.XȈ)Jk=qevQzJ+`KTuifG@L/ ]w82^*:nA(sѺkݎ<{v4z&}i(T+n|+yuCDCD3AUX/| X3Dc^	o$ٛH*b)ǔLZ=y=րKxwǝ@խ
+9~U=.[63}.{)yR'ӇaWkfbw5kQoA2PZA\͐~f%Tǡ܂, S]<bo3*^
+[m}GPQ<<f 4$<M6"$fNOM]g~NB &9j`=9qEok[aC8VTuc8ۈs~K,rV&P
+%VPZUEC٫.Im/
+-ԑbbHi_hݷ{گ{^isH9ZH^{,UiV^w#/Ui&C 0@sgS]M|(z-& E!ous%b>ڥ 
+Drl>QƩ *4rI|rf܂Y#Ă[z>UtF?gPLiGz[J6t.ϵ$	oyĦn\X'^ac.mpX3+(NógACKtpƷ六3P*0	_q-7x{6rӜ[3o8Eqk3~akhkw>Vg_s{%"hG!v*D毝d]#d"h
+%(؛3vgpTz~ċ(9~ֽ1snjnĵ[7L`Ӽ|{ؙ7Rml3'W.RyaWHH4ͥ0:ٿDE=
+Kf{豗]_лp2:;5R[aӅܸf-~xuR"Ƶ/(Ya1GX4e~>`%29)=r7q+o;EҖ\CK4^aONM8I颳=tJtIљv:RJȳ毣Ùf<..ZHv17bp&#`;SEyn0Lr7vDq?ߵTܩZW<D:KȋX"rZ4䣱iYi7kWᤗL8!D/(?ܼy_u7w]WMS5ѷJO/U;P%x#dK rbރʽV/kvF?̨9Tƀ Te3V}jsK\Dw8ALZ8y}PF}Iˬvj?Y{:wbx	NDOW[!*1Z.VlN+O4ŪwrGBeDoFW@hHYxQsk+׆j-WDQhv~Su9H_K}~ivTPҴ[N$TA=JF]{[V)!HhۏcEih2ەi.]6smpt4\-F_Î.ݖYm@L
+F6Nh^3c1pRƋ՝,E%nw`0N̋yfd9v1חd+De|t(sͧS5Yu.~9Ӗ~mp.$Rb@r&cn:h_/;c/'gֹFWi3Uv-|Cf7\s&cgKS J4t=_idE<'5 |*p9haFOƻ3>#`T7R*)'qhglḋֵoTPfúI-X	42,vhp#\lٜLYtݎ`BdGXg|mbhʽ;*gBY#gЍ0N؊MYT&b)Iy	oqb֓7E-Kh;Hu	}\\Ы*>&Tnp*8؊`"o!]W=y_/9Cכ	ʬ8HX"<6ǡ)*fP
+*PH\
+h5/@Qp\R(sVn#fKwn?w$LFA]F%4Vvwkz Zƃs:#y8
+iO'19	T6%(Q uvAN.}p(}nj-ƹ,U 1"h4W]˫^16j7kw}x^g@=dDq@uUJ)-q%?G?PK;_?b̄$R$NMw#kD^jte<(ƤI#Ͽ*FD8"lX;jDlWv6blL%%TgGᡵe20
+C bb3?9c^8/pbT$enU-!d+>y'xw,391Jn[T6m4bP)ʅ;Ɲ2`( 1/;#=b@#P{Q;4UV#RT4!ҥ-C;/''gذawCa/ v> pAuTaOUiN?R7Nfh`q_cL2:gj5gQ7#+,ƗUۉy	'7**1}:rȜ"pJ 
+4G'\`p4;sLoEF2Hfn~\oQTHi*-[<D:pUL;Jձ}Ǭ-_F2-:]*PiW"S|k-
+4Gx
+]j\BQ
+vn)Mq\LKN{Ǥn+λ(=S.q ^8^?݉t}1dM0
+=s^9g@TU#Yt#
+hp+{_tȜIN;%.#
+~ۧ&~-*bT*4HK<ORC5xQzL;x:^6%otoiSiKnNcR2f*xwjQHMU_,ܡ
+x1\P"jٔwڂk*j
+l1fywUtHG0~ KӨ;tRW @.6ǭ3WbzR:Itf4ѿ"MLu'i9JJ')-46X2MF&a3f,i|ҥo0d!#d8&Hcr*"=Ж'x=sOFf$->e>[֩М$ /?[|Cr0T2%>+A_'Ryk|EN3r<sZRTF|q{	&ڟVnܐY#M6< WU=0ߋ*3hD2NQkDVAe#2i>#6"f-u1:͍40ڑ{>/^s*XD!s-Va*?:)΅Z)sPg&vu 	Z1oE+D{R
+ AC	eӹ.yX]Zv壃^E`*(JFM[:k]֢0U%N:5]h6LxC6.'Z)qblo+dtF#9S3r&{U=b32{wZAUNNh[vKCl.h'h{Y@QNau{
+t"[s"w<yVsPO-E̞̓] hV>VtVt}Y`EU_2)d3ӻTWzi6N"uim_ 3&.b2"뀭1R>4ք@̩k3O1X_01p-]lXLWƠp#U0Ν4o'_Qp{V{^E\si&XE+u2`#G۩|(Ͻo&df:3btZ8)!pD{ѫ8ZeRރFE$ k3J)UE:r`'-KN{'Wer;?apNA;茪[_|1X bU9=:1#񱩏W4+ts޷3EKYֵR8uw15~ dXJD{Oz`%?n#gY ZM1M:ámP/gUi#|4.P:*8Z;{W.+MkUT%qGds>m˼mSegѮ|.ewFh3tʵ_}U(=邗2eB_PodPN4͑n! jQ1;6$%	*ۨjgW]UjNXo4@Z4}J-Qә=]\s6)OC:ee
+TȇU1yf.R`YH[`Z	
+Z_.Md)2(Ț !`D/i[MQL`Jfa!|njyqxmO(bе8#RcM:-?3vvԽ#.jz㤫;nP:tVe#.mj4;H
+WV~ɯ)kB|H-foUWP\;<`ac`v7B$(ZEK~8"xʯW]UY:"{fQ\IywOnb^5O[?	6׼J2r>ϫ]qEMvV HAAO ʠCnLψ;rơPh_.<rjҪy1JEM51&1bo.
+0eRt6
+"4E.]:""~YYK7w}fz=9gr ǫNRi,`d2ڗE(X[qb@'X$@oq<9OU`F֖_4(Vԣ)d
+7s)ydt8wl`x, G}eҗ-a3E^7Cj˕49SFޛNS2g^Vb@*'4+c,/> Ә˒g!rΘhΗ'cK8HcӤ|٪	Q7qӟp'Vц}g{j31BK҉Cӊ@ ]Ht dֽ~-SK[վD-uRӝt7aҞ;_ޥk)Ea@)(+a]i4)j23NRBPeh&JC*p<N(YӬՒoܿ+"ߘ"ܿKxwjqeҏޤ>H@0D2y^@^(Bs6=K,(.MK%D7^t/O`k>*oInigG\+{;NhD;b?60xRlғw+u3ڔff+j}^Ip4j)pbM^rn`t
+c8Ϙ"AZgro\奼T녩 Q	CO͡wpZTZMfhuчV&KnrKOlD7nHIeG_v5f&w${LO#JdR{.Hzbŉ F>},rCJ +TWE_Aߴ,.4Șanc D0Oab<Ba..Mk7[yDnS1Cń0 "Y;m%N#8H %#I(Ks;ss8|+yڦ93]tuq@L]R`xq^pgjz\ͷ/Ku}޵= D=bI7C3=%8cpViobz=\eQ`u{1$MJv`7ipR3~1ݕZ,بȝ̅u\oz:ň
+j;UxK.f2u<.&E;ߌ/bB)kpd
+Wͨ0ͮUfQDv*4e]ă>KeꋒBQA>e:9uſZbXNaZ+Z	,c/oRf:kz!kt	^
+䃼qa4o2mMɍ90$&2E0yLmJzJkYU3h$t
+(i9{/Tu>/"{V-AVu	Lİ`vF,;mMcs! F	0+z~@F	!]FAC\@>!`#AF,YJ7{]oJ13bUSUE
+
+KKYMx=8sPhT]$(+	q^+č{ŃKr{AUqǳc9`|bڅY/UN0NSAN_;ŎЩAn
+fRZ7ܻ|@Lir;0/Ia@+R#;|aۄZkR,{鴧\78/y" <y(<?y:hiT c0h3y_t߃3bx4Hfmϭr1H皛_]Kq,F\VP8VtMyx]
+^XQG%[αDu&}.clby>-U뜖R2~jﶥ[M(It2F,Y~Yd Y/H$[rrĹ%bF)%mMt
+}o=µ?ElPҼOL4ai\v8j|q1>22qA^@	/5/(28KvGjHrhP_L^AAPØ4@[1έd@~Iƌ@6զ=|iX橙E:|`|R5גm $Z'Y1NAzSu^Wea?Nqu`faVU@ʕ1ncj^/|bzWby; Acl=Y{%vY;b{2%ZHgZY,?[
+tm{gŏa`g<ݐj,Ws
+9~R0"h3&fV3"՘ZK/lP8T׺ЉIQWq0Y}fJye?912 $#Wz>`@ZhlJT~H^{log+-Eʽ_bZؖ[DH7+@$$q{nS&k-Z
+vɧؘ)TNXZPyMPXoށżړ#iо Ya]\KU^(3-s&/sSzфW㽂
+[nj=J}\qL4/X{ŕ̳R?	C)7(^Ef2p\3"ӭ<TY,-#}enܺk$q3㇦6ܞc	q2%cew1>ͻ2?$ךU<s8'Ĕ73HW{9<ums	lc"pB}di)
+ Na&>Ck%8kWEpjYmsC|'N{t$hR[#%wNfF*~@rn)kgyA8|QB1ki#ݻw[nJ4inݺ܀4. 12}u/#eXrk_]	!R=[y1o@XK3:B^TuǸCd'-Mw˽6žv~o˻o;`)LK(	YY3Y1FŪ*8JOk\p<8po@!'{<6m_t2 c{VSyb\ݟ_,5@:4!D:_*'Վ7^q\ҏ1/pn"y	ˣz`cY &`j:"ڼqHVcg3&++le~W4N,bvr~Uo]7/MrܼЕܳ36e4hf7Ȝ\4MXO{̎)Fs	G:QBaQt:Gko@x+$7,+mq8r#gVێAd+˱ 8M[C<+i4]@׈1+<qu<5I+nT*"˒^alʛ\/zse4J/FGϻ&qa((7jsm+orM"QXm"@@i=?SWR|MMy}2N)p9{mhq.fsS%?6h듉kǋ
+
+8yp:1idn[cfrdG*7$!^Pk9Y7p9/>i|H{;L^<W+̫ [FIdb
+8Ъyah}oo#F83+VX;t4nSN9|?8_($g*J+o:^NĒXu|z3"_tH
+t|ګRՅm#cv(`j{ЏWŪ r	t\,FMVD	̮aIv=["rUG|\a[fr7S\j^֦Q7\)]鸠3ŵ{D̰cj^>U<:11j=_\>isD"4m]ӆs~	yjOcj,zou2 ]jhݍh%-&&r0LP{Չ|X2Jw'ˉW%̜ _\/KzyIK.j/GoHB-zP7û9l!x="qb+RŲXe4]30sh+zU(8b$.FtNԩ|U}xB_`EՠǛjޕK޺;2ah>H;hՈ"ٲU>Uܘ)5U;bIJ@uC
+31Vx1b9^*c!5#U,qWYpⲮ0ˬ:7%(pGEjG/ŋ@ʯM|iL_v*M<QdyG< 5q:jyݞR`v ˄ntJ[i-
+){gjjw2]HKEFz/+"7mT~k-DWzOHRӦMENt6>$o^~9^ItybRa6./TY!:X',?j(-WzWAYaB;UKk3-W5{Q.la/|(8@Y:f@e蚖Sd_eKB+>z!zXQGָ'e_NT`g{V`a;LKF^GDe_^R\<mDNKhH%pXE*
+1#PK&BkMosIҍ	{AVU	/[*y'\z'zj_bU@ywAX/7qD[Oĺ9i2P)bj4V+qA鋓.'/4N&&f?po#,de/e%<"0,zI&2k` nXvF/ Q5nUAEbi:-QR15#6Y/0TTYk*ZvK2xg؊Bb%HW/ |Uoq( 3[sf	F/XPG}^;_=#~@r?+r"3
+(0}:^<]Ѧ~	+[:Ke-1 hK\/Љ|L6C=G%7ߒz;яqK	's}%Iwesq6}8{KƩM	/RBF_n@~|颌;?,>ywIߙ.}/*ͭr(p[6aslYq5gk r5JC [+x\WUv$aa"[B7|ӤI_|y;O<cǎ߻*ueʥa^ ({TOl-5>RBbm0D}f:ZTt",B\5"S^Tک/qgx׭[Ǫ‸$}핿MUg{yB8oi["mmBg V"PRgUrD@(n5i	y11{/ÒgyxtͫѹcckF	AT
+=i`H39{&pc^3)`@3MA@!hQQ<n3W2j4oۉ,ܠKJZ{u2	Vb]/6I_t6sQRpm2 J dx76#"!(!:Q8%w&.pm,>U,WY!TItHl ¬~꽇|w#kܭb|(M{X_#1OU0ep$.iڝ_V{UefuIrAcy"T1KldCJ^Qz@Á*$~[lJX>Ag5P>(hFtݾ|RG1ʟ5#h$35R``JNV0uPUkM-ޗ?6=nZH02=BZdD=4
+1#ǅP(7wj{(&KA;tY"EC,vƆg.[2$]~N%驉jcҷ;ޡ9M8bq8(yjm\5Xacy=\7oAfΜY~gCњ#Ҙ؛`{2 jRTHƦ!W֯M@`VMa$;EŀsD34ˌ)BrR  ]mNś<-̇6,Гn3.W0E=6㶕m\ڠ͘bž[cr>+9*;fѹ7+DBH"ĉJj]RLօ)}?^k55#,CB!"S pd=oBN1@Eм@d8d64/'OafWl|/ֲ&cʙ	깬9Wl̮ӎ4޶'G!io`%9	C8 )N()4#IZkqwӬDy#aRS/)0\Q+:WO#A3CcOmhg>ׅDGg"{sl=¿*S۫vd~o)Z&wnC'HӢ+8'bw1a.M/~A#--SNq?w2em}:Q"&Ov^U|-#>՟_G,gc5"R]˩EFᡔqp*0O]x<8Pugp&7'!7}2Jӝ<^jtTٳWRBlk#.(zڦXXd~mcnViՖ0h.ql{teJf2YӄD#uU^O.V<Wװ<NQ/vAo	WUֆ"3^1;sID_N{sP`v0Jڕ`F;Q\85ژ)VfTsXҨwͪy\a-ZOZЭ:+k1΃V>jx%IUgp7,/g\i&1	j+VПG)8F s|xN+aٝD 5% SҢMQBHP3ɍ*:[=^#bN('ԯquO%rk&5/g+o*kԴGyiזԋU^RԛRo\<CL+$d' 3Sԩosր>D%?,PC_LKJkbuĆ9&a_tieɳg$c=OغU<\QpP[MXO9v"Z-SzVGa)pipU	Kjql_e#X?ddĎ5/qZk䂌15/u:EVd{2,iaq7ՙT4'W^~Yw8GAʑ opʫ;#+fWxdQ;U;eO}Ds0}̗n78QN_ҺOL/]:e
+83w1|_\;ùEdp}rcF~5)"XoEY5<aqraTgyLnP_c~.s.rM}jQYUCyo
+%AÝ\!e=D-z>)_<Hl?J-b}̵*GѪo	 b*:FPB&M/.{cy\Xq׳v{Hޮf-`W';ghU2H 
+*zUj, 6	(K>D;F,]bNn"*5rQ<.jVot$A^:oHg;^9DdN+_P rz9ò;$8Oq8NaRR>k" qrRRQ5nM?M &Q[4O[ٙ <,v s
++-bKWecAL}URBUJfs$c>|bѲ\o4M .&Hu0J[u	j2Ğ\amGhBG]kї&=+H^>-;%ƛȖ	F2A)=]O8@-Yq)#r#xdf@гG:ʸ/1.Y.bLāa[Wyq;@7m-,wd#Fueo¼,MX΍f!C῁Gr\@hZBrW%Ȩûְ'
+_#Lo+jFf5T0Z]5VWP%(Y/σ<\JI
+	&@|Z7A$hV98V2xeߚ)?>"D ¬JsWj#v{i&%[ڟ1Ouph`e'^@󷋷mY[UfEBW	wK,,+"OU7XWL;zvY~=!r݋N޽8o`T8!LXe1_/vD5}H/;ekH Z|:5T992JS1!;vUԋbc=(X2>NnMÊ8[[,zd9EV	.yz S.hl:hocZ/w7|?7}A"vud;	Aŵ.(dXv?I>HI'5H#Bvbqu~>ML"Q`ƹ:Wr ucq{Ūї7?5#@ɳR7^y]RL`UZZSXN[=-[?_ #>1/N:s GTnIBWOƝi&J!G7[QD06w]c5u3O%z=L1q|Y}&ZvSsRt+ߥΡ;>RT	*޼s`樉k ŲHD8lQړ9sƼ#ɘZ(QyIjZd_i.k)හ,Z._1I928t%*8a6VjMvVJES3	]zW(_/4#Aց?汻<H}cdkz9TQ@RN[~P,#(|*%e k)XNN5=TR=fvTwaŌ9yIT93Dilޣ[H%3v;`{مWڔcrK:ť~|k@մ/?}6l7>?/hU"6u*F4(0'EڧJssUV`K@pϘJvTz%M&竬rq lAZtn)`D6;tRkZRM"Dw7br'9ۓvA]I-N*axL0kP0/0<'9,ro^'6$>5Sbl?NdbOG&ԯ3~="M
+ VFbOG䴌;s0_*ujI;+R*n)V8M$m{zr9`Dw^1VɎ5f;v8G
+8K׸Klñ4۹\
+ L	'A܄Ab)D8  \]3hu .`Nbvoe(FkivY;1؅cxN!zf{/F׼fpf!1R[z{Ʉz?tql8vU-51ZDd<&ĠH7w..YkQNoL2FaE>wZ6\9GC/sv>kTǝ-B=eZX
+~D!}.%~GՁ	8wIڿ'T*ϩsq%7ODhŵ	m-D~Ntb.~jK=_yJxHmcFv |ew9T
+!8`SX>E$lr}W8[DIsLt
+xאi
+ҾV\wpNfuu9dL1OnԩAo)CrItԈ}<ݖYV`frWν3?5 .1sگ?}29&xD`O=LX'ؘ tZNVA
+<7Ǜ{P.ӆ"S\*k); 9u%WY&͂HVtso xѸU<5FG0׾O`r'7<$Bņ5ฺ?{	 2ɤ xsSe珫S^ʽybk`Lˇg%1ȴ7rV>21&&=.L^|Nr3	}MF|M,6Po/9UNy%yi@xR9ӃkC&"ɣƨyw>C{O56mzIrlwL{E՛`y|rڿ~9'ޣ k\_rdHgOÌi3#rRy.Hc03MzozƿHָ¤$wF8;T*?38a0Dͺ m{Aַm2{y>{am=}fmlG2#R:4sV먟BPU{JT 6uo1{p.y	&sWU˧߉ QI;襤WU
+nYR9ie|-UMITD\lJ>%s15F;(ĳe@;DNS0q"ynNM`d:Pi<+.*~ZJE;F;kɣ' _CM{h eP 	PFkJNnN+z__bU`y]$:nF 5Bq&.U8Yʮȱw9#(cƅ R,E;oUv L8 LX#M ՉSHVKFH~5RòF4@$vXV¬><&h8A//@Hl7#Xkؔ,՘׼5ί?4OSQe +ë52Ыa/J
+nLM2]RL<ytBhLXH#pXylWG^t~EfćN	npQČfzƹɃ&=E͢[<8I}9l}\Rb^EOa^~l& ďz	aF,n	#mhS0Ӄ2-3 c2ZOqB3B#>sT;?sf$As2(8Ђvs\fUG)hg%wn"Vi4#pr/CTs(Jib 5Eכ.J[O_?+Y\Q.hU+L#qbT*l5 	uСﴔA{Tq-PN[[K<!KYێRK`esa\ԂH޶f{swŬ}[p8Z]dSTSXv+3dXf?XaG
+f$}zH{-KUvӃ^vowpfl&D[5/W:n.64~cUE6h쳊7X˙6"C	8r#rZrKE%3⥪ct&_X6bMnp!9`_-4Pyer;Wc6KYOdl%b>HT`$cF
+__
+^-ҧ:<hE||G	^ѹ7b=LP_gLI)'n}m5&`h6/|'k){C=G.$oS0U540(=?iM>)k"ԋf9M)y65D[`*>ZPsVng[l<F{vnpT$&$9KKh'wm%[nnm,Lt`K(ܛdLVD2 $^
+|hgʽv	۽֍5"^BgԼ[<ΡOq`_vq?TjLڑ> ʓ|?ᢤ} WbZT`~jd/@Ɇޘ6#Z|<z~8km-[c9_i8!~[P
+.7n;ݼ9sAfy~ܞ>r"C۔OR6Ϊ1ZRަ,~J,goocz~X|53W#w-7.ڦ}Xg|Sn7"roRnQ˘S%:=v	)2	/uѴ{WߌfuwTQR?"gOu82vFj`F1c!q7"xߴ⺾c|]>k	fVjWi5`~J
+?szzˣrŹyG)Qa'XH[)gr?w!JNwp`R*UPνn\S̎y[?Fp OokD(3pe瞞S%ΙqR@$NlPmt5|Ű쎘qu~A:Be&Ғ㰗~.|yj"Q<wZMsbE`Hb-Ҋ_TQHn/ڦ5ZrE7^
+<mH;iVnc[Ud b.Mv_9`_IQ |'`tx,xD{8fSrd{G<	cj^6Ը'OnwMj3QUvN&9Em*u:o8]yrd[*<0x,t@iɥ/Hqh#8 g%wܖzF̯,!Iwx:5T	_5+Ȋ1]?>uf߼ƨqłgi:G2z,߯uAZz".`^`rՂ6IqU[ME;,
+wbofyE3c~{dEmI3o1UX"I{mCDFI";	u}@1MFnjh#r=(GKd9FRyI2Tkke1˭	{;|cU-cM@!L牥vq%(iQ$UU9PtdLTud^Zcjqt:T@ulM5ܮLĒ^ TJRD%Sn/(PFV)tAwq&}@aAUtRa]u~!ܛP̕Ń9bw֩9I;#^lݓIqS_b9/ A_';(s"Xs- W5IdIq,Vn+׬KK;kIaי?R3\/wsG7F=J1#asJ}~
+mpPXrKVI*\b.QqJFwV玘gAR$9)a8cj^B#B{tbA0JF{-MIs8sBcʍӹX+ ѽLY^/!*s3iTBewV`@D"e=JGW&:L
+{cN{ UE⸬h1?^,Έy' uν	?Skǘ(qs#yxGRqOi8K֡uVE=_LnulPáTs+%=&j`yb<yˀ.͏Bߕ&4\mVT+*\k㲞GE[ß rhK^hiq4c2qO#.1zM4	gWfjEJ[C/Sʕ2{FN83Kd=%Tu@H0vR"(ۄy!.v;euWHmL޺>ާ2d]e^5Eg/acR`U+ihN(6Es^Q%@ >k9('֯1AV`O!"pYgFD9.%=7.Xlg:B`z\ݟbL͋^hqkE>0/Mz0)ƍטXnz9fZ	|#ҢDQ>NԑYIFﺤP15dC %*8.OwP)@$*ݢ<b<*l}Z=H皖o&Kt%6%]FHM\Y\<_ګ՞rNt?6F}x4H ,}5k2VCxV!d  vW&}x[yPm].,.fyoӍe.7'FۋN|pw$f&EO"?$ˡ))&8䴦*ʴ,K3{HÝvᓢ>sW`f<!O)/1pSusG+T1 `EΑfyw&$uL\M69JI8jUk;ZŪ.ue̯>,td[Q}x
+xI}˰C=FPe	S	E?kEADXΉ*KűP*K}Ix)fVb,Ito*[W%n8d2\r
+,:Akt
++b}v[\U^C6P+ƴsڄ*.8j^\^v3LjXgli2B%2 ?^/*R>G	򍁕=I= $\q,q0ٵ%.K5V\ݮ|a[ӊTa4b+EreBנN֮jLx{DYv])\$Bt&xJS舋l)q]ݫbeܶŲnATo^`xH1c
+5 cQ7OjE8?ckI:^w?Np?|a8,Fqêqv\Pqt̸ͫȈe:(PJ~񒨂y=3CKy;yC2ij:Eeڠiicg1Da}l@/XMV븂3cajf;/6bVp|Zc_lg:l,q{!W?Q;_TaL$ێh!w+{TN%sLJikE20rY'k_˭ZɟkB#n+2]c;vn6}fJaX*X+g25APrk3]۞XuE=]'*hlc^d1c:{`b<+u6aUV0SC=gH{Ikq=lWF)I} /`$]Pٍ_/1L8?d#{Row/h [vv'3àV
+6:[݂u	GB20 cpb'wd'kޒZLj|ty_ǒ_Sr΢:9ȻNxvIFeHgMw_LcP4I}Ĥ.AA3'Bo[QM/^7>@ϯt$wc15~PR˒^ĉMZpC1uym2pteIoi@UCe5yL\),Qb:o[rpg#?Z\ ˘Df1#> fI?wL+ks#IAOE57Tz?*}ଁ#ǃ*3YdYQځhɠI2&/VYTrO)xwҡtӝUXxN",KLW[`7йp
+0"͌ϻVUuPLM^i#[[@p
+ uG8b\ڊtmWS!w'Ak܆I.E/Ęܛ	y| 	LNT5nt֦g2-Ns(7ē(2>/ܚ s[j&6@a]'1pX"DD+~$>>T)}D3-ڞX}ݢϵ۔ 4әQNHvM$Ƅ|dkX1Tx%ZDf+gsAys&3+{BأN䲾ioKqp?<Ih`hqd D_Ihɻ:!X6<V 89 Dl&E8i..ˋj=~Je0؟ޕP.{@:Nͼ'(wVn2v@@ŝ3ymRLbN"wnO熖JK໼R5W'mfw{h1&Uz-x2Sl#dhn]_7#7+Yբ^5!:Vt\PD^~_:?Gs>$yd{4;aQ89I1 c$obkٰy[,{y*)t]6Je&2b^	t5IPiBZHh^ u{RId_`!W8
+NRd$rXA,~8\ЃqόjڮĿm)% ,cFreW٭
+,Ԓ+^Np^d-Qk9}TA;Vĕ4:k]i
+S{=il-;3x5ͻw!xۣyES*^)2l	Ďiu+*ۖ-9(DU<%`Vz\_`$%sO,|Uc3T>B&4k ͼMi<`cG l[wTnu)6*8ܪ@fbj!g;ЫNO:uҧNnT+V&6*uz?_ŵ>Wf9אּ@$6e/ۻIXf8bߔ;;N 	`4!̡tU۩h)+x@~~TG5S GwZ\ɳ)HA֛Ki;%O	'_iҤ)QH(!T w{YғAI%.uI#XH`
+P315b1qcj^	D80!@{'S#k=AN>@8UGAoig|wiLƺ<k]4QjR}ޡqpDXM>h/
+!Yĭ,0H+3e[/R_1?~7EXx뀅{D~Ujq޴%_9F.^%J<̝wU(Mnɫe{g%␁vNW 5+<ǟ?"ֶA/M=%vlyc:G!Itpfp;3bv}ԛ&#j^W1wdvdgYBzL
+Qk}gz7ep;ݻ׭[RJM42~hU<^hW	9ӈ:j1G}OhWExfvZE bL=ce;v/-qn^".%zSpDoNMNTvI3tǔ'm5tD+?F^?^#oI3?2ﰟD(#?j;eT wF'DΖ\tq2G+"%&g*9#Ӓ%Wq&	;Ɲ#k1O#JYӪesT*䭮gX bSf,3K<V0EuOVjmTXͦmxMS-Ip3bT[h^zdJ?]r7Ga檫 &'߾\u^plJ}f;;
+^ xwp@B!z}l_8R:o&7A`E1&M˃+o|ȢMcƧS} 𜼁cLvDC1Hխo\sX&MK34)ӁW s}fҞ\*-^wU?%qo£ȢXP?Γ=X8cNUVm9BunE@_wtk^o=-C5zϥųsު1DuIX
+fbIMS뎎-<5cFK8)(\a3*7
+7kRMa-As}f+IEoy_FYӺ
+#ˍ}R>m;EttԸ'#q_˹(9'~ߣH3:t7>SCZeKP}uV0\ĭŜiT~{1\Z[$S}۴LJ9xb,p⛋cD㻁?{P&N<:]@Ҳe䃒抍/bbVJ2'<l_Wb?cRZe1cߴ2LqC=a;3s&7J38ǩu݈#GH-!N1ωtPb|3c =ؠsk?:Z/qșb}|ڱ
+9;n2A.hPf,ibx@nU%`Ճyzbk0Fx@ 1dpg)7ur{Vp%I7oSސzE#̀}K-~7^|̗T^/್yWд
+dSʒgH<j<,vOgD"6A=gGD9W^ʌ࿌;8.{GiQf15}[^:'9{6G;H6SThr;C=?GU^'ʎ֛#1hio2oNWZA |%*K*~ByEҕmms~v0w:RS];Ow ;hه^;45(P:	:euRm].~g*J8H9%PnGO~e|TW>n.%/gd;IŮx;2e:qr1qei-2,5zkr)>Uz߮ˮ;O\1zS ҹ8C2&{f.3gUK	!-uFxaKtHSzD
+XkD8iw|i'ȋ4qDL_tb%oZ\T95GQ?f2QEXcfq{cF kO%٣so9*ۋM |%1D%Vnp-cY0᥁&^.J>,dyqË5
+b82CHlJv;\@eC$c2?x5%5j^+x9͌6I/޺tJz~askWyb%cOXN-8ʙW%nL*	B"_+lͩ-EmUEjO101:qHg		q!WEK06GieG4Jij(/K.-ub~;#__ai6h#GtywHނ¼-*a2:E	r:c䌫S;]iKteNZaVx`fӉ'yފc,%2/t&(` n&HG1+vbBYojmTk!+yv9g]e5A!_;iYͷL"(cY'8zUX㝵bs79-.)+W	K`%D	.t?^.uin[~bFLj3+	S<l}B=k_<JӍ}ߣV-؏2Z'0:*m[ˡ[LDcG&&0(32sUYs=+mg
++'6j-#%NF}֛h''D%'ږ.@( hcbo^mS8D%M[|Oj؉fZkR^N{&\-ׄc'U6pS *-'fyE^ѕb1 XZ||G GWĻ\.!3W;dacsT9~]PCGk[\NP\z	+EBvH^59ҧptz糕7ʽpyQ+kIM/Xdv98fQ-73ҾTUz'!ēTEP<zk,B&AGֵ.H;@<Iok%]餆U4JHMnf(	^v]X)tLQ@R9__hBz\hOކs͂VE`{؂ܤX10D+[Լж""N;gPHzϘѕ|jpf!R'Wָm&VZ$Q./R::Uɔ/BBj7	bv:"bnXl_F&dCR6*Y6N#jyQm z'E<G9*ƢsxO
+:r[]o/=^trBDoZڻeS%"2(3kU{k&O%%^BN5c8{=~w{& r͜6s#gqC=Pj fe	ޖ̫X]~0g@BQ&V1uՀqNWxENۅVOPnЭ|yDA>i S8ԛOwSHOݞotQjvOj-~_dݪt>D qx10)òcew}be{Q?\Tـ#Hk1Ȍ /&BBHEBeח~|Wdbmĕ)PR.	_GJPeE9\K5Q5n9Tf1C=~
+e  sYpF}R3i|Ez$0&Gl0g[ڡ`Ul[M:mG]ed|?uq:=FƩ;tK&,"PyQbW1ӭ. 2JpW{2a'O'ŚsV/u&#.Y4%WA"zt~i1.Qi׳׋\1͞Ϫ6YnxN¬k]6Ͻalߌqij`*ڸ%*EOplg8plq"V/KWfuYTQy;=n>i3is/U]n>FҪ9Rj=HXuG>[6aӽ,L˶NvaQ2ںr'ӞƛAcX~:|PzA[@:()%e[K %J[\ŕ9qINw]mbXl
+u`=[R7UEMj<֒LiFpo: (!)/:;xoƀ\'oHcM{&ՉQӽXE@QiueKMTrh&1ȊW5߈mË1G)U ~*U%nLM!B*"i@/e,Şsߴ7IGmL`þ􈜖xXH1yN_&z&WӈSP"@5+?4N ,%9Ne#wQP\Rv<HscaKLSewp91/hNXRlj_.>EI`1a[;R&h:_*vXcW2V %N-ő~{jĒ ^4ݐLz .!E
+Lg@b@yK,@$N/.V]~riUzP/~MMOx5@$GGn7?Eps+}^68E,Yfi[UoPg<ƽVԺHJ17˨ko&{ iIG_Qs!sSRGZl,nTmHrwf[D9"~-H-!b8,a Wv ֊V*ώǗvr]N2/@iJjw[&)V)7:/O<oBfFV3DWfAȨ>%dǝ *ncaͭ2~ 2y$EUSq]	4mʑ9yNc	#X;<5SSs٪o{l_Cj`xZ-/2s#t]kˊ&
+gU8_	ժQ_<][nrai8~XrsaIF3&=.7.֌> DuNUT]@#ν9@H4:quObe!$`sZx`xDl/ĉ #NY~sm"x{mc>n:T%XQ5n!rZ7&jߤ;Jj5rocsiQ5nxX6w77UC=`Z0}f|y}!D|'늻^N{KqN
+Pڐ-v1	<J
+M}[}bkQR_Zvu2dMߖ{SCr>hϘ5Ĩ
+X!:('5HDz. zbޙՉ]?7zdā!)|^#GxDʨY^;V+4:z#cz\ݟUdGMJS42Tq&ˈgއF;Lpl8({nݬ_\.6;#H%2~unl_16C+6D6h=ni[$.NOY ?~G8IJb/;	\/sA%~TV|*̔96?'v?v9!)3yvS]
+-ZL:0y=]}5Γ.ײ<)KI9g(9	BtQzFAr6ȿK'hUWj0۫@M
+#m\-\T|I5{܄i{4ܑ@{e [e?G,(uT߽+ZDǺϩ*]|dqԼ2zM|8m^;Kku<牂{~ax`8]ɴO,;?RyݩaEW.5=l2d(!>/ΰ/E'Z6ٜ_Gǜؽf!4^4H ?}2M [ `)|7ZR;eR8I4T޺ `6}_c':\_WY=d6c]*Ɖb^_qoM%HWz1	o4|'96#E`%55ޡźyP	ɱ/5SJ		oSbue(6s7J0ui)=/ J^,N=Jy ~s2>;?Kg፱3gZ924kQGԺXS,3/MnX6=1A:swʽyTMV $
+QR'oy5#!G	2MAaS>q[f6q%kferW7֤727e2CL8|WhEQ:{L=yf>Tɨ]4ħix,Y	~x7b"/g8,_UcɖMPL嗠gd2nAC`z[`jx#>]X#<0ۑoz<2I;<z'b[SEÆ[paƍO>cE܀fXWT&iRuGVwz^E}cNf!7ח8a1
+E?'g@;I*P%V'ܔzݩЫ%%޻8ʼ,ucU#9l?/Ė"xt᳨>oe`FA|!\pQYFO2ۇx/(͟;;qV&^7Yhd}dmxd̓' ^gC\-={Eqpc7#TX?I+MjX𖏌yp__"bIBѹ7(7; )#E+9d[9!!6bsA:9y/
+K8gAr{㾾95ûySj*X3/"!Ҍ.?6єv9RT>"/BQ;/5炞s@ێGf^
+=|S#tV6-HqꯏpDwZ^CHKiƉ	,L_Tx&yQ&_|E_DzEgLtEԦ}#r
+a*9W>kbpbfv=& JKKstynABB_ P1Wq`U^$'^utBtowYx|]2.n"pB5OIuwj5B@a2?#6i-d+JYpz|F<?Q'SN~̅9J|¡o{ݺuS@	D?Yy#Giک탭ʇC#@Bޅq
+P oY{W];`GXnS2'C%=ZE-Ůrk&A>Eb`MF{po*|(jWyz5A$RDX &]o1^qÞq_,FdlWaSi4,lǷ6bW8yB.]z?t&)iOԨw #k@pIQRyEġ!v)DQB^,̠[`1YYOĲ:
+$mDe+Q՘QnQޕ6ی`ڕ%\-`g9ֿѹ$Ek2{M2Ҕ mۖgUՏؖ;ץ1"J?~1p]h1V/+#Z":vu$<k݁ו ᱌(M*]yk-LOSO3ϸ:Y*Ct`;
+~I\D#bɱuNaPF1X9@(Ɓ,u.ݤ1Spİ#k܉;/]ԲSg]%TT*b|uP0wĦ[<[d=tڟE!Ħ<M?$>O[S!@,nzeJ!؇=w\asL_B8dо(NhW77܁-YQ.w*c *ΛR7.zfƪ_"ddq@5D?S^{@gUmk= $A9zذ{.`$@ iҤ@BHHOқt;H|9ÿg2ޑ]Z{>Ykg2	o,x)_5P|*o$p4LhS(r/|XXFg8HBu+86@7㉯h5*8Ȩ4!!(.oT^\{h&GZwz˧TLHnXVNL&>у-K^ 6p@!a-ec,m-ja?ۄYEJ1e Xڂ~"*c̈l(L XW8$=ܪSf;98O@@&1MVjZ_O&0(?u_ɐ]Yyh\K	o&~hu@d55	\d[%ֳUrӎ;O8rK I,|7)]g4 !$.oG=.)ԉnw3d6?'B@@lU]icud>Eq@jpPux.sc@ܘ~,BpRz\KF"ǔ+'!p4{Dc1!_jnv0 Kŋ+SBz1zIKfKr,uy#\
+v//ΧM _Ԕ5{eECsĤ0NKV5',[JhVԊm'. ǃ {U/IXggUHʗX9h1e_&l/$3wkM蚡^}h1&O4\J"܅?Gax˦[S@00$7$|Es|3$VB1ėMߤ-nTR'f9)f%mozt-lpK꾆c6tN5tͼ5xmQ+w`n4(	,mS@^w{nHJ`q,OoS]!:,RVsd鞼A1K'-9	m؂}G#_ʚ#pW!:c܏#	z4Q26 Ԑ.135Di'ER\܏X# AM"`D=&sUL*Mrp遉@
+ho9S0Yc1+ <S
+a|`_]i2,:űo-[9>51N~WTz18_@i^`j@&v	$啣H$2G݆
+Fp$Aw?R~{aBVI%Ќّ7_ƦU׼$.ZdOU)m|K@ЈdNԣ1Qy@.Ww>N)2t	@okC827I3JßQ}-}^Jz$TEF)V_Wܠ(ڻ̆hBeL&]Ul%;n jS| ӹXQMceoC}.,iHT]-۩}n [cg$7x+++QtWeOD XFR%(2,jike[ZPQ_iU*jE_.D[hD+sv-SY%aįkUZra''uc@b?vM51:9b<b'&4jI_Zz[9}f5r<֩KG?; 6tQm]͚nZnj7mkoikp\K5}~pܘb&~ulqk152$)ifhg.qbd[V˒!),-Bߎ#{ZIDVNvg&ʤ)8neφD.%twAk	Y#gf=L\qnIo'Uϋ}C^/E6@I ;1&.79=p|zxYa-X`U\J?+,?C6V3BbÖ)UHƉ<*d`"mu7ǒ"{a wx)ҫ,)lʚ&th7_RBʍN*1
+OfQ{[+<(K~)4>=uf ?TMJ}Bv&]ɯs!3M_sdih=C/|;x	 JQdW>'|6?])yCك^Va8r<p21hbvԓy1%qhsАάx=.ԉ)ep{Y`s U' -dh/9+grԔh+z|S)X^ʪ$M3C?5U`uMhgW`}߮lKI'۬!;{H~
+NGyr4 Es1&
+dˊUV0_Ax-&Ei3;	E1[1]4NO.fE_i0UT["?I?N  V֊i3wNMju&؞^׵C`+֬wj!:'MSUo3lqoV`EUU=\c9!fTq_q<ۘjnxko;-!~@kmLuƭz{8=vSStJn^381hT2lzP(ƄZF
+") },%>dZVQ
+>:	[&Ж\/ftAL{{-{w"Yw`@]m_fUJ?NkCԊg
+_DYJѓ)'sz\ˬQY/KkLTNeD5-C^lЖQENZ~JHO^.?KcaZxx6	=lq.PN7@V8&a;jrmᲣ),-Ql0p2~l+ -BMEB*ՐYVaK?rF|抹<ۆk9gJH|ؘttHU0=חwG'Ǟ_<k^p3WW31f]lҶh:IZyZ[+BʴTYz3NiaO u}RWy4;rRUWYFrp\)km]#,1Ϟ#5|z[49;@VL_'S4?1^!xpil qA{Ϩ&nS!d[g ˑ_8w8%0fChcʳ40.7Hlʈʎ7["r7L@9bqP42Lӏ[F0g֚\7ՙ<n?w!U'[1^KDB|ESRqԹbxLȞbg&Yx-	Qi!KpV:ENU>h c06=؃sis͚n|wCﻆ.iPPgh-iv5䥆eY5Lr'Tif./;W~@,!n?FOBV ЖvM6+le[Mwkwr%wEI*-%wutY8UW҂/ϤwZŗ~޷dRoҲ2:[/*Q፠-n*3}t>ڧX2p?X:ݢ@L괰1Vj.w QSɗgv\zn6ĿfD61Zeg#o>CL|`в\*~U';ݺtF!,u JMf2o@^3Sݹ$Y<KZuW#+Yڦ3~Jz3l6yl_W/bI4{BWOo~GhZ-BoFE?&rrR3tPNc8-t)l.ϋ)!ٔ/fFN18A"
+6Z`4;]C%i,+gbMn\0P T|	@ܧR3c ЕuE	+?y;7.M[T诉s*>s0pj@Ղ)ZӎU'wSY6"y| Fک .TbWٯ6ܩdTki8fDuN.]:
+W5I9O5Zkæ<O+|fh	ks"ױ30	'$;?R1j626{nٌ`8Tys&354Pml,tZ{G hoI}e]fCo$ɭzUr=T=֏b~sm78!;أe4/bD>bpn.YMHTbЏ&QHC@c]%/.ym.ϓcqrˈ88׌R/]\4nat( pSr*ٸ(|i %Xi*N*^d!#S
+&@P,lNoG\kRy-)ZLPWlko:$6_=gh:KXsUknStSo'~Vzj}|w,1f̂$D$gPf 1ݤ0V9as39pIa#2z<^f9<J2V{~E%~&&8dgCw}Ƿ4:\=ކ^rEzr9hI,|XV!%-Fƣiv3\}VXR5$^z[|9+_1+8h9Qqi3D3JhA'Ӓ5WlH-0)V{"lӘ ֠A4#&,:6-WR/0V3tW.iB8ot:hsdp$@?\	.m
+KcOi=o{hR-tUej:{MU@OGtƾmɻ?w!Q/oyGj	<BMo+Kdy)Dlj3ZPERZa2,{aso-pN֛Z0c#^:)OW}c-7f*|s}jqQ͍ ]EXۮP[u,hHsou]DOL.;$um]& ϷxS4	`x#0VdĴO0g%;&&ShJ]Mu1˱Zwy7dfOŬ$Xǿr>N^ߖmcu'G}>cvtWJ<!`*1}g L| M\&&6 h`%X!I!=zZĂڳ*DzrqAh̓'I:TuAX$`k&f
+|${[褛X$+c}G$J&e2+sDNvϟ6ʺ0PSs	`~^99ݞ
+c/YgR:ʙvkjU/,K?>34yߗuD0W	))O	bDQ]$Dw%'!.:3<ObFsˤ(g2 ~lzxĠu.&_T^a=[>V1aVdd}W pvrږnyF9iDS4JoI|;fs&OKfxL-*]RhySH<Bga5$)vJXj 综oBxv*1S*Spr^w` w"(.G8]Uypj kH-F8Z`iOV<VےyMю}X<+WCO]dfb	;z'Z{;llf-7kY&q`_C_=빴w\#D1{!X9}!,Iliw=u
+K9r->~Lua(]y1%gK	KH ,%(i;=[S^Gr%En_k1ݒ* n{=||͍o	Yh8 L.YVrc09$]ð'(LVLz@{D3E/3Qeႌ.S>Mv/,v#>O}AYZEk<r/|w3]Vr	\|FԚ73E/dEl%m6`V	R'A ƺSea'>zvi9]V<
+Zw+mykFw[uuJ/}͈5W#}MH5Y	Jo*H<0Ob"`#=8+-9QPPr [it<czPI%F%_J|EA'kdNKeR+̰?ʷ"ȣۯh=梧sQ>U!0Z`Sx㕱?8B,KjKf,Fuq<2NTwr۶Pm*de1ճ2U8#ԀLY!Wيth:c7xuiIrz-遉wB'޹?Ə<آ0>:s%T7?%^1;*A+SM
+9ixi<|`喈a9AFn4j)0M]ġq]lko; Z}5]7\sllE9-Qի. DH^풀Hj$s+r92.,y}CWn-&KZNWrvjl"[B^5/dͤD8,p3~^Z\-!]d^#<MD"q>ڪfZLo%K"1ZMha8:`3sekF.(}|)tATQYam/O4qZphtG0n6AGc:;<C]50Nj'i-j-zn1˻A}m"	wUSIDm/"d[}~1yg;;ꩂ2Z2%fc5b-Pxߙ;?-Y^.osv$##EitvrڶZondXLF 4>f;2#^/	7aoz--ܘhayNFʐʬr]UEHjF@[_RC !ilW#c!J)i"nz4"ž `vsggB@܊;[% P~v2,U7bj@.{t7Uݹd`MUI/ZqTsUdoOjk݂&_+2-&MVMqFS$ulH'^=E
+Nw=bT+8$5u'(aE߅ZN'2gdIe"-s,@dYY"[*VʊX0u-:sR]%v=J&Ah DCߢڞZM"&v=^imVwy+ܧ"ԃ,|ƨo6تn(Kx˵}۵o-꾮6q|%׽49Bd[O+o+o5^ɞmmtBeb=%
+jܘTZxc ;	1<ַЯ'o=:*`1WuPbesHj32Jog7h>sJ U|%]VbLr@pDܛ_(;kUvb*ǌR4?qͤ66h.ˉ։Rv>
+65ܸJ'8t57YgM8E8QCϳ\zlǙ?)yFO{_c2aDI;޿K/}ŉӲб> *D:ha4L&-O>XW6}ϫ.n<cƲ7M7<#lDS#KXoFvpzٳN	7CAKֶiIp +R$$Nˤ.U~MR/0
+qG`_G1D/k7GkU`ݰNzR.KS\Q+g\`J܋/ b.[mޠŶҡ=wx
+pCu}|Z)ײ_s3'mR'CN2Yam-iR|`pvN4^De~2ik~	Z}BCZq<s+JQCZIzM?as* [x[ft0&l0P&VةoGM7Qy᎞$qkՂT88kRK*^\T'vӾVr=0E= }uCrϽ㺀wH5\
+nRE(k)-6𷵷SiB^TEmUǁX8n82ީ4-ŪXfE~Z-@_.Qb8pv}C[uuUHvS|m%"#	eQB$|y|MļRpL/(rBIֿ.ڗ,9ꬰV KI|V#ʉ~ 3ux	~o;WtF(N;/ڦ1Gi@coW]Ϯke\ E'`3t+	bVsyͿ*^jzűQ#V"M%\nu;e]PZnÒ,I˺_ŉk%F!˿n:ԅfLkda &x,:r]i<ⷀ&w8UӇ<p땡WN\	6.BLͬ`˦w9
+?&@)w_vjӃ&%/]ޙ鬰ָ.FgTb
+m? #X95 Tű
+ܣ8w\.SU	)]Z:% _fMt7PmFsj@&Xie	tK@6qK"V|owR<Ez\MN.R6l앭Sr_\N(F0mD%nuTS/49c}tlUTrp8|bpZxss>*& n2joZ	?aV7(ʹ"hl­Cމb5EFEzk9Q\aƿN2fX1P!_B#iϋ (hղ 2BSo;&b⾂NM,'krګ5u$4Ŝ\q~[_+{pPˮsϘbOr &qk
+WjUvZNťR0o%02}7Яaig|Y;=Ɲ/eRKPJrP=-*j,SF"	8JėZ+H%4v\%;ĠY/7ńa{1Y(ޔ}ۨ{3	48޷E]t>''¼)YJE ComKo*𺎏Ιnb\ָ/|!uĦj]KwN eT0F9rW9Nt0'BِZlSBz OpOG_Y-N)tvH!AiaЄ9$sG{]{iutlo}_L꺍qo͝jDF_-yG?;1m5|2MT֏`T7_ɉz6ńgzהgvN*1$5"_R
+ 묰vyprf~B̌(?#xG3D&BcY |($ӝ*Wj;]#F5f9`aGN_8-!!ZiM,Bª[bNfj"<L~\m6mLLÁ8fNg(ׄkkSVv{_*TyZEYqG6<mur<h9ђ|2JU,rnm>I%Floc%۶(/nC˦5+XV܆.m3IOimX-SVMeYxUe⧭	,ðx@+<jy>W%ݕ>}U{mp|Oٮf4+jn
+h*I*lPEl>6Nķr?>d5M+@l>
+mהef~Ŕ<$ju+4FDk+6ecaX`,3Xyv;5T
+;1Z2zF%֛`7%{d6%a(̺%΂y󘘬r[~
+ٌۘRa"8xSqN^BbX^1tBT~G
+$T{
+D8*:cgpF͟=̾lG踦2~C7Y<*_\K@SUq$?x+f"@ ߉AMÍT	eݎuWy*//"w jw>E<c}
+_`%@wHfe_IhU靖Q@e-7U{JKlx
+2GyK쿹Q\q5?dVSQ&O*1FA̈7965\7!M[$E|͝i+0-08b3VG60]إ`g`4o\0biw+H\Yp4%}R0mϕJӒ?hcX&i:l N02WT=kUI2Ri\!;!~BCZ=P,!~&VC._oriG"6DE`[F=,;İ_yys{GyJ᏿Zy>#Uijà!Բ]%:.~˵
+wu]HjU7ᚾ6b太nkN=piƒbw̄bryFx=098͎ͦ
+kH]@>RO*,6&qv*g,65
+[s%<pÛ"5HrJ6$H0J
+f!)Q@U+HۄLgFcH2t fYJ>OɎ;m/"8ouR{c|،Pl`c<S.@蚪Tw77BSqIt.Igu(;]*ɘ_RL40QÍkf1>m<U\E)#4@JH,6'M*(+p`/l_t!"p48z +AϳS+
+VA2HXP􊚏tʒʑF!كiU"m4rlٙZVZ9\~Ya-馴Ƹa%ki3ęhd謈ih&vWt>IN<P|1NϐJM56o C59"ؐQZW%>ǛRi0$e5iyZGfͬҊVV
+av\תAa\'«ˋ&tg-j_yJ<Zf0@0n >9Uv]d['OSKgj@&n.]mGSju?qp12mȠ2zhgis&q73xpZ1[eY!і#rͼU TZc3v6-Β檹l =]]M<^xӵJ|%˻ .&qf
+MZ.YnNrS0Tm.
+3/#\\/L/Y'5NxI%FY$ybR}!'Pp\Y/ûW)K>JdH{1D,3&]9uJ]$}Lڗ8\jl5\B1UPD#6IkCay4 r,^:YjiGczK2hXTeM7sso>U7&6HN}yM^n(c
+oi"]mԤDU4*ՃVEɌxK^x	sVp6zHD>'AZ&u<5Bq 4FI@AIP>1w*ANA@ZHhɋ)	)p^&Up*HzxYaeE>"+
+VtbZ؇KVh)(`VbX=噡d^v<vB@&;\b)j<hj\k*\OL3MX8#$?b%/HčDXUHɊh_zVI%ᔕӀ|ͭXXi)߀B*-HA#lkZ.yF~drA5<VQ+\kvZëT_wh"UVVVm<<wBd;܅?VeX;/or'z ehY.0B+2IZɌOzͽ +ʹIX='~w%K?0;&qRt_ppOc*˹jX׷Gݴ\#RݍƃJG#on%׳ㆡ൉O++0g*g}YX!'5|
+R{"5b~Mɉz@xV".cl`!@:lyd.yj(b!8<^6Z;fvG	2J4j0['TBGʷk4w6ЙkaɅR
+&73IA;׺7aQSAqч@.:DĪ9ph7Q0Tvry>2uzqkmPH̲CC}UMr6@xjȗ+7QJ25/,"k#URr$ipg4ץ$p +ȞR>V$^1'sٲe2e}9r[2jY&eâ[4N~"c N0_хZLa_3C;`٦gsc]YadFɉztdlQ L*M'V?/^(!̎qyYuefDEԆm?i&i^YSIi:Hh.
+H
+k; lT@jstc ̰ΜDӔNWaLC8|.͠(vIcZXKF"c46xytj@e"܅?GK*0} UjUE8[@G1jw CTɿhakxl[hU hKPnph"V~؜ U-`_u7}m)M|5tn1P+[TM6Yfnm:2X٩M ɖ8ϫ41T%Ѡ.QM&8/=ϐH2@ƾq0k%A@׽.1!D\¶JI`E6sݫb%n64x"/m`#Q\r 3[g p[Zu4袂/8*@'٦iXSwh.TNo}L0;S|+\s̬J]2lh.dx)OX"t
+gΆʷ8Փ?^].eܩT`/Q]ӚTbdFj_RqH$~X%t Jμr~&ҁ%0˫_8;H8 d40WKQf{cΙR2p
+GXx]DiB~A=OA7;6C4p=vsa,ݧYam \"XȬXD<LxIa	*"E[nzMZ2O6n$>M	=\9|$ R}ob@Rs'ȚKL
+EQ &ea/$ƷlYTp9e࿴C$ bnLChbZ뎝IWI{?"s+V,""EgϞ*R;sС"-W ok:r&tt+% )f\ݲ3O+Ñ&n$Qigh+/6OkI \%K1h(ߕ]@$,KB3!\풀Hx%l
+oboε>McHk=gT(:~,d^4L.]6-W:D	#Ta'`DD.Ie2
+P^̒}mnDn
+s	+Pf	@'1@$W4EB~,<S1=$Sq]b3JU6obXx&'ΆU¤tgzTXMWdLqʸМ4zcb04&m8Q :c_[D❠hyXu	|,gf[eA
+K'F}W9=VqEcqdt9YF
+@-	rZ*@m4Z:9Ef"٥3=!}`++;_3C;zbH7`HS?^; zZPjpȑ|x<3D jlx5KTyI+ &S pUItB@i4<P=M e?)2N'9/,auZ6kgۓ3*4/%^/&"g%_coVبcL*EU28u(-N:tyJ3=CdHo?- ?%0:{
+OC:sF)S+'xxjJLTPBmX?1lذe˖͞=lٲOLL,\36mTb'|͛ 7|p4+amSAYSYtObՏNVE`Sf?^V
+a|6tyܴV6,dsoM誺
+dg'0Ķ^ZNbV7^9+ť{IML$%;z'4kI@&5w_iDX,pQMckXQlE?}4V"$&.*{[d&8-W0G)QU觖&Wm}O'j
+hb!A Y.(v3,r.O.Ŭ!)Xf	̌xEV? v8Xy"zSZ0ʽibqgl ;6+THGݛC_jhTXP|[NC3|*;Z8 ;ؙŋ6hy:VZ/̒C$ ?H; ߰l<)||F5>$쪂  m19,RDEKc,T#"ul3+,;ƔJoz@"O(i)~>\|\рlqSt"3QYJŬYR|ʓEɵV\C"wq򵈇/Vmn:tna|@)lam46w9B*<	Z2S=O$.Q-qM<=uP1,GNk1Jo蘢mi);	Xkg< sR .DeA*ge:{Hq. +˓IB?~~~?ӿ:;vh?yޢEZզ; <v̠[%0`liZgRV֭rhLH ,Nͯkq~ױ{\ kmޜj}[1J7Nr..97TM-p	JURӾs\r|؞;vBgrryq@e;z=k|~X`*ss%PHv!Q:G)>3cD`'NwcM~D*{qIAclFtcE+s܃?+ jwk,Bط奚_0dubb!t9)#tѥ̱T4։1r>AK]QA .;[B{#zt\Mg뺴.h_n q:SD;o:M4@tDMn+*eG=YI&@()-\WLrkYRhAA'i+#s.~7~(QAӤ:} 5d @2ƅBrr@֌Gm2.1b&jrlVXks}ܘHoDs^x9v$4-9U	5SO,͇.1y5o65 gLѽLI'xd1ߚ=+xE -j9WMNsjK"zBukU%&< +?[4Gc2#^rйeej$)lLLw'8Aax-RR>=Z6lQ"pBzŉBsAk'β3shAy֘TP%LK>ZOCxTGZ;!?w![nݸqPBw#&ZU⨪.ty]PUdbT=z3D hVG$h6
+2tN~Pߧ~`]0WnK?ۮccoa- UpQMࢠd+6țh6)6*,&3	R$MRC?A0)/>5I,$EuBJoe)L6莃ɂ#G{Hl}=Rk0կ&Hcu9/rink)g*_4!t	Lr1La^s_[c 甐t.pfibcuj=6j>MT=n_C%eHȊa@s%eټLIDep@|:AI.X56I#%gE>OgB-C[[,.4벳.26Q>24~cdIowaېG.dqY&@p[Ĕy^LآG|;O)'}G"Y,X0-.YNQOY fDhӕ+Zϰ0fl-ozPxV
+)t%GW::=9<^`տ,L,_786]gn `:źØn&/}~qax߲KhHLIπZJWsÀ)3q-U	{W}yF(3ЏkgZk6n LT1by5+)p
+eOTNΐТ<D;\]H$K{!r܅+W<C_~%'NAVXq翯'|TT@r=,CG04ox'r~lK}L6Vu;Z5d' 4젵 uކz.1p@I[VuC@Əz=[qOm=Һg8O?J56A^"zSK~UR:/)_aC6u*iƖ+'AޝGa+' /jerDĚ|(wU#p3$Y@ ,3dk+ NRuqNm`	1RqHrG9Ad*22Aƅ2L=5T.յ,{uZV#բ7qJƦц(*/7o	 --|4Y?HtӼ̕z@X;3˶te4fY׃2 R/⥥l;vQ}4d4vh!i:˗VNWoc|.NZHbTX ^bնiuRN?#.
+7a6nASls 3<"眦=|` )!Lsfh=U	C AԐ/g¶Y|wQx\%k5T?YRwg$	lh/%5+#zhU5)Xf*:6ъbHhXurẂ#Bvq	^I.(sJؔאּxhdz7	Չ XY N{@d,g^ɩ~ɺhl}*%M*(YTmzx}2nMʟ!xFPE-KΖ5SCXǭ<D"8DB+Vo/
+(˰y-8 ( ULE+pcET&nF1VpPZwU~x5${ "ȥ36[yEce{M\络mXU!Pdx"9s=2;M:^SRUPm<?5fc%pw5{_fěX%kP/MNaMJbuGc%XlO1'qVC0f?1*VVZC,mGfv (+샛+	}Bn+XiAF>cXZeifh'*gTE`/PI-˻I?[ F
++zJxؚfP(8ʼ\7QOڥiG馞2Hv2H`ol=eʮY!#w:N)tٴƮv!YVxt^(Ky-ᕾ)5|AP\Tu쯫La
+EiZ,(s/m˝H|&adۚMwsZF2q%#+qYxKPi$L)OVr]!5{aA+Ep51Qf ֒pot&bOZXsPC-Qg)W;`!:qis\D+W̻y֖'8U_~/ƚ.)J#c pz~A.+ xPY8f&ec WGR$\a8 r$tر	$ct &q*LvU3Y/X
+ia-@>I&
+/)'!=oN.h:ƃL_UxpZSڞ;![?	>V\~=&Z`>+\_
+4bӣ|m+<jk|Vr/ZHpf5A0&[5A  7P\
+9@ǉ "vKzr9*ENl/Vg(8/rYYo,<'/#YjU_/5 Y咃q!)X$f-bHߛ*5q_"γSe9rG])xSH/HF/qr~onWMݟ͍((sw(wG-Ij{G`77VL(<NbL.9CJ?/EX٘đRt0o:0>I%1A+-=T	ӴW̾WKo*<r7T3gfZ~ܸ^
+9fݞtִÂ}4h"Yo|K,L;K/c}$hǍ@waaiܡ__2ē ʙKVcet>ׂ'Vpv``!:j:K=^ˠeؠO+*ŔKU,Ȅ@~TbDWƻ.1e
+cA.ynRBzt47=>hȿr,u/U6>_r*y}F`q Ӟ6';
+f2@NWhisJxӼZQL	j(ϦגtW0Rj^-p;y|QFf5]L<oM{O;+=Ȩ %n3_̉~(ǘ	-)5"d<O-tmŵy䚇d7ޅ?W\o
+iLyw6 VXR]
+߰K[`V|wQ5Od⢾4v7pyc
+*N.$߄A:'ikx\UW-FL+;myp}1zj K	^>H+.ū M+%$*=JԊ7GNh7$wYPNMoofVA e=% uoW&ç,+p>fG'_a?{dH7%ǡVqf\erɬCÜGMZUr0b.&[{]}f@3feyw(6~6AcIyepHsWb;>VZ1Y6L?ز5'5҂2pp4|'lp ͧfI4gKӔ8?փA]Zzx}^+X"᠌)=*}bp!{ZHzdtw\Io@$LLP"R"1h+:r;n-;ꉬ8|eQO_QUSC;W^L8O^Æc!)!y1ʋ'2Ҹy]-%<2ψöKӑɰsGKKts%[0hR΢t\&ݩ[GAKnPBB[<|QYiUsyx*;l(rEk!p٨b=9"
+];ޱn=dKUiAnVώzs*</E'/\Dx=sNKo
+D>_Ƽ[?y֭*UDDD,]tk͛7WX'I}Cb ܶDUӷpVxBa?+0F`b>Tgو ܄c~wWz't0ZeCK9m]
+ڂͼ\Q}m=cPTnf]Mij:XAxFb%yNC.Uxo 9QVbpPACsxHLvq˶Ԁ)_Uͯ@[v5+-a:
+8J9Ba Sp[*
+W.Y+5(>P!owAB*	@1ܳ*BN(dY?hªy\ 7'?>;wLM}<!?I556
+mR|>xM#3蔻j̛VbFzv~@3,_ȶ2n(JH'/"hHT[ED?(:/jS%q9J|.:H<i|EAaF`ތ~dFDTFl݊AEG9(Av'L!>?JcL) W(>0%.(nj8hbiKlj\+6综&U'՗ʜg*C²p5sVJ^nkRЦ>~cwtQ$<)EE˭Q㿖!MFx'kM?Uך .J(ǇyVA=0Yaiy88-0Bs!GH4\[i^^VK&8:+:0AR)DNo-LٷowȐ! "P_%֬^ˌuW3ch
+5OlRcV׃7C կFZxn7}˵@"@&l-0qn&c 4vj>܆.&»wcbpI
+P-@Da22t1$/oa8Vсܘ(c[,o˙}U`qo%ѠL(β0GS< ,[ʫJn/.~gmRkj+#`X2#|EC/yq΋n[IN/SC}Zrd(3[=Q,2#x`V,Ndf_ɝ7Q*յPLEq0HOa9coQ<@!aRAvVT28\5z
+`q@(YPsֽ.P<Z^ƫR_;J w$חN_t&0C*OpU
+Zwl 2;
+F̽[7\hKM[4e̢G[kzɺss>9
+yCZ:òܘPR3e ѿΦ$3vi9^cnUMڦAN. VpFU-* BQwb_Z^d|Pp$Q:IKqi#(x6ܐΜQ=-ɵi1:iY<lrp?ƈ&vm^_L.GŒyU ;i,mVX쨧@[ڄU1!tn;![?gЪkNZX:gÂ%xUjJhx` qe`ձ _So9f<D`?yV}	brL7ls0+əCoo,m{0l|f`"/,Rꚺ%|c&z
+^QEN07J細|^-9oqV˘_3\o-!]ĨP\Mru4cQ1Q,2'H<|G{K8)ײOퟩ{̓k<:#i]8*uɈNodz´x¼/bH;Z	sCi4aK(5!d[ZMJқhDswq]
+통شZO-cDnOlN|/N<{{ky.+"٣T	u"+Oɵb8Iʘ >dYcǗ>fQ_ 瑩ß?(+jr
+-6.3OFvb1㊡Lկki.0'+bt yw2#^U%'1ʏ/2 3#^21&7&:t;dF[bh-Γwvɪ	oV6c&_1'1~Ӫ0L5gr{*a0-{9+p$M%~]OyIui_NqƟ4R(M%1~,Kh(Cr7t#B }ƶZzS _"-{ZKԪSd4?SBsI:9jIr9F&ݠ*ȟG}<bOJNJ8$%󷂞~'D6ts.D?r;+0@Dbf|Kw^YMӢ\[ŷ;e{krSco5F@n`hCfSo~0kǔvZKX58гmಛzK{kS)h-V[o|]o̭TSAL%L7̚WlAAT/fǏϜ#_J:#&زD{dZ[N lKLJ&]UU@fFer=	!2@	gbc/Y7Y,ԀRUBvſ,X`IC(5.fg>5qa.ZxVpZ7T%ghjuLXفq'Ŧ?4ۂǧa@RΉUf \U`#5A!Nq&EYF&<}KqUUK32=@eV3oϹbɆ %H(Z7ޱVϱYʁ^"O|(״I1m3 iQ-<ёIjΠ$Ƞʉz+`zAYeLa#o|3-n2<BcᏳKVc00PD:w\aZx38^|OWfdɬJcQD5όxMUANs3F^bxwQ%'QidBS-ky@?3cY֜Wz5 #ս0SYPPVj.3K YC?xUTn#`$v6j|}hlUUɀgY!Q3Jk+i[ժ_oX݂2rr.tx.Ziv+]{"T]璕ްK'%>^b͑j%Eٯ HUs7|%ȓ6NbAHjrbcSתk
+Wlw^Yϥzߵ`KAF0Ľ5;飡;s`b*&j p<V)1WUFr}iSDu0XALia@;~"8.UZ
+v/H*UV-%ԧ\,C4LVl6ōSSڑ׭ <EJX2dE&IhF8K?Ra1hLPsoʊے}V9td9*MjS0f:MvsnmhmR/8X4 /xY"_6=ǜOlg.P0',@	ҁBkBHW6LpXh>O/HY5)o aIiË\Ȍ(QOtS8{g,>KOxS@_7fd4cbb `cfv g0A+~OJ+	%̍~h:ƞ:39r];WQLɧь@ϬZdy*n0&މ_:[;̙2ZmV[YAEEQFBB y 	IȄ"3J""(rzVb}}|V/SNgz4~_Sb<@'NH|lqNbX.w4Kߪd K25;-6j&_a^ΞHx2yVc%rJ}+Kh7sqN0S9ʯ\Ͱ3h59M|IͯKgTc3-?6=܃!bU\!$ U1J+	0Ha,ހ3 FלKHX!!^pA6rR`p|,Wwz:@pP`hpg[iEw@h@5j>n{Wޗl;WpY<UU[|0zG&c0&+9?P`y̸a\
+X[lʱғ66ڪj'U2L7}"wڳ)72klTVJ^o$ Fb{)Sg(e/-YXvsrJTpqʕy-Ϭ `1q)WkjiH@{EV@UT kr^ˠdsy0&:GkYUG7:P(.?g)7}ƯpS<	8brԘ,><s5m
+sf<jE+ h>j"yŎ|X+աnl-oܳae6r1"*ꅜ8Z4)I6O(:op"֛DDaz&e+wN~ɷ
+[<cc,tKm<?d=5(zѭҶ};@a^l6sDiBTVPAFHx	xBy<3`2>`p14ZU?Q*<~p~%M`]i\dN`a-@7(4m
+9Hm7HLF8e(6i~s Ť3>r#<#j\d&Ml^Ua]+t"&)ަ*5ÃvhZDUUk/xwE8
+}N;{?a|P&\	%2~&2As"Œ0k8-yuy[b®r<3|Cm!*S\.ŪdcL+>({EI͈k^,#6;ҴzzEWAYsRk٥W_\&{ِ7CH"kb% UVp0OYÂq6A_ĩȕrm1܊$0wY5	SV¤^3mJ}kB߰ƒ
+W]=LJ@Lآe5)l¿t^Yж G咰kXu{=%A]Xc{/n?enۋW벬؛*Zj[&Bi|+yGXZ?2%0VzHP}D'?zUG(+ ۨbċQ@:LtI9|
+WRԘW3⻎3΀ g߬:9g*PPaҭ kiz2\@`4L9|;v}f6v HSv@n^4jcM{.zU8K$>p"%涏$Ds}){{K2%w~eTzDQ\gni	ШFq/R/m3I lRPT	vM~=+}fLSNh.I;m/gcD|ɊXvQQ n.I`hJkIxO3N"[z?O:fop-]jL-U۬5U.A=颠h銬ZK]S{[ŠA'!|p+iŐu:	L:Aum9Tv>(
+?gucf: JA'FM0DX?c-1huQ`ݹْYo7nYv_sktHkaC,HlabC[x 3lQ%Wfy,I;w(:/4FИk
+3S*jNE<(#x<g3X	P~`FT?bcc[J8vf֋JlWUY`!e|[Z]1~Jv߶V.nnճ*!$5%TndDm?a_׍.rË1,Tz଺w3/uQ}FW_y4T%g+ 5jVBMz&黜4e(Z&{nws8)	6Vwn
+oMu _&tm@OXAX7s00>8?%>tN tLߋ0
+BPUF	%%3YeS{\|l0nr0xBAOL:_riɭk s
+AkoHnל=pR+Aenx:'*Ur5)NΛ^tLT+ %'xcNpLֆb`驒\x$|2xd\÷hRu"kmf|'i	B}|?Vt1ű=-Wa@L6w\BG劔aň2ǀ}=$fzbI0`#
+e3XgDb*{9VB"h9L+_
+_u8V-wa,9?[<Lyyq޽Ђ핒v;^ec~75|\o˻6}un+\]2f@OsHx jǏ2UJ+hdʪׂ}'ԏi)Wۆ>s-6[fۏ5>D]2BxLawBnE0XԿ`dT=aAŋSKpX
+f/\F$GJ|+e
+׼W")dg\A6z[g3qjxePRB@G4=E@1$ʴ&wI<U
+PY6EYtӺHϻkih" RŔaKy}UxgU\bYa#8rn 0\qqfF?q7f1\LZɑ``: ja{QhnI#ⲕFwМ
+p* ͧ ϼHᅮ8٨V;G}ayT#<G
+v3$
+ZOa:8ovas~\'ϺZ V˵i	/M!ܖ_1TK%l-ߨ?mv>Zk)خ}R)245>v]\֟%n%֌ò6~xY8aJp+}գt<G'{7m1X'1&QNep 4*#t[&,j$x,0
+&#f\7)\g`fSPQ,=уd(Ȝ
+og,Ԋ)VM5li>jkbt.yllnE᤟<\V63^U_9!I{}#XtyE+ 2E7U`Yw2J+m
+%̝kU	j/QL-A.8rARFגhP|'&.3^ݠ+]9>uF9*沋 %<qj
+g/aym$m_+~$(ޠyg^@+st++}yfM@:c@I<נG8ޢz-K'iQʗ'[[p=jLx$<pz4roe`?.}Mc 2D$TK(
+
+\D3-yCNą엦j`1OzU@-	W¥^
+2N4hUɕd
+Y兊Z9БHb&@aH
+~ST[m~pa34j,Nꥱ!AQt}!r7&IpkZ;g+ψbk*cѧP3'*@X.bRe\	woINpu)gˋ˂v$NIQ&_m}IִjnߠU]HI>NAGj3g[ڊeU2=}LCzPI*2Segl]!.;;_kHD,Ҍ'+YB^p(Щ5`\-ymXY"k<&'L1{MPG	eְRu0IV.buF:Vtiu&.rسuj8a1m~zM̲Ǿl
+78~]z̯JxwZuc^r?D:~_3b#xW(4|h]7eLD皡TV*[(#<T7(sO28?iMɣد_<mrg<vFG;d)6T؇*0]1sc?e3%y PM	P: -__b1::<\3WTsz]хICc'cpp
+jB5=q@F,@75Y+6
+_r:	AL1;zDI9aP7ᒴ?NALRFZaŦƾSf%5.<uXOq_7YŊ\퀵in%iR8"k+ۗ?baD/sradjq
+6y.Zz{>gqyx[eb"}/&y5ahUiDriizȚ}WyVݻY_w<E^X`qCGs'&]0;vjl{8J:ȤcW*9qS"#Wd0YtGb~!Tr|Ћ{Fwp\P7JZ|gv8&ߣR%IpkPPtyOw/U,3Kێ?C-
+M<Y%Ig=zۯ,#c{[J-ϬCYrY/dUSI0θJK: +uGeYI`	̻9Lv ^éHZz>Ied'B`M&s'ޕbȎ6`U;nF$ҹ}@71h4ǻPb_ePG1J|_m㟷-x/.k[
+q%tڽ\~hH=	d0wX񩨙<,8i̠D_WĄ^~E4xǿ ]iCq<uͭSuT^R6[yzIپ.
+$1ԤG<WwsÎܣ6wJj[7EYsiOڜ+'|XX8ن`XiL=a01j=f} ;z/(/~]F!A=t:Iz65 5/ڎ!gb_z (M^Lw%<y%-Vjr8x/[a"
+W^^sf'RM3"yyI.CڪsY'|9IuKPESE	<F2ZTj@v,-JWT*s٩7=gL|4.\[똪C&mکFK\=Tӳ	Bd`I>NArL[IgY-B+Zc{xOP؎=z)0z#Ų~x߲ɏ|M>2aSU
+?upuMx̓FUap+>hR!ҔӖm`%\t y
+ 11L¤s$çXh+9+)u(ѭ|*r-zZjJ<rO-P.[sYjU{+Xrת4o,T:3GU?\0ٕ\{Lo#pdKY6۱V55Xs%8Z~stm,zUу}r
+g>\+O%Ɇ6΋-Sh˃c2RJ0E@h{ (FBٷ#14#	&Z_\_ hu.7m7zZ K`2`d%hj%)\<M^psݕw	}.E 5H$S6r11E7|GsUوAGkapkNy'}-}r}pG*;58/*II	L3*UJeپijnj;Ry\@3<>ykVhW%bbRxG|t0$eݠ<j]V*UXIIV5]{g2*̠8&;<ǅ*)-2|ٸfo_AZ-i͕?)zE D:)#hUوîq:*e{LjXN$sX6</`u 7(Q%ż+b::-aʬI<b],on0]Ќqؔ`uK
+zj;c͙?>3mabb5V]V/KcT3k EdE.`Jr L4UՋ+1U* x2Fo=Nuwld$WT=;MҘkSE<H>cp?|u\k=Df+;''ca⻎zpfwj)zʗD3Mٶ4]KX؊rמJ:XF۱Zg	<z^TT
+O6E+=}-KP,>ujNXTmysy)V>ȁ`am\"2caHo0-6b5nJ[ ڻDJDMO\Ȭ@3Vca6Wag&tóFE>jԽkt1$sgr% /O11_nh-5~q`8&m"3"13f#H}\#	*TyXUxr+|Ey^yZl_OJ^$QݓEy9$BKbTCteAE`30qx3QA9CZ#Uz
+ր_(E^iz:hZԐэոL(5LuꡟhD|?Zs6"]ڥ z(6hz4a0X g Nel݌p0tm>]Q7ӝ;1;*c=vmS`%)g,y׈Ύ8¤S|;!2|dI^P<p+2dzLC˘Ў4ˮ0ĴEE/^R^%9W**
+-_~F+dd{&;ʺKWjwȗ?Xz!SoFSY+|]bs0іĪ*	qZ%gՉ.QBO8Qo*-i7IUVGq9]O`I_2~դO3<s08E~]k-R'#$a
+䒈rqI2Nt>ţ˰l-ov_n	B$}eԚ%Ykk8Ì(!@}oVBzz_Zp΀vW<f&Nk>#`v3GE|e.pƙ#~2-6W d4ŞXx ~λCM5y$Xl-8˵y8Vyq=UrqV?^K
+*w#nk']㖕]f{3SDU30\@(_2(g0rxNҽt^뼯D*#c@KcWr}|< OVHnı3tDms6E Y>M]|ma)WkkZvJ,#ơ)W%q'[*_ѣm˜}¤p~ U/+>KO D6D*#+AAs{]֥la$W`&'1o6#;Yɪ=_*|bX|AQT:%%
+	}Tגk*տr``2m;B=\úi;fv\(IEٖ7Jg()WYjEK`y@1@g.-z<ie]i2cMzcdOrHÉULde3sPa?Qfh̠1 '$K[`=V_Z;U$b{lXPkxNKľV?7:,`pDp#]B99/*շSU?*P媨їY|E,Y2!J؊kf%i]VZzYTΆZӭ7/Eh(,.ߖ
+ŲKS<C
+'=Ƀv=%վu. [[AxPb|?4 U}GEش[jB+`+SVYN1
+k&QN'PI9CUP%73K,q;B k8ֺIRf"]3r7|	>sm-*Y12~ް
+& RJ*'5Nb/>$Q¨[V8)q<M$Y18-06nYԬ&m6ef1@op;
+C0f\(iRư;~pΦB5;So:QJ1`eY̘Lo>hM5m3zEVEwY/p)PSnP!o V.\ (ԏc'OQJ uN깐*aU	b0_<-~n&5*)W
+ZE^ZP>93?yVmP#Ɇ_	} @Ivx QCTHV46{\{%\VYyA;K*"Zuݳ-ů8j~zz3&4jz܋1Dޒ
+tw"[];\ʷrZa;U]'ҳjEQ4^s S}8*rr|ɕH'-A{۱3u.QmpbNUfw`z\7Wlc4*MB&5L@smEF17;"xE^`k&{uJyfot^l(xLxRTYcP6/DHxjɳ=U3_e߻Nit %}Mkt[{?RݍsKHo:9¤~$!m1WT'B|@pU"Z
+k]a d*q +]%j0,AXګ &P>KJ4<bɵ1=4ӫ~Z]J*Ű״`)Q-0pnӁs@=#)h.{fB&g63Q\̪Ijǁti	JjI~EjyoG$`Wbxy,T̸=Al8)#hU& Ɉݭ%ڐ:aW{00;.2M;-PMo830$*ep2V;Sٚ:zYu]9QGf@gpqS8һ:LἸxL&S`Qm噵l!--eGB-=ˉلdPS3HϦݢR({XAOx
+oP#+tw++Woay. ύp%X6&c#iR.C)]`JTA"~nuf­|(XLȚ9OR6:L-j}/W}iQANGċJvL^.CIss%~~slIE,$G{F4
+^StsrJHK8a-[P]M$ݰʎS8-_lP_`mdZSJ9JXPϙ0A*`P;$[VĤ]iMUz=1PK1ΒߙYo!Fāœ|TP9_g&M䒊b+gP;T]8FDa=b
+1]Zm0RyL;//N,](k} x@G`&3ZF?N?UUcU|V-~Z#͡eXl%b[F}D~VOj4+K-މ36;>(zе|Fi`[ @}8(F4wE2bt	Bd॓|?VdwSdA\}Z;&jL iK?U㱊3&eU涫~GYϘe_GTI`c5|BN%=V+ć;wdBEGL9ldb}s&#PJ[ BU"4w0Vg"{&zBD$2JM?XYhWiLcʋ#P>Z	տVq%`yPwxq[Е.{U֖1\-jUv=gWU{,'
+apn«>ʡOEAR w *lי]SW
+8kv&iytdHe*7	Y%Y4ˬ
+nd&5-_OC.8"3(ֶ"YUPKYq-,ŷ^4T+o(+c1wڄ+$#z$U	t*ͽA/=MM.~\4%`cV
+\W;=t/%ߍ%!Q>VK 3H"9tGK2ýxGhO=YNהƙwg9R"`j	!nw9qpهLJ*O]v?Kg_Jx4$](zK#mku)<)q 5st˘51?8NÜ#x0[S<ھnqi$cs Yu /)1VA}}\! lۃOq
+"?Zy^t	J-aU?Bu[̚\ݘA Vd srW+=&yiTNaJ,L+xXj cp4m`BEsLuPoy,rMpj3_[˨;矋ofBGg(sYW0+FI.6@d>慇,bㆼg4MT_`Ku*+4Ӌܨhn3`\bӤUzǱ$84,*_෈<LQeNp.,Fng7/L/PZHd9yL7~Us}"޽>kɭ
+:1<Ki@7NYnL/+xu}*Ua DXQ5/H| a:Z峒TQYTqlT,O/h̙ (ǳ)U:F֕#o /gd6YSGtפPmiڹyG˨
+:i;]ʒx}En׷Yu@R~kxm.8#UdDZIvІ
+bvpN8 y 48g WecT\x<̠5piMNـBsM`]AgN+Ie~Wԃ3@.gT)&ՋRkm:j䴾rVǹɌf3y]yT@Ѵh[z>Ѵ.U(Lj1z Ӡ$~Wi`_Qu &<Y.[IzqT[Nq
+"?ZUzXэoxUGվ_Ux}v-X	,$37"][Ŷ0#^=3gI:LoN4W0CMBTLX'3BP`q#<$/p|j=3oXHHy9aWh` zϩLB71mAo帞uMlr/ؽB-M3^P'<:PBUoAzMAwT4N4n27FqtǃAxNޡ0׮CZp]@7^(;k'IAŌLwvPQbάE]dxNPX=Mmqяt,ÅTݫ2WbfwUBwfaR#zCaJM}4=huN-Ray:>x"	":˜s(ă=3Qt攖E&JOCA9)፼:\B[h0Jҷ*.pn4ge/Nn
+m,kr´VWbЇ+gRjJt)T7??-tE<y"-2@\sa+uW#>_1;ګ@Om:@1`$7+xBmYnQ5\*XBGw?RL'Siȷ ")ƛ7ZU:c'_YD*Y8U8ӳމ21Waπ\I5૲zK_yjFt)G2+Lp-#3>\UUpvw)Kz*}|
+f5FR9c0U"tUYE_hz<[YT}Mg>6ľEAD
+ 3ZUj|΀Tф%0
+&_.ͨV٠K\rUQ buaN;	]>9JZi 1\}xE190"i|,滶?[	<vcǽ3GL^d̔W>FY_;VO'2wO0
+>\G75oچ0 $uQ9}rʋZl(sNWV
+}9ݏꡄVr\aAJeLlT:FPS܍)=/0\pа _b-<z3|6(yv$גVW/H|`q㟷M@+Psbd`Du.Vmb6MDI!6=K1V;QRLIEnWZ|xZM/8cA+6%\僵y8F8rsCS[xo^qa?PqcqcUAz3*q"[@;VDTz -(OG.:XN[Sr42g*9HΈbBK0eHZxRm\Mcr1LF[e1BY,lEZĄ`NckG[O"o
+:D03Ӫp֝ 
+|sl}$\*On1D<TO;.VHn~xra3Ae;~ΒqҴG?SZ^gwұ,=){?ɌzigPa NȤ2"aC[hp%?Je
+]r$Fk*Ĳ1{ޥWVCUk4TnZL^nOKR92
+*J
+q(Ȧz+dY`%`ǿ<<w9Ag5h gGe@ϺH/ {zj*U=嶗%|Ѱao|u ;bɚ1Ç<J n:"ILyW <Ii_NR| YΩ\QMȴbQkU	fPeRDn?Ӹ6\Hu97\҆͂/@kUBl{2/},
+KAqx8dg,r%ѿ*\lAzK*ķEVhOίπ'}E[	bry1}؏ϭ8e7^|m_CLd@,W´KrW<*pXI{Un`焟@G;3s̄v^)1m^O2["%F3)z3g5({8@⏌%$29zvizf\KfXeT6|׀'7DJEazMc
+kR?|PU<SYe$֎V*[0%;X]v\UrAl&uRUO1ֳv'TH=-JI81s$F-a"abÛ&Iq=I7v3?GKm:2Ibͭp|pA0®V|Xdx
+zsVPS8J,=ezWX\Ax	A1m;@Fޤ+a&-^t+t/Sr*/#OprVEx37J9Zw&|$>r*Z=PxRM}*hڛϩ`
+lGؗjg&<131:H/WV1~\;_-d],Ϩ<4=H71p	4ٵ6[ȏ/d.bEMƤS!/.G+~z~>54;
+M_	Wy܎׃R ҁm	j3mF%pvϵgեkT1W4F&lJW,苂/>P>
+3_'ҭ9 YȎb~PP_?6n*wo£^M7['h[fmw{piveFP}8/pJre|="Nh) s/_.9h;	ze&Ʋ*N2x[ǋ0Pˈiɭ/nI	BA|?"] æ1VҸ/7CX[*`i Yp Za*םvy$,֒ݯ*t3dh0C=\D{TäSOeȱ߆95-:oᵪxA1{²QŃb,x`*3!a@$0	\-I^fTTTݹ.eV2ͳ>|UR(g+˭xςSUi1\I4?y0p>	A-ǫ&IhHwsK/:\BWs=[ڇW.x莫˘h%rtgSR^Hr~	Ԭ&Ӊ30GpBbpw8Ew£p]Vzw$Fwr,"sExVluԮe"2I00Rh$J|6"%Yh&  lDoUh+>K |(4Qt0W%ǹbR9QQmneU`ea<:ms|ꙕ|_Q'I:GKݑe?;I)GFG2ǈs!qzƎQ
+`wLs$VλtA^ JR/MOJ A@=e0m3KV3j"?5v /zv%L:%C;`xVyps'OL0.crvJz9?!zympI>NAGҞFңIy`qz[xɒkq+$E
+r;^J)o_koq{GT>~19k k/M_ôy˒3ܜf Y_'FU/I}sjf44p\}0:sW	)#Y_[RdU+o۪_*w3]%]H+=Y﩮iַ*f!;嵮>WznAZn8"O^,_p(Zm _ɉ	 @wC
+Zpk24F4n*]ޤG)[fleT[Zp/)8ᅫlW#bL|	lp(ѿ3Tʼ^A'j}`:FZ|:c[ZtB[ЌI3k T|>1o
+W*nRcƐPMi&08Vk`ɥcbGx;r fqG zM4 'Ĝab)ZQyxnjEdQ e8Jڶǹ<dK[RoplGKg+^ce:78/q>:\)- }r~A'8*e|O\kI\nrكZ% 3H6. a^3gA=zNZ_|ŧݣ*-yUe_p6=ˊmHXc1qVH
+hlh4j"^s	KRϣ߰IQx!	'DU#sD-ZOs8 vwboaU̩QWP$\bG-hehpDwtLT;2{<bwpi93'FMq+B}̎i}q:%/VssĴXVy0f4-|ƓaﱑNg^dѧ.lW[2u-
+fY30+;f+Ch>zU:K\iz &:nSnS  zA-@x(1[![{17m`wc
+t0IAC,WxŊgCA{Y[z6]ɿK1.EH_ \
+Eqv~Sd)G=Ʊ՘U .3hg*YYB^EpãLhGs٩ej}iZ=:kmt>ajfBptW,9q+hϥyq=ŽܪDZ*_2(ls<FǠ=Sij9-<y0<=kTqU"J{N'`:c4p騾aL&_ү;.BR ^:h-iQ%И\4/.{Tr%Y>%}|#ʙ5MUj!wH(V\Jo^V,GjmIڹ3:)[YFqgw#VV#	j9\gM,2USo.tՇ-g.Hl9Zц=:ɖ^㳂+isgf'_=A:hr.];;>LvᇾKJ|0( m.yb6TnxWHhψ}}x#7j6@yHX%h;=B'q/nb-ݙ!:J	8J r}[G%G[qt1Ȗж,=.
+bNnzt "KM/;
+_L@J@dA/ǌbu	}z㒜dqNY|]NO㻮
+۔wLXɰ2Č]9:%t-31[h%l.Mko_|s_;B4x{V
+IhZZsPzM PuRFw`I-YϸrVU~({,Bҭ*/Cn$LN(+V/}fcn'3XlTI)W |Tg40ߺ~uD3Y'`ɋV9+j+o+#]F^{eE~A4zwCgHHmg~alMí9Z<`+yGAm}rO?>}Y;wQ3FaԴ3^%,WI,ߥU;OL(he@9!AaL[~gjAZe)\K-1׋G;nNJbP'FMeYblF	'>KYzbQ-VF9z(	eЅ}Tfk"L*[r:jtfnYNB俏,u~~
+UN	Ukc	sCxyUpI>Kyw|TsΓ?Z9z++6ukW2,f6*eqø6^)ROI0rgqH0{Hȅ\`UO~]0gg31-D-	SadILj)_z6-l%3vp`)Xtrw{E]p~# źˁB:_rYel*9_JLTY^yFq5^BVv3A
+2}5^8y&'^}D  ]VA>pykZȦk!Bڈ䱬XiOU.F
+\-{ls?+y
+M)_::݇لNxF#6:閿VcgAb^Ԧ%_[zBRUW)E)υI :ZPcA]<i?2<IxM|
+bfṂ<VNGfrtAe "(uf@/Hs~;̔b@ʤJ},	 .]eqtd&KRY鍻q z4^jNe&KR.YJHWF>& HBޜJA5;$TO_˜Ye%z,8#^PJ\ٲ WXz,gZ} jՙGĮ>pIU.:$\h&=Wy襓'^E񎕷\5IKO}Y>&Hv2=>%fqrQ֟+ ŵq۲$˶3kS|=-՞ D^~Dl?ߋ̶,ϰr#ü	`.{ȢDSLA>^4gl)OEP~/<Er/20Vc76O8Kw00Zޱa^^\wjAftKbQ5QJ\*-Nz\&/6Ǉt	<aۖ#xci+(H2i<[;ko5t3%-=seI59;mq2,7wyX{l;TyVz&L~;,,@\41x`\u<ryp#\KN|( xwq1яڅrP~_='M\T1{=kҹmo1~F΅6`qd͏|W5
+wce%A[҄qޑ(MbJPAfr PS`r1ۦzQEs[yACx, kiZ,J<T:g)'b9X?Y4ie4:Mw3O6Ơ=	,yH0pm/_/Kpx߬*Gs7zRp/x)Ձfpc+YgF@_k[4+,R>pҖG9X	Ϫ=KK#.,Gux9!Z̭8Ieת?-Y4%9K-[ kLLA"f^Pt{JH3n;?=90%fGA.hR(&]%t{JF>^ɀfL
+{w=5ʖG.Rm6*('/Adddd322:ut?Z4)'6\zA߶<\8V;Sd'++asy{:|e"0U1.ꦞ׸|{^Y &a16OviNf_lb2ũ#囏*՞ FNC&5֎Ƹ\/yj ޖ3 =?,ͷ,{cXYè9;z}kHk63<-՝\{QWT >ɤЁJB禙	|Tx2- 톕P@n^:r_0kL<`Pp8I?A1w{|`MA+Y8&p/w:1z@A<nl%ia I"^>yqVyBa!dZ۬BiD8h*C-LjBWFgVSy9XER`Z`Eh.ZU0b+2WZܥ-ϼ҇dsUЊYc	y;Z	wEq;ڄ,q	CT6"\/d	ߚd0毪<LږvܣӗN;jFmm,U'-"Ϲ:sRm,2gZJ&Wv:rEU;Fװ ^<ZI]A71_{51tFc!Z{!n 8=Y^\O*z';0Ue|q\~-MO-JnrPQ3F3X<('3!jS3QN*2MK\0Jt}C5k̙3W\9qĴ;`ϥ P8STɏEt`,|<78	*onfuB8U#|OT!-$ӟ3Y9Cs)-BOe
+8C1[yRZ LI%V\[h^klf
+mF!|ĀǢΪ{FԳ41vyLjXMy~*ԳRQ噵v-,3A<?S/r3?ԋyͷ^0LLs:4A)/F\5S/϶OiF0k0wh_ A,<P>/\xIп}UAa`6VQKH??u{h +;Okw3^.f􈗑:p#TlTKI^\7L0E9^Yk3Ī$ñ1!t71XH(XG(pq$Y6eF|6i X߽8g˦q6GVxpà'nnLà/|S``G+S_Q0g9Efn\b.y[˯in1ʩ<[v:osAO:N
+R; NWa\^|˥
+)zXWZg+AҴw	/n^50~x)coiN_&ƃkܵ<n% X`=;^"/(/6fbay  ]'˿тL/KYw԰p?OW-.3K7"ӿwzӪ6o|xbe˖G?eőz 3-÷0xLᮧl~C6nq_u5>s~[oG%7|՞	Q3ֻ0 I;/G^qmP0zp&x=3n''d NTqsjwb?FYyfAfs̄|˕@R+saT-I=4aʥ|ڼ@A^V.Zq\#`+Dgՠz0kUA298mYl q89\a\'xڻ!7O\.e%^PϔQmU
+c]pE&^ė+2\0N-y^BKg%-445s]kOߛU^|:J&EMN>е K
+]J4 j?cQ)bQ:xI0s&9;2ϯV<Vz-ƴTiV3Q)p/; C)-,졄b>í?!hK*
+pW0Ћ++CQ!s9H>YF|raU|e!}uWrlvNIJ'WG%!ҨܯdU˅w9WR8V5?'=֛C*\?NkRLFw~}e<S	;C=TD_Խd,I=ʶQGA_>RLNWRCQ{~£<$my@`\LAVةVCa9nX!7N"?:I/|?ŷ~8wH_BC@P%J/`lt<\5sm F0Yw=b{y%2PgV`'v&J({)8:Uy9L&fkm?r-zvzrUL@zz>+wTr@%wԽczgq5^bkM杧$@/yqrUoԓ)Ra<^7W;@zf]EPD5`+Motlz^#m{*4#&]MYRYzz16*J3|,9/OU`,\␯_\JbQ	. GZN#h@]kāRRSލc\/JX7J!/uj8IIql5=yl$$ׁYcIA#(W)taz@3oഀG:&GhۻA4w ۇh=$Nz^*mSqNὖgU+ilϩP/OWl1HJ`#̑N=Hu=~tʵ7.{t6g~6$PW?P90㏪Pplr\Z;)z, }kҴ9+]YMͩtk;rgYu2Ѥцk5RcL!%xE7M2;xԋh&>(g9	GIǩ۱?L:A0$gy"nՋqY:V&		}#5]@$+^Vˬﴘcvr2GL߯TC}S}8>fàjH*WEԶ^@	m2,F2Yqem*8dR
+@QU0K⦥)~rWXMM/2X߸\V?Jn7Vf`AO\0j(矙tL~V̻6&{3pB,PZTq	$
+ZzSn@F@FAli0U j*9`(ܐE [;]"{YZ`߫Ȯj/W/H?2f<ȿr~PE[hUIܩ"&VĽQ{K|7q #i¤[3ӛ7Cw6ʏZZ ZjE`ZuJ`ѨY,ሚpQ&Ga`┘AZLH wE);|/"G67yN<H3xquЄVmLl.m*htKЉhL';4r]/_ l<AതHKK&tH@?d,π0TrkzFgnedi8~Bf\?~(7jƮM.z`Z*սx'z1UVU:gv _i5ufYlRD0'1|kfwg?t.93q(Jx\"ǫf&<qQoghI*
+ӎl25&	*W׵^滴Q2ZN"9ǉCd۶mW\9iҤF;	"k/(;c#r92H,Y&2pXƶnVgjVJ{4J!s7>b<wqA*7|x*|ēF &7R4=鰙b]1*?a @gw#S`Ag\
+wUJ38#sM7|WH	Υi"$HF=!6JQ5frHZ#y'}H_}"(	>_mA˃}o	zcXcr_0hۄa	:%Q!=U:	{ n}+W=`"<Nb/ڂ,V@6
+2Mݟȷ=^ƿك0|
+PKa!k.;%!O%r])/˕`X=L	8?x*T`x]SzKY&@k@n&^SоEP|o0IdѾ+nYxDx_To<<ѪPƟU
+ֆn-B!az0,y0t,򲜊LjTws~u<@tv+EIYVGZJETقC?JiSWKM- 5qUQ$];Ă,ڙV0Q~ !i况')ϐ〦J9aa;$lsqϛE<,Ҹ:sǻ/cN">ǉCd-RRR<̳:駟>G2w}|bCWSGollL,eg[ixj0i	sܺ\_9G1׀}?+x	vk^Ld1\:jhsa6og Nq5:v~b+ ,nmg0Ŗvzs,G	w[ɹydd&riZ=Of+Wy-wKЌ_^$XCTwB׹&QU)InOyw@!;my0(itki02dpy0ڠ9q
+ky	3/?+͈DK[rϘ|6
+;J-e38UI(=J$tyfQ57*\)gIkЧ=m;}Hu£fbs0ΰNeqm&]{w:/X~ڋwڈǻP44S2<rTG5zЎVZkqn~W:\iӟ8 cpw;*-t͸::PQ끵17]7b|do5jοpU_i(5gwr<U08x/mUgż[*70
+6Vlq2b,91zy%ڏ`jP׮t<x<6|QK`hb%,I%,Ϲd]RYR<[=2hdOx$>tY/H>)?V6>uIqnѢ]"`fqosv#m?
+/lJ񨜞ji\t=$cƘa3cBSv/	%(r(^t(P!m\3I徵Ԗ.4.v~̘3uƼ|yyk_BMPjױO\M7@nE˔1P^;E!}uv*^q:U.d㬍rIx=:"oHO18[Q28Y6L.㻒u$jUߵ[\&%mQ4MmG@DeF&qKA="2c.Hȷ$jˠ%NVIVy~	[Zޣ盼[kx#kUkOtr]q^?{7η\JfSMx^6|An`KeOd*DI-C,qheIIS=7-D@?"I14XEHpfRl,<(9y\vFǲbvA)-9B"<'ᚴK)Fk	rԃ-DYJBn`i$'-?ym9<OdԧfGZySSݫ6${7f-<g>ּҠxޗyZRka봯,ݧY$o%')n,3Z[fQOi44_-I2yI,ԼI wv%@3d<LbNj'ќ
+C9%Jꏕ;y(<"_ZBh+k(4m*XJu9PPdɂR7xڀ>[oPҔ\jzu	N˒sUC"EwUD_XFÇ*U*((aÆvL*'ѷ+t#c/x8*,g;L"_Aa5	 YVpe<q+/;eVۑWlpȂee9ٔ!$~>Ŵ'1I1\뇎pA.R6q*<(I}t  \8(G)$EvbFP˕0t4«e!A=)1lQX&.	'Gʓe	2r}I1f<>UuJ'ewcMy9b`CI׎@>o2c1K\a$ud\Vu}[LOxUXy$svF׽`KmptӹQHGW^ts\Y)~|;LfGASJ3a%h 9J0w	aӸ2+y!툧ipGtNK?;p-Qc1k#@f4"iIA%	J کn]7kbiN*P
++{S8!X~zw$~޾k˥Z{u"pIPi'|2b& ͅމyJx(`%ŵ,D[Vm7*ߵ	SyNXODښ~s7U뚖ݝaun3ᩊFvYuK+	UiܘϏ30<~b?HP*>oJ@inRM.E)S'('ՆnlT
+2n?Nu\Uxa	8xW;X8ZXy%LI1^?gML:`ӧOߴiSnƳgfv2OUsP蠖-ϻd[#;{0};uN`H>ՅGgZuFjmxS7qeD<\B-RuSKcqzqr|siVM<E\ft	$FOBEt.=Dґ,yQS`hƏnr	or#)q-)C|NKZ1&I^Ro t/?rg&^ke;G	À;q{yK1]}$D}^Fͽ7!A)hT%!U1e\Sv#ϵw;G+;Dhwf
+MiA0\2+	ħPe%ZJ\Y6eq]$c$fM7X\?æ?$1sK`n;d䣲BUtu)e!GZGv>5Û.y>C5*"a$@~5WI$ Qr4dwZ/aRGgK6f5^ ~zBO4ÛZB'Ӕ{B{o4|N9vӴuh
+FydxVmcwJOS,y"qOiy-t	IB"I'd \1Im+
+hHvYT"dlJ6Gڑ"G㺼ĥiJxFd	>ѥE5e3`Yw'MLIxt-ҭ*w?^=O[Ku1ݲ:Kߛ>VruХ;gt-tlRd	3&VڵkW}|˗gv2OU?T[J~	t8w1>&[ @g AZV).?^1v+1唓QA]_Vqp~+5] n_BgZ)r|uJb*}]}Ȥ"cDM8{{qS:@XJ(R6L5J7K6wӲS|*7/&CvT᯻ԭ\%EߩoKUt-q]T.BDv$z=e9A'٥(鿎O	sQ~UVJo_I[K 6"-IdԊRdl^_H))}`@Cn޷NswdfIB68@DaH5!?PgW.ŚL]Zqu	BU7#qd`s
+]F|͕-.>Dߞson$Z@1<@y3o9\2PJ9sKnGs	aSqbk1_]TjOz!d{;4ϰ8"E<OX:6K"
+$7￼=TݫǣznU:4
+kxmQFjh5(jjq&YAY$QQhuVD[JJ2THQ|~,LWv<qʾR -O^9Q/&Ev )O]4-4(޵˜\#1#R3ya"9.L<?6͊ޭ%ځ}@QR2*Eރr7,.S}xF|}p!J>V;8>&`lW6)"SNϟ#*Uz3;
+22nkYxGQ(-\/9D&#]YXY2eqR Ց7uݕ&ENw9?tɦY\1YVel íI+U	%Jt!K/DZ:{CSG?,1jΎJJr\SҭEݒ ٮ%Ǿ&zM.2㠤.e_aX$B.r최*JDEHqc6b1;DLZ%0V$[Reyc(wJrފe~7ok,y`bń-Xzޓm}rO;$N(>T;y r@'G\gG+b`|N|ou3@*"	y<q.)nu[#B<7\Ďo,Aҟ.DăE8Ifk޹).Y_n~%Ϛ	Ar"e[e,E]|fFybnUj#!!Hco!$tvן^2-6ͻ׍|˥<uٟ(n]R͏wrVjd$8QN)}y`::N/ӚPF|>MyICZߥyBeפIhT /j!p5teO$
+4˅i	&Z\[N
+$%{-^|M5UnJzJ$Fsc4$NE8O#u'k87]x|IH8*LIE̑Tn^;F:'Tl/Thp#,c+͗M"{V^?RFݻgv>'p̗ݑ8&p[?T9;J4uCaeUF" DVzS}[%$VTSAtNe{c*#+ߜaIr^HA؃K˄T%25m	]\:Ĉ~#XTJ&'-_B,^k}+/,U5]O4ȘY(,8O)@.,-iHX&ES2E!s)\j K]R-Z]|*vG@R]3ĤëM~A2al;TXW,6HBY6^>5hQmߛr\ZH;1cnsͥK8VdpqƙM7vR3?h_v!$P23&x1#\əX7_ M(0xolv)¦Ҿ<Ā%[cL~ZCe6keTp[K`0Y}ruT|DQ饉coR怖"4KLԴ	t$󞮫Țm}*K~B;Vy%Co^'4|ķOi뮾Jd:zM">$jM]gN&ʓѿgsO$4t I{^r,jjRx#}~Ҽy]2uD-Cw#}Yx²`)3KI$@w夊
+ْIYЕH>#K'u+Jѯj.jvn^-'h}X*}/w+sKzh.U\6ka#9dJ4+Qd@wP`0rn_r:j0ÿr\`0規3fl޼A7pC>`°abbb J(2`0`0`0`0`0`0`0W_9VZHHHtttǎ8/exf͚Pm۶q<;w.pd;|pNV;K1rU뇇ӎ{IQN93/$G[B@VC#Gs	W_}uʕ+[,=3kD3g֮]@ wEDD<#)))k׮;vZ@o߾|W_}իW/n{<4hЈ#ҜʓKrf&^ (Hf)\;2/s͗/߉']J.sδF ܹsF2_?x`}}Zvy.ƍ3rPU93y -p#x  G 1cFXX3ˌ0:F @+Yd>}ԩYfulg[G\'+Vly.^:CSyr[ά)2o$lp18rZ\2q
+*;.cǎ_>B#<y{*Thћ7o֭w)`֭[sӫ*"" xtiNm9<Wv/.נAz>}:.;v숊om8~8jժ)zI_l'|$
+"/ d4H'^+!8Hrw!YveF}>_@װa /444>>ҥKȆ%'xLJJ.] d4YAWaz[ڤI[oѣّr|ȑW_=|p]
+aZnϟ?_\9]YpHŊr8
+N@ӎ.pE /o6mbŊO.B2-eθ=o[lmֳg`
+@FzZ/ݻ7iӦ<DiJJ
+;;%9/)^(Hf.-P;2/pE o/z:l߾=kJF @KHHC2֮]P>#:J*i]D<.]Ow~<!%ڑx `0`0`0`0`0`0`0`0`0`0`0`0`0r!!!ZըVZÇΜ94mtԩ'`00M7/V^}Wo޼9OSСC-[.rw92j֬k]/5?+>
+hٓ'OVP^<>}t#~#g^PҥKs-`0\)իWŊ{RJNi񱱱뒓9/t)<<<88ۻwUrƍ.\xȐ!GiٲePPP\\܂.9WE)r))!!J*\zl۶}ɒ%U>}p5knٲ%ORo6[lB*WU6g:t#`0'N@=-Z Zn]fAMRR7|;w._U6oLVF=9L;wرc۷6l U^$EFDDpO4Xb/'Nuvܹzoqz~(~ʜc΁7rUVO>-w,^q>3>m[}Qr?s<pE #z3;:@	$P2;~AاcǎzÜ[X.IRXs[p!,R	Qn?o={vkؘ-ܭaI7o6lt?W@=4`0	ЬY*UtΙ3'E|0[eQQQ 羍7r^I9j(EسnݺEap=!-EnٲˀCĉiO8b}~_iӦ]wu3׬Yç'U Q٧~/G~qP#E3FBpϝ;_"_ I0H;{CBBvZ$9tPO;0`m;8p+ڵKN>bŊ3,Y⿯`0d8x`%t}e1Кou@uӦMf}uZ3R$:)	^y?UթS~B3fd:wf"	oWp]vPDpUVk>|3usNr.]TPa͚5dv<AL7>qɓ'Z3R$AnppN~KS䣏>kh5x޽;̙3a?쳜H}lӦMϞ=paҥܶmȾ}-:a'믽{++W^d.;5kܑt|G׼ysN+_3"y1RJ~ƍS$x-ꦏg4o(P 66RNMMMӈFCCCzIN
+G`0)A0أG}[n.c0CСCmڴQ^zmܸ1D2=
+3
+endstream
+endobj
+10 0 obj
+   277787
+endobj
+1 0 obj
+<< /Type /Pages
+   /Kids [ 6 0 R ]
+   /Count 1
+>>
+endobj
+11 0 obj
+<< /Creator (cairo 1.12.14 (http://cairographics.org))
+   /Producer (cairo 1.12.14 (http://cairographics.org))
+>>
+endobj
+12 0 obj
+<< /Type /Catalog
+   /Pages 1 0 R
+>>
+endobj
+xref
+0 13
+0000000000 65535 f 
+0000278899 00000 n 
+0000000141 00000 n 
+0000000015 00000 n 
+0000000120 00000 n 
+0000000455 00000 n 
+0000000241 00000 n 
+0000000772 00000 n 
+0000000751 00000 n 
+0000000872 00000 n 
+0000278873 00000 n 
+0000278964 00000 n 
+0000279094 00000 n 
+trailer
+<< /Size 13
+   /Root 12 0 R
+   /Info 11 0 R
+>>
+startxref
+279147
+%%EOF
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-handover-campaign-rem.png ns-3.19/src/lte/doc/source/figures/lte-handover-campaign-rem.png
--- ns-3.18.1/src/lte/doc/source/figures/lte-handover-campaign-rem.png	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-handover-campaign-rem.png	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,1323 @@
+PNG
+
+   IHDR  a  k      	pHYs        tIME	7   tEXtComment Created with GIMPW    IDATxWeWu?
+;|=7Z-j@ BH " l`9la,YI(}'^kEŨ_5~5X℈WU_WʎW>煔K~ĕ)b}3$0 ` бxzBaӊ<䤇	5V`Lmov?옴V~\J7?,otJ|Ee@K<2%yu:ȸl,)G{[la%q~F(|\ms[ٷQFe&mp7zX "WkLձoIqYye*.:? ̻ۊ-}}o YvEiv`i-c>{ǂDo;4ϧ|ȶofQvNJ|Y~MDv=⋆VԊEzC͡un]kn+L)s@l#dHMI J1,4>vqQx}N 8_80e Z2w[P O68aJi  AecXN8i?z(ސP$73dO&U5 UcBT M]~
+AQo#RoSpM%  i6B[Qz^zc6_Pp綵7+^Vt'N]AjCW7 ^>;l0~+` yn1HI @z]N#oX't4=6k|",xTSB@:^-8Dwt1,F0kA}
+.@ 'eHlK`Ň9$T=\ֳ	2ef%+:	u,(Cw QD| pNHM;Qw$Krtt8%9`jQJ6C$	ko??!!Q>e*d9bYt tu5E]xD\驶R>sT	)*ڔ}mm2w2B ߆8@VJ
++8O2YqAJmL%Op(bXwj|4;/W[?g*3"Fاɉ{OSzk8$U%?ڷJbbJĻ[5F9k;JO3mr}+g8;nN'1>l?əgF	뮻"B5G"бo#6٩.==ƪl\4ruuG,X)YeJ-sj.CuaPE.6M*&b^o+xVfCXqڊ_&Y  Mߺs-Y&P}uG0}o%$su0|--[`_<ےkunruR'Qc<4)ā,{
+B0
+dGVC8<gR.D%[փ{B-cb뚧Z|CA(;_\oa~+fbL[ ;yu>'4j e*36]]P` sq `
+q s|\!܀R-5<Ah*'J(0pG0B(!MbFV{-sԀX$aPM<,#C]7 8c5yT>B,yȀ'XTT .SCU aクz^l 戣|8̞R-|4{D`1!90Q+g4i=[vTmxP1)ٙ:MɂwR^_/_vVmP/nCf
+bL#۴z%DPr?hr!1Ɛ'`BA"}AClhfe =XFVEe'wvK0£)'4T%Eq.4"+lX
+G%Q5EcdɎRoP	d6;;jlۑ(pf	ee\f͂)	uM  Yih2CSYW+@["v\E&8ŵEqp62JŹ:-Ua޼2FodԒ{)Rp*ŏF	\QVvef<D^4={jGpQzk
+ߦnV%_d]oKQzm!)D9ƌ#f//lEy?\iLsxRP\vAtV3Wv\wulßRWDjn@ski@ ``F*,e	EyM 3s	x0%ѯ3#N26S1)EH0D=Pc12L;wx:+[ΫXk "9& .neI_ۊ?U+kSu%;814L G0=QRko}dEY~ z-qnW|G@-!ˊGgɛګ;g&B!T*ߍH9e}24T> +76<C[썳]eu?]kL֞1[^4}P)V' CըفфHuͱN,7sF:S11g;A1OX	NPD@}j),}Ld]̀
+!hv=?l:P!0S"cwJ""Z3r2ħb1Д 0~'bRg&
+׹/;I6uM՗$٣6CEH>u; 7:QvQR77&)3pMu~r X+\ćk\ygקW#1KM++6՟fWaCE0U -259&Fzj𯇇,r^A@E٤̎噢@pEͰr`;0)|ΐ\]է<Xsn4NZ5<>dX	78۹lc
+ ~PٸB:Bm;fvx4SkDbV^7@>#e@B&T}M@@SH4I1?Yf#Qf*jr$E(:	.0uXk.l*4*#ϼh7Og(?c\W^%s).PÒ*-Irq^3|NfR%㵃NT7[Qw[	
+dV۪t{,cD?16F-;?|0(~YqZDn'jx-g:wn?u7[|nd:8Ϝ2RtOcSPŶl|de{2)٩!k'-6X^4p 2}l]
+t*1+!T^+ۚZc1(5نdankf/g}Ï]_.Xw(3fCq`8]yiX;ʞZw	Ǿuڳ|Bx	>ML6@ Z=Qr8_0hn|1(|f|-iZEϰDeِo/n\/l![$Clm_L?yg ya'DjHOjbtt0.#u RZBM|zF9d>n}|Q GkxAT65I%<1$ 8XM`WmEy 8X\H[X]3S($wo3<>++z|u> 4((;hgV'~'91ϹYM49kֽƔ:?7÷Ă~N]\EN؏'+/oolޑw;	Xp_&Ek<)k=݊.$?ZLmw"KX
+ZoO*ȽĞNz! p]ʶpFqqۂ@)劲MxdDGU2ZS;L: q5& h	;w8](^
+&;%2iSx}.ʘr*ĸ=Y{mUv!B (QB2`s5|y(7@Mj\RqU,kyF8, yZG	7J$"h$L`Ҙ}od<{]P]}0zBǺij[w=*Ԧi<^ʥ9?	zs-	>$?^(zr?|[̐ԖA\op^/"bfOՉ=-iSWRӃ)$<,;{i#??3#b鵀Œ|hZ)1,44d*YuyĀ bUæӴ:eE΅Th5GjBRgAMηm&@"8`'(!-ޑ̔d-ɗm(2 >5^]~(}pƗSg[Wt=dk3N #= !gm-DO+~:R,DyPx*H49ͱ%#*YX>h:)zF63DV9tGDTţ:QT87-PdTRj53T)~
+<%0"ua4qZ	NN?n]06T7YʠUS'Ur[&;0!3D{ErO3@M&3ivĔkeTna^K5<l$*q6f#&uN*;?Vf]7}:/qn׹5_^2B(35V{5@	>7^X`7zoXoTq??Utб~g[RuJ?}+.rĞ0`YM=V8ƜE֘s+hI9Z6:7kM
+.!Gw~]޽_j܇lhv	Ѓ)~~=O_.I)q²69Duv">Λӏp2J:	Gȃ	2wEWX:YJ	~~bb[B/S3),$]	lƋQޘ;-:Ӻ0@`i*Ć,YUN^JaIgfmM%^^y>[>g4`%?/)74HɇEQM[ivf^;?f"H^8ռ2NXw+=6ʬ5PZ|ot(z%ϩ1Öܛ뭕ҵ-ֽ]S-|t} zMN/:?A$;?H/.طWݯ쎮_fj1Y{@yGY_,#/p4%`],XM@rjd	gh>A7HQQ$Z({1Հr:P^0UOXʬ }51K19+P2R]!`X{=1-)|K349Eu{Y?ꤻlurr?a	NKO  z]by!	qq!#߻uBagpÑcڲj:j?c80
+_N{̠4q],\X)Ws/$ȇncKukdse+["372*~5V3orujLqC4eHwJPGx
+b
+Ӈ߹0AgDJxң9X0()ؕ4O(ar3WY	=:lAb9	-M6G2SEPwʊUMto.Ņs@y(4 BjAtRNb[Y{FY~Nj=ັl?0~^j6VyR[lh<wv%j,=V'"{y8yVɻ1΋'JT?/؂%X|NQvA
+G+ΏmqQi|SW{	E)JWMRMf\T7̻j%Q
+ '#Z
+#x'1>% ptZ/8X#PFrM$ѷi+hieV&`c$Œ_fN{Ć"P5u_pME,6 ch%kz@8| Z,d[ZZLXω*kd$k\ϫE(2BUIE}#oEoRr`w#/L|[FO{ji3W^GW	\|c 26@U|Rv;rm|Q$?czⵣyI+wIq dOlL/\_|Uyj&Oury#Q;~}b;dF~}NAƴng$xW٦ԔF B |\3)
+Ę!p]պz1MbǬ:2R,]r;ZQA+s\_gcEaE9ֈiE\2U_Ωk"gz2Q~Bލi|[foTGGUJO7xo (Z 0~oEöuW?qn|Tk5J,;y8,F^WW_T
+ȀZן/w_y?joZl;/p>gY~j<wj5盙RtgD/P}׊r_?᲎͗YC57bْ
+8 Ԧ6bR38}d
+(k.(Dp4[Lӷ'dk/-MwuE<!#XPpqLS*Pa=c#8cl{JQ)OJLZr` T9(^>S̌WǗk p3=#X(|bsJYލUэ^#fƳ~\WRW֯ravMuk%wg- b:?i.Gos@eQ~ZɾEaTMc=%Y+=b&ၬFl1SAF2!X=}1Mg&:Jg p#0ʁ
+,V9@	7Λmlf¯\6$Q@ZӢը)p/6P[ ]6˙E`>
+ D1]rSF0^QK	"3,VHո d}uKmH:|a1=eH e1;Pk!ib త,UT3d1#l<dI,q"5m'fZ'ս,`]M#QRۺ߲~|Tyƺ0zy,7E%B,j>`\!X;՛=yk&WS\-z|>Q;]y6cIQ5Dp ,bO^JG酮u-ivaz)gLo槿5cVW/j欕~tt(uaPO7Ǌgu&tH[armO3(0],YH%,↮4IZQC)A^͛KaEB Sbݔ(# 	yM<C@Mh S-)[뵂u,># {K,6J":?FK{eu!_eCvxMu
+
+yn?)bD/g|/FLwkfiy)ڮG|    IDATsecG}JzʐD<aqgۺH+NN|=_{K9R>F*߷Wht2狎}7Zb~Fy7;8͙iYbj]	#<a/G3#ا!*va_oz~>4/z~EӃ1ww!M`% 1_:D?9n~0vr1t;C@wUtdia	YM֔xPWC>ci3=LսA~o]eQv`u_hm'M^QzIkY׺o[Tr$RuR~u<7Uzk 2ub4M%ͣiS/02`M s8]ؔq9=(Z._Ud1{#zE?#mۀ)>`x|׆	T,船Q{|CpcNg"hm]Aq--@L#\2&몏%ل}T9LHq^-.$-^(z#@C+\F&rPx(
+"_IHDjdJCe 1MJbfR4Y^a- ( 51^fS1GgEEﳆ5UK }I \h\4;TȱCa~
+TzMWKqVt5àֶgCweDeI<κgF1di=۷j<~>i~Z/}1?v1Sϟ]Yxm
+
+pԐa!d k(9!ƴڇE\@LB@+),,p|?!(`,	E9|u%.o{LzƜ_v͊Иa}4fwcN"C25Grur4?׷op)Kn۾7_0CLʥoWN3tt_q\RsnFɈǄ8:=`Ui6O	 vki^!Jd@80֦Q(
+U'mq40f"HYafrp*T̔vMay01Sbb [1-,d570VsV5 4>7<XW't +{@m<ׂ{*lÜd	MZ+!jKn&FSc |!Ca#OHI4Fjj(ݡKqJRoHS%[?\n^^ b&[أuk
+q[$=@Z>J/Uf&JmWO3=rE{FoLt ʹN7ynӹ"uej2ˠmB82gh
+*ymCs/Y</%e^5C1&7#X\,8%h\2Md3Va"	 QBtyd!54y=#f1dmvgz2W.($1PDrNb|q@S,1Fjs]>NTl8w9JLφ=$&, 6z:P3zqg[E/Y ٍ_TrO6"<6^xTpFz6Qs/,;7H/-طfD$`t1'8@TPp~{b{`] 0 AǺWJzmY@T:q^T~;7Y&̆D]04NF?ξGeSOֿ92V~YX,	1:0H(g4d%6VFt4{bD+1}`鈁cc`6_QWd1yV @\&gRz5"Zl eyQ30w5U/ FnI$gmurmuMuie&|e5e=Ym?Gd/AȶRR}A4;Rs@8}jkL lLӚl+OhRb	R;Za8x] zݏyޝ:Y	CUFލ#$3:Ikn1|SjJ)o+~>Qr#r.f`MS~@ce<5ՔUع	=)eTH?*I=m:_~>ؐvq:#$hg'Eؔ ntvvrL,	]s df(VrtK%փ {z elǗ/fد>O^٬LaZ.f9_ӧ/v}Qqh=ٷw{!;S _(}j^VuIdwV	ׯ>0nn6jGٙ_㱄cs;IC)|fy6/Yt>{{[Dc812n'0GM>s67*R6>#Ͱ;Q=	G1N;
+ +?5Br^Fbt{;mAAcR6W-6H/(@4t B]ie[Ws\lײd2ғE/NLfݡD 8,g;M+o$XW|]OyX7yɱO6R=. 2 lW^M^Qh7klm)4?{<[#MDj(ırJmƯ쟷~4?qb¿O\뗜-ԓ8}z<GɆoQB)ֽ6ߟxX ya|ya>OsSϟK#ߌe6A@6	4 &~~Jolk8S h&%	%-%5gcJ@f!LB@FYi^H7d{%(ʢyfuLoBֽ|gK9@!AEjKjZ0gy`*gb2 Gم/Y|mݣr+{<Gm4?0VXx[98Vy584Y+yzt<?Rl @B c-`!w\Hкfx<T_TAsR@fNB$(8@1BfFEl0-,͙ ӃX67aփ)SS}t],W l]bnX)Z"&}^4?gOq KߧG܈˸1`Tq :#e峬";fHFXÖGjnrpf,|sO.o7d¿s* |ֳEdiŎZ*1ڎ~n׺s_ec#|04dl&lA}&u{8y&c+˃/
+ #Gv7Wb3hSTJrÒ}M@ zZqJOt$ hcÆˀwC0_y?cYq|J%vFAl3,`#"@B&@y46{wڛzjE
+z֢@W4aEQ-"[F/򰭬yd
+c)+@mZy8yt1y bOUbh`3ir긌GR࣮\*@J@. ,o\6V|/J'ck͚JjWzߪj>0]joZ xev`xu[&*/M'\m1Mg3&Ɔazd۱[&Z/	5,&L0ya>Q|cϦ/oS=xN7Sf[/clO5sk}d)# Zq34%\?#REiǴ2Op E@Ea#@uLE
+)&R$])%
+>[yi[fV2z5=dnLDjL=gJ\-,g av-,_H6CձkT7+3X|(|e=05f+Wq8<R}?_ZA<z+^"p-zkΆbx#1i`t qw\IǅTW}cKKcU`6
+欍8݅b[V3VG:쌒uP{_bHˉK+lJ]B8}\P-I|N Fp`5OZ[|R<Q?A	->!Et@D`d D6Nx 	 EWD'KbOzbq;~! ՌŒ}rǓ4 &D߮)7hm1lR$ 1[=c8xk:썮RkGJŏTVbdU}g]"q5[)? R !!ds{(S%y}QƓHLah_ {v
+d 8!@Mv_0t*E?04iFcLhdZ*vͺoGz:oQMAƝ"]MA/8dk5*N+bIb-<LjJG.],w%ybU,׬'7&Rqz5jMl6#ST$ LwMvy󾧟3Х
+(APH4c41DϘhƮQ"H*Ә~̜?{@ Zֺ}oz:|+6[qYq,y!;-w~f"g y?ፈy{ъC `Y ޔdY?/ϙ];~k,jzqvm?P :ήb0,/g7|"4x_o UUhQz-eI(aZg5^y|ҳ/NvM#P\oڈ鷮둿#=|A	N
++=hB+!$p,d
+vmHN]`3srZ|<<G;X阣-)t`[$]\(S}^TaASfBԑ[;5=s=kbrbM:bq[Vzc\'XǵzڶvD 6gKKk.3Ǿ}TIĒ<`y/R:a83(Ryrbh9`4C @H~w)҆<A14DĖO&<|ǌa:]gQՕ;y@A+'<ծ})6JɃQ`_-8*eSn9D7!u<OP!P>hbC:&qCOH0D=,YT\fkYYk% n':*-4Us,b  BkPSB2TᬋXJ>9|ǘ!8{2ʝ~ eYvR\<b>ںhCc/p1f@iqF"jLB̦%z\\Ztdz+y,q'NZMiQS`7H ; 4iE>n`hiH}ܸwpRcJ+oRV@jq[xOgH7݄$z3PBjȀY,[,&]ܖ&py0u	
+Z']EY-Md/YO5S0	,d6SܗIDLt<XLYl?:,ʳ=YGerKn*1%QT?ы̸߮!?Q?k?/G?́_Ew Ԋe9X}h$?J4 Wy0WzB1eG+6 dm?\$LÚROK**1H:_՜zR[beMsZOgtǿߪ>둿̛I!8tdaG{V_d(d%G+$T:fE3>sRZHDm#jOMNp0/`U' 3hIw03ϗ:hM[+LOBM||r=]Tg9rRѴ<g,AKG8O+4Gޗ࿔ >Ώ5_e it"U	B+hWe9P:L#R,\kGkP@F$W@f  NƗboYRmj3
+Je+-+Bqq~bQS_'5YA@=sLAb9f	1|Zh
+*p)&  tb:\/7Y^v$΢ņXN 6C:yf_1{ %;jb:)3Fc徚hpQe&lOhScXb6Ѽ4-Dm( X+vf!7SZ7"],kG0_hN%
+Góԥ=ڌs>'k5S͜Oc|	>iCզ)bz/pȐ9Swb2ig^?9.o(#?.mֱKR-hUSpjc0icEC V]s.=s\,t[eX>uleZrBڝƟz$E1qJ5'DSO3LFe1L٫&YP>#0%XQkŗU\5nc+كQɔ҄  H`14YbBi+qW,>+P>D4ݯru6}k =_ݜZOf K>Aa
+$?0 B=pNymugxL^4DQNbGLW%zYy0A9[7_ˑn() 
+tp=DC~Y2OEc  !0J;x=ӳalv(Vq+z0*-4\QQaQ) m=,"`+Ky sC-%3)rWl%G򌞚\$8Q@rkF|Co=Roxa#?DX߶zr8Ӗ݋WJk0l𼇈@ůwRmBz
+t	 ̺OUzIc՛-zݗY9,{C5Ci)079}{QM_G+ΏHz}̷~fj%$	|+t	L#m!:NmK)su=`x}@ 0.N:`a@sôfSGFOMhf݃?p:XjUMO3WEj+Br{ <זOf婙:%&mkd*=Ɔݛݰ    IDATSbT6~x.b?3L lk; py~(Wz`:fLkrRG[J} ltU;tG |KTp[Lz҆qMO+K_n%z`]ڥG	@{ohi0jpa9Z%&ety;`] C4,ݔVMJhYbM6K_➶DwzA	6K~8˫YGt]j8y!;cю>_\/nZOv/NG0n=G`V9]M6j!Cg>)2#-^rKE] s|ݹa,O͊GK,jTޭԦhFEڌ ca[zqx3 W&ġx^JOm'WD ߹}>l>ڪ'_4	h{v{vg zBElC63&JS֦S%J,feH(0 8Q*h2*$H P,rYv\E:*MB@AeV$<ACN'$k#Ҍ j퉝^+ z}4FDܚ#F:?w?W͘GՈ|"P'JϲvUaEqvC+@ & C@=_)Ȁc@ *I,  =aJX!I"p)v
+sJph{y4+3YM<[QMmT$:ɹn93 PXߩ?cAiE vI0Z:0Fs3\Wϛ9Et4E~Bv! _=@@LIm@6Fx9[v|lɬޗ
+012Eb`p=~þ8'3urqTm
+>U3ݬYp~P'jX:etK/jH08>w*8#iBw̓Ǐq~8YVGGi4dqvMNj=N`{myq^Un{oaoan5_H3ZSv,e0Xbb}u<sSxՇ]>=±A5<3r6d׬(Jkl:lt(S={`290= -	QŬ`-C5kuf"Sk1k~\6(u|(GS93ɇ+'?7x4_?.8 `fZCrc9S~[#Du,2&{Pm̌UD XϗOth>ϕ!6c][?8ߝ~X|NSbVl>߉k+gA5yyZ~]B*-}J容p8/h3U 7[}0Tzйe|L-xQܜgK׮1UΏZOiV\_>·~Nmgn8,0?%5"H Ov|Y[L,CS
+Kz9܆>M=s1 c rqp"sb(H4;Ns{U/nsۻӺ5Gk`Ґ$@FBQ}D<2/ذϯXz>Ìa̱'lQ	(23Kߐ(g+DҒ#!9d*,RmF(\vd}D`%f,+q(@*cr4Qi,M#Hz
+@@+0lʒǳdVӼ8GY xz{l[]m3).:0$Uyf_o&^@٥GІ.h+pW.Z;8*<)aW",^l(L,F,CĠO|m]2|ԔpԂc6z9y*[5g  oq\I/YlaLj͈}2zXZN_ӏeǍiV444ּ׿VLjFȲ:mcmi=e/ I.|nߤǾT'FGG^~q]'76-WGD<#Mh*HQ ',igGlËsĄGIٯM?/BSiaŢ1AͱXtUP/4@7;٥JL"Ѹ<#RTO8w ^\\s.:%5&{uv%_8\Gswˍʽg;*0{j({bWZD6?2]X҄QK6],NY)1,P>O>.W8?[Bo$
+3x[raRsۿq|swnm]hO\)CF|Tiz;[߹-뿿F;VHW"fڿ%o_
+6edg|ɏ8[<ڑ/?ɱ>Rms(c97=5GnwY:VQcbHGc:Y-Gh"pGQD(hbPgVא2rJ
+j*hQE |S8'u5yT1E22eU,Z"iÒ|lc%/YdQO@	CNiF@*CIyRSWn.x_)K@rݟqR'[a׾޸Zτ5p|s!҆ipB@א~  !-	.!^
+4"(s
+|<n{JX[2nYOV]'n5,n5^;k᫣~bm	<-ْlOZ;$T6&0 Nq@>^T a@ѷxCG&F 8cj.qpBC
+ Z$0>N87NkS[g3G	t!@Ϭ%aNiI|Ur('JEa(f-5UjLwi t SYq#6&Tf|Mf{]/FD4^/1ӌ79&I6cd#Yd`[CҦ5vcDn+`g%g9:Y7# 3%>043]7=L [>l`@Wdf|lTqQ1W&_0Ou46pfeI"gʊ 5lEUţ]bCn#5q<aA(xrWE&Ԧ-[%[Vf^_iD_0|rTm>`FMkUH4u4YC52}SݴBv)0=tU*+Nv68HM^ L_NܯtT-C/	"bj1gVofz]rNXMl,vQ|e5JUgo}b6c Ƙj_<6aL)G\4ʮtw7KxƒOO6_?PN;??:5#[gRNKL,g] m鮵mz
+#WmmА]kPItX5laUr,#Ϡd1fo!hv@4>)zkdo =gJE,"5baN|hb WcENOh7QT\0P{D<S.EmꊝZ=Z}۠8߷o\Ynb fI~r<5𾒦j[^ά$:y+q|:[;h\^x^JP  	 Z!4[&!@+p;4!A1 -b+%D@LxQ0Ju0c6"]b1.W^
+1?^7l 0{Nq|<1=Wvhl]* T0D6zT	es_"hj9]ӡG3X	qƂZLt&d}cae<рTL[/>1uTR`Bf8Z{F?TCVN ԩZCS͕OG-<}#^ߐ1{?L{ߏWWm+p7ghJ~Hpv`FY~"iPg1ߖV^FxC//|)^í5x\k#Cy?,IDj'Mx<ZR]X3Fb${́YԠR8hy8CNVH:$0ᅑ=9leZS>/FˏitjH\KC5#xw<vXjgGLo@c5㈝c֮c_,e*ՒlxH.?)4z-|iN;~WElLݾaT H:bSУݿ.IFj"7嵋G{\޵Xkp=CžTMJ\赌[fŅx= ܕO2ȴiΏ$?80z)cc#$_:<0~KwQF[-?T-@^#6#mwF뙴}.^:޸+4Tb_<13TsDhu#=IvU'٫-~ؕ"hk9bXa3!S	k!E54\N5UܚjRQ@E]BoS>0.(ϩM>Q߆H)3^F Re
+x;Rc;,%`-.Ĳ?J$J3fȚNʡ6[ꦯ?9H_:d~G5_Z}IYZNGmg` K׹ȷz#z$Zswq >" 
+>=A  ^	tfAXМ8!Ǉ
+Nq ue1$!
+\f".`fz77/wɅEl-(ɚ~$z^7%u3ClP.mG
+^)ހfwz8_5msy8vດ:.\kc--Tq͜
+j#xFL-_q]sHCncUX"`%%Q9`u R|ԴK
+?}O⹒q~*~
+ op>1g'y] L-f\g~Z{ָJ3{ "ǙT aZv,6^-$"T[\>VVxC?ys yɠx>c}ɆB>,G"Zӏppdz/אhWDkjf{ACK^(& `,L85TOUN?jN9=</oǺTorD?M#=´ `:9Dgĺ1a7Ul6.Ods#G	x/_0N~Y[leDmNtio4 Z+xqy/P,K2nv7ܯ!8o_ItwzJ]QK	bDUZg|fC5
+Bz:rGsn5r]=iz y`ǕZY;).pڠ̨:Wg+a&!  5!^o:G߶~ϑ+, Y }X`GXQBTpd-?KA$!ߥ]0А&0M>	ԓ`k]ЧXF'z)	Nq4+QkaTJ "\H֫θw!q0z@$D}ul}wdr#KuH~!l)/l	 b^Vz2KO׺Bً>Z|M9?xeE׫B8=ˇu ,6dHKA6d0^!mh1Yz>giRM8Vz_&4je^:󃏚lx-ؽq1$@p`4Q|q'+t*nK\1k[xVLKإ'Ngpt)$G`cKhF@o  B׸g3_:܈\/!h\@h藛$`'*BTo::`V<|ž[~L9M>cJxQLve?l3 #G ŞX~O
+c0R~ FC^"?ceM8jJ=+Ï!gm6[spnӫkKS5$:Lo8]QGVC*	^;qZW @,L1 𘉴mP5х|SC$X \mDL4@?*چD]L:rۈi=ꋣWQ&ŮkO7Dz&kY|R~IsO wX\snJ =q 3u)/x bշ7|e]JkK
+m~)g=R.rvS\-nZӴv۬.pY;Tm|[\>be?s| cw \Oz]R𾈘x_%?LQ^	>S')=]>mL󼟷Nzw'!d}2s6?0mx Ы*3 S!IR4^ۿ@V/f8H~(O%|} 7!ֳWl8!Ȩmppt@όsx]	U k9e+D k(c0PJ:_3ChZ~hKpl}3Xc	Lj\a"JAfԀόb`]WsS=Ci"QGݯmiah,8V1AřJmrɵ}iCQL"EyFD?\Vo5xN?T@k]h/n  UA-98u Y@t!A2(23ޅYj^s|{&Mig3  M,69G10 v	.}dA3᠄
+8n/e@Ip<敤\LLԅ8V5ٚSa	r"69TKѐ1(PlhDMK6Z << LF/}KRnq;慎=GyyH{*/ήV/> J ҰtcLL`;&{˅SiZrR;^/
+oCJɋs2)ŹUzjM]Z7TyC.K3k.Δm
+!+k4{q@t@LieUu|a)d}Ym]l8`51;Pk\ޭG6ra?`B{ƭCa}O<)0^ڽ?];cuO7 xW5׸?%pV@|>j`Ʈ6-$jL*_	ǆ9"Z䇢J"kX:ZWTh}LЋ
+ݯ-4z[Fux6<9މ>p    IDATڷyS1/c'WSY{UGcBtWgg,['ڸPڷ)Ɛ/JrצVwSg'6s{v~7Hhed$qvNdV9z5"~G 0FC1=\ 8@'US37
+p kHg˓J ?,A&Y% 嶕4jcu_Aّ3uB7~nd}؅'ŋ8ϝ]z|}؏j7'5:(HbԶ/rfg?0:{GSAV ,UpPa_ơA`q/,.:%"H`1`p	Z7h1U޶N^iL}{3r̿ɵڿ 07<29Es-=/Pp Wb#9tR05ִ:ie  3 u%8#a)":>-ADIƎGXISU&1BC@h"X;]dhҒCay54d\oYή[f8۵i1H'îPܺ:Ǿ۲g+VۈB"p_vi46sH!N^D=uXa^{Vշ
+qgֽ}{<bLMJa -Ȱr94I׳?f`x"ݮ!8(႞/\>Wɗ	ٙrIńsw JLL hw߲Sd{_"BɎR=L-Wݻzx_gGlPm׵*<>#GoyDs"№}Wj wbAnӦA$rSG}kޱ_r<}aMΏ7Zt~qoz-ֵ|;Hoo9bA4RҊJ9޲ύr~ZrQj~jg&ޗ㿪XTk%c;{_P׭?Y赒l9ȵgk&|6tԦL=aW- h_~'?7b0{V坮xs~7Gskj=)O8XƱ߿?G~\@IBA94:Vtɚ`h	p: 
+t(>5i<aFN:.E0̄XՃGئڊ2N#2 jl22J4>)ؔpڒ+|XV$/A:OfDB @m]ʧ8tox=i~YZ\0Z\JXimqc]{65@@vqeD <ai@ =@A  C@<Z0
+Q/X69C2к.eWHv^	i-~4:)MSm aId4شOi.1
+irC
+*K$<FFdbp=PZ\ǚR+"h 맧)Pp4'YhlyTf! n:Shn\;6,X!0k+y!_o\Pn {9 +hj[+re8Vnc_;L"olAr.3͸-+  MRۇAcQ'eF#3^joƿ@taHg8Yg%%]uO!-6xUY-/)@3,,Mtz<0ڼZ<ePpBOuCq4ɑT(Ĳc[x;]fNk}M_p??7"z!iomgeWu.:fZyOZʡL&01ɘd$mLp%$rjxg3CW{*~ZY~cJO%j+gd@~5t̹>S(IQt-TUZOu][=;t97n܆H42hAib5 d Xun*<#H첣DlȻ4Q8ϠZwFsCFmXNtշ~n:cT<@N>xsK:fOZi}\
+>S{;mߠ٢cݖdϖz#~h/.{_Ft,v`PR@@ITbt8_ye!OA`d/|#;d:?&
+dD$VKhiG1*dƼcCGc 7%&^R2j(F	I# cc c9 c`5MԲjQixCSc'5ZTr+}If#y
+"d7'~}cݦMS鍀jY~_j{	QwO
+`,F'izֿ[_%!V@6B(p`%ap|8! k_ N I/.7*3!:%#6'zϺaZ#|LC6M.9I$tIeQUp()Q4?Q>M]Mp X uoU}< fX"V]'1O_5 "4dO	2k" dE?RfO&֩~2| &<̄$~jBԆsyŎ"g֒!œiwxu_]G9YA'<r(=8{͔(rh| ѧ^>(ߦ햸wfIz1B:V}9 ?"	i {b{#?[CVakOӋ
+>Hv4G`R̈&\jB~@AP$><zJ~[D :uΡfN\J3X)Df}ˎ":Ȱ|<^#nźet?~fx w[t'5$-WăLtz{rLMe' MWFzLM]ѰXvhdN ?G8Ɏ/\Ήfƀ%M*t[Ro(Hf4'Ajw2uj?yPKLfK?ɻ-qԳuk9~Q]&%B:Qt?}P'5CڞKV pmKjk{kC:cs=%A\w/w~ڎ>UtMq7Q񟿔V40ln!V#*mNYXԪٟO)P tH&N'jtJ	dA@,(<2.1nGf홣Q131 NM 0% 1[O!G
+3Fl,sS\2N#!!KscwmVJGWOjN;XQ춭,Smc. `4(q  CP[& *2h?`1ǀ[PĀt a0>un*Wl>{\Y>"^Pu}Ӣ- ҕ51!ٞ 9G@[%*9I+1{MwFلP4YiS;DvA:+&-b	&`Q !Bes Ć Kd<L:`{∂XRG,]Y~GM7ڴ%Ϗ TG%/$D%ٳ]1XnWGK\FgԶ]VUi-Ǝ&bp{F}(ԇJvb;%<GWr i\Z}B@m䌕f64;yM9DVɶ_5p)5BbhAz.`[z,/5J_zf$
+bӻ*Vr%x(|JvFQgX?|8QѾ͖ZQf1I3>C
+b+ @?HHnùv45m.ZK%kI!f-yc6SMy&D#]dSyRmkP܇@/Zѫuv1[蝌+3$QvĠ}Iͣi0X?yǥޤMu1qWG맯s}\׆+ә||%DЪjkҗ$\ϥzx-ހG_+biMNĬ@ɣ~tmYwU " R8x!)HB@ppf FfDWerx&cJQHE26غk
+<j;Tr"INjp!=cGjgv?|"T;lg$t5s)3OjS4$+Υ$+
+ERc+}9ohV#xuX;Au``NB* hBۇWJ^ @܁<,ɟwC0
+F}Ƽ_7=m8QUkZq'*4xKdC6Z";2SC'ձ K,
+BR+C=]e*1h4e%XS#D2mZju
+Ȳ4 р:$(K5  
+6#ĤJg"vIYWez(TTVӓ8#)SROWnbf޻9[@OJst@$g[Sc?wwD6X60 @(5aU?`!0 7U>]	@ǅ7%yM]h>c\+ٴXB0$O tVl)$Z  HQ=4zWo5JRAW5VFr1Q	 	AW8[]˞ҕ|q  P7󰸤|-VrLqmj\͵g7'j͎sҕf"Q[)FjC~fv~E
+1hZ~èxRqקz#%9"GKzFaQ&->LO8%H	!@bB$`##	*9DʬAl٠GB{ Z-q~%	`:jg=.5տJ1JR-2ݯ4BFTCu җ/Gkzr?w=eƄI~E
+й<[BRoZkjVz&i|ke2Ӷo$gg?4O_v7%}
+=AzCmت	fkh3l%6 3|.EǃMVNMh$8VMYla#@W	2h!CZhR4iط\Ѣ\sH56XQ˓$,F%XM..I2=~T_`-S>?D鰗]#!4Ro(TU()-o.xNut;x+@'_\kldZmvh-A ,<RX` ,R@>,~4h JӐ )Ai
+` O );\jlÎ6R?yme&V$Z9c dyHg8HCJvxd
+sm 20U|ɀkMR&IJuު[8XFrT4!AjF(Wa*17<
+
+C!F
++h[т}(uj)Q	'Զ%;4lI>'OlXؒ% a5HG(Ljc.Hh9XX@$%0:r¶r'&g22tXmSh;7 wYzil}- :4L^iO[!e|l,fA@8COw M6W J|DHfG-2d/O󝨸/.֦ѓ'@2`!~ik.rO*735c%~D/]idkSjͫ.Y`8[3$aS9PMU kɍkSɚ!!&3+Uuj}C~&Uk}'c$
+:޵셜^|~cx+lg(Str>tnt)%OCq<׾u7Qj3ogWYlѷ\Oy}7٬Տ\r!<Q~W_\>()[|Wפ}vc+PǿX1U )H!mX
+qwI5 8-R4\BAX@yh&b8A8vؑKȆ[>pM@6I[/pB=RwISѮѐ#Yİx(a1-L>eq%:F;1LԲntA-u(v?譯A*:Ro5ܦxU@ISڒh	>+ l 
+ynI@eg[4 \0QTU6(	JV F@rP]oZM4%#FbWI߰BIbHv͞>̍lqQ
+R׀Mft(h6~REC23ߴi:P
+}lDM}4 PꐠB:mA@蜂"`3C#`@CLpoУ#Yش4h+N^N칄hAܼ8WqGܑS,xQrVF8}YQTZOfiJAFPB(np@+Hk0@C1 =(rw8}q} =c,|PZYȉZA`b\adGm$4ɮv3a}&{IuГ|y0e&o>Qe6|~F_#}F"׺ݘ
+!bwaj.;:ɕx t5;li΀byRI,YXAzɕʟt=皡ZGeqwɺI!,)=N).[sPNeg
+˂4Mu{4k-,uN%
+C׺ʾx`Nz܌!rNr"QJҌE%u'5nѕU.vE3&}~$3vZфڌK]qw(}7zf/2GɟrRrzn6X?Y(t 2++Ο=[zw M?|}Et8~ֿCl8ĶAYc3>-֔4CR)F @lq!-%G&asmdKLZ#p ((#* v'^ͱ7ŶI4wy$(h$9G@ `ú?V[YVzbG H,Ϩ_Ox>U/2nal%gP\xBhrwC2T")OQǋY4	ZO:~ A:nAPSB;!p*X$C.0C@[&9n> @8`4e;CůlWZ%$z+}M#jMB(cV#|FvOѳcmx9ba5͌ʓZ    IDAT̠%љ:&`}FbMr0=ĺSf"/)Mm.Mtz:]gv%SvBg[^>~뜥4~:$^:ĢB RNdj%>;VulSkzc%.5Mf3yxIr^}+78b|#^	,(4>Usg !he[^YNaZ=\B~=}a5ys!bZ	ishVMKaɅL4\6uEGg^ZdƇؓT
+[<p(2kMӋ숽Rgj(I[$N5 8W/?PoOڷ@N_SyLש<oXZwtK*=4gae&,vWƂOXlгhzyUTmS!}BrEU,vLMwv	\m@Mx&ꔑ/+
+o#pG)Ŏʰ?UA_;,$a$1kHmЊ8wc4@?<.k8+Q/X^s^Pvz>*v{!'n0]Xv봞l>XQdrGɽ4A׳n.Τ	(ۺ#J^Y/Jo&oku|K?T?Q/;LhuBo~*?K>h2/]ǽ1gG H}[2du!+XA51yn#e:T_$Ox<`jd2օ) ҍ
+s 8c-d-
+|[Iӥ&2h 
+Pb/_:%6ގ< $ *?\;wvU>`;1zV83P3[k/oqĽ6O;<˺7/B<O7Y\oo-\06}kg$. 
+ə<
+k͎sTnK&eyT
+`9`4wAX>P.!@yPZWc`4 8/~Yꔕ!??/_,"AG,(;.) 6Kjo{wZ+WZ}5F 81HrSX+֓ ĥk=5-kMFڏ@-͉n!ij4 }j#@*҇։%ӘUlY{:wL^팿7w=Sg~߼
+#ibJS!]5>i?˒N
+ˌĜBΎ8{%CN2yF*i:֎@.,+CW(F@ q8qp$ֳX. -Rr뎭y_2O-{_[5NA(Ұ[8>)j63L6:Ȝcs ;.hglӞEqH`0,.-Mc(+0#Okm~@5ӵgE\#u;K6[$v(VɹKi+;ei'1fX7ErW~f<ƕGjės]ЀFFU6%zS(6GTF2D^wMiZ3]MwI_CLUd$(͟cvwsTm+hk(dXGS} CLڔ=vc*>,3''	ηo1S^|!/9S~+*Gy~\'~!Ă-⮵[
+k)S:fWT/F>Jxr9_qȑ9VBN--+ВBmf 8@egڄkDnI+t~<FSY;0+ؤb~]&'U\L+3Xc`#h2ް*fН5(t2q掲6?"`i`b):aqV<qg=Ts	Jt`L=|69(jSt' SfF>#'&6 @ Ϝr=ǠSB 2f Wm|  (4$C!O@8P]iF=M8BmG*7G ܥTegG%Dte 2oUlI(F2OvN7=IIjU,U[f>n=9F
+Ntf}f2 
+㦆 'EԖOA%zb(,*[ڔuڻ-OIsZѓ?~;ͶzG3VҖ/u "l٘j[[ÏgДu\#6֓]+<;qX6z0	DPxn <0! C: ˃%/A:uuG^߉)}9屸܀6)%c8:$ 		z<}Z!_ْ]N^[\eb?=wI=W{>!l@NHɇMJόNU_/*VJ?/t/ED?{iײ&jz6SRMV6yaBcT2hP͎/	{pI\2챕첀-0:r6|~̠㉇ijSj'U T)-#򡚩X{ilA5uVy_4(vpDNοzM۽@V7ejPp?*Νk<ջ^eLsWzQF@
+q@iDmCWefCVC'FZc۪w{ٹ<mX<Ӯ͆vf_EJ
+w^y̑/jJY\\?OguVSSS}kG333^r%Ga9!H Ŵ m	;4Chra>2qϜ0@2h'pE	̉@d
+ȜE*.LIZ`*1.{d̀ $ R'gg7IurZݮ2C\1kOXm+/#.[PHrLK=$V\q_6ioGf7KokT+yjV<i8e/
+5M#8q⣲ ap<}
+dqZ1^[?lD@(6Cu4wAetYơ ]@)0ݜɳK=qosS%; @OeΦc'E]D?V'92Dݴ49HGke%ygό{Kn 2M36	"-U(&Hq5 40 qo:қV<u22y!edVUZ˺XaTlD,,R59w]]݊,AJXPjRnߔmLv@Ѐl9!C'%`+ .HzŐFJz+]l;| +d BvdbÇik):qO87%>FzcGFNZ&}ڷKN]`7*V	c_4,[<~Hɺ@蝙AITw\ʚ+FT\2\S	@6;:Qz=gZg!(SeЯYwaCY_1<'U[ЁKv.5j&78VIDinPشZnKI(R5{3Pq韛<*[զ.?Z P 8ҾGNx5mi=a|ZSc/Pf,ʞ'ء3I,JGھE%5{/ZlXm ھCd@ZdfZ]~p9~𢡊4__|ꫯ~K^r7|_[^=_uU{>Ovmx饗j7
+C0Ć%Z?&
+/-PU@]<S%ՑIgخqr.64;\%& $HS"тGt[JT+d!<2 9aȴ8؈JA 6khnR0B(!#}wHW3c15憬vTzZʦ{TrK=XC@l̵ne"k  A ,6n/5!_@KN ]9Zl@FWeȻ ʠUxǀY~WFЪ\C[5+m΍;Թ M ɴ#"6z͙
+ڞQ{3=py`˄ȑDNe/k΍%ǂv[/'9Օ	s};, ԸuD]eb~WU2T9{P^e"anGf{#'?ܺYwNyX1JHm:؛LKQ#	TтrSH37φ{3Y@`8qئlh,j 65p..ӿ<|2Ad}ccW'7!Zd}nPj]s%`m!$$'$c={?Q02Y{{kZ ,6W^m#|O2˟:"D*Qm'gn_pryƠxrT\\vEuƔ	zz#yzk.WtH@gjŏsFI"hK~$ؠ9Hnt0㥿G$`wVwPq"okK3Vӧ0HA%q#	!c8;GHk
+݁h[҄O)E?3mv8S[fJoE;Oy_g/$K^5&
+=^L6;4֓FQ~xZ\<Ҿ)Y?犇Q
+e&=q2+m+giR2i'g/VzCݽ*s"WRy2G,GO3瞳:kaaaff~/~h4r]3ܽ{M7t{Wpl(fHSԹiP:2T	k.d 93JaJ	I"<cN}5 :02Lqlnv,2IψqPOyOKbR /n$!&>hZ
+ 0uo/-ў6j; \uoFE'*;͞_.ݶs{QE$Cθ*7`XXY}d! |`$T  "@!:*I'A @gv; 2hȋ+_d<Fk`pHʼ	X_a='SU'R(
+3	}(l%nߣLedߺ ܢ"~ܢB1ˢ kQ6룣>&OX$gyϬ !/ ~%26&&--B:}WC 
+uB\ܺiǇQ߿Lqjh[`4pi<Qj"nA8%(ہP@q΂) PD0ai=kzSh[&Bi 7QHKЗ3*iDujes	p,O{&tQkߔOxjSKU}Tۺ
+6jH6_s<A?M^v ƺ;ku<Eob(}#-gtlH\Wq
+dın/)%Lp=C5m&3 fjSnw{nxl-/g4S^V_n[xDSF8Q8PA ea+J( -LGj[ޢ/1	O/Ff}cdTTo7<ވNU[Q\?fLS)#	iqZ~s2
+;5w:?jSv6+Fo7XG$-ny_,XRcc}+ˣyBmI%.5`+3.[h9OEPEy\p[n;=NƼP
+g&[,l!:aRPcd8>E,hFD{DqC2q}g= b@3 G.iXPda;ŵ9B2p3Lrjdz5 8H4ie!e*"X9o @L'Dj+ntUMIMpiJLU|c~8"5͞c|[VZF*uIAi5ѐ-  f[c rpʠp'@XtqP @{`:G[$dC˺(:FkktoL;iR"JX{ʾ޻iH}~ȀЦFIhנmEFRmvÏpNcP㴥0l~OFN	(3Ix˥A]!&THxBQR2<a	2S\ydo+ #l( HAFHpN]N^ixth?}!"4OU/fiS  <>*}CL2"gmWy%:fZy}=pBBH"JHyC1[@6QD B9g]tyC*׫W.~U׷fU7c2`eh"_£H#0:5}u<eH3<vT#Uv4KLؤf&}Dg#MBD/}A~d-)ўJ7;0Q滤I.TZ7(=h|,ʞ_>*u-ΞJ`G̺uKqZƸMrPQ~#i3#^L4U\65?iԍ_Qqbս~?;H{-IUƺ}juܾ)uL7sSR7Ml"OƑ9mI_8ɞ'V$Qe1/9?8LjF[Ě3BrJ"%\Orc6Ȳeq~6CԴ.[q)֫䥞s-O˽K^]^R:Ϻ˱j:+N&hz_ʊ<>.f/!g+	;Ls1r4FBHQJ۱(?X&"xΆI'n<PJX0UUlMaxf&:2mAM#T&Zṿ]xl'00{8CDV[&3Ɋ#9iV`BؤbajdKpl氺&
+SC	B=bڿ`r2~8RV,7Fo6p/LIn'WVPx@r.')|!/Ngtӹ"hmniX؂A	@m5 \Du),"UF*!ST& |x;"	QIs|ab
+Z!jtv1:TAID&x 4,D*O
+mMa~n`G+Ĩ8fG)i8Tvelq2'bl&	Z/=,;tX 8=ܝ:~[_e    IDAT;?4),ta
+	ͰBg\2@ˤUPKʉ[	֕/AE~O<66-N[~:_mU<`u$4ʕrh!*(pJ&lDT
+ۇLlnrJGE<l n6_0ފ}RF(V->ebHl:ukec6;ڏPZR=YqbҾ-jFQLmOH.wR:"Pt'-BT7z;׺")][~6)Π[+qcLm3`+;)]UBӗ'rS,drtAC-{ɟ#Fmuw	ҕ%UMԬ6^'vln\Peĝ8M`:rj9zZlϺE#Q~1ˎ?fl^\(]eߺ4l约L%kaВc!c乌)wtRzb__?YreϣH,v=zYŹa5ϹZ
+Tzo3fxmJ
+#ޚ}NW~8FfYv^uUsW^N(pֽ%i:RΉ7%SFgZhĦ}X` B]	Sq"(lkgCs@"̨mf,TT	ea#Bby퐲4ɜcBZfGes81l`/ҙX[uZ_#,7*`X5FZ_J_3IIaB9F{%qsU?ڎ?gsBn3Wp!Ǜ@s붣:zJBfHqZ`R@0BoiVX%wB1Dz],4$D7W/ybfmq0]aPooowDnIqMFzxxj!]SP?J~'ɞ7<SG|}##~vA"nJr!Dw韛 ɩ
+@r={F~Y=
+]-*R#lbTGٖ1}RNLt:fUiPO%GANWJ7g7")1eLɧoĉz-d6Id#D]%8hf&=viei7@ce7WJ)ԚaʣkJ(bLnSkݛM# %hD/_MrM±ooXG׮?kG\JMk=V+]@N^V5i~\WO_M`ۏݯį/McXB/{_z/?$Ѫ{EWqbmC]F?!udݢ/umRqq+xVL]َ	i*oXlse۩J!BMuFNSeHnua౹\OlOeqPo5lnThFХ/GScvJ,Ϻ}!RŪ#-t]Zw߬6VWҘB{! y]!W;ujg_Aj@KAһJ=J\n.ٿ$Y1xyTM쟄ZW8jHTojҾo<U3<f%ҳog#K4-h4cVZ(?XܣGzˡGZ&mIOhխEd}նvqBh7gHSPX]s b̀ Cs`>D'UU~=7~<oIU!<ln"WiC_VGVy}kG-F]
+.vh%*(Vr˜.jmH؊ުMr{m&O>XBiWJ~wk4My,!N	U Y^BPu`"`4	 4u50!	Ze1j#x^N:E C?
+OJmIsW<:<EZo3^[uGJ5K$#n9+=6E[Z?;L!)A>,`$ =
+k̜^~z998,1&#<6zGk	오Mۣ~-tMK%kFrǵHT<s^]dX\&hTzQ19dK:B8As;L(Mc .*j[%9M)]6{"'27P-up>^?;wN,wh|JJ[<@@M4__>Q?|V!_;n.N_T?IH1[ J/_ـ9ߣ$?0|8WFvtW+]AF{nLU][Ye$@GEF1YrduOɺu]T3mPٸHIՊ6u·Z#oJ]b$2*3}?I"$f1%g7JE<QMY#a+W	ڝ5brud~{)|gڷ?$1֦Neuqyx^ \4~Av!54m֚u+][<XvY36:goFot d{la|Euv/ws=]fEܸs'1Nպ?pvsv<M7T*},;NQ؀;&R՜'ށdӔ]+(Pe1ֆCyՑb"j@MM:*Y&QBF/J-Mny@e3ҫ]MnA
+@u-;mA=^"	%p(0˥XNX,HJE<wrʐYɏ/yJ2?ҨeAc\HO5_S$Y{cZUa
+aEz۰|e&@pǠ2XU3VQQG8 @H#t/@}+LSysmH_&SB7\`9].c8;w'cIr0߾u~YkxZOH5:?G[Eph]l\ɭ-rBz_l#$6,7v
+($_ErɦzSP4DRkmK@-)QHt"5O9'"v[0?cJ/!9;R9ɞ0KowtW{/'gYZט:]6[HpT ?~M0î4=#8?xʑGʡsyb!7΅1|PVJnCIWf$;ץL+Y7kS_řcl1ϟ	V/-qOQ'`rcKIǺ|ۙ<6pKY%Rr:VoMyqRZ\,}~mTk\nVi$q6&űnHM׭R5[wdjk8$\hMZc UݯK5[o-Ԥ4^ %6¦\Ѐ'(~ujߒclv8,N,9Bm3s77YiGo'DZyl`ݶe&&hfӶ
+=a<h/yY-%1%8?Ѷ*H񂮖*5t=;,n{
+vbP<~{5|
+5VjjMQA[ ^;wtbG{ݻw޽?hK/}?%I\c\uU6lPJ-oq]8?w?zUWM>AK62eb&#4c<@0B(XC4);q+" oqx
+iP6)dU醡90bX"yB}B/jY
+ٲvgC3Ne+z"QZh&[sH?ki};p
+jJ@k3%HNN.mJ-~p~vv=9+/Qd0`EBp&`۰K܅A)!S@)3QA@
+ʐ,mYQr]^,նic{oؖІ4~<-?c1va?"޼8ҎĶ1sRzPM-)=5.쟍j@\׺#CJ@)WhP.{l .(MEP
+ ׭&+sf c%ȴ33H6PMr{0ӳK|=fG%Zg8Z*o3Y~Q8B^nTl`6*[̓RCd=xSP:@+paEA[a\|Sӯ 1¦qO<*Tk3YkZVSB<u3/gӁ-6j-_/bEHز*\mҷi8OˁӋt9pLs܆YŉЩEEq ~;({Q6z}o+RJ2S:(9gr3e%#JD3(6()
+=6]~O.ctI.'
+NպDd-]ڸ쑜H͹~T<12}K6L>DL1'^1Wx[xW',NikvI=Xl1'I=1H/1kX.Qڸ2e-Uu+<b!X3}1';	m|AFo9jmO7^PN.J()R `DAz<qkW~w4xA>Şȧt7|駻o߾͛7'?yWw:s9_럚rS]Grc!DSтB)#új~59P0Ŕ^S}2;!8n'!@_C3ߠ[Q9e}=326.i̮ >00cĩXk)0\C^>֥XC\3.aj^fD&)ъE4	SY|"a`d`M_s;"Ԃ¿vŝR͌7ߥ$줠ưxVap((	+.L#ZA"Ci-%x FBTP_0G"? Ed84vKbvr}:XwYL?f[wj={SVv[c,xqd 7~,^]fϦ;0 "Bf<Bmӡ6nmW1Ӊc)!*8fpN {llEuX,eNiG*#uv^ߵ12eRS#iDEWjߥCF̓(g[#*o1j1zgw)m46"ZPFiBHZpGpL`.Զ"^%yg`dV*Bh
+=fEJFJM;5[7^  zI&o^us_GmYq%Rj6nXQc4{vY3D-D^")=53od1;Z}ZȚwukJ'J_}fG
+=Q*~m<Kƚs|ΝﾶmJXtSRp:K/[[l- sҊ'":C6}PN֭]p76[uuXMP:8fbBX/Jח_$Q~TFj8jJz.#zjzsoj\reVN:@r[DJƸhɟ3\Xjfݟ.o$Jqjl~qQ~AT?N8w $,ط0>G//"5j<f$ȦKSeĒ͵hѕqX^/&,̵7ڧl^2MJ,;Z8q˴
+@sXNN,L$yLY5'h,}h
+)WU&"[{UΑS#'w}-F~Z[DT>XuB.!0)'V*5{S(p~uyX&$?Ps~W:xb~|_њ$R<E%QB˅QB	pF̀At2,zڿyP	Z4(7rtsr،&UtZۚ7,un4_l|x&HbcU MrqPϻ?|G?{ZaoíK/\BmgGs<ANmsN<<6f{z;M,\3#v(Qw? l:ѢiG#ͬ ,38YAe&PӼ5Fڰ|H=.{ɫJd#ՆzsL cӋ*c.&*!J cQ@-dd=XU2A:r+~zi)rQ-LZeA/WKWمMozarei)5S9;`[Dk?DR0@!fZhfBQt*[trA|n=e'WivSZWsQLn^0'SyB'c~yL-/̟X-LZhv1ιּElx~?{ÎK݈.	՘MkڿVb!eFJNVJ26#iwQؚvjv	~tIjMH.uEqk:P3[԰]߾y)]Aⴲ8yy
+='WX[~qBP(]S2ڕj0ˢn
+AIE|Kw7~d?`F~#[Dbb](QEY 1`bhFH55i쫒͜XSZز$Wt"tEnuZ[ԷNgISt.#!`ՑM9el,@H@
+ҎF(1~~# Ag0ԫ	V9<=RI͈^6wkS\:Hu"gjlݖ>[IغNx_pkQgo۷a+~	Ym``,hQnE/)ԂQ(oGs`5a
+@)C@*;`$9EGywtTFu_&7T,DN{R[k/ö?'	&-0(WLNµc+ZJk^n[3y,!y6@.1oXͷ_TjzތlɬS9j6+)n2Ʀ:S[гcwHtGDJ6t[	dk~x%n-5@|x"y	WiavI??kuQHQ@6i8+&NBw
+؁QfAmpƀ .Gb;B9]}qw8Ua^,ģ`@p?ʗ    IDAT,FQ1 P
+%9A@	h5H!XdsvunhJRUXYAǴ'ٮu`Bmt J79[R|&k$ⴳq;Yu\LZJzSٽ]OMt)el؂6g܎r!U8fjB%	%Q,vr#9Vv|]&$#0EPsi8M-:ԔChh[O/a$'Pd7,Ndx|O';aߒȭt\?nn1c,m*ThOp6'2ڍ-vL0^`8IqraꙪ)c͋[ޝ;F&XnӂҶOs83r][gW)PKRby9)z\yEu-Rv(Ɍ3@<	XWXG`JNLm\CEӮ' kj !uŮgdr.NS(@lȄ_|VPSlC'H.{3,6y_|̾#Հ[	d#(z 
+>lFHRsp' j/:7Q!p  <0ƥ-33
+ir>+sGįjcwx6r{Pl l~y~,!ZRnDLZQ^Xv	GW5R7<?6/vK
+_iرcwɏ'rsȟT(
+ژIiTO@jE8DfE!!.r3$=14.G^ͷӧE8.rS'~NgccߒaS~Y 	P
+6C+p!cxw,  L<m'E={=]B>e?	wwgQz`IC"qB)?*-1i'a	ZuwV>_?ۨ9ϲ]uc(?G#n6&$Jg'PJ]rK5Sϡ/5K]vl~\?}9-vW0Qsm'xɺ<Q|떑jr:,zA /}(ץvnen=`N|oٺi[iǺE#xp1=Ǻmp)zSa6S5v	){֍\iҎM<DX$бܡ?d" uKj] >V2)Nw[)q'ʕyGq~z3T(9;8*N*·nnvJ`ߤXGΉ>#U˵$ԘDYhΦz3s\Z̅4i@#-⭪:KkNW~ńF6NN뚻gdoA
+E#i9e/_߈!S~LNv=j^S.qYY>zٲ\V60<ݒIիE\9M/M)marE?c1p[3`1#G$3hĲ=F1j!X@(51HB%% [й,@`+tt,HVN> [y9}YΔޭtw\x%QB)"C>+@Ś-m ~yE'ln%m!Ώʶ)WEeS]4n<NuO&?W?rۚ~6sB,uf/02Y/HcHq0aG\QMB8bGUA; :^hѥ4?׳AEc2jbF)AkxpEî#"^Zp1|;f4bp̂e6.}v[gwuo<9r})uV xPX0:3ŨkyeXNA <Emy
+۾Rg+dX),jnqzkayHsR2,0zc^K<(x*7쒱<:!D2ՂGDW;:? LԹ|13< avARgj-%(??;(ɌxHgx=b.(?5	"εDn&n:aCHJ`&(VVcFYb'Ae*vh>%q($f/k9CFa$/9׵֭]Ҹu~֚4V%~4ӗoKJ胔IϺPk<$W[J۽v&ex5pWܝ쒒Վ#,dʔ؝?  S	̪T6c|\N_@6nߛkQ&,a%$d0p)cȅCݩ-1ӵ,a#`SH 2Chlų3/?lW}͗ܥ!d|ǰ74ə`AOX8MMY$?o-nHQax@_l!]e\7'Owiz^wt%﫞IU8:! sn %C>݀*@(D	tbIx1*φ3t/k*X?exޟsa¸oZ~q1)pnRA(*2/r3!,\ڸz=ug\:6H^AhD ]`ڔW?G}pbOyxzldjP?2*0616q'ܟ2BJN1 n^_J\Rҵ94ĞqɸB<&B֒vvg!hw?i # GyBUg#ȺHVaQ?iZw+!SIdkV#؝	ό_@HقmE) MLWG}B(20P˹c;
+c$*MJ1y%1vԶwjRz~G	S|Z[bWcDڔ,Qe0uFٿY`
+=S{svvo))kqĚʛ*εNx]n')ƈu-z|Wiů+w24UM!0.HB u|~PC50d%Ǻ%..z_֦&Åt@ )|/#IžeKc
+V==O)㔄SPĢÒxdg$?b'&zw
+=fk	I S)=QK5Soc_ӗxT$neg]l#=wMč RTS?TeдQX!IG&x=;L} B)R5r<z`#aeb7~V^?sf:g~}YOpIe*P
+gī)V8'?VɉB8DdbWqohY7T/UMF
+}~cm *U8qq0\Rsݔ	IUH#8#O  wV0d
+w[̀90g 9Pt~k 0
+vgt{eG̮[*㳮-UkcO2E:`y,[TrYUqpS
+/=O0v{kViV~~wvi&稀 Q`FQǀ|8i8a
+E&7wi7p~|u9UNZ?V=֪빯͏.ˣ҇:o[9ۓġ$lӍ}֖MJnvH"$!d^!ctF#_ׯ̫zzE2Hϧhd&ez&yX鬕iS̢3X#o6޵PJ[axjZ.e.א[#[gN?J9dMAfa>CMӘ&wrm^5BњwQ酝Cqnvm' ۅA:I~ :zY
+= Z{;f箳lܷ(ҿ`F7_)7UR|ڎ Ϲ6ckO3P~zdv
+/kmJ] $IZ7l!kg':J#Z|>պ6g>fmQ|(<cd>iLH]WԎ9hgt%ry[=߹Vk#os/-6ѥg]gOlaSa%F:]~BԾ'ٛܢ38mcAg0vnp\>M@,vWoer]uouk=T>o>Vtn4hMk@7g42f;*meڤD%ʴkϔcXڴED9kz5we$^4PIͦTB' "] b/ёu=E0DdsaM)gf~mF|knZK5 =auf9D"92NaP
+IϫG]|Az}I&&'z^LH1F<2(TΘ{[=9h|AUmo&z|5S:bgEYҥ08qH\~8@;"|0dK`.Tv?X
+X|~QVv!gC׌#?#GIa{~7\!oɔ;؝;>OJ hz7ɺUW|*n7rѨ1mYvclg޸zmlKgf1?[7^PpB17^褛-`=X/rjнe&|W|n(áѼ)S-	IVD)OPw! 
+d9iSKjRw~*ぬۿZ{s`EJo5T1OBV>mP>"m*`#5 -A h"DBAc7Xvyv&k7,EEqK.ղfs7zMnޛwz\7_ZRoNg+/~MЩ-@B%Da>.RN
+t;[+Sr89s]mAּS!(T}B;&_oOCHg+?YXMFWJ׍j/:f*;|k(vz\V0^t+;hLf74XfM;b~V=>Wi+G+ejwoӓ8i:֥_io .[4^bD=9%'.
+|2g=t	5r_nca/ln3~#+s?j0kL6cżs?~+}{y7s:IΑ:3u4DlC-OJ(Ssm{?4-^މ.Op#4Sp~((=ώ!ȮV1wd?kv߉v>sY~eFk[+-i$y[k-9
+ ⾊\ҷO:HOY[!]$CWB%@ElJ,7{WCSzRUZcWa>7>]vD^pN@?(0woŘ5I@9~i}C9}6Az
+zy;(Ӳ->iF$,NTژp#Yo@R5
+hM ML>Aeo)]HSV!ȕ 0T` k |P@#Yb 0JH[0l ۓkm'5_vګkCY bTN8ȻaO|_ܸߏfYo=tj&P>抡7](%.*}{Th8۔d٦(9zcJATqoiG(9?,ۿ!=s_g(k a];&ɡ%FUW9i]bkI9Q"
+zLHdu=A m !VO,UX!B8i$Q%nMփ5;_7^iEA	8LsH6OB
+,CgDQ(=OQHG}ۮ{OwŻjp=-!
+#G?3~;?:{woy?7aa:`ѻ}_PscÕcO91ȇ0m$xqDۧ$鉃?rlw_ʲu}W<fB$3 ?~_t.gaOPlƓ_6ٞNtQ&|"_]l_ѻclpez2oONargXm[r(Ťu&d k?`yDlO5Mj$o '-_kr׎n{,PlϊXe1wņ =߻w;D to.`>aH9P6'rsg5(Ty)="65Vǹh3d\z!0xO
+9xps!݁AT|Ѿ'o3(OOnti|dvs]*lc;[ߚ.qPY~sϙgY.	!}"?g|=o1;	BdMS0JRuy )WXf,~n+Kr61ԋ?ԋmQ(ٕIC	$/#jQڳ#τ/d]>GOrhϳD<o'#r!qhY}\,M[.sd]l0g}R]O*ͪlRڟɶPTYrیH.[
+TrHc]VP$e8^9ߺ((!Ž_Y=Mf&__J4	 ݈APYjdm6ìfD8*3~3#:g}{.L8aAUmkbVq,)AZ2pK;/O<hZ hrN"K?fleuWH{`]qv#M6ڙ`=Z?7^$3?j9T\ d	H4'uzxS^#
+ei
+D}teݛv=a5L&@^᧧$reٽ~pUFK
+1ZXZ83l3Ca9BK0YC{PGhlg>޵wNg_M\Q5soEeZ㳃]koyW.:^j*(#h=c.ߵm}2Dird!F)G~4gU"ẏX\5
+!V+U9;o(1`|ؐ};6Uk\RJL'љR:QMqڞdlFٞ5+qKϧr*}_5Z[tڿ"S} }ؿp,{קrn	U tr?0IZO$؜kylW뛱)1HLDl)8)    IDATTi/6_bc<S4gJJm}W"GXeY|#sfҩztG%~ ̎5ݿ	
+ٚBfD?~}XoM,#ǧL_Z>QO('SUͭdxq&}Q9c% N:}sysy?3̟103bY/)dc{G@Y+֢2sVrTU1iJ68+URYuD='znK~O},}ga͎7&CN#gL[;9}w9$"\£u<mcWl0P1@a2E%Ԇ~%L,[Jde.q&`2bgZͥE-&Go3ؿJH z"PR9e6MYn&ƋM!@+0R n6TAT-5:O$z/KnAtuEl蘏x:ʏJJ,\QXB+
+®`i0s̀V`Jt~o,m>Es7$4^SJ
+9>1P4'Wِܒj|,x%Q$Qvf3U$`p-0BTсtBqToH1ri29\=0"ufxNc].F [ᕡ8Ȥu?9GQPR+	Xb%2G@yPӰ@mTlpI˃;}ԟ	ovv53YkL`fsp,0hº5cW\wN5nЯu,KBP7Kfj)	b"o8N}fUߺn!e|Z"u4RO/:Ɏ40=.+v->џX2%{A+޷\a{Jx޳^=չe`OLΥ$:e
+T9d lwBf&	HSiUlIg&ֶiT$f
+%y&ggK1&r2^v?=v/~vT}Rݍ_Dy]t.?;6VӮeNF}I{6smZ|~v6~|RŒ}OO7g;IyF|js]7 -?P^]|.ZpڌFZr(:lT
+#G_~O[rnz$@d!I$8*S47tZ`EY!GY$_eV]fU0hVfdkvf/,g~\Rt3Oz@G/Hm=1FOاq0@WO`Mx@	@?9G$=6za]~_ɀމo^rj_C>;!o3I꩕ƊH10q	1DK"gV`(8T妚Zv|k>h_[klCZw1}POBΆ ]D4tEX@eA{xZ'~ɹX7sʅ˭[s ;?{F7vQ~j?9/Yw{uyq.{`_̵g{1Qqٽou_pGyma!
+Ǿ;.H~ؠ\gZs)"o>MO$՚-8[ >9c-N,YDT ,ږ,ȰC&]zԍTb#zJ^Tj@ 0-;Jp
+Czz<pdyj ~MO*۷ⷸƫKT*k[>a9)E~ N/T=
+ KpFX#h>}j四oիW7|hM_'n3o]a#כ}co{dԍ<~e;q-=co+=Wx~up~e,`n}_BUj`;䭮ui"!i&eg8?0=/vo.棵׫dbL!Z[X뚏M&g+GYB62^!m%rP9OcUQX[:&$JԠI-u.6Yl:ojİY3H+r|x}rFTYb+)#ςD9-f*oyŦmv|>%qzU*[d3J]֣!$/\5YӮ_	ƥlxznvh7VD.KӭlTc?%@gH.kτe阏gbbtI|<+ 2X|o $%PTޏj2{_>#OM/#ꦛnJӴλ꫋1Af#=BiV 59GMbn
+ʤ/B(8@Si$rxèC*=Q$CP+Nɇ/<P;3=d8)^Y~h?=iy}Owj?K3R1@"\ÛȷY!#v~|\Ny
+zIn`-co4	Z3B<Z-ΨY;uV=NBUߩLfgtYAT\BCp(Qg}xŻcM<wsݷ
+܂7A$UgWu'pR,
+#jcb[&C܄!)"F go0-c 3&XU*;?S,"@39jߕdĶd"9V˪_oP(y>+b[pTJ^\ROU鱱M氺L6.ߖɑu".YQ$V!fDZeZjfǚ;4Kᰐh>i=g&gv3ĸ~wvB0 P\ d8+.Oc;գq7)FaBP)QHIjF{'6Lt"PwќӋ$ 3 b.K& Ve Id)A(L~r>J{ЖcB_hu?fG>b]3<2qTlpfюwWIvd"֚l/g,Y݌.Pwlwj%c7@٣`'鱑ʍ?/vX@3vH'kl\||u"!&mPlF"ǵ6b9"cњЅX	dǺrݟ]`ĉ3< \F MVH#:b/6lbxyվ+k9D3]Pژؠ
+$4I*+פ*7ͧ29i#Y|N;~TU{};8}6*wiCzbC?#&IyK)-[}~rȽ_zYk'[ǐ1bp)+YZsXi>Y5%!=.ۄY(NqI-4=bSeyZ|GqhGFZ"Xť]ݴHJN:-U,cMM]l$`Ȼ}Úx*A8#psGQ8}N޶|<)}[ڐ&XtG$OgrX.w|p=9 )Q;UeFH3[CW~NT:QU-jcmڿr$w=Vfrsv\o^8_U!"S0Z/ah%Wq[l3j?/9mU4@()P,ƒJ[©BD(p*^"X*;4eXD0].|.מ|nv#q--]S*zcymCr7|z4KM:0|\haҡ~f4OmFTK<JT =w0Q&1jJd@G"ݡKN앿0HDFuRRw["tv,7,m?;:Su_'|G=4okz4/oL[h#+cR&2G~f,GEo=ߑ=P	gPҒNAp*HP)OBw"^BwɩRtaQIz5`,@L4Ry7ퟋY\3k&)!ڿol[i9voXf_PH/Lv gc1Vq,ъ}ƾHlhvn)I"1.TUiˠux8I8 Ȯ,4`ܼ"Hl!-IHmeT1jվ}oN&<k?fgslMtIk5l4ib{.bMɘdn$[m䍗;)ZBJj=#S9&6m;fj$HO+u1Pv|_- r0qRb]7B٫tQiQozZ9 $x)}\pk7s̊+N9]v^<\keFV,}}l92m
+"('Bh+gi,MA2yAADRyM>j!	Pbz^gҽI0Qثo#0H%<+s3t:zLo2tJd~B`Gq6pJT7|LpPL˚)"$XR!# 2t(,@Vź֯zdMzIr&qLCFYC)2E (Q.[d_|4/[q*%LS;|&ˊ*΂N@j>.JBtQ=Zޡ]$P}`Yun."7nQQ5TR]z3}۾Tzui4?j71d4YlPJ[LUz|fGAsAkrB3-+<`v({-?Bܺ](9viS}8ǘG%ZJazFCODw!zxhS"噦cSSeަ$ϥjĤSl"YnEq8Z=ۯmoZY:pFaTB䏆ΰp+^d @GJ$K 3X9$]89^	"`q n"C#˜pu035xɱ3\)}izŏɩI9mk K/f<k(mlg*R-%J&oQhmLPum6]1bnB/Zi,_xlf YJL9	 Iqh 0bA}͵
+_#'s̩H0$kģbqyX]$r5|"mHv%n9U-r ( R{DuD[gs|AeӠ"+\WŜ/4M;D.s+6)Q]숱AD
+^O~Q١1z#JDRxd?G_t=\<3:wW=ϱVK
+²D;zAƭ#m\/5E5ңB7eF	+3ݕIADZA{T:鎯d fy# ԫA>29j^͓m3GVD~U57C{\3P@P&&z1fupl~%Az\7s؅5<5d}r 4T*9$E@zͫ]CHѥʢ~]Z2L3ҞKUO
++\}j'WXh*S׌S͟[<A@̃J0{ODS"@n6 Z,9	^h j
+"C4"lAi\7TX|@(hM"L $IҞ9>Yzd6,oT-9h	Ű%Й6JzSђZ+tE[qbV
+Bo&?ayC?>r&m->v
+p:MTl2iHOU-!zrW08q}=`_ݦ:TuB%cAXYsyg{Fbknx2xVm#fU(Z(ݐ1bDpǐ!#QpH}ZpAd`	QY
+n20Gh]^a\|AAB"JV2HcAtNH'Tqager<Zu?gsRzOɛ,6HN#)Zl`=Ԏh]%Z^>$φ@rf"寘lO+T)See6#u &mFr VMcϤ\2[OIcS4#P
+|#VVȵJ;6lPB'gLhSM()!ʠXP1'"_țOYi'i'UT]6cR.R|]L8u,[=Ô~zL|diJmp-}+yveIꟚ̇F>裯׆0]0iS,V-q"恤v[+5gp)aDČtGh^dqS
+[z*@ss4a`TT.,YM[JdM]?\$ԿsDs,z?9'b97aw
+sY+$R*a!0[^:^YԿ7#{XngI?IaĨ$>w0
+ƉA(Ll&c}r
+ʣVt[)TyFb\e=WMwP֍gN{Lv?L!*DCt	 !0Yfrጀ`4QZ hnDAIX>{PđuњoaUrvwKc9Q.wHwË5hJZK4ʚ6mbHFH]BgE:CW2P4IW>/pypP!~hǌd.  *ng,2aZ~FC ,p"2:SС)!RSNhSѽX&3OOa}> nx5d=J 0 pBt&i\HKLJA@V d!6 (n@	
+˗s"6+v4x{yE陏4k@R@2ٷeb]Չ/kv,6H5d]3([Zܗ25Gr̠Sg0h%o4ɦ
+擁%	b|V-`j*fJE#FZ=l^iSj+@A;B=]Y2IXKqٴV;rtazRyBTv	
+N@3-uUy0,]dZl:L %Ǝs!Q(R	[noWf.ueVrFxF~sޗŢ`="v?gS)Lw5QAz˧!%Vu֝;wضm֭[}pu][l|饗o/˜ET({̩*D<>|,%:|ӵ&]tОc9yVh [j
+i    IDATª3BUPmhrAB3':t veln|:u/=>#䭳ygדU7{ɩ.YV~h ~,cS40`'X2ы=~5@:~B5|M?ƉKak(ꖞpILUˑ%P-ʤI1۞Uw\+[Wn95mܽ̇./Lwڈ"
+`ho`]jNɐua N*8d
+ErABy3Y ^>$$L#]?Yaog4x&qbmLU_iv1ĉ/T٦s#ѳ(i"L+DwIHwDCW[$R'ɓ9jDm2Sgj ַY$+<'R̋Y<(M YfY~^tsQϡۙZJTs?[ǎU]1vo<}G7_zWg¨=mt_ 4XdMs~hC j Ekѷ α"	n@	 eC-dK*	PӲKT+_>Pk_ߐyVHGkT=/}_`=\nO0RFD4R797#rKrJ'=a3SJ;x׆P <ίchd&-TLjV۴eBsJP.+1N*Qn=[N 棭lأdp.D;Ӏ/	Y]ygUM [ꊃB1B܀<6!Nb_TvHXF3h;K$!,dw<hiPT.[;OG'gN,οdt>>NckI7̎)YuZ3^t<M6]r% >M6= (G>r'_n?~ucGS F*ߑEQeC֎@	e٬MiV^nXh)"s+pTBE(_RvGVlF)Zz0=B&) 3QrYGI N--Vk>\rHE?>Z!"`jQP[TU>	
+TUTQVu+Pn>ĝÊo~p43_s}3<Hx~E 1.p&9WfX"/;cn=ŽȻؿp#f-l>As{MfSKшldlFܛj'djmnKoI1"bRYQ7M{ًO$<Cso|qHv"XQ4߀Q'	K(ᴠ "FZ5/#r$P	Fg!|L6M]L68Νvw`Qh, ṔxØ$Y2w@g6zw.ξevژZ")LܷjYYPS8լ\*LSG/fopKLnrn	zz!}AA!Iw2U#>q%AmY#7XX⇞\)l4#U;Såsv)2vRoJ~JW"yB\voizHNW1}2()Pචb9.*wA5lBNa-!Yh	-'/ZyphHYRQzY6}B2G3dl( oHZKM'ӷGߎ-%qqGg?7M#W=8qsHd'Б{w"ѦlIСzLiB~0/ruEL^Dϔj[[SzچbaRς
+к81QǚRtC$LU[SaylEی2}+dz0ժD^n!v^P۰$7<gő\6t(3cنʗNLEaj۲<.%d{8,'	s0"{VS%qZjeM}%}q9:5nK$'u~4wGݿM5cu><m&D}|]fn]{j&bUvdEؘXK\:౞C
+Kcfc]Z7jڱgcL5e,yZ=~Y5epػi(d%`9zkk	މ}f5'=Y&<]j*{!"L	;9"
+MޞMBqNB%JZVΑW\&^l=}I/ۣtXBq?fYe{ûB~~q%]O67vT9iVWLPZa}	s3Ǩy^C߻S:CM!.arѽy@np8PXMԖ![pSpy
+a;υ%Lhx;F{{Jor$4Iosx:eZnd %	c.?-hѭ8?Tl+baZpmot3@9MZO/JX#ӷw[Kg3;ڵ% :O~6S{B+,˴%G)Chέao8gd*4~x{'kT^sͧݷx=E:8Arjdt?`,q^)1Bp ;Xsw`x * ZFQä,Eopai=\i='ա8{&V8_MOyw&N%y=e%9:S)42Heܘw?3--7Kgj	&j`-N gH?1o:4XY+;a$wzـo]w-tYW<L9`)'<@	:J4@%qjh/Nm+d[Umv{璗¿	>鹋ɛkηL]֜2-oKvn1H^;QȝZ˦Z󾨬OI^ջ0UFM~-i?zW\\_r\aʯ)ˍkŶW>kVGۀ$z 2mIwi2#6в_P8%8r$spS-Q a*{R 61PT|l b{)$KeZ[`7oakʾ}'K
+ciG|̮XV:nn6Fا%8Ui1PȋlaE?3=mSGt~f,xGϥ+Ld&F%~B8B#z,R1 
+~6$h هm[D~T@ɳvwőz>x9:.ρ
+,(](b*G ֏1XG0Cx2GeULF7X@/E)&IcZ63ʴK	XajbeJ|]]K.m1$P[r
+ :籍-fK
+NT-- fS#]#`rhlHEcﭑ=*YXT4
+rDI8c5X{seS{/eB
+an'ByD&#@/?Γ?i)7Pj{@g3|tpx<y셑(y*@9[aE2EPBbfO ^O Y@+>8ZKg;n$oVy@vcJ(F_9W87J0~2U#X^o-W\9pqiQ循%/z2\/SR垚2՚*,XIKu<Q6#Hj8Oԁ=*Kzq[ J|$&X;-l@q2 ɹ|o5jwD)#bڳރn;l}*GWWy5k]2-;/ύĦV yN&i%jQƈjw?2fX 1(cYaٜ]efVԎȹRta!?5G머ck.8*n$ߖ~t`{:#&3H4Yi51z
+Ky4$vTqi "6R%^}Fj6YtTkjڱUJ j0=,m9l0:9xll,7=G_2-db/^}@o<\ ϰ"/qP0a]G|l/VhX`:X1k,`Asi4`+IqC}Ql-`@-\&(wPr`tB+ yXX{g.9ouh?wxs+	62%=@>P1	|+a@*X;Jb%\_j4Z]{wՎ~Syy?lwiSvYiڵ+l>,˪C[m%V)jQ'LH'u l>'y|@ 8v'yY4"66uC"d5(S9TLc<$Y~s䍕?yC8*Ft'E,Cuy`6{d/?B4kAjH:s!	MP]@1pC$#Px?&ި|Zo)|nK</TQ1)P ֘KbNgA$N2:oOg?.+ul@`75	2'IevT]m[EG2% cx
+ݩPbDΈRbҶXhCĺܸMLytwο+S)',1CtaYF)7'8%j_$L嵌L{ J'23KX3І2T	
+֜NIڗO'td)cU'2t?>3~K
+J4
+m9#*3K8J҂֝q!?oH6GUp<7-=5[a*5dKΪO#6Ǻ\e{UlS3tדּ8,g<7@Dө;
+4O6!gWwWf,0n5KoɡԮeXPeV>"d6y<}hCwҷ0^ߞ+tO^<K̳=ktHflSGX܎:U!NƖy2x_nэF(p#íBNA(t
+ ܉tn6[HE1 .~ŉS_ϵuvT|2(#Ysjσq=P] !3xe>mBB;7
+qs#޼x!!rYz0~z{F֥iL^L=rexeo7'S\R6b=_&zyCiMjiPP[|hOo㗝VGճPl/0S=aJȍ@9%z+&Mj0s;]VEF7%!Ё/A+sr]7P
+EL
+5`2xPhwP.0dw #X8Z7`> ~i2,*ԑ@9B=T:7%S ϯ£yL׻$EB^{_ӟ֭V>ۅ.}gYqgEI^ҦI]t9ζ-bg,LJ\/7<y=?;.n(j/Ms{N?aչkXEQM`B~*K.[ӶYvuiJ`ޝU	q,7$-ㅙ+2I`9֗8q|vhOp{n)$3=:p#xvm!-*̺t5ѻS]ly0mNt08=eF u׸$o0\Pb>M	+mC;dDlh2gm,EmD=y0bMY2,dG;s$>|RT7<w؆2M[lmJWDP5Z԰2՜={e.d:+qhalŧVYN/M.v \MMQUX1+RkjtU";Mz@ڷ6oN&$Zÿ4Gc(x6hm-Yx|d`6-zm<m8UUV뙕2mMRo'zwy2Qj?0B(MSua<׻"_|Z?TsQ
+Up*%@Ԑo _J=?b%}5_b-RLFH{)-2]@oXM(C20A(հ~@<)QJW`SqFQ4)N^J.I
+F{*{aEU@lddSΕXJ@=\6HRa|E]J퐠ʈr!,kSOjo/5]ް_iNpL`n؎Kd#{pН]2F%aie+1xi%hYa~h{ZAuP#[ A]d E$w5I=Ͽs&0<?&Pİ
+~9 t!VZ vrmr1:[Fy҉'"Go4zqAN;/j,9wiv\])R(,k	тs3?[OpRh[/V'}C3e}NT(f$٥b~I\6r٥:@g܇9Bqb8#VP('jGwoɝjF}D=$N]Z8!!kYMK5qҡSa*SEFt[2iYS uC%YaN'PˀxU	 JeQq%4`>X/E\:MXw,$e,IMu<6-w}{~P0{KR?4lQCG}:Pg6b%jjy'`	"[!S .霒	4N] &[Nb'V15KAyQD쥛Iw)8ɻ ve&J\,096N^e95 lߜ_ƶ+aa_guqĺ;wd[4D/޿Dޗ@4ǟԦ6!E30秬)HƠ~	^P a,!]`&": `&'nW>P+ \r{?򥳯/r0.dHtG/>\4kFYb'O+Fi ~Q/,RCTzowӟMy$+'j٧$agdaDGnh{KxD>K@zf+[ʪUBv+ KMr}Ub/8hjڃ5[|,P]6!v>XSbjA)</m&k[fQ\jd`(    IDATTq,&b
+m|-:_Et Xʻv?Y&,_ѣVW~uh@PdᴄLyi qc"*A)!dJ;l&Ik,`8y%*;^ L7wFlUfV߹`RX|.WWŭ;L5c#.)9͙>~_1dm<XCPI[za"} ;(6mznvme?R㝾ܗfv$Ku}jhbz@.r2n5F4<)<4l')cAqE?O8^%p͑]zvGP6֟jRO|:U-,Ui@5gW4h/5V~,Y/b_[;WoMچbtm^ֵe8:P%cynKngՑwZl&.%5B'ծGmz[ae^fJߢDNt[絝+L}j
+ s.R-&kՙcJ[LجAg`x@jv̱6kT"]2D9z=_W(]{ &IԞvPͰccvN1V"k%vKFm0	OrfՈ"q\'վ258u+8J4?KuqXwDIyᢺ E'DІJ`rϡv9,FO#]oB!ނZ.ڰ8POajs(D- >AD6!. yk@$i<~	+!YuR`]F{.4}#{K8
+ic lP2dKT!n#a̶8#)椕ׂT*oa$+D\#m.ϲhbcnnNe+}[qCA##˟p
+(1	* ToRA ,O!>9FB6U_N~s# ZtR)_*:Ǥ,Fe܅5E>,cǨ{U%'XX]X[iQB6'/˿YײًO[g+{Pz{.s3:,8LЀ?KT>BJef;gdz	>[!Čz޳U*xLlSHFaJrz ٠[1eG Pa 
+&qZF?cQM)Jӫ3F&S}ܻe36vwO u2], TÖʥ
+43iG;,\R)	Y^oSOaEg``'8G1[J\A^9͌G|FbM{XϘo|UW_}?:2_)F≦{/'RaK;KndZZٹ7V{-RSg$@n%`ޙTĳO6P66#cjLTؔN@&B{-9qkڑ1M;/.	R;mp۱YAHvXk8B0F'[9#ɢԧr;tnD朐҈9'IMTc 巟M^:~4(zx)ǒ5'\!/w`X"QۏdVCQuK%yVGi(򒱁`R]zV7S$)އ8~&0^	Bf 0nO݄3yw/}$chG'ڛsΊ;M8L~av *qb>O{ƆqHPhm汕XAkeJO!Mёe2VVךEHc!dJ[zplNZX7ѳk*Α~s>A 
+>Gf ѮAH(}d0 \!(.h*J60<y1lګk+j@o%?wp{Gaz)甪	&1
+U(hRaؠȡBUu<hYds [{?jo%z	gt6_:uF |R2Hh!)? LbAyXۊԋ	t'CqqsQ[?3Ho:4䷍6VaC
+BL/L-֕bxwUŪ:XeCJlj~~K׭)s=SK5}RBr>KRFk(VkA>lWުC`$V䲠~+`S!=m\]v^Y;3;'z K=)kyaD]D/en%u oHkZʺKirPSl?Q;Ցo(]_D&
+.K%;wՕSC<Jl7.McM* klD۠72 $ؘ,6e;ldzΎ])G].WLHS;1PL3](xuEp*=b@$
+k-dwUy=+h77:R"S]胁B^yi6Fxr`n֠F(	!XP
+^``M85a-ڴa4zvKEiG0mjG0NGx%xȅA^בֿ>.NW׬=0һqVώWWOQiжО/G򡼆em u{veN'چSCXې3curȀH&خydG@
+9jE5J,3Ba)!؄BGD^>|RF"_;--%(\LVk>rXRt5d=PyTAa-Pj#a%9$[(RP2XDiOUKJN'iq;#ccf9;+2CfQh^l
+>"9_prIF'Ny܃~3l}e%K,|JL^[?/AO:Fi[C群n'*H@O[ -"-Lۡvm5XxwTgFҹ2yIZM62 gl+ջ|v[1"#~	X/ BnBZÿl3MY
+b}` 5KA.b-\B=w!zcz2N4%&d	l	 maR?_X*Nw;ӈlD0*
+D|0ejc]J*jL%YQ)471<gYQO,[/V7{{yc7:^:e9NRHԷ{.\:nDZ >(ɕil{)tX3N=JrAhO\SqgD;sԗ<VE>h񩱽4IWȒ}yl,,G!Ans4y
+?G{acvcg|=ilKkH7~zӳ|67DW(Iig[E,^z9񓹺"_5SFgL^'bVRZDoi2O >d-	-@m
+0`]ߎt̇U 
+5TcUߍ߭
+.Ug얲H<ҝec)I(MycmaR_~q4N2.!n??).nBNT^+iyνMx#'C@ʊT-j[88լ,DTXa4[>	f9/R4OOl|sbOD= G$0)\3kyv0l+N4'DDTf-f6rݍ&W߁Rp|Vއat[A(x5O"[b'!} A),-zzNOZ\R^nU)BQ,in^Qo&oۺBhoNgӌiX/]_ޕ?F烜'-	W6̊p∣'ruИgĸxA0{m"3!DܯlogdHvl9Mu$?ۿS[?I7!i%/Lﲭ
+\S2mcPWGrT׷kCH<՞<$HI0 F|w)TkW1^і_^Ƞ}L%˔X2=5YGVj|k+vzZtl"jU93κ:t"SnneG6;1U-,hYǂlʊCoVJ{`m
+ڌZg3?ٗs+ur>6S\Q,t?7zCpsaL7ɇj^Y.|>[޵|y;Y쨋uI*ِB 6)3[Z?VbS
+I.V2S8je6qyԙzzC%:Ts:ensNbB֤{vFRdUrUlφd{QlTȪ4l!HCY6|0.;rgIV`*_3ߘ?=,^>?mmz[E^歹QcD+LGae$|0!hB>)נr$Xɓe D	0
+&Gڅ!uD`t]QN[	z;{wFw1c+<)eݘ<G_UEͬOfkiy=zNV{JTnжg8-;lZ'+ږ7TTf@pYI؀DGᄤ]{;|49U";Rl+5K6 lg`Wl33MN(J.Mq<܌~/_=S~,JiUdSDXpC>AjXVP)(E>#O<0z~E"'6u-;q<ii3밻	`NFJ+6z(=!f.M
+ 6
+?FtwaYz}Vxfspٍ+UjOQ*m٥JJ&I!lJ3W"q:u0`[vW$%D	?9,hX/9md22W!T8D{4KRgKYi%g&MARS&QU\tHTfeeYfeO"qm>15Ŷ`4TZߣ#mcY8:U36%6H#e$s ֛uO0,/3@j|+uiƉt[ϣLr)H-R%M39S5_Hm>Wm=J㱞.}E~Gw֑?()"QqǺcޫ%7#ޖKTjj3gcy4K-4b5GA|5ؔjY/7@r#(-)1T)1U.bblభEISduww\U((b.!B
+aYp7eMHZ,qm@#$&ab.WÛ߻ߜs9gGtttȄZѲv?3#GF{׊}żSS,--{EYpT`7g}}Z2Ⱥ mqO1" g>p9H`I2bJ\J<g戁tn͟(ol|
+/c~0R
+lp*%~Vt  l	B' dBi­axyD09\1u~\RQd䘹Q+}ΔZ}Xn85n緓U>YV7js77_J۔<U	ʛ4Q&#k5)í,ߋ˗v{mln6pr06jѽvUW2Sދy)Vv̅##3>)Лi&ڠ̘;0AKo%fia/(8bvOf2KfB1cΓ5AԎPJ!jm	XP[c$ǡ#l;iZ"I{}J vW3gf̭q) ;,;x5(,zodˋ˴9|"M_\(yRil/7'ޗGPJYB5)m;OWvv}i7\Yn4̵]iv47?H6R}eiW+K*Hf!T p[d6_7M$̬XHWT%KE$/L܆K(>(cԼ Ќjɪ"3+mD7jPMy"*TZv-Tj$nѼnˆ5k_ydov"k4"üPAm1'H픫
+v
+	9[v4ˠdyrl9[.ؖMLn;98Kk?7_O9IR[Pۮ_}\VC¶D6gZF}ғv7K%PJ۩82"wh\5^eJ;"Lϥ* j2m-vNmd۲ms6<8zUD	öJ̃YbT!+{^V/;|_.Yۓ5Z.xzכ9!)E5npǺS;CMY]:'+}|<޵v/\<_5Jܳ"-Xl7՘ր-F؇p`
+4W%i.H~ET	xA]YIA˃6-]TtĲ ;TkzYF)fhBY]g2Go$ۘ̚
+?w;$eS~0G̸xbt*1հ(aȭW.[meY'YÀ <.xdQٜ+{>Sk&X@jXpzn8aa4MiGޫHĀ`*n5ڑJluLZmJ^F^ O`d(p'/ 	)mt ickïZ[jlZllP,fnK*.Ϸw%ŸWtkV3ƬX;g:vcVȫK}\qqfov[g7z\Av/^Pe"M0DU;K犙bW{xM+1_wOtSY)9츏0T5'ֳ[CsރNq8,RU%{ I2 g +:5Qzb:겪	D""ɑa^jeK%	UeAV)J69>-̼J(9n#[Q"MMGͬꪽj -ҝyE{{!λQ2y7AݘA՗mI%yrM\77_"-l|ʻM"'Zum=UTK{X3f~;>GeE=`6N"
+䥨RPpNJ_^8PGf!OӞs˥}.TTQ/깔K 9VEC~|nmIghJ>٤3>H]{JERC    IDAT'4|,3tH.BȡZC,H@T t	}1:CMoXv#G77ޕw
+V怫J)eTa<_nvE!MP_":T t|w5FcYN.f`*1fKߩ1㜇-:1MOnX[w|]l-yYyfl?pV&ϯr.S YTs9\mK%K̴:t.H_xj_jN\dƕus偔{FtX iXObGM$|TݱYTWW4@4@*ezٷP7Vz>s_ڍ8i寗3F;C:PA"A bt
+	Gۘ}rqmj|>oP\NKu65O7uE坮،nl/Wr4?J_jݞїjz>^_w>P= _$47;ǣ;k\#<><*^ʭqux{Hs;k%f1\ak۹X,瓷7Dˡtb9U-=[%EjvN:m,Kup8VDaG&+7.-$|aOwNrBѝW~ddCVc#TWɾNˇ;Id rۆCE/KU<
+qfUٱsț$f%au>k!9YM/S[8nWkXrHxBI3Ku֯˽XbYsRrQs㩕Eq!e(CA喬Jv+& .':U'U<f~;ߏ[=VP)3Չ:RRiYg/jZe
+}KEf_XȖ햌ʥzz~9U|nQ-5yTu!9D)z)/hDÞF_p^x霸&ĚFlJx QA݌G
+Jɩf8}U5dRbX-ʶCIӻ{Z ǏO*m.{6g0d+i4AkEQDEU]o"ׇ&;BLtlQuT)l		m"|EjbE8[2	yi9-Iꈳ=/M_Q̬Ս5F{OVfn8Y.AaۀoD(؏,Q0ZgR߯m[rò9[=2FD;VI"K.K	
+"iahdPaC>uzܨ`=ɪwƕ[m <~8PgW;o{i<?yt=x}:b/r43XSaK-Xۀ0:|zP.mݛ}p<WO@c`]cf?Iy+KC?ԓEq$)Uj_n٭bRp]9)P$8rpm;~_ax].
+@Ǝ`jQ˛?4Rle<uSS]-%z.
+aߙwIef3英)nm,gvQOֺjYRʽ}sq}"Yڞ+7pC;{eZOSY#$J Y=]+l4ElmҬV [eeUsO|y&g^CEgfybb,rde֓%v	LPu#}JD[zRਧ"XQQZOKS kɊ3ʭYے	h&o<bd]=T7bs9".vs=tiny6AC5rw-Q:3n}L{r]x庾anAjQ0xYuC3|A~c	Ւ^ėj8b@myI\ߢċZٵ4hCofC4'vǣV@5]MVb2=]ST"ܬxlFDe_?>/]ZEuc#:%(;XӾkwQk#ջ :R{ $PF lԑL:fD>C؃ `<]J^r|iaV&vQ-.>W=ƆV9YoyzM){ۄG(/'#sό,Y%ܠ:H(풴3,8ݪHsbQ-rY9g8⑘јg%}~Ts9g.{͉+|EccZp"wA5MSTքwK4=P:Qqm'Qґ$F/UJysUQ5zY@93!K#clf;GE? C	L頵6G0lk)?dYobĎ99֭rΰݪ||I}9&G0<Nev~4}3be.*ˡ+;|TbW'	m{Dե3ajDTYucS,Vꆨ|I\]_%ͨ<HR"T0ȧN(,LR@]%55f)*KҪPMиZ˃UQHM̴a̟M+h/
+E !@ˎJ	
+1qΚ GOXp좛LⲼB~85r,%yP]YNnz枽5DO!Z܊+IB!:pC5v	2+kewh-?WLvN=o:uKu/o~OLx;	Pd0xNm+~oʵ~wi޷˚TƬx](7+m(*qu+$Ņ98+>5,;S٫Sڶz)YξBܚTs[.6m>\X50r)p)ᴥ,$mg^vu!ǼiipbAkUL>Z/l76ͩ1LSt";[sˑXN5Uع:k|q٭V~K|"F4/,zO᲼ic!:t*C!Oԡ+8>6]t 3~>:  `;:O鏕,,xϜK	(n!%ET:jȍb.AIinCuaRh9$%>} O]?LcSkqb65+40su&+ 9T9R〺{h[>ҧ1?0 |,OQK/P3(<%G To{~uxտ>|']J6>7t#MA3Pe}y$^kRX	̨
+MT t
+FYE:B4L6`4zk^0=1m/
+8S~jMyNyE欺%1گR}Eu{bVèSP!?g?i}9^:JI_ \[yukil'2s<{wMZ fUWTLl]%f>$nw $I;"Tg}t9R֜m꺊ËQzKmzi> 	N, HPʩOAKD66u yV.W39gzmK-	uFm0γW7\Tp=QH皵Feɠ̚g8Yضi&i@ئeLD=⎙;SSO9rw[yXdNKj^~?ږ43!l36Fzi=[jLbiS0_OgnG?w\_O7\[}r0"Ȫ1WZ%5+딈]i9U-P>dX`@>?ɳ*~ny!ҲC9U/,VG-u}`_M5lEI#IW"}F@ C~jnYj1Z]ڲq(\7hm6,.tCNU4DsXւJ3Pgl9Iχ>-(+1-!t~<o3[?!p"D{_)ᇨ
+8.:G`41+,"m^lMZ`W(r娳l⍡wwĥnuD(7SiWǉ7dybwjsŋ<냚P=:cv)ꃹ'fvEV75%.ٛV`K=c4beZ-:ʝGgF!_b1ѱC,'C;a:M1ߕؖ5dfQŞv|ۓUOONemQVwRT}Tn]EVw.e |	t	YA2TmȐO `pD5q'`nB,㴸}vkf<U5Zm	%ͽ)Nq'SS^iIyN2PO꿲/7^߷rVq;{ͼR'ml?nꢻBuRI%fbѬ:tNLnH6TW mnW"WV<ڑ,-Sʬd^rA24t _D%@<f&"ż$vv`l>02quD)@uJcMԅ7E~)xͅMN/Cfő38hcz*?US;Hx뒝HwDk\^t4DM*ov"}ٔtSo*!uh /J=s_Ǐlevſ'1f#;\ŖزK<Ym,0_k^NCD[VWW x^wk?t/qI|:N@f:OuŰ<?.(KJ=륖9GDXV'|1b<gJ}7ݪ*w霟s{-J{աMtjPDg#y"r:sDƂfs>/nP|K7Tl>9܆s-ovF!5s.3QuJE5b<֒B(S Opa{7ۭO:r8hZk\`$qh93S $Lb!  Bw4/7NtgN̻Tϸ=mgm=?+zOEMRsءqUrP4{5P\O^~g^iA `p|Au0!7Ib٦6k Zt:Tѡ02NWհ`jƧS[t?
+Rі-Y}VV%_,mw{uO}yq<(Fp<5(KH	E`E"Bp4P0y"(R9ȝYBSt'g9,VLvw(fgP&?rVϖvLR64YqUbS_v{b|%6R˯6g
+K@:<ꋨbdj2ް/<EVH2֖9$Ě2pjdљd~.=_NR"bfzqRԒ0EՕyK-9KRH!7]	8l6up_/m|TϋzӑjJIJ36Ouelҁqp)(8۶ld U.
+Pl3G/X>t[K"bxq,,SdBBB0̥Yy{Gw$I^/?m>/¯گ{7_Ŭxa?¬
+=s9!Eef%:P'C^)Ʃ>\w&ͭ8kn{^Yi%fNiYV刉s٬'ki#26id3/ۋ9@P@afZmԎG&ɢj	Z7'0
+BCs1?PA2IlvX]UXe즑q%uaiOϪ2}vCᨺ9}r{c;9&hR>nA^5b(^hu-/
+N 1P $`KX?uWkE>1koyO6ˉ٭Cn;]GD@&T"n7GV}вSئfDQK[z9LL%Ay-1ȡ[O(klGVTlmigv/͘澈{ۣ1;B6ϖ2lWLqAnTc؄7čf/JR,\q:F*n44G4{Q讼xӷ7߬J4:3t7.M/@6AU@*+skp<(W5kʹgO
+8.u7RӭYBzLmR~KiqMdm\nI!MbDk:VO+*\1(lx>;r!~u(TH=QնPnݱ/ͪHf~eijjGˠKSd6+]fvq(%ۋUt{fhCeb܆ETSi+qY0cPu$Y (yn詁`b5.,DC(9g`TZpc.U2@d
+'Hh
+/űV +S;vIArӜ\  Ү8n-hIgj7]91oX87=zdSp'$: Ix}̏'CEYX7dR1\-PHW$(j￝:~?|뭷^r-~?A _WU9qW*=.^-*lSQ/L󷕦R_1._Z=AT]vUÆj-Ey(/l;vY^ݰWtFaGjOscT(J"t<xsW*&4(=iPtA	"Ǭق<62;D 
+~ h]s69'qi{7,KP,Γڇj	#{FAI\BD: SqtTZ/.ʑ'W 3آEKX^chdJ7amSʙ~Q_mfoϫf:{EK"𷯕?e޽5͟^s6",Tf[H4596et+޹yل<޸e8-YNp͑ih~uU4vڜgCKF|<.S	XmЕK1JlHkS.ҋ#jU͕GݝAEl$*Iyɍc[u{\lo5?jFO9}b9FH/qk ?Dòf6B`uMqvoTbLk$4xb\4.?Vh vySa6O7KLZpQkplU6)P妗0-tơĲSڰEnGq-5&KYUIڡ94)@+b    IDATD(mO(8xk!{6+!*9@c3ͮ\lW	.$%Gzj-uҬf.hJߧd;b0K=sNKR.8kԑg>__CdR |%e\hlgt-"<5uTVjԩ3M:ƼcQ,$Ė}MWe<h.}{lEٙGAAudfXp"XQ	&pJk^?d?(;|rW>I@HLkW	>mvz_	fݽw'Y_iΪ;}P&hT]>cm50EquBG̝~};qu|>TF)uSMӥk7#Bhs6 	=ndj m;rQTS4ץ-:*Hi9>p/mgkuGg3u/ꩅiu͡nU%ʥ'㗅X%~pYG~t,t@Bh@2(S0`.ZT3,e*˛?hkr.gԟJ`'8v|qly~%dnlO46Yb%)ub93gCrj2ur%əjNQdg
+.݌5Wī<َ`~r󬹧/^ƣ'otx~yQ ml5|>?2Ztڊ'9"7G0ڇ4׮_)ѭ$5s7ujQAks,oQβz,o0VhYYެX n0@󖛮[U7Ziq5
+n94'j}<Ky"ѭmq??O]KW{қ&۠ظ媅jXB
+؎h1h3nT[5SmJB
+2D幞|[2r_׷+}-V=1U_"(9K(TsUGwAYpDYң9鲡uܳ]jɩXSW]5lŚ({1{gXϫ,-M]I9&zl`0VM]hu=g{bnbK`#S'qSfm$!4j2wUl$)j1g!qO\-.oܭY7\UԢ#3>U#.]s2{=.牢Z@>uMxH#EMG%.w)$3U;ֿƘ~e_5_x+OfBg90|APm/3+鏖\6O8b2~Tq-xRRqXݕ#Mc}޶_4ut^yuC/H|j$Joɱٚ#rqhQ HϏ(u6ћ1\w<Ky-lƃPT5<&yU(.dܜ>?Gܯ[xT1+G&T_ Fn>L"%		a4FA
+~=60Xǥ'A[^k`66tx[!OP髤g&jgz!KVK蜇)7mB{&j)]G6w YGzv\ Z=Lvf7W*3T;|2LO|)߷og+b>gQl.ݬ(pЬB}~;ƩGu\im+{/iKZPƼxYSf#g	{r/C4ԩqs'n?Twُk#(kF5f%9>_.j=ៅ-0]AGRA
+ QPeyxJ=EuZܩe?*Uׇ[YvŬ]|HsgwKf7]w!"1?|R 1H)P޸~[Bg/.R(hdȧl݉+9w
+;*;ĖUd}2C;ڂbYY%IDbbT|hۘkz.7?2e(JL̃S$-Ԫv@%:͊~%rj9&vu6#94y]칧$J[K4=~4e@fKW)ȟWlLO8$-l@	?+ Pԍm`b;ٵ'}_nI`\92 &|.)+3CBZ17Dߠ2\'mґ
+K.3۠Ch\idMv*~MNNr'$$D !@	"W
+QBoDD!B-En)"=$'9''9}wZuoWg?1Ϝ2tq= tY3A1HHͯ]KǋSη	&T
+
++=&%AI=޷K'|HcdW4{cCYd$ad#-Sm.#ӆA:S9Mb%=YԼ&O)$y1n!xɀwƌ1Qƀ/EaNXUydKfQ*WlEjwՈ.
+nV+xm~ַۋǴ.jw?e}|0ɿLb@179Lm{F`=+"Wh5+XiZ.TfAH4h"r0|Q͹8ʱNݍ·oP ;w4ąq"a峂Gs<fQ(eQxFZ0G1e
+.$97<\̎OCycB:T2%ܜP-idC\hU]wiʀWgŝ
+#jsGWэl BT *0$W3(1قyQ7T3QzU7m-y8WvKk_L-$CKǵB$U[/6 $j	DҠ,,w?gwKr5g+f:YZN|}Stv51p/uPqq[1"977ˢe1YvMŲOW鬵h#S$
+ b]0%bInF 1k/a
+w!uhK-ܯbYNft2=5ї_L	8vbjYI(֮$M͘0R3Os.0ErQSK:<UZ?eLp[xy̰Svâ(5'*3Pe! \2"F聍JƜ {qˈ;FWo5b17Kn3i*f#lpwJM+c*M}nn1`y*vTOU@C9T)?eTCތJ@Oy#vK_()f|0R}7ZJ)i4G.ct:$j~#|#/8f/oEȋTzxtAvo<flsEsy֖ˎqAql0H)j$ wmeUi3)ўeCq	PȪ[ܓ>/gK<XZ.2QPWCev(?Rr芖$R3jw*0L3]T\l|uQVzcR4^${K?Yn$1q5x~B 41@RLPEmOZhA Is_39͒p<=n]諂oE9>Om0ҧ}Eh/Ec^AԬ#܋iM>qp:{ĥbO1e:PWa\]>Z[8swy-M}$K^4XlUܚp+E/rbW@]2&Ȓ:f؈w$ʢVyCUո9f=1~)v).mtȠrR6^ʶ#y$D8r,دBkQ47
+_o;j|n4F'35Z^9~v0^rFl1O.Ϧ'qq(hn⼀{
+CSI F]Hѷ(g/g'C^S/dK%QQ٬lN%g#$=t)e	!C^3ȚNL)+  Rê-XPg]]zU偊mIݦy1.ؤ& R
+PPmQaZEspRQ_XKivhl]l"
+М<p>=82b Ar8	]RcFE~LNIØ3f&RvрkSrN+BiZ̞/:g#7)n%ʧlI"~@(hO./L˃M}@5:<)9	M#F_LhjqU]IVleejm+BWLHÑ?زmꫯ~衇^\[[;{7OOH6Sq~ҹUl.g+|5JN|[UL;=SJR+|{L{z(v=lfMi0ž-Mdo~!V${#r#Pe99hWc<0H2WV72R#x%hvcoΊّ-x-Z*
+5Xelj[<gGs1lt̳.r%,yd4TWt:oM~I[w<@tߙ&hlخWF$<@I)Uӟx_Kke<oz5R]:ZzsyMvo7X*^¡lt1eј7sEڹ21T;|l{QY8oξ՗/g%sum|q+]"#y`bv3W'hϧ|bB)A0#nn9*ia퐃y*uzdɖ#Uk)qD5ԣ{]g>t[Jw|eM+~`w3a|siGsY6UͶIbtqz4`_Fmy2_hAv T{tJژʫpǚDp"M*>2-|8{|ަR	π]ee3T	SUJ$Y]0bfYQY׌0?AOtvIT kiR͔	B0]娜b
+W])%ZQfC~U4@X,jK9EF zQsoK)SsK6->6j4PqquȪh4O\M
+zpxp2N*tpG<N3yx4I@E$/g|KuɦMUaQOZjʢr-м5憺lgو{UۘyZ2HWeSD4m]egL-E6PU^t?ln{̙3g|A.,qJwݮ~BS/u4(8Yɵvd=1w]ǇMVz3c΃g\,;95[iZQz,QT`.&6f
+.vIVE͆'-5dʆwk5R͗lXƤCejw<Sܰx4^2@'ᘔYf&maN\s1ud?o,Wĺz,4E[.i.gj;eA6z91~D0IQہ9n3aYB2`0blg]QuE1DB67'Fc<ZW#lT>N?v$w?TvzJ=>&?ѼIu	GM'pD|H;,*fLbw̃-~NGXW<
+p$blz4B{7Um6b}טWCK␀yL*avN`LJ,"5s5Oz}|CJ
+}.ӸP7RͰ+OI(BFYZKӃJWǾEOJX7H
+/Ϲů\ [yΔKJφjZ&Liq!nUly%D
+):,恄Sbތm-5H:T1#FG2. E9$DO#PWl*.t&YT&U&Ƃ݉u1!b{)[flɵ!DA`.Ur"u_B:?F-|FEC7rQT=r 9gUIAYڔсIqr((	دe޻y>[()7}\PaMu,f=̡b(xX]{7eʠ<\4)!Q[xB@ΦTCڼBO4;}^SL
+81
+cfHDW}go| u]~g oЇ>o~j@J*;!#JT+s-FOa٢J5'2]լb
+7i+?ȋQ3.I+6	<H;.+.i߲E	I|"npNs_
+oiUTMy+!I/`5iexU3o#Lk-_-ab촓Cc7%8eWW8ƙZJ<fǐ[Qz>]0fOV멚&Fp<$-[[Ao,  4Bks\FpW5Q|O&/5R/~i>OZjL!X(3ecsGXĐ.p'Ah>@@4⸸rnŀWcnXMct]بҿ#~xM Rb0Kb6M)'À`T#Eǀ?#^='hqMt>mQ,vo+a9&g~=	J)R8=[b3.!):J.z52񜐍zE[u=V^U`+Y~fײ)KJrɱS6
+h(~Y`e־!/w_sR4V^#PjNҖ5dNd]jw4!hF}.f3#5AF
+PH1L1YszQ̆y Ҙ5T'8jiE]s𠥗bB'+b@!G;EZPH5tI̵e,\A(pQL"۔dHme[ًM~2cqRU1!I%"A6CnA&<gMf䮖ڈYgȚn͘UMXԆF` ]xA}dM;o1nY{}!GE:	lI]Pq.-xꦾ~Vf A&R:A,ǻzi[9f-e&lbH$ht3أM;Y(q6pP5)"ӞAI:a@T66upZ].9[#d)u2.)w/X'}9Ƣc=aۓ˖\	ҫ#]q;[-O?d9DV,5Z.p    IDAT5o]Ռk,^儛U.i:Cy4P!Lx `TĶ}DaFN9E& 4Mfz:Ȇ#R=PWǝwǒl%%)msᛦ*?̠QF!:JM9zZe&qre>%
+_1i&6~flqPuE^0z)Z˧&j{#7 aMo	;t^MI?̀r-TuK)ZttB2]Gv^ȾdX
+#Ks03|#;g-*n|Zsea?[ŭ e(4C;4'-Ժ8:G?Hn4SWݚ,Ԡ")t/N~zH''S.o>V;{+}/ejm=2e[w1Jiv>j泮wl0a0xglD3-,%׏0r۞psPvmEE%ʠQjxag\61ݡJk reTcSA+$F3`18C%ܾް(pR)Ȃ!.ʦD@Bnn7[ΐ*5Y].=Y_KO| e$҈[.y¿}m^޵fQ% $H@nx;x7ybCUTd<侀0L>CF(e735T+oXب@EZ*a@A͡҈yfp/h7S+U Ҝblh bBWD~Kh /@U,특gS)争ܘ&C%ܯfŜ*@E_~7|_3G^U/;+9n<, 2C"=H]c͖K<m\%7m':5-- VsyHFj,\vGhK6!C*ot ʸ P4ItFd#e",Jđ+)ba#)D'>Uu*+mݝ4Q4WHռ9'4av!v ʮT\+c蝵h;C"[ғqP
+?~Ʊ.0<$Pٜlm/;ApyaQ8%J$Ԋ{D1sb%![mtn
+t<IM\H]/ g!_h֦Zk6+Cr.4`qr3>KN6vv6z[Gg_laDѤ03Ec5ݦ1qc-|hc=)oL5k)lgmWKKcڞ7Gy6.G?ow	KRt{=KY2ۡq;E8eȕ_GhLR&L~9~.^3H4);ǭ3I(j)-*F(Ј]o;)6	Ijm>)#.MpΤrU56~oqM쏸PDF1ÂcPi?F'/&;(6b4hC3(r&E14UjRN#ohNC拻.U|*QE?V{z&8	Z&BTBkﭥٯoǶMr[^̔?ec	>ژG%*cl88\-	T[	f'L
+a%jb,*x"<&<S !.U\QTIrNXPAK1X(og@)P*b..@S
+D4i-j6	b#媆}µ;\?Wi6)I0Y46bU!ռ^FCnj[<QqVt8g$%ic5oR$zB$'K%E9f6rADb32e_$hmbMJcEiNNH*ȪʩuNfMRDy1#m1+꼱?f9i4tV2͑.H:Ru`?\)(cPOZb%~MZ<U}VPffUl 
+I1~4dK$5izб/p4wTW[^~r#)cY[^ڌnNV+`dV@omcďhhO+	):km).f$>fL8@$tEݺ>q*	A*Ю,:WHW`W2*Z!6zKs	:-~2O{%⨁|[E5J9aGFf^p%l	cZܠ/' 'h-*ߴEgo.,25ݎo/ۊ\k oWf(ќ4ks3 z-@B4EJ Q?[i?P#obK4:~(ɸO#\J7I8F5Yq/Az;+tCg
+tE>SccM%0jraZܲo&ܛ6&. rC҂Q-P%1{͎^8)fF% &S#nGLkY{7'BnGز(s9rU誆~jLʅqc^^GOhǲ:"^Y<׿ϰB`V^;&熼j;!n/]_p1r6s0ϗ[q_4ߜpp	ۍû]rv4G	2\\Nľ؛`O3rv4!$PmD 'B%ysW`~vmIy@
+ڦIr,FWKl#Bڴ{lrwLBx,z__]0V,H?m+*q^(SnCezc=į+ߎ,4Hnees- ;UK44$yډcS6 =U+sOY$@% Ӂ:z,{\xd_=SDâ%q"剞̑K9I*cf?f '觤ڳzϥI!uiZ!e$WGJyC2z:o'1+m>qzXe<?N=>O$4`reoUjc#n36?LS3ȠB%B݀o?iq~qqU\g=hnȫ%9&Pha/*}rؑ;Ks)w!	RoPLnymu!ޣ􎢘5*E[Q,Xi@zXmGZYab8og	Zs^.Ԕc>T+|pi]h&\;jo]ys<[s֣]SAŅXm;j˾y_[#U#EPGX0_hZ!Ɵ):.PbP-*$<H4FyՀa$aXl	0H,#ڙq!kS]y*-}ɧ	c+%OH,F&`&OʽkxfĬc7#⺺>n|ҥͭ_i1&;jSN_VOU:G?g*t`y&M?IgJ\ˋF	;fis6jr׉o	vC-YVI̅<x"vYd6բG[v񊐣FZ񆾔iW95{C#!irZb1CDU
+ @DO9$?ƼmNș|yh+9l8c?&µwktm3͕~0o+|#AXE뛕'Ơ!i$EN8GoWrηَ=%Klkχj:gW'\8̪1_0YɼTul׎/B_ @ª1h+z&5RndQ$'TF-P5PmHP[%\bЏқJ~ǔ6G*_0Fߌ+]M*Y3o4CfF?eß,e=ΗћFlh)۫7Zq6vY<dlB<뀡B5w
+pI!ia-T8e"9Z7Mӽm})FWy|ʦ{bFVcm]?3AwUYz?P;/WҬV`"0qzy]ƦGt*KߎSW/Fu0'5m匝alԔ!B_6%c/ 4v{״÷Fo9Wz~2%qrFuhu25'0Jn˻j%*]W.@R4591l+q=4((^-Z9 *tn?yHc31oMOs1mqy]KdmGڣZn`u2)\Iem1:P~ʘb@7ԅ5T^ժ7.kÒ쒘mQHۺqҗ"n2Һ> (?KE1?/_UM+#N|VC^x8ci ꥙ҳ1j3	@κXx4}>!_!E:~f:|ϻKM5Fvu"G:L1d;]~/+	j52CCnZMvGm8edklR="M}dUm񔃀b \w  D$4VFD}S	@͋@  z5Σl=q2 ș+W:d{+ΗS9+Fn6GH5lKkukqN5;l~>?쫼3Oy֓ 4K[ßMT>fw62]֔}4ENAʔ#BQ$L_Զs1j3G#4Ra@3IJi"ahy j NsGGfp0}tn<IzMkıkS(~_Y<sa2Q z7zk'.֊?8) ܇jKGu&LU2/NɃQȧڈ7j>.0tO;,b˸;mwCc6+t; bp{}DȫeF Oy/MѫbGg2%.Wz-K'9>N؊PSR]%.lIGq:bYejSP4_uRq^s.g>#)"ҮWkG֓ar }%J h<>LK\Sce߽%F0vxEɛi@@aݮ^3]Ju}ay4M.mRtt2]=Fx}Ƥ8֝<n56yE._ɝgOIP]֤> b2-*	.	"bJ!k
+q's2⍮^6#7L42$KD;}Y}'	&mw*!tVu~HC	qХosi46ZkdyO.oWX/d2=iāKU	ۣ@y~@=`P6Fc6{zuk>:jʣ[ VFb`mf=#Ht9F²c	IdiOKDTdx4n- bzI=WZtzxPr"\]w(C__Z/g/cVly)QU#Rl7G&/b㮬t~%jo+ZO.\tXHuQPrg=k綂40E3vƥ 9qcT.f{lpC6"v\QFKi$OMqˣj]+Ҟm-{wV~|fE#4(^Nȥ'M@{sDQ>H1˼T/u*=qn+9[;|_v\
+k>ߔ9Ak>ng&z9M89o[[
+Uj574+W龪}d-$2(dBkC-%`4g} Ay:إ*Z>Nwu}Yfxguy{Sm$z49४8Yi BF /N])8Qġk :f5rHW)j?]oъk:3248'tʆ$"#i#sy*QS MS\D+]	h.qz=eW0\;	[b+2(F.IA4al$t$!*1LCM}Gjt!_<ɢ@7]a-Eykϗr4j	6?WKb@iO/WvDOw4 l*xKurT9du$<Ejă{\yFDC_ӼBqH#tEOJ8ev2mu}T&̈|A}J7J15f{	eb_iYU%:O=D}	&		
+Ol+,@K>}Q4I	$ٓ]d7nܸ{9kιB!E_cQ"w<X9MO{t@³QyS
+^WKu:_-耟m[ܾv&!a`lSpjhl,Yu/!Y0
+FPMe}~k,I41V
+Xm~IWA"`i.UaΡ4T$(&MY;`~kSo&zWOUb'GF`z0z#@:k`Ijkk2S[ZO8KcLLOQr>,އJiI&H?z@Zu?ELhƕٙr*didrJDN?AMTm;B e!R_xzEsPQhN"IyJg'f{{QåT4)D-Ůk=R6+^pз_fmDjǖ\+8??~pAj`=EH%Y7TT?"ViHϢأjC\P .Q&4Y߯hStǸ{@LdFa Xɋ?`]33Q5.A4}NeN_ԟI9	_e#>R4F1I1!nP1H:xI/9IC;|*`E::jMZ/[.{! 5lF9rKAd^驳i7A]ӏ_y^|Q[:tR    IDATTr?	p,nzIݢ0y4禖z-Ԉ#i's&"SY1-.?12]V	hUǀedMxC4(JgTia]*wr9dͪ}36%a&ei{b	iQ `G97xlCzT_OUt|ɚ虵I9s)N2LbDq`*t$ǐ@/JG.K9(~ԣxx]j!#n1KuȡZmK!6RK4GQf 4W	rZ4K86t6fYTYTK#^u$VWJ8	J!oW?\jzpRͧ<ZN	*:n*86U|*m}c>/kJz41+OԎ84e&RE/}<;߳=,t7Ϻ{vn9f?{Se\OݿS4lP	&gI8?qvet/ytDZP҉|η[VrTRhZM=a!)9nQ+kފOi&ǧ
+  DӧX:E	3N{bb=lLX'c=M-1+RXp>3az+{'?Lf6ήzj7$;#@\]ZO9CFaz{#xB?~I7ʗJrXRTew-3Hҭ9!_r0|^:hL_MgB?h(Yjʥ1*Ig	In-,V#`fJܹϏ S;/F|iMUoIz:HbZ(Z鰄3.z2iU
+2JKQ=JI#%)۽@-[z\	>7UW-kvkJ%\1l%vKG菲v=YbSLg\,hߕ#z2giOv#1@[uc_7P/OӀpRr5&T[迬ZUzܾETlƲ4D!aь	)jY>1FZ.VĤ_RFf$*lEtK"YVi6aV䍹'&EomWd#\y#^	?c;񾠮^tY-6Kxg+3.!%}QSkcVt0>،ycK5'|)Fkٲ7TNyhSBK7e::19ovG5)y˂T\C-D/mg֤qP[\	]sKU2N٤V7Ե![|dx[/T}:YfN%bpOXWgZ?XQR3yxr7|o;|[~	S˩r_(_r'/i^Kl*nkFJSFH,)Ekޡ9PSpS3ydr7ϭmz]Q>_鹡@"=0f}ȌrslJҚF~ѥ ,"F&m#ڥ&nN漰1
+瘝H/doJ-^i<p%uJ[lkkS){	GeG6UͅL6?ǂ:3Ȯ*X?[SSMIQVd.f{s6~إ*p&Y%IjhZUF-Ss.5jbrlu4>Mk%91W Ex٬*EYSMn=@o,ҜFr0vc,t@oM9&5F>+׫sjT"Ò3yhWj=?ȏ=hcI~XP2aXt:I~(+վz.և#=3ggfL5RXmCbUMh'[)IJy@Ƭas'V&#e݇;f%E7C3f/M˅!Ma^)Ѹ:E7d/<NȺSN޶}%ofd&a&2 l%;cOo`	@TdXiq0GRM1-~/x]
+G;2%1P-VΏ~X7Е%:"OT3?v1Z$ݖ!
+A a֠+̧ETAce:	2r$|JFIP
+H?ڼx s!7g&1qAW{䏹nELx
+X,)E"c-@DKJX]~bRܞp?	uA.TOyTM5DsKcpg.@;Y#e 7[wȵyw>\eWyz4K-_M!5ս'4t/|e[M|g;_\xwß[u?sLo)_*L`;̮eW9RI~"1zb&קzA9Cc硚JITDf;u*"O+GU:Q]#SD
+ێj*r \Gv&bhz+Ek9/&/9_.vWrMݲ7zΑhk.ݿ\;Fٵr3AȣjG=bJU^^Vv7:Ĩ^gB<vMT.>fTy{<\ʼ	g|meyK@:(j![O513ZzZ(hNrΧF@ T㧜U2g,XC\j0A7ؗ_҈.6j9|xcZbV}
+:Ej g
+Aߴ7{+[$Q@KNwjnv|v^vPFn Ig8?wXsq]q%VlQsQP F?;&n[glњ
+|m7=N^Ts˗Nt11E -l!Hs񆀳_M]Z8ob4vN	(_9ItSI: S2MrWtrD<0Fs0@25V_$a>aQTRmAxJCdDPaș\ctELk$}^)aEJxh{qPpq3.Ul4bl<P)-Tkt0]K9F)z;k#yFW7vӇgfwȫ) \0҉/TpB^׈s5ƚ6/`3LYKFά3mT7-smF60@|yamS(T{z9dMm<y.#ޭѱB@vKr$	w0 < .O&lrVlѡwٲDf'kjgZIc
+:h/l7T?̧fZs$ForJk=O-u8b:}ӓ?m A}G"*F|mC6};M<cv2g7gl*.&R4咷mP+TSbNZ1EDYT+ t'yq w	:S.'
+?ߗ,h૧7`}+N\/*O7vw3JXKogW(ev/~AA33
+0 ^ϥydlT6?%ȫ\<8"&hOTFV5
+T3@Y-xM`U%QP3	O?3OhIV[XO9P<! C~vnṱSⷛ	+tuEh[D	@mA
+55vr0?`V]4V];tȤ{rw	kv\#=+)83g34q~01\"4lG._.Du~]MU[O[b$Ͳхnf!GEu*]B|NeFP]>/p6z(x?~?QT"0u "8dxzkglrf흆^ʲc
+aM05ҵ:yi5|qMY=eY<n]f$FWhQfs[rAѦφ7)(	I\A7ܠM	קCNҍb+>l'b"-񺋉*:(~ CޫCY	q[NVprnP
+q.g+<jAkPxOQ`<4tLG'|3
+/(1r%YmjWl*.z3l^StK*2H19{ץBn`hDK+lO4N;g8/[+ߦg^aL0E&$Ei35W\uC}C8yE+|o=3d1n2[t\Z%EdVOůf)J-f(\Tb (7eh^d](D/4SΣ%+䲢ɪ2c@qE>ij=3Tje1?;1ZU1e-1w
+-"g5qDeخRF5u/Wz%w2Sv؉_r9Ώ/"'Wue@f^PNnizN̂DUa⤕i;9:;66
+-'h"qP+	y#f?jC^WTȑd2/pb7*hlԾY+FGT50HVۀg2ddҒĎ9O<9斢@2p1No]SAM@UY^ל6³W>oN۞5PĹىYX\OT4dDƱ3Ez](gOVS˶-a~oǷ	Tb``ru-fZ3ܱQ1f"g"@矽LzϜqh2G_?2)qc DETELW؈=U.)	,\TqމV\t%l5)#SÊ(3Ȍu)M^P$R\Flo/ZK6C~G!MC#nψk2HK)za+NiX'cC[-SW|Icg+Iz7blωbxYTT(j>à7TCM! T}Y3eE{ ,CS.?0R#C,J-5yʦҘr>bOhf,yħ|\xkz}^B$ȤjkQZ7iB0=LwT
+7֓50|z+g}/둒4Sj)KrSUF+h$Wn<zFeٍ`QMYv|WAEoUb߳\{(-O;	
+r55sh$ERYԊ_VmV] 1YěZILW$D2#nt,BbFF%FF٣ZĥMVMgrv4YcrӰ c}%Z&@OL`M}fb&cؙ~]Kgvj4577`2o_+Oz*ғ߭Q.;"V)K!h>&hg-c4crz9:f<i,66&E<6"]}"ˣ/GdB蝦eJ8=~zMhF@k>-i8ӏ):,CǥJ7NӭТ/Tp nH-4!&&1,SݗybӺjNHW2V)tNM95nz~nG[Td]ԕ5M+zS\?}-Z9rWvW8bda'ȸbh\p&ADd	>Kx)^k|Bye^T^)ҼKny m[K2g\Q2AZ!2|=9!q=gݭOQUTETuI!(;9͜!:Ja{bXs↢LC "^MX-$DYGde<dpsiˏo3
+?V[5!ƘXh>>q(}	oo;>X	xU~1̡ƈW:F'4<i9hCmTTlW\lkm*;C!X5OV阄vxT6V9 "k/K]\f*ɓk	
+VĽyl;4Q)j_$̌ߙ䫾[03i~nrku6DB/Q^f{kGlbL85_D} J*|\>j`բ3Q~%wQz[/yI
+Vwz"|QPNg:_uQwwskaSPTL`lLUKL>Ei/uݯ]:޳?s9:VyE7%_%Isn3zCû]p4DwӦ>~06G+"=zڢ%{	W=ϐ]lIs㌳MO0_jxi'曆u`AIY(J3Ef̦aJPm~cEvJ&.5HM֤8q&a2,LOӘS:8'jIW r$HTgŖ~(Dc7reZ".BToUG+0H n	FX\بcֶc}!r$\d^9iItgƬ-C"2h'~ieAm?$-5̂-S'HP7m[_Չ'ف,v2x
+2zCtW loB%:a8w3[؃_(V.J &7QH..|#dϦѣ=HO(L}շ	v1WWeOxV+ӓE
+ذS).פ(Y'˫8=n#[Tjit  =*O%*)&tY{3$?bmh.4øh<8u`rn(Gk$U85	 jǼbStK|
+SU13uf#tJcF\\f{jeUwBK!6lIGw^D ļ:EvAE/8q44v9âoz'ɡ	GRPÌpт`l83{yעDwz{ C@ Zs{[rQ۶)
+7pû3g푾Z&CJǦYܓ+(~NGTb QO#Jlf73r][q?oَ_\&?D{XφzV3DQvrr3c;sܕ7dD/6C
+T    IDATqASsq1?kI3Ο|YIն'1	g3
+X!JaC=ލlITj5q*$7nz!U0 ~/1[STj^>=L^AG{-V	4ŎκOHOę)'3Q@%YSra&2F@]14H}xih 9jfԢ DI ~UB ӖW)K?=Ȇ/6R(@)m,hA1cT;-iLWVk:b4.E#pߒ.ۋt(׋4wJ$γCCi_Iܱ 	D1L@v"cU3rh;rGQ1%EY'[Y{Ɏ:df-&OφGbC, 	3)AB 5):EjǏax_X~K&Ղ(º,R*f$00Qd(AbMw%ŗ[O䐊B%F#=k0nETb	kB?iǦ@ 8lV<z"t-&HLqZ.<SQ\kʒE# %Zѩb&ǰ#~xa 'ح%lÀ7pw5eFbLW.[,H8<>jaF7125iAXNo
+ 2zd'&EѦgڦGAP}.\hled;yS%	8IyA},zf'nYǏtRu'򰁶a9v4@PW|ndnVP(T+f"mN۬oǞ?dQ?t enxo;m_~|;Wjvvg}{/}ɓ3337P<9~kA]Pr^Cu.O7.T
+/S}7S}Dd|M	6UzW֣P{kFh?Y(nؒ&U=rLTAuSS`@]!+}Mo~sOd5b~dIU}81ଛ3Wz	GĂ2i%Z433KOg5W\ÓK[9 	*1֤YBlQgGFOL+r6P&PѤlaҌ{9z͇
+hD͇B39TW2g=j`xNڹ"TPZHU\
+DUITUm2-q?@T3:|6.EvJyzcd+{#,[TbRe3,gțG@%gE]u著+n4mkXJdqJ ?ΰ׳\'@W2T_ȒuEjnNϽt.oF؋yǢ*daFb
+rty]X_/}͆)C@C,ɸcp\!l gIB>Ǟ}Eܰby@ҨhjS"NLu''
+_T.)v6]T}I+ev]a39%$îFw1Q$O807.iHG4br0`BuzW[S|6>ib{8mlidOFşp0	*lQ.DG3tM~M}jDX[QEqqe$eS""w.&lLبz#)EudϬDKM(*M*		FN盪\Ľ	i "U@Hɲ WƱFOg>wG~z+___$zGyAvl=lgzyi?e¹O(v//1K͍A}e6nҺ{qv-@TE:7÷[㚋avM`=:J'%f娕eM\~NzrxLOa!nvġx+Of-k9ݜc΅{|HE}	y-gq&EAeuq+]wǘx%9L@OKP# -sq(2l(F9~C(?깑.(b_jF(WPݜl9FC/ɻ=(yH97yKkʣmQCIqEYaC6rvስ46 ցEAB]ʘ=ar Ge6%[@@hڝv"Sk)!k	YA+/vnS5㮤BGRt"ti*eb54t]	ۦ@@̦OM) a=c_JMm%1Er)赲ɺdզ:@XOEj1 WvV;=]kE@[o:TScLɌ)2q~Z!qJWlg^"'ޔm5q.oe,JWNYMdǯUM lk^zl׷W+
+|<
+32|Oy%@`=1Ho8_hǯXr`ѝ5kEk!5N>%IRdJլPi|F,󟸘9&izM;9iWtsxsW}4OXqQ5Fbu
+]sxwzMc1bBjޔ$kSF	Yy7+nIm}1i$GUIjꯦ +/ā&Ndtqg{HYē΃g%\āuu[?3%O:deH"!Vk-EqWTSO8"sE?3^N߉˾[0zg#W	=oeƙĆ%/FMi8QˎzlV[$mKSpmy(#$=
+4?;~TQv-*K	F5^pչ^rSV-ѺVQHiK$iO__?hd20r0y@]L$l$M(w%;;#O뭺! 'G\Ɓ/w\IiFዡv6>9%\&7+i즗׭uAf~b/	aHj'쮾XѦ~~:$`yfR	EeT-|7^c91oE؜/ꙵ*sC(0.0 3Wt{Ēt$t*c.NήpB
+JKAQCz;guz"GBd	Yc֦:q}xk:C.w1'UɑIj6r R1Ϊ覄Qƍ9ZYԉQp)XN΁^6YSc T䵞-9"!ؘ̇Z$kGj9񪄻My_~U9U8Na@УZM:-
+uȽ<]!h|ӓo:-)&#｣=s9ͷ｝խ
+HHBBc`0෰<ǁdaa&rlRKX=fMXꏪSjZUgYkff]i2DAzg[bɺ_m-5%1wxZk=~"a>?T=,fh4Ǩ}J-!c!k6tz4$yQ|Y/[2I&{p&Ґav/g)-8k@ura\ocGl(8|5pI0㌏	tlC[ws|.eqk"" *\W#Xsb.Eu\W'X+t_	YYh'4,f84gρG11ZA^RV5!um2,f9l FtG}?f? F]ɕtwvGy;o݉_J.mB!/?XG{y6P
+K/ȫU>ǖ-#Nt&jj	/&:XD@/~M>/82cBD"?,w9BW+.s4u*=eUFyED{ߞVJLYf\&9aN|%9IgSRs=5etKMcV_g	ؔsA
+ D'Ӄ]u|CN_e5rD*zMZ63:=329}g@ (sp,(3^lǬHmo\1Q0d7__u0MɬX	sZzhHtC&TKب0ᩅoXF4<Hbt# &AՒ]US@%5a~usܳosSPDL6:p@A6hv.ӗG]p_llu|YsX07mvBǪ@Q#tm]%tR4d~w.&FhR%euY6`:!<2ĐkAKmE8EVq
+cN6Yܖ=ġ=z^IzS)u_m=e3<+ɘӆeg-I&Q!F٩'~u&Kkeo>Zp=6sĄ׉,6U_Xτ16ޓPn.Fוs넼7㗀!Ȑ.ަ>g#ˉZN7e;>shZ}}Zn! VkeZp|C'{=Mc${> E=		v;O>.<sabc3$8Km+2-e>g\j]\ Ccwh>~]Q	J	*"f`$aªKSX=M*ry.B,PUt^Z5Ծ^ݜW<Fqg:e!%5V.ykr霨n}jˣ>}G~2s6١V>DL,t1ߖ)=9t,kޢMPƐm8?w4Y>ډޔ?iJ%2'
+lCTͼ7U{CQRCa$G]vW_Z=#9lk=ZKn͊z^&+U[~IYJJPxk|Ϛ>e@	XXVN^UE$$Ʊ̊=-@uGOlL$
+d"cm
+!-3sV,lM.KbK+]zf3,eܛ]+,e09۲fCpus:e ($\IzM->CLSȼg@", #B$ns7 Xu.iܓP/fC{K܀&(Nmz1dqbP4k20CM1E0m8B6`1PC(= hKL!%'2$IN-Ds1q=Z ̰Q|ÜqLR?&zfF8K`DܫF`c"2x}c2ta^]D1iJ	|b)RSUu[@B07OyFj} ^ uƂ`:~^0
+70UK+|-#=gX쉕zg 4 6a@+t .ppH$Ʉx  M7uz@neo<ӣEԆyrN\#9U1Ɉ:S\BUltiijK21շۣi=lO@w*3hTi`z!D&	k)&dwpJUF:gWbgj_
+_ZSޞߺ]>]dݜkoi dy<qC&]9*0ĹԌV4ȣ[o|/<|׏O)L͗νʌXbnz47%CA+;?m$+-׺c69 ^?Mn_o}q;_ yubd(ZKǌ);8Vz_įŖ[-8wuY>0Z	C&o9fN8X\Oa` $,;t ˆPl| -w<fv[}ͻZڬ# 5--:rw61Ns8+6]KDODq%Ml2dͲ@oU0ie5\t	钄 ȦU6u
+06$1۽38Рr\OÞWfzz{<1aj2j3ip3Aɹ4	`?m^($H0d29|kC sWtio(m.SGԇ dBI@pL~^ 3ZzA >6"TQ
+W*ŀוr·t]Oɿэ)@S8DhNX<V͜`&=a&φRf`n%uEi)3k뺞P`Ϋ'01M&I#=b|PODzAOdT0t塕&sN2C9}=>_69,uʹX(r)Gz5O ) "QYY+&H/`EA׆ఀL]o MC'<@W8hIC<_iaJ:=1pm(Dm<0封FS<eqN=ݞ9,.g	A
+eR
+<k"E޴@\gM}CVV#SYF'Xf~
+٩{ü|m=/ۮ6FzL*2	 Seȸy~iJ6ο ޫ?F>+c7mv?0ɽ8㊓u,Ww[,amn֣ڐ?3a:,NCfwGɋahۏo6tc @_l?ΰKo,qLA><L~aܔi+3	-%zNWLaO>vWm?'=eeF@[Y8 /`4]]Ȁ((	% :?0IȜuaUWD;uak5O8|>TdFĤb*y}m]Ԁ Q||,*
+>-n]%QKǷHKF=1®Jhh8eR`+pg&Q`WZr<Wj=c `{bU1fz٘X-*֩FԽ{-e}Ȑ2=޶ے3UBF34@PY+ꢂ#1#Xiӑ2Ú hÉOjPC @! 0Ë),9(TBa$9n d$Aa	@dMYH" H)M!*n{A    IDATlJLO`|0.7U85eI2^ۤ+x}U/8X/9B53x9%]{Rb!ʋKS~=|K+=򺁼~"o_0{kɶ2Сu5{U똦P}`kwj_j50<U;|SͫjȦ3<jn.E՝շ	.hL.c Wt\|ؒ:Ԑ2sH" g^.5{eU_a/j0OhuByQ^;2s&]Ị!yn2^SVu`<7fWh MF(R-*EB=!sBѼ$>v۬-XKJ&*8SUzׇOogz&i~!$%픆 P`5}~\l狫ɮ3	yEVg~7<r׮]V?_h~L>Mm_s)zrjFovG'xv䕈ìi[ޚ?PFU\!~|8|]|gܒԵiGtib/{+ڃlu߾;bͳYO hMXO#@:Ґ{~]Ja_MUrDg'5"EaI	1a׬FBɆJzՒ.&w{Q4cE( L, /T ZfQfY4ltwkkJr 4%M	&G`d(#0nӥqvuԑ˳򰏕 PI5ݮ=ު) 	a #sC3ޖ<Æ\JvLL65M^ޒ}j>:5cyoج""i-S6kG~b 8gUb` ,W;7*{w: K:Ebs"Y`HIfH9W=lZY8עo\g;H]}00D<WlڀM̆9Ś9@@! ,jH4kHP\ԏ^.ICzE]`  	5Y}5ڔ{  ~ZJ3D8Mnn	mA5 ج;6ئ!o3:&fUz6|: <QÞxVSckы|[ 0!"`/[_e9?حmxZ?V (;p	1xY.KY{s 9>{Mgq0β7XvqG5 ;x1iU ʈjQFKB9i/Ql9塯&0bcÒ.lwMVB>ٶ܍tͺU>Vp]q9֡85h|Ԅݪ+h0>Zen#.RT\]V#x9o~zkP@=~prrnmaa'O/;wnG#9#&l~2g?4{k/9V3DVzɭukCyc=XO)f?JnmEo⬾~1|Գ;+o"+5]_JTf	N^hvznjs嵮o?숓y{e8c#V5iW.v^C^['.拸;g=S(X1O073 -%Zt&[ z-6",ٌI2T8eǊxw|,dMewQ.f#i6uEg9F2y>h`UtUMO+t6
+TkH+5{сSe|A,ާDiDqvr%6vS?GBYA"˖	 {bXd+4@7%w|QbF $]=YOٛ@X_g5X(4$mTq<@SQՐ2^!rIj-zVS:ƀꀜO`Nr\#0E6i# 2ih@R:0	#jD\)#Wl`d:CLL@:ऄP@/`wX&`Wn{ػ*rт>2^-1#֞.|=&3|~esPhUܓ/|kwĢ;~1V' 	WG\(F+D._}vzeƽg*_9bwNzcm%9fr>6y) @D`L?fVϙ[,(t|CIx}z^}8׆'p,
+	4~HDfx9*DݜZ' :aa%SBG'3N-1AJcI]HMxl>); Sef.	KU4QMcp!mex,^L[w91a{dݣYozowJEsMl>lZC5sbR4a>Ȯi
+Wfg0py{ogw}xᇉ/'9ro|SӸ8[._7T^ݶ8c$?`@.ծ~a׶sGq퇆 HCcTj5''/]}+\l]lqFm~yQzK,} (JoԦM_(X[4ڱ)xfJMZHcbdI-lgȶ̉h٦g}֘RC7iv"*2	EKVkeāc{} TWΈ[J!oź:웞~lȀIcz j"^~,%đK7qCBׇIierV̷w7j>f8ˢWcXD*`gK7DM@'ƷY\0}A 5y7|Űݛ򚮜dJ:q#Ƶ˭+2z<u:16KZ,g!P,ڤ8x	ly<ˆ6.(Z0_M64g^]oZnLqaarljH-*@KhF'1-JfpNSHL]ncnB[{02KðA{0̐Ä@AG&Mms)qvr3"S"-""Lu@.?<jKʌ	,OSM'| 7ow $	'=Ar|JRoy@R,.MA[|eE_p#YSbc@/!mg-!h<χiiE|	_P}(	O?݂lcEd`gkbuˆ vMd$4tk\*)LBԧun$3x̷orY1E`ӱ>uPZG
+/"G<`sPtqm5S{\:Oo$3ZKz| 0:D.KkJfX 7Tc8}e=zeKQ+I?Ntȑ+riiirrB]s5G `eeejjꮻ[~7iO?fG5%	bDF+zC.1{|s""F#PV݈HzCy(p ,'8[Okwݘ>};0~%N%{ѫ
+GL݌5_z:U9Yȓj;PO։@\$~AuNܷ&lO2^,Pl5Sjsp8!I2d@hg`[L	QMC!E0%*SV	 # `NP_i;dDrЦXB[*Xԇ%G 73@ˆ4!,z0n@26ߤ'x Rj}Q{:pl,!{ݶhjW:z>efE9]JzyaNI$WQ5&vk<ToIG	4kv@vEX.LMh@CIGr aK)]m:8/}:+@jK
+2^C]QbCnC1)#,*H $, e(Y,!*@K '0<+mE=R(H7tk@YpkiűMpiѓ2l.T-UEV(DEq|9ݮ0Si.`dl6ix)9o,'Y)AXI]T 2=zRTe/	\P/~HxVZD JYHR536Yr0+.H	גk:ڍh=&?Qԫ.f3{ҟͱ_0SUMC_O6kK̝.;t{m;?)ls%ٶp,ldN2`zfj/9vL/j`ԔeAJPQzr!]LɎPF2H,ZO(rBƫ΃Uf:DQ[4ܕVgh Fb(m,FbCy10{FgW} p.]]N'B *Ovz}ZJ
+XPOWuLtt4<V&:Z$9~M7Ν;>Zw۷R~J12~%`:[|um"@a/qlq*o\濬>/X%΅3gR'Wp 6 m__{s.=k2u{9[rYN@/y~ǶowG]{}a%z̵*'"S06%I`=ΥKV'/.F&Tt؄Z,(XamV5sNCgI?"0;MӘKѺi\}\TO5USlÜ/sm],VBΧЉ6K!nI¬."Awq́RZ!nЙe܀%|raK$ꌱk,oL6֠ƉqZY"B zWSm۶eeŦ;Ј:iv;jcʸb',UbU-֎|AWoYﰚ:1
+զ,P+9	>{Uv&	"yQ*"wΙج.k>?wp >֐#JOt)1ub('7rǴ=,,s&M}>\5z ɈV؍s>0 <4 XJ
+=:;UnҪU?q`.K&5! e'l>lɝne*.䊧\ y
+?{Uz,MX\#WO2	B,)i3*Nz\!bu1a(ctW_59!d-aM^)~hJ"x̷=fq78lnޠo=Ss9-ӤgxK̱7mRrp2,9+m- G,ZIt&YUjNXĦX`RjC}=f!a{b=;☽XSqRL'ڪ8dhS,L&!w1)%&աL?a1\ġ/n]=ʀmʜ2C%yuZ̚xYW+Rj ȏo-h4֕JG*&^<×]vN~Kwuxٷyj?u1NTo3&T;:SiS{S8v_?sӖǇ׿>'.::J`ao8H873w
+"Q3GX"0F5R&jətx/UvNL\ݯq7\cö*x, 'htT(Y,NhI@IGd`_`GIqhi9GxLI.&
+^	3mSoң%Ms4mmq8~tLqtk@T+!ktoʸ	(5!#2ݓ@);#ps==bZpGD --Lf-LpX	NhJ@^A :bu8kkD+yAF&sg'yúY|.犼7"C;[dF-$ªŘ2},i)\(Tw+	4t_kl p)	j}ZR0b74+6Mp]hғ#X5ON+ÚKyr|yjѓeCj|/5?!/ӝUIVGgًRJJ6vjכƻ[^SV} 0)q^6Ž?L~eJu~@*gs7yiJ%frVWzKkwq;TXM!;s0HofL$N!A@M]̓%[s3$0
+I|m}3ArE"Rjк^p\c7L?`UXzHFclkOchB!ߐAHMcMdne=0Tlw&]ksr,$ M\(Z.)Rc3q&K "\ZEy苏~\KeوWj WyL2U[nXW3}2rl2%c㊰FhDW$8JM_&y_0~{[o{~1Az]yi;ylQ ~~zZl9WaPFQj3עϞZw:%N;dEgvRɰ?T.p0^sB̻c 8yoDrk+"'j糁ux(b<O?VP4be]M	@wCˀTVS@|}gX/?YCm1$AgjzyMh_\,wb#陽WV<p$1,ֆ9L_~Gp-:ޠ$۷5Q*6	q|ELknI˚$G7|ӂjoi͖.d56%ɮiK΃{?ĀLnx_P'/rYQ',ֵBQBrK-ޚsQn#~qJ }L	y.shv,a3Nҥ<a}6p416f`FQaՆ9 '%[R`.;xsMzLAr.),Xe똥s7Y՟fn>Lǰ<"*m&]>¥msm,7}
+>QL}grKL?tg7^	BGn'dYq֐ד;DjJkWp3*=:?D^ʔGO۟snr5;{ƋXqr#g56[ִp[{yE DE.R    IDATܑ	l 3!yk0T)1EbnQh5zU̗-* @[ gA<@ (:6	ȀN]M,@9g3Y0VMuhlh^XN'
+ hlhBH:jfTH/d [b=1 {j>ؗjE*'j&,Zuw_g(E~OMFҥd8CGXHeH0[| Loc}'bj6glmӛs7-݆ď# c_|Ճ?9
+J%fkZZ	c_WO8)呆<qX߳쇲v"ah?=I|a4k ao>hGM䁂D]^,o4(z~,dЦ_~7x@(=>jLa"~A^$a__/įHD+J&3Ĕ(o?ё9vl 2h-Ϧ=,rr+4ߍ9eޟP9Aw`}V0tDOw/=qѱ.]o~sp:taYu
+xew:v	W>VصVRhh>,0J0F5z||{,ۘIHY;4 mUi4NYNMHD|g#5%˱J^駇M Y+_ܽg&Wu.޻s09 MR@Y $$ 6E%Q $Jhf$9ssν?uo*VGw^gdC->Wc:?m=9+5?H6zf	X-VٓɐNI& 0P!U5İʛj6Op /1C:KxN Qzpv`h\:֎o8Z.0Rئ.93 ,.7I.PЄz݃t ƫ|ऋsh~H6 }7rVt5SJWEMȵ3eٚ2v<=fLW?$pEv*,>@ ?YtİyD.џ,}[W9[t4>sb5JβY)] 7ͧ갬G]ɆHPc)V#g4Մ@fY'4;<.Ƿ	GlGT/R&4Q(-5)1-y-T,eа'~ޒVct&/g``B3gEBR6#N+bx3cbeZsi_εb2{rM(sc$ iF2銑Hiݸ%5%HPuIh2%,TFYȞ4?gN(bbZ>R. 맽xS	^f͚^xѣG7nozx>L)[f/8Kjh?oKU"REΦ=y MtZym<kOVpm<T!/ȹ_|Z/tp.?bz{m@3/& evf-Qri<Lg	-EDmK4a]i@P TKd/,XGUM|q L/Xvae
+:MF9?@bhfX*'l,kg1v=(%6NXu:Y&v	t:h_-:XSla@G+4#`+Hlyz,h!:؊h:z<Y$}ij&KB2on{/7?eiԒK" D{YFt@&hsF[9o5͎8hU1ӭXv|5n}asucdbb
+`Laʄ$|7R :oFo+vxAlbllloCQT/Im]<zy\?o9`.qP=ұ,5hЫxnu?j&⧎	$P.,
+a܂
+V]xLphj!Mo򩥁a7z;PFpжJ.^p7v+@aDfOYOdo\E/>_	"'L6qTR*',*A|c>ʰ.UTrkN71g?W&"OqܵԂw컂(]hi{x  FҮk/3 PS6^c7Pal<Pk,+Tu;p9{LIyT@K9Z%:d<?^c=+WG+bA̢>BV|
+gZtkXJǫQ 2p=YiqO*B ȊA$ht{wj2+G
+LF6D-^[2^}ZxYFU	֪%}:K,6@eAˈZL"ʉPިכʾ6/Mx&M~#^kV<t73ttt,Xu}{w߽lٲ;c|||Ϟ=ߢLoj;mELտXt^t^Gdq>~?6JD+~c#&˵oa1bJƗdo5OL׿!e"ߗujZRRzDz@9h:( < In\0>ؒG6}mY
+Ņ["nX>oJPUaO!U9lN8"jaLx\β:6M;=` %D)$W{(wDևcg5ڵߴ_'ʴ=ϧIz̆
+&`-ﰠA;1-w`v[Pr=2`qZO'}FWDuxs $\1`hZAYCҕO6n4, Lew:uq(Q%"eZ0Yӛ&dS$lq(R=|sD$ 1Y)閪.&%\ ;H=A/`ĄN;GsWYXymxNOQ1=ў=%\#iWfhC:)fiu(JVw¥9yXa&p̳g^0ia{4`W"`L)ڵZGg[N-M/5ve5%7Rr]qoe袼TKɰ疽;&뭏k>)t}OEW+MfpߑMe=&M쉢4qk}\%3;$e	fl"2ycFVp&MfYv0"
+3+^crwdHH8F$s3\V$).&B U%^d;OTR+~?kɏZ_JW UKn}0QHLV䵽
+G%KVȈ!Hza,0d9dz&3IIA 9&CcUha=ˋ)Z+Ɋ)5S*̊I " "ZAWJ:M>űMO]o.lڵ;v8g?|g~+ ?G>򑷿*w}ď~߯:ףt"rxAP9DaΦZp9S+LɊb8^f|y~2
+)Q@0Y7(bJ9h:DY}1d.7_	#B|σ:|Lӓ0DߟܦC]bViz擜U^rLқQ'*`9iuJ87+[tTѮ&^>;M4ԁ0V:y}W 3lv=>>*w6=~#^zzg;^P'^CMBԠ..AsF; І9[4 3O1ڴzaBtSrD13(%Y"Yq˼䬬\+97g<֊/OY:_lqaS'ʛf3l4?gdg>/8Dӌy|.`^~.J^|I${-qo@I5dnJ:3zB%E:Z=t>I\N *>CNbez4dCo3u| 2NNг\"!ò!ampC)5	diOvB=/qF;x;^T,giyX5A7 u4j
+wCJgHsS8i4)Ef=Y)0#j"/
+MWo|̏/jϿ0Fwe2?ҩ5R'l?u6BiSiY8M LsLRv4q4kvpa>bh~U">m2H	` lÌ:ޠ\,7J;%..6HpJβZ=c	/64Ȼ;JM3ßV+K=ǚ[iWk,>词wYObo%xg\q@Z⠤9cOWe&PdtE=0jr%3B#NrDRcLU6YvMq^#0dKr>~Ϊ^&?oR&o0+iW6x*j2j|)ٱtb3 doE5o~X_|{SO={{ܹg{㎯g}E˲~0/I7ŀ0dҵqrVѹ+7 AGt)g5]Nb)O(]JNxɲ"L,};맶&$]CS]
+87+I\%Ef8XUhqti:bj;%OV6QSq\hMbh9)HI!i1 &v8AY\	I^rq~p@dJHZ;)զ+Ѝ<%!n@#,.9sZY\!a.nn T$P$D
+~!,Q`srt̕
+,+/mV$\Oesbb8T"p=9'LWrV+W25ߍԿUr(:_li[߮Q|dՌ bѕKQ^N?G9~ܗט0LfT]@ S+Z	
+lŐQ l^>?ӂ&g*3YxSUz[x)"v8=2mMՀy\kCOu5(֏ZîGgm#C=8U\M8R74Ðs8P)QYU`SS4rƋb?>-ؤml}][-}B.b0U>^?6SSU(qVKӂ7.v&c5M@${9&@!pM~f];0PB]/)HZ#x0/r0MhK!M`Bb`A@ImCEɃckrd ѰУpEZA?쥳k*kcq|/z^gLv0Bz>H.j~XCaȀq*i_ϲk]q2HJu:pb0UmHyEnNJg LR=1JzmqXqǴP2NB7}nY]`x<G@2D|&wm>Qw7Ȼo|׻ޅ޾}+266s뭷~߿ꪫ~ ̷Ƹ,NU_xVB4.d:R=L6>2 5~)ؤlz^RmL^@*-^pCi7i\n-{00CiY8 7[ TKn]`Y>]ơW2l+Ic$_ra3]F9-+샱WV:%ۛt'$:Cxtj/jG4eaM8O# CEA؉tʄUUKxċNw	!LP~w-UeaO8S-:Q]%H@8AքnShPҠ#ee_mt'JAXab^L0 @e&]2/OT&owm&/9TFT0g-~4/"JfCGI"-Mƪ͘ &ge]F8]fDFi8iu>%\IlH>3QmJŅGouqs xv}QUlp$pl3D`K^`*	'9LTcoQS-k9K.6ȓ9+7s]Q^C5k<r4G,QyN.g:.E( TPAȶmTSP1,o֒*wH0u>q/bkS9^űb[:nٽWW+*?>8H^#H:6Cb?|sғty*gEa7c$YS(\o%&Nԃƣa!fKEf:%(:4t'U	-;0GB@!JtW7PI91ybo3+Qm;d`%Qg5fcMޜ3^H,Y `5~_X~*e' pסF  GkfrVxez,g輜ZV;HG'y(gDJr, dmɼ@iɞTTKvu
+[GA!8LytV^;`w}eۼZOB^ˉɸS՟|O1_x}}}~C=cǎÇo۶M7dƵZnv笳z'ҿeA[YY	Dƺ19kp6c S9WO [/m@R,Cۙ+4J' I$bC>@"0V]`T
+G3@dsbalglfxYSUR^Φtq|Tibpe&i=obɇ)?`Ha3J	z]@N踀lj/jrމ;>?wV`hF0%
+Jn	^ϧ	`Ą!GRhhwq8<:{#`{0`a_\t\DF氛f(6"$J ӣhIcا7"$@"\܂Z+YS_J[0m>fe>+D*L+ؔ)2lIQ2~^fVn~c?H']EXqѝ-Qmx"BDN;RQ#,f
+uOIe9X]\6p!W3$,.Nfa};Q|EG]Ӵ~fN(Hos0OXaHc|7!qLC* TaRiKZF    IDAThaIrʄ^aD=aQY>GB<tanZ*50m91+ p3b|8H:q	L{O`h	>$er|^Jm׷mǞֱ0OCvG8Yw&L槌U]>U((SpHl _(7 6ej3St&3jr:)5	T
+^v;\KE9q`@ zm>mh9  0L\)%%Y%EL烒@v}^}kD$4Y럲3[tǻݿMTB`)S6ũ~k	4UVjCP)97R8],ؤA/]a=Ktu-PyQj(k")Y6k=" L>hz%25bQ,>(eGcR-^~1./7_~/|v_bqK?w}_wuCCCo[ִ^2~KR%a#~|litlWtyӿN.|ٺaig"6[Lp6k7H	t>G` N֦VY5(\;	T+绹F)MHbVVYR)AʶV]엪SMDz/z-Wզ#̬v0T"VzNHx oaN7\! tn@}/pM?{<0%\AeJP	pX	lo
+p`r܀%쎘_%@B[pl906	s[ѠآcLvOÏ%6f5GSAZ	::PEA--Fdgè} 6ɺVxZ*{8+7ˈtAwǭ';yǚߘK4>VߙwEMs>ngZC;3Oc/8>ѥ 1r¢=RИ޳?
+_=l$Q,`8OAmu:éԱcE4 g6pV	p$&
++Hr/ȟg]5g}.W^U\ aȄ߄#\s(4ࠆ9N@5:pORzC,,T%e%8 JY6%G?(cUd	DߓsljEnW 101Χ;> I5[#m?jjOZN1<H+j){ X+	}RBL8]PEbSCexNlS&ٙv=-!R;8?-.YDė2uS0~PVc5E,HV0 -V]#}>ӝíxK{էޫe_TV} (S4Umq$Hgτ7fWt]-(mgyO,q'A 葜;aN;4zjO: '+@ TnJdOBP;Ɉ~#&CQ+6kH _Ζ i*D
+"SM7V4r.h)VF+VpN0G}ꫯ,h+kZDXx\ ]Jq@w_CQF㧲WfQ5C:0V}`Eoq6k8 2yu0ZA Z
+Vp϶_~. N|%43[v!xKVuÊ,2{ oNbDkQwUubmڤ';dp[ADu
+ ߠ8Zz	=63} ,7ƔL.ёqP>eaONX+ W,<z9-`@5m`gHc2
+
+lӠ)FNC̀&^ABdk-FjW!K_\ImR]bt6CJ	5$#Opl1mTv1Pa9s2um'ZI#|!N!l^Mj(Vtu[[3{
+o>Xُ/lF㧀THUlO!H?j9R숒9Ci704uy*F'^6Ba]WMnhѱf*r;e	E'}&
+tt(^	T3WOe10KK[6Yt%F:$\j<=a- $Ш¯ҀgHg0`b,/FiOH(%0W$p@
+w&[erzuq^]F</0b  BTЪ$6Y𫐄0Q@&&)Y3MC9om^|Jd?V7WS|h!U%%>
+pm
+\dsC1wXmfJFS9=@$865u:Y`SP\5IGcYMFx`3ӊY!~t	(ci'Nҕ8Ϝl7KHC,rVH$"M".p6cM>H_"dp٭{6H)FZtx+8o4%*kiIV--,p<'eU7l;wEs^OH)}|p۶mI8|/[nYreye=㓓J{7oܸ߲XfG-RˮD"24~2?2Q"ӅatQ7+e?ռ?k&JsU4L'*pUz?-{B1b`U "ȗy<t5t##<((4dMvYU!Q1m&1ډ"ψG̟fL.ҀDXSU@da	o{8SgqI3F;"
+U!L&K6dK'I
+ez)tv@va2"n>r8tOh>b87v$mRGfd=MV
+/d>!*h'\ۼҔ`>H)[d@t9~$czW2?%"ENS 2/zm>>>qv6iZMiroA2rw~x:^P.n&R?dgBCpPSlf8ꇫci,,7aSJ^dpIL3sػE^v\~'Ojy<  J+{Ui^;oŅ>ĸ}
+[؏E0C 7pp4tUxa" 	'Nޗ0HIBIJTcdl_݊4Y/XS6?+U<@QQeo۔*	^M^`:`g1~RfnBv"`:XS^pSKvq_0zɗ]^V'(IV:50L,Ψ>
+`K9芁 <{\qd}Ju90yX<GSՆ@D%Lq(U3OyReOq|yg#C;yqwƺ_T$Lq H]\Տ7Y^1IUQ՟&΄rQ(ggg,q86eRo5L~J+o)GWkuANgg_X|PX|O.u^ӹ
+L>#He=)0腲=NV;d)IBSLD^.w[p>L&O}xnixxλKv!0_.!D.{U5mGOߤӭxKB10st!j+>ULeoR_53)׾45K(5mj*|:sijvd0!!Ë_!^"t#=P
+l!QFIXxDha@~e6q,#m~zگɮkȢZMMYXBp;\"7Tdh9 4iLZ%n=._Y+!`+.U=<vp`2ʧ솀fjp7RkX(qo{UOkXaƃa uP#z{'A]p)ǁ3ĆYWST{ @Eͬ7$2z	GDȊFtE]%}%XG{;r\>m%@7= <J
+6Rr?-W=3={P|ص'|d5gS2Ս3YGd]x.|*g$I
+l	O
+ $@0EN\X؇7f`gE4C9XUV=Ņcj[	מR>Ю ұˮQ[n PoWq3CY>
+`/44M/ 'JhDT+˫wH369--
+Z%F cZNN֧qROX?{aFȞ /vq0xzaTLl;ԧB6?.8#fr0~q =J翙BQ!0Te2CDYcJN HrD0(Ŝ*iu&=UA:Y#>#޻g_khduxV]qQEW'n{,H6p65+vcI4\1HR.[(JV/3d^|qft!6a;H6J:⤫jF5>b/*UdW9}{ {Mq %m,U왛Z-|A~ҒsR]t#UƞxU#i&"dR5lqDJ\N Z<C?ܲe˿EC=_udx/oqok'>={<Szu׍?|/{j#`a4%kV8/-բhξ'1NV|	HCk~pcB6LFȷ d&R8n#EBWd5`X02;vm/ N"A"  .@hT 0#  -z8]ސY"e>*]*)iP++ ۇoC& 0Jm\3Kޢ#!c3̿-qEy>n@He&1фtOѯtl6;+h%:M.zWP(<wanLӎ~./+  6]qDWlRv_32ٞe9ݼ3j;gy{ls*>
+  sl08L酶#qFN꤀jDVx2O7?fxC$;]^ϋ	&N
+%mxaf@[0օWfodX
+.ZLkStipy'nEv=<cPilY\AFqK=fέnz.OL*NdpqOfh="Rt95YCfJ"JI L>c3{;Y%q+4q,Lng?C`xw\ǵ`qk&Xh%4b]ҋ23`e!
+ћQTxnB^Kte1oȹfy<Џg'8iCAh$"`4`b-EF|𡮶sGyn	?jxk<%X}⶗ӊ:N]E'XlrAR8]bۛ;1K?Y!8^?Q$^1?ǰ%+mmoA{k.5 (tJ#n$jtCoq3z|Zj}2JeX9FD+Ή)_ܽifUy-<W۷ON}M`(Q5숨`4b6WA	6b@4"(4XU@Eus^Q|&y1>]xc=kZ5mQ-4Ģ@.kf[C(7GӞ2U	hvnG}.«?1rǎk׮ꪫ>|߼+@k檫:s6o/~T*]͂j`R /݋ e.ߗ8;u&,O_EIѿt4ےck	I0;Ѧe7r6˼j?<GB臗PbՙBi8@s
+!rt,y$MOBd<Ez1gU,ke_KCk_zxRI@JdA]̘[cLvNcB0IHЙUI}EaI3 
+vjl&`҄!%|uOƆɋ
+vX(~(Cq5a4BGw  6+ċFt{3S$S?%@dzl:	"<hRH5Z|2eJÊm+Sz0ˎo>;ϩTuiZr-'Fema!rRubm9?\.+_-?RpگW4 2ۏ7N_N	$_#/Y%lJܳ_);Xl}_@uNAǬL"g2_qS~C6.aBrX!jng^bK6p_l'o RжQUr Hg	H HSqvmR)XVVqnt]ÌAT=P=Ry~Յ
+{E0~ibM& +hhc@P
+G@].TS=TO劦tfEyã6))UjXSᡂ!A[Pɂo=uSBuVfhz@Eǌ6/`y{#%'.;RdVuã(?WzE+ ^rnt!casvۋֶs+%=Ams:L{7;ߓPJ+T伒xcϖ^v%A^5/gIs].-eKlj=CIfѐ`!̴c@<s)7#i~ҟfk?1^O&rWCcY_XJ=Њ޳ƻbӾ)TΎ*?;^YQ;hѹy|)N<?|Pk|c5է(J"lbي[".V\>P!TF@ n*@-ɑaZ#gxĕavs%\ks +[NqH65i="Y({d@!"/Z&dCdZ5,e/'U&cl]./%bTX$>)	brGaR
+X!*8:NOV[mC
+
+ABs`wc%
+b-bݼ_Fft˥}SCcĿAVM:ܿ5WT/(~|Ut9;|cZ:r,-.-@nFWZ9    IDATJr|zJnvVAZ/=XUIjB
+Ń
+F8́y`D0J].7fr<Z''W* ted2
+%O.zNigY4;Ku>%T";H/%o|l&kLqGU,396KIW!R30*0DN,1alzژ@eM刔"L-UJI7-f'zOn(zu9 ֤Vv{a@),+cxJuP@g2{#9Q_W*WwdicX W&(ћO?8pIa[!'O\6;X:y1J
+ye/%A27sEblbSx,ʷK쌒W	}5H!m|xi	I+W̲%mL-MjmֳK\.%]e/0`AR^źоǟ.JtCսbߧLo,?'B&jinsE|˟%PeVv!@ڄZ45 N7_e'т ?x_~io[j1Ե
+;vZ߸qc{_WGFF/|۷o?5-!gQgz/qFH1 /wGo)lӹz{_5׽8;gj0:h۶i]'$GiB%[^',)CI: Y-t69gQ 0Jvb%w |dtv>y4h99H^4qS +,rp5r
+^EXb=Rb1nk+d"1]^1hk˂T&WGJMBx?}ZY2DlRk`L#y29&U"ִ~P Kͯg˟c2Os|
+Ԭr]%0}9Q{q-6Sڊ:_uݱ~[
+޷z
+޷\%r@a6=!"6zBYhiؚ 8VHzlDGVOl;|noOJA[|ZPA`t-<\2gl#L1_K/+XlEubSZέ*rWz#N6BTjx[7
+{>efZZD$:͑0Xi{ti!	Mgarg'-__(:k}>Ê"Y#SsD{Dߺ.CjfĴtIjl6$Y>=6Y~[
+k)[M*5ggz=N^Y^51,ShƑSA,G #	-X.2O)W	dd?DT}Axґd=3`F6x<mAĠhqwZ|E{yfR￥׹`j>ijVkv컅}YVel\c҆8m[<
+>ȵ+l_/*~8O(JӭqRe7yF|W89хfxEF)[?i)q8ec=@;35ic!=}ȾT)?K(?VJ2i|VڸWZSd;;
+4Ju	w.]t";֋/o瞱v}UWc5ktMGJUV&w}֭[w7xG-h/fyiƂ[XMhcYJ]7IŃfݡ2FsBomoxLN_[.\5J&_
+_%.sPn/=Oj;WAa A,X6[]ˠBofFxmVڔY(=dh1EDa cEF^+P;nnM*&/3S0@SAjwcg{PÒܨ!lJD%ZH&IMJW$9jhd9"3fkvhBRz7/śd	Ps@x<6aK8Dt(WTi~M# \]Ar
+
+Ώ\#w K/^U+;whϏEwkcSySyؚc=)tgZ$`"|bZ#AHg\B&}|Ǌyp&Ix]x'HEF*,\$OTfGUFFX_EARZ 4xQGA6_>7ϖȱ5^O߯%I5O?ym48=-gߵi<HS9%Cl$7h+!|_e<W覯Ԉ_uMaI(yu~)WFh!lhGEy*GAB-ay n)TFH#0BA_CB/P~y[-}s'$4Mjtբ,p|Z^r~(hkk=wv?YLM;0|iJ8=3k|GHj% f	rƎd6Ô6ŏku@T߹0pZߢWz/=	.[[]/FHM1:dX;92roHq̣=m=/XK\>ߑCJVmD3=(EwhZ*mj_M*]D ;OG?׿׾+W~YgzO|wu׷c9l?>|S{sB#rZ+~+_=7$X,k)OTbzjƦ{J
+S5V]RdlL#G_V^㗑(;U[WA Q 6  ֢{P!BVY")qI|b-\7yPO.<Tngǖh.M*gaS,1̥y_k'p"-teMu>OIZblKmeԡReX@.@ ܐ*:]CZRc)@5ArcFѿJ^ai<`vzfz5<7y`jt&0lgk+RgrwܘUu_Q猪?E67 rE7BXHbJβU;*yD%Zrt& 
+.j].UVw1-o6|2<젾pFn:ACǰ)+MJ@JlHWY{A:03nz棛	fN>-ekI).l7t#z,6LY(eR!+s6*Yyh>g,x<<\=q1l"`9b8dHHISV#_pt~/=׷8?YN)lXvb&9;z|dib&K%q`ПEm-PPFlL7ˌ)u u|CM'UeF ҟx|g+=bWp~Ԑ._ Aܯp|3!gSY:/wmi^ΡڻZT˟>c3Z.E0:?ע4{I.\`ڿpv.0m_q>?}Yz ʶZ`7=F
+/+7F#5<hL_Kϱ١Nv&rm[z7{ZJ	h'*Abj5:QвR˵9@2-~0]x䯎}'3vy$駟޸q# ˲vرa w޸qgF+<Z^|[O|tɏ9?JANr53=2QB?1VѾ{f3(}R\]r]i/f0yT|?p]7'P%׸,AHBh!()8`(@K%a4 AFPz|fJ᪁5e& _SRA\HO(}x|n+8fQl6"Mm;B೨zM9,MBEryE<UbM[𸐃.	+u)wT"|NfU z:_]sDQlj:ar=G yjnX;g~*HDf"Y}([~HbAC4*55:+xUOU\ڻ5d"FBrW<9w̷пʶԺnJūeq|R.JuϺ~@-3ϊ{  %;Qf@Pjk53,'=9:d#6(xy!L^%8!92,,HI\30XS U408ĞTtiQfNYuCX %mvOis`R
+c&C&X"PZFߒu]p9|Qo(*%e2Nd|Et٩'jPb;yM؊jo]WycӍ.qy$HBPGeFeIZ8 `
+`ċpJ0Ѡa2AXYtHɽ>^]L'7iٙT<NԨ6~I<w؃K8@->^pͶH6s:6)5n;;EW$[+yᇍK-Qr^.7}fKƸ50ԱX7Go8Hń>Bc6aZf[WƫtEɫ*M<`>^@ųܜ>[#5kOѹ6b#!#^mvhQ|RU멚OĪB͖6Ұ,RJV(ƍ)@B`%D,'Xlf.Ru[=Ǎ>g3L嚡f:ƭli>!փa7pLJ~4V I{c04uȺ B1:Z(@њGy3yl/}YGҮ(nW@/,n<ڳhЀO j\ErS7 p"}6v5f2=!e'gtՈ7eLI-̸lQXBF52O;b]B!cnExNh#aB;px)}"
+3-y^ϺoW Z}'%B~T!vv[>֡;	C
+J:@M(b2 l_lH|?C3%ї&(M)-4Pd,"3:'=6>b/=k/{*JN_B>tu¹Apf2ҧN@+(	z΂yFodPvlX0G RwN=03|羏ڤ0ەz^%5egLˢ'7փ}B
+W˟k]
+5#糒1$hGGc#ZDaD CwvYpphc^9. alt>)?=ےwז\|#*j_VM,Ͻ K-~/|qrrؿ|gxc3Jp6U(
+iZڱwz`[%f^\Jʹ֏:goU?4{ _ӳ^cmX 䦡g~vZK}}c58sQ<Rt-7L*ݹhKi/K6c`CrŠ@(7$Hr$O
+;7 I#΃ƈX-q<Oy$!5yM\p7wyGmv###sssVq-ǂW
+kػc5A`*㦺L\6h;hOHb.?qA
+׺?L6mõj()C(Juy
+E{qTY%˵ѮL5,ZAfp
+
+9A9B҃SL%BqI2PКA Yw79Q39gBDjUšlɰlm[OpڈFjyVN>QR=I5:~M6m4_	OS4̣@4,k|4%r&bSȴK 9aӚrʼ6Fl2a]$urr"7!ӲSCN<F(k`j~h&~%1#]m<s}{/ wA)A BUo>X.®^iFqZ2-p sኇ%Rz+Qg2YqH\&zE9l+*0`ޞeDM;hOGD
+a$Jhn\AbJLSmE&1s!k'*RYc!e&׋|8ԊA鐁y!=kɇ4rd]<bOcB<B$`>L,I  x(8Jb?d7KGJq\BHR.PbG]W5a٨!;wpz	y 0
+#`E/F'o8QVM%Tšten0/X$*]jR|mv%Rs?.3-!
+dRl)Juycӳ29s{e=u^R|.F7rֿ/jSdtAXGZ)|km/luZ)~.,s	ow_49ȕ";xd%>v7%I.
+\.WRFw2cћk=<lh!˺ ;UPn`$Ӊ\ai"Uh\bNH7,$$kelEP360%T|Ht?.yϦw2?? F57mfffʕI1b.|eUEz3n'KuJ"e~9m(R$؁?-9}?Z4C)p,*z> A9.T&̣4@#냻 y hj4>rA5m*8yy(GFƹhcQC16IΝe%EczvxYɽ~_C=\Wdta6|w֏X#L>!v6 v*84Wd&ĎL&C@.}& VA7Nޠr,%3wzdYdQXu>cvj$.YZ#2/ҬgVX*׎)|A~<%y58q>lY;:Okf;<>6*cX,N:U6PG CH0ۤ[wi]s4:    IDATd:ny!MmXc5"hdޠV\W9dzHN8lѢ ʦXجZN4#:ܡY-iTɮ6ɋuоf' IcDlmRi#Lmv,g9`tkyXNS	9 UV-\곶T	6O2Aw[|'=߻2PWk*j4
+Gћp9d
+Q݀~T6"< "0hZ#o@4?1OcqFf&& %Zq펖>?Tos/n
+J=iHqcY}12Fay Z ԸOGћ(mvhǅgg؂^ׂ[{e.3ȇ$ك_<Qolw]d=GsLA?#@Hԉ.Ŏ8?)Q8DENz6'|wme UKR=HI>9˝YbSlE[ ՈMĹ.# !"v^'c ˮt(xGy#i	tDY,7"
+ NX4Zm
+:h77{IW9NIK*e:fPGnwh% AAkE( ˃]E o T*`F҂?.t218[j++c)uetcQųlfdlN
+!\mkLMΝZ2=Af'V{Īs{3~}E~DG:	baL`
+Z%` I86M=gHRl^_#/27׵͓}4$PHX4X^ѓ9&USҰ	"UtԨ6r`,6;X1Ekw{ֽ~%!,(BZ!KPG"bpyp*V  (:( <
+ G-_ࣩ(<֜
+ƔXHN8@Ц7s*]-L"iglE}#ʍ5H,M0ӥy_2aո6,N/PDiehKu#ybDZTA##Y4Vɱ	dgdDpl]sP"Ǧ)2UMg(Ru~?ήy؎.$t^DUq
+,хE!K0i 4dR}p@A&[pkJ!<a0ٷ)5C.qxUSћjbpÌM%=*=,Ĵ@)`6{4|
+8b+"`<1fg.J$[<J+"9Yr(%J8~nGkS&$ݾOrv#mBc4"An '緣n?I'Xz 7<ީ՜5fD(?ۍq)	Rڍ-u36M^C!)	R=b9F6{O&(?m\Y|+@%z5fun=~$	Jwܵ_gquV ۶m;S~mY/1bdgQ'ch]FtUec(!)@]h/}i{xlr96U=0"N_AHLerSi+s\<nS>-ܣ $ epY oZ
+"ib'8:{a !c-1*G\Ƌ-ܐs$cK|wL_dr%zgjS>ol?y3䜅
+kg[ݛ@rBrNڜ6SϦjy +dȚ$*hCDw&VKOb3*2oXE.L{+d㤾B#K(}83>Y4odclŜtI!^jh-]qYc![^pne֌Q&FޘgHҭYrGiCcE= (rL ;H:(.A ,A (ToiSk}Y^LM4{՝ekۺYu
+wj%	%A5k"͟Mes&JiG\fj47e OwmY|5IRZΧ'4Zυrifl
+iR`:P&LF7?S:1/eMȅ/<ӛjꐹ~	y2  @E)gd0Ī&O*K]"DQdxǳpbr!i9Z?,E;(#Z ww#p-ztwGچJQZpYi-aZ/Tj79c,Yۥ?;h+aǂ¢7{TgqXVB(pM7'P6?86B?u`Nci42qk&+ۏuc	r{VJpna{ZopqTC؅RȲ Uj$LPKuo4j5%v_5{_Iٝq~rr;_֯]l߹]T~-؁J(;#Uc.ߓaF{a~lz({r5Qr;A%Յ%k["54`?נe~؀pFfe`~ePY(~sB)UJB<ko?Bȧ	uShhPNG8MYnC[7΅eڳhXP
+6e'փJWl˱~?bP%+jӌY|lbJ[ -ʿ'ϛ$::}>6n}UXe"#7QBoD
+hgw+?ރ7wӻr06ģ,Nfy3I~gݛLW/փƸR+[۫ޗ ~[*}PJ;H?=$AbB䑌.MR=E{x3W:+#TL7rˌLgJV&xdxA߿>#s@tU9EFffmt إnGϯD>50;%7϶oX?GqJێsVC8j3ReY
+M-s"r(# @+H^xrTNԁ|_,0&r5.9̧-6Φ\׌SU&^^[tueNx?co0`U^v#!%˟x'-",b|-ʴgιZ;ϩSM  Im6 fb&(	f	%EE*B|Ng^qG縎ws5cw>}ߌT[mhÛÃ݋
+WճgxX|EPϙ?ԝFSdE.d(;jw,.RSvgYln0-KG4#-N.Cٷڒ2g3e>AiH`g!CބFo?%
+J(Agv	/!iA0ZǗ6Rz6Pel}v@בuט֋tYjLki2$xi5
+A	nxe˙K"
+`9{Hb]ۥt\Zֳz?:7{Qv? 8,jm$Yevz7m1?Vґ9c@YuRyG鼩.*OvKe%2h		ڑ̇8_ikfV'r˜؉O|,	D=Y('D @Z@/Qqu0ȿ:Gv^믻naݺumݺk9s/o `"9B6e?Pn(m)Zrx'>ϼ_4t{9_Z\%Ǵ\8ʲjAp^N1(.V
+P$E~G0\h.:N  "A 2Cv"·;SSstڼ T<czF%xfwtOEm짚Op1fYrPx"!+zSJq&n(x^J"3dJ5X
+ƋC?-Jy_QNdXج'!5"X.--9-(Х\9r|V T6TiʓudaSm
+1[yiO*Ɉf:$+k:RJ r,.nj>.dY7jw:
+`! )D-pYtg@ 0s_#ɑBa|PK(4D(c*\Zx^NߥѺg<FIѪo2;{c'*Tʲ4Nit?ch{2- D`sMbFzŲЎO1L%ZA4HTUؔqc3t*Q:_;l!}ma$%~ۉA~Qb@[Ryp׭ߧ&=HjzI`YkD#d|
+LmяO	3̛f!2sG!&r:J0.3ac83^qƱS(-D$=vCY_\oqYИ_n ҹ-<IL!	& H%B}d`X0L4陛_m*5a;sr~C]eJ|߬i>'36Ywwͥ2BI?J6::@T7SZnN{:mvs|Cvr56C &woK*>ӌFn6St:m),F_^~,آG(8H(֫Y
+[1DˇylJc=cݡ+_ʖ~ַuI'A)=n~Ap}Hωv:4X:
+#eYt~*Z~Jg~2B5l$3֯:ٮƦDQDp[ucJBSSW <YQڢ!GA݁6x}S(.e:D#,*̄Տ`D3Q,0oU׿T׶mo|E]jYSZ5Զh?XIާƇTn-P
+Ii	Z/t3euOs]޽9O-D	_en r$J
+JC4ƬػO$q?GD%0&U*us<cJ	>OmR0Q1	,2Rs
+#Kt 9eZ='Gy$4h&EETFL,8VCD	?*~Yh6[岷I?8)}\3 Q1D-8E]dztz:upuSΤh$zA?@IDG'ZY56k{ҚFIӻJ)&!]FdBBo_w¿T{񉆶&+Ze8l FBVs;iD$nV:w2,!Ma	
+@!]ehʽ%TAʍ!* Yq_W^ϟJd;rF#W@TMB"<M1|#Yg>YaCEgߡTq`'ujYH| 00QB@҂tLhd=pJjnf6ʰwPԓ|Ouƌ m<MYlmṙ<Cz|y頋#WA )Ѭ,z$ECp4( v=[&g@A[m
+$RaVxv碐D$z'?"`ɑ/g/bXtWsx*mKkRH*h:g/un|,+JqR_IIObA$E%?C6۫ZZGo]\lb[ü_R `ҤmMU6=mJ_#+u#m~=Dy5}_믽\.o.bZ&/%R(apu,M%IN߹BJ	Õ鲚N[bqQ)㑺޾妾\bi[ћwBef`OlaI2[#]h&q #=4~]́GAX=8E!Jy&5[t	2ؽ	iڟN"{5Jʟ%,)P"@`vBON{7'|Y޽1J֤[2OAlS-;[F#-G{Esĵ֓E=zc,Kx)%;ڨqHglbKlKbvVMKCY:'f*b,T*p,:C4^uizRPHHb|Ws]?Ta4:w9P̈́n[n*.Bf@v	4@` "Y$>z5p8z.D|uK0R0f2Rpei;xԶcm	_=ͥJ]pOS`ە2|bؔu?͛/wuuɔN:s
+W͈%GٴaSnX -2~c&ꉊJr֡!@J,R;>Ze};K3&[[ELhj8IX)tS`Z_bq}
+!rպ1zh59ydYÃ;pBw7`ꈚ2< "Clڝ]IbAm0>OIӔ!ۏWК!8LRgx^;)@ 
+μB5 0L$z-i)Ǻ/A	d
+<Gl̕攄w:%bĲ]7S3v >#cF1rB_3U|vRs޿8C3%bAbu-O/H5Ēuwʺ%>_'mQDOpgdlmc<jљ)w,?;?N7JdaSz/+^?ęgÐs/_pgq#㎓N:"8+x≿Ey5$MA}Y)Q"cl(uܳYٜC(;XF2ky6MVl0Ҏh)}moMR*m0)!-'JDCh33wJ=ihi =hi,@r$M*`&>9JZJ.Ͱa'~Cx4Yy1IJ}En9ji0D>LҦy޺ީ񔩿sg_HMITVxdjpac:uYjoi$c(<O#%.A%&ozd8Tuxj$D+HLNUP;ŏV\i.sZ;VóK!_j믘!RL$Me3J"/IA),,Rc Eg/
+k0'Ds+#h@	ZQhʞM-Y}7ж	Y4LL(^;GPZյPhB)^nvanh[u1?LȂm<e_̗7Sm66!_nPe3S %¤XQ?CLR7    IDATI$b
+=rO$ьGZr#Ȓ!S_/fqM[)6FcR#dZ'h-`GX
+ֽR-%xT׷p>nYYŁyVceoSn$]3=RwCs.FRoCK5>f[ehc|4+wv/Z,CD/:t*AMTH b>AEz"!`e~Mh&yW&s'i|eM<b߃RR	AeL赶t17}bxyʅqaV.ؿq>0>[UFc>Hi@N^rTֺby|s)J#3lmaX!q;:3'MGz5m>|i#YV\_YWmQ\=/ё-k'OבFꫯv0wr-yfOj\rߨ|CuHDz̉}lҞQI(VL*]xW#I$짤Ӧ&ǂH qվ9۸΋㻽K(c4iYvZgQ {Io4d3E܄fR0ZgZ9X[Dxyi֡{R43l(@pBYv%OԵL{ʌwC}I5ɦDI+JNM		Rū(	zk6Ch~Fz<CI"T6lbi4嬉4@ҬSy 9*fLbTDNS0QnTW&|DNǟԦjT\/-e$VMmu't en|NX,d?%A'<Wo6'1sۡA 90s{#a$Md@sac6N?h[e{f0ϣ$({_S]o;nwXk:PAxN
+F룝?LQA|.yF,tBۘ/a /OVmG"s3t JJ$e{=#!pP(Ox(.շGʚ9ܜƠPFdV@eȂU~g=wwĶ<]*h-P+sUh[Lam)m%dQj?%Gyֽt@$ߤ;V5P
+Ao?4A	ށDvxELB"Aij;93[z6r_-?-fPEyxR`t̓P8TOj#jDtYiDo?sӆR0\f 00itAɡ(߁Tn1hH'0 89ZH;+-T-N#K]1ob4+U}Ec3bּ/XBBnt>%u8ˢe)cՉάo;	D $r(MmfccarNG:qoi[7	唌,Vתrٟat_Ew0rO{gV?&#.]sN Gy7^w]w7#tFEPleNYgiY>̌Vr+b@uE<}%"|DfYY'b?O0؁Dџ 3öJV++z>IyhX0ydW"n
+!z#BAU|~=0\icA4R[hMt$eY$!#K.,cDPʎ#cLAh}ϻPd';?eqq*.3#/WxUE=JTQBZ'RՑ}ZT	Z!"44R8|7QV.9jgJLbj 5ObwOM5<Ġ(,3hnAp߳f$1~ih6d!0p:ԀA(	$Ρwbʣ_3KĸzIJ&9L'8LkB7vel]Q-)2ɺ߈TnǤ̺潭?'bo	D/9\Ҋ^_quZIdA{:D9c"zR*fYp99LLx)ҨD)pRnPo>i@۾a_({vdzż|>ԮZGRjp+Y,kâ!Wv,FI^xnkOgR7Y|n"
+$a{$2z0V	̝pƠ>
+TC	(^nާ{	dMSÙڶţ'[֠!"	`gdN)63̀tPȏjvnTLAqRP	Æ26nvahO>HK|0
+ǚ Z5}+e@3BN@AiR:.!ܶicis}#Re4:ߢ}:_.#kb1J9Y)J& ,	ҝr#H[4ZMdPY[|<2ɒftN[kJz:fٵk׮]6v,lY>}[r_JH]5/A2H@jjMBѦ*kߣ#'[ˬ(*"EmTE徴tX,um~vV]mw#xW1}M$q!W+;n Aj0azO@7$:V,@FMP̃Ґ:<py쟿+>T<"rM\1&{ln}s<z5䆡6N;? @Rzh(:0EXNct]xʖ* YƦ&;_2hҍ_[rM|ֶWֳJ0MAD3U8Su]	ԜȘ@!$dV&$,ebpwm"=^AH3bh:K1gb	eJAONt:gh4MeC#"@TC8)GB$[T퇮+^t?x\/yl~%/.r-j\}Pct_5k.jt+~ʉ_F/>k:?<TF)W*|lor@)/&}F_@2c^"}Xꢷ*Xif6evȢy+M}ՐDAS9zr?+Jb4d1ځXÂHu'ğF#eVzj6<YX}Rӕ]IP  pBH/`)[pỊqQ%'tި
+#A$*s5j4r?}peYDi{Pg|~""+o?ODm[$xاKwݕ?sȞo!"x}N9B؃ѩBr0v<Bi/	^)2$Id]FB5iv?uSm\'~g/ћbyeJڎ}o=wY%bhlzsce"d>0۹Π(YUR:	Yrd4E۞+Mi=Lpͪ_|=|ĮxwƎHMY	ޜ5<3_k'|Xt)!d||q秛7o~Oy饗^ve ֭[755u?oTGSꕆz_K)`Vn0xb5۔bDl։jҚM>]4wؔm$ #9ebOJ\ >9"Z7)&J*nL9PzFԄ01cHQ흀nսbMbēF	'!`5oqː1G~y_J?
+M( enW+/ty)"H)2Ӎ_{m5h/|6qYVPupupEtw]҅FPq$4])Q3D"*nIс}iN6);c^ l[ؼGnd{$6Q~o?);ts7dr0|8}/e zR{ B	$5s0
+=P5J5g(ᅣ.zfot,r5L,U;s8G*z 0=7Z@?+'K>XRȲP)3/H^rmo|TN.AVN$!$$teHfZc4R4} MNCtbuH[W+H(QICmq OU@tL7 `]CKȵ-L=)&,v+>hl	7oi.ةַ*q<YAG1zV,:v%4<7w}x(x 3 SSC>(vnC	T7#;=Uȟ|5{}^Et+5ރGLZ̚3PDŵ'h>.!fdRSEŞd3
+{	c)4_$(f OtE/('Vfq=9Ncm>Ng=nr,cR/	Wy!*k	tNs8o'L|1#H9FFZƯi\3%GXoWOwlӶTnݿ_4٤/ӓZBna?/G}thhN+կ|_/䒥Ko~ϟv<}v۶m>AbL1%ݳڞ%;w˚1җPD'"RdRo8eZ(I]d@Y*NV{txA_2U	.Xn|;X'kxR7@vOZ  Ӑ ܅%$H*@˂`BqV=w~xnG8hA%(,{/ZzHQ/zߢݬ:a1Ln@cSgK5'K(I1?mb֝3ֽzZm>ӚsY))֙MIUV 	%EJHOF1U7'<&`!3d}[T&#lc y>mMFfo3dE|G	h&2]0?Nrt$&8RBM	_615zy]B $:9 +?p툪@z%E҃~/m6'O#.;Mgy!`*weĵoi
+ǫH	%תsw~I+a/Wp{÷{7fJBًҶo( .iLY}5Ci{]HD"Z0(+K;lJZxOXt=v0^!5!Vz<p[mH%4G| "R%ާ0-csVcl> af1\%/iavȌFϴyƚ+%XɄQDቛ0.[۪[M&H/Bj  ͇o&$,>Fxs cRy3chm||7>FZcp9BD3LGyt[C3rp?jx-n^HMP컯XRRNҥrLq!xptdZקCR׶E|eqЗTix|ݹC Rm>ޗr21H),mk""+JR,`{tt3)lfz!)e>ˤARYimli7qׯ߽{[Jrw}衇,˺kgggo|>_9/
+E{2]M%"%Hf86Rr.XԊ$dD^Z,MWx%VfJ+QKIV4ӹ!9tڎdѠ/u?
+Yl]4=Bj@2AL!+42LoAKC/  z#ـ/:/nvB,@̐9z^t`뢯<pSc_X	]Tc^4ܞ h#]E>L1ar6LX#9{9F!"9|D'!cl|[2|ĢI$"Ub2o_6M<F69e)&6vI
+LGt{V=0B9F.P?qhMSYSOe1mO\a_54F܌@ fG>Vi+.fg{2h:Z. F ̄7!B9./iՋWsIg?e^_ڋuhlQz/&qlx!DknW0G_ʷ=t]ͷ){{eݻRl	Τ{_Yl狛[k*+.=hh&3Xva;1=JteY)W3)`9.GV'{jj>+(&J,VPlO%H	O,rٌ]qϘgM1m4t.g~4s  s̯qYϜ=zJ*EOB,@њEFAElZ.~kO]OO+,FFg=T`,zqvp-OG+	3hh`WCHEujV S0]fD(rxgi>TN;n'Nq	}X(>ھqoVCp,վ<e.@IJGlfiV!	_Òg61S?w^wEgk!l}C̗s  Հ/{ߋ6_
+mQ")Vw3c.g>+=c=iz4enA;Hd_^/?:#M7n]#J90-".qؒqfeqZR$"T]	F$ L:Rb"Fm>yWV|8kqKQ1J2uR ^	̀w@4&A4D`.-l&k?}yo}QD{ԀEE[o۟FtEkxڷ,zC^ 
+PȖDvf8Yo|:~$'	H.2jE>_}eZm\QJTdh3YH5"u~[h,#۔P_rxMpq-z@'W1rABhpsd-6G b7G*%24l-)";ɒY.=쀯R:arӔ f"	٘x ^@)X wYw3~f/x;7VyW*	E؂H[z(~b+ 4iMHIy{px'޾;ԝ{zZY|5HNp?Km,%Vz_+Ҳ%R#{YIf#gy$TqGxtMۏj߲^*ޕl'`rSE>6T    IDAT)]$պzU"8:Aӣ$Lq
+|]֣v4Y]ʎFsCS:[zd^;r,I ~B}~giǁJєan#%P߹ǕνB jPsh3=58}AXPdћX/k\|MP
++P(l?i#
+i
+B`䈦%bk^C(Ƈj;tjuJqE  
+:׺Gg{3"+ލ5S%c7Zt.ƇlR6}|e^|HQ.s
+:֌Nf$9J'9l|,@ZݍdMdvYN}˿[O2Lv6J"ۍ,%T%2dFy9e"]v@M	y;S([F҈iaRRlVBeV((v["]*-W67vRF띯~tzֻ.~:Ѵ20](ґ00Jhk`/@v0 6?|z:5 ރ-r^̱lD81lk "5DC=x:2EH)`vNCۙvoiu?Q}T&/u6h%Ju)LV瓄J&/3겲yʹE(fжnApl0MA%(*wkc?cc=֟3_=a?IF|k4Jc^Gt:ʾ$*9*oH6Ֆqʪ:D7dH ]2YU7MT3Fua]#ʆژ#LRʓ7BKk#meEL
+X3Z:qUL_^R(MoJ[kQ%1l:lRZj`9]d#S1-.  S"3!b,Ufd&Hc1@ip5]'Uv'z8(0JO5B\MwZ~isOefp{à#m^/JC1Ƞz:H( ztD-Qʓ9Á&`bC8^F>N=( ѿg"M"fp3dI.9*ˑZU=ţji04-	_(Yـi`Ɔj=3^i&>Nd]lKmIJ`ܵ jr&2pW"<jeԩ/gP8hJYHPrҪvGH3E 	B@5H<bn;Ր[WFJaH#D~atkC+ȅo#ǼΎ`dٝ/|ORyF40:EiClGgf>u!{K˿M׺+Nόғ,26}&
+vwk^}%a#g<Z?n&PmHe0җM:fWHsd3>W#QxnDoW4v̌_Ou֍7-X?F~pt#LON;RB5''V[,D̩gK:F*hOT8B_n7mq2|28jf#*VIo	bQnbߤY3s;[kQOCȮ^ Ek}Sba=(ٰF"PH` mBqMtүk?f"j8
+Bi!30%e^al\	?6&J̧[v\,T2cPXV#]Ӵ#!t@k	`ШS52'f24'aKV%X%qڔ/IF
+=vGVWLe0cT=j}A$c:\I{|%UFB/󟚫* {֩:Ok GᭆXmzqፓk)9 IfFz2dNu0 9џU QP2
+fЭ#pHB6.R>{}R8yB@iѪee6FzXj:	X&Rt[+MV6	ˢAgRiA_2/%#0+`fɢ2׉#	?"oϐ%%r.M\OC&3HY 1 lh6TaCF/"Ufm=ztxLtLB.tQj}׾%:Ml٨Gd!CPk?_=R^⩰FP8N0΢.C<g.p@4{qI$=Ȃ}Hu0xzG`۰`'t@b 0=tk`,.2D>4tv&	/
+f2=-Bϸ?s];DbDaB0td#橖t6:;V*g0zfm0ȳoW*׏.Wڞp;|k.L'9Rڞ~
+,S|xUp'=Y*WNڃo陀џo$XKbO;JN~ZߖC?5g?{뭷^}K,a'BQ ^{"|~ `^}Xt^Q{Zj3GB^QdRǘ/sj'JvjD㘉RɭeŪ!tKU\U
+dM"2jꤋ"BZzDsTC>_0`/UZ4Ax"~0k
+/e(jw_o5OALC !w*y"4A@O&n#SaX	,>- R7Zw&|?ŗ3'w<󁘯Zw4*[KO8ts=}K/="ǠFɲ4UzHuSeITΒ4,e<ZDޫGw#ȇL"X0GFqqrW1 LBl ߚRwRt+¶
+rQ"vVdő| K3J*j$T`md͇m5~u#)5ml=~g攫x3"!%@Zm0+`hl1<"6azPI ݂f5(8Y4V˻cswѻ5#ykgAvVt-}%jRѲM2VU5ڱ9m^(+QID$J MT!%my<KGE#TuJ?-s 7AZAORYWbDDq_tЦRDPb3l=8]^06|Hݯ8nܡ5w#6s֟g*C0@-|}JY^  Bqd֡k(9sއD 5}0՝ 5bD]D6D
+ dJ	2hMA)h:rØ3yfծ12wu.$f`v=j?Zmзp!'zƾ])z疌@"mw܇Zwڞ/-1_MN1#mC1kuv`՜\-`A׷6mOO?_$գ+bY}W"
+zehy9<h32O|6m5cEA
+0vG͒Fk66p8<Vc,I>UmW!g6Ց%KF騝&̑=u˚r&	hmѼ/ftV=-{"*xluNҾ4"eE(x?o/;kջ)VDZ@-DG&0Nhڻah.diEn"FG܇CaI)!B's$
+rtme>FWp1$	_ǯH"&r2{|˦tLedSBezO<WҡD&}ItBO&*hF'#91E-
+]c^>'agDT3%l-+AkdqM=`~\#[U7=h٦15a`><tFzϼ_MD!CDx'AFmxi(KqqEP%GԅC83E!5^YW ^8?3ۼџ?._WgHėYھyT';*kRF|͵6[MTՉ~9ecǮ<5ԋ!Na񄍑<](Љ^{Y\UmWn\A>]Sma8/OPu0bP;8E-b+-Rh:Ta#R/Q;[βh겙gU̧W4ez'¥_ܕ m]dB*ӈTj=t 飰"YF0%A5P<	v#QH!9L^)n,[?!aG3#VxxoSoBB$ݐZpXEYCQ,]Џ,驦wu294cJuo/̇B׎T'D̇3ݽj[?*oGo$$hDoϽotdzqؔPN,7\+9զ%z
+ZF}#$g8y9yBs{|駿og?0?SBpщ}s-)VwB0e>ɹS Rкx.ӑ|ȗ&p;(GHV0	@ #Z *Z'
+-<_0¦IĀ%G8|6nxཹ
+'?gTk%N+P)@ˣ"1hY@
+2At0ghMsY	6@$f[yK^vvkhnȮ|Vad>5φ.>FW<RY"deC)IC,hP
+tX0Zq>Uy@!M@qz:
+},pV1!fO"ߘU)uc-arYW*3rd|^=b!-і `0ʽTEfEeo BDynXuxVmc;ӯjYz^>rWaA	D@mtwJ_
+btQfQJ߀ap8 8`CaPKHEAFRNʗ(x,L·SҍŒnrR|BOKgݩ,HeIS6j 9(
+eEE)H%꺤@ARΫ$DKmRU$~?rdmK=A6ABk<NH2d	&ЋtaqziKːDlHeJ.s/$'tVI74:jLJBSLiӱ]V΀wsNݸk>8yȞ,hyĳ`Kvz1G SXsH}({ 2H|&@v<D8, <{0m>,
+8R0mh4!!fq4H"Y^ ~B낣'm6Wr?~o%6	RMsB}o6J7Hd{m(>/K皿*#̍mS>3i|'wڬJbMn.w=7L,F+h&6y]9`}?_v]wϯ_mo{;W/\xᅏ=f799c=1o)3]kGL*E:
+ W)-YS,hldxl9Zα^Wd]f2_<{['D)|gWߵw-栛8v}^.XG~5w%ð&S>q4|[Lg(P"a@"ilU"Cw 	 pHdT,Ԯ|_Ou?KPxGɿV%=׹csSƯFe?|koFowK|>af,2	ThIE/X%}Y1Xڒ-&)pGcr@d2~Y"	)uwIUcWMPOT˸(GV{jo,	p\3.J5!2?vX8 QK'] ܇RĶ+P+*rӨ*=Ap| aPZ̂ߠj;`{DMd_|_O}gle04aAesf"{.?д* B	Ibj0Z绔9sh=؈.@Efdv:(QC9.eTBh H,KޖFy1-y\ `p؂˵+ľ2Y7S/"j[YSfD5Ԏ9L/lUari,Tm\J57b@)*n;׊D;Jv޾e}?XwY;";8Qx =' 0tC&G]hyuĳ0ʈf`}T"*{ᔐFdaWovB܅]_~<aC3ۈ}$!x
+ӆHP傃󊓩7h--/7uO
+/e7v
+$0R,n#\Lm0~pil3
+,ktv4(*ԣ7fCoM[J:_hg<|z<<{q'AzPoneج[#ˌn%dccad\K.=|ӦM\su]f͚n5k\r%7|x0%kuxYn<N1
+舼C I)?'>Z}nZcVGLNlK֏ߎe,TH@!5I7o0Ww8ctGǴps	1TZtLOiG(^w+k!U.!j:n0";p@MXcPt"WKk=&@g/EPq$)P Hjr0r84U( PX''PDJnf)YuzY%m2}k5xZ*/H.(?po~shTqe5ڦn~̗k]0ft-%|x08dW	ݝOY1)	H]+4KV{dPC*Sw64:jBVmㅶzACFG.F^Ȋ0I3PrȄE*Y,z/1'Qc3 ŕ~<k>'e6onh;)mD}laLt (fQz?''-C
+ Go/31p柀03p:ć@v8ɑHS _ש#.ϸ?u/K=gTCJ ,
+9BIXIG!K/|b"(#mw#`f	J'KdxzW*=n"55ۇYx.ɶER{iq P-y<KGb*ʿ#vdQ_<ZKar	1iSꮥ:1-5p/2BE,NBـ}C?8;Ty!d$a`DU ! ԂGI$2a{gR~h<]s`V}(lh.Q47Y`&ԉCi9zS:m    IDATnAeW!j0뤒h߁B3@(tBp_ϿQ6t!ÜM0GmgZr}fo)`?R 8f/xo`ݯWv!4:hl^[r9d\'3/tmjG)O.?vwX/	9O'[V?-(sg##<r3hG)d!24raͽH_'>q_vesGFir\r%_^Sy3TV[䔆Ldƪ.d\v,ܻ;
++Y48q<WCXꉒym>Ut46ACuX'bk.(䳟R#TeНs"gDe> !BPjO~nUܑE
+tz &YȾÅ_7(P t@ f_(nyӟF\9Hi<坽M0m_/oy	k6b lLAT"5"3`p0\QdFWBtd+P3l>29_Ajp8bG8!%"E(ACGQC%MIAy}vSd#y}U(l7kuGH:Pqr-I "d
+g М&o8;9rއKFWg
+/B(!DU0FZHdA4("TBrxD|)啡{C7sS|qW0H*6=}_ėR0:noJHDX)B%Zى2;"%؟.5Sek$JcfY$x::q{_}2ZiRt0vDsRb
+8d6IBg0U%J0!`=YF;O?]5+G4\eȯF~5!#6DfPۃg/\3z4|:nNF <dރ3pf) l9 HZU!B<CzR'~ G0H|00~4andK6wo
+|.9݄H"y泚	1j;`A>K(W~xM0zVʶ'x?zbTc)_9R]\ʁo*k HgpY̘y_E*a_MW=?v*uV2D*.r>1_w|lH4{sx??~ןDǭ:j.Ti$ŊQ: iezf=ļ-O"7s| :QJ)X4 ym3r5*h6Îo$~'#Lkc+#'_P
+.Y zĀ)& })7W;bv*7A	h+Ai<@fa	"!Mf@pf,:AеCTnQrƦlE?Qyl1X}5GocZ"s,GbB@<Lcp_m)StT';  dwV5qhR[)re:ı9@3QIА*.;?PzqWQDqb1)A]KO9ߖ|I^vSt
+C,@D!$mm&BV]Ew#E tLPGO#8V"ۉaLC!MPK8c)_PyJ;S9\jy5~roc0]'8[޹!BY:j&|e|l^rHޤ>ifG@#DJ	0R;R
+sbAukK=GV6f,o:Vr8&ʃ0W@ꒁ`Q2T/iES%;*.SZrIеݣ䝆)0]j"8y嗬G3V?sxuL?G;cP)iYDU!i#P}y=<3 FLGnOʐt!:Ӡ:D94Aa>ޤ:n}:T6-'iAe9ǚQCyZދ6 |0=):[tvԱ$m'SFIԉ/bu~4׹v Elk<fceBY	Km}+ARH*PFgF5h+\}kg֚OքbD$i4RZ,kE?ydf
+#AG pɸ%^GUM$3C5H_0M]*-9OiPduMi$ul47
+4omC"Jӵc} UtAT@(xU+RhyP>-QB4`LʭUO\`t RÈ[)~Ak'QHanØ?:LSG?X#캻Z7<Sʰ?Q?z:C`S֢t棍	;:͵dQNhKмxx6	%dyfGJ4Sy#Iںz1Q]y<8B0<%oDSm+u
+*G8\VO}ձ7jD|<䫆k i[4v8!aCҁ-B\x{lSStt~tr!("h
+v	p ~<E 
+Ni @pttE6{/ct#$5g;+e32::=gIIK/O0%Q'scpv4ϚDz!MqF*]FRɕUH,CP%61*ULe $#(stu#詝KTjcڢU-Ӆh.T"ˤTLY~r%)%~޽Y!J:62^d0r[I6z;"iZtV@Q`~U{J6wf V""j|2E80=&JQ0qi]}$}Xt`zpHC1Jѝ~Irei&<F\&2vXA=3{6A)xm!$c5j2 ~]ֹKϹ~h~H#aFiz5oUsokch|+JO28f<Ix
+~.Uٜ|~@)b[jɪQZaNJڭlV6],9<WKf~?$\q'"]~>__ u89JDfq|SexL(C9 /u
+2R<&OK\IP&YlK2ڞj|JR$UDyعCL"&<>.tÀq?}ٻ1crs=)Bttd*`6ӤR*U[=yZ+[9!4Tæմ0nd:]D! o#7ʐ	blE(-0C$F&5gG+u}w^شy.G( ȺOikl.H15Ie)GX.Z+cSzJCӶ@%t4PANfG4`L"-5S<9v	1fGɛ4(YqH1IT'u$ƌTztILLVRE^D=0ڛӡ;	Oa\.da&Du!ڳv/~4ijGF0% A>F<f3MG@I0
+cX(~:!qzm ֝Ӧ`Rm>GWJ崓?oT6/kDi$M! Pٕ$NMtxDg䓋Ňc#\,dW!/gc
+:<.M▴'v=S56iڎ\Vys$YS(HB>* GE~5. .G 9`&zA5~a~__f(O` a`&
+k܂oq\f 
+z`x) 8<#[@B`BRf,Q"iq)ͻGߤw2O,h!p>J}:~xT^"b5Ur@s~rqɽ|`+JwuJ!Q|ǩvh?=52< ʢe#d>B١,reX \9:;|@'H^8M*POH8r0f<_;Wo38CӴݻwSTjrgT/8n*"utݓs:WS.q5⚴` TmNh;"QYt=Ҭl*K"S[t_?xgsu࢜=e:<p`&6IW*j٩{{bԳtMYA-G "Pv	#DKD"_k4~(3`$
+:
+k
+-RrkMSОk[`v䢂uMMnc-85peK/;,i>#A7])>h3aQܱhCaQM_gGaKԝ`6T@	Ա9<0NK5
+JV[B")87nDt鼨IoȾ8o>h˵~I RTR XYE B~d=#]!8hamO՘sKû'M}hJ!Rfb-爢^oue=+gg8M}\+U6c4ɘ6g	9-mX5ҧ3җJFR\sґ}8|A"%G83:|;یa6hYWu-:dr|`"VGj* =^]w1ڡ$b󕦶Xux$ݠi	8O810< qVqPZ` 
+!ET?]!DpZSNɲaNL/@`:4xH %H{;#l!;f_La7u
+ h:%[l=tj('ps`>LNXٚĈ
+?x6zBn$ՙOB¬Ôb@cǙv(NiS|&2=\3[~_hG!BrSP%N׭X}1J߶« e[B3ńP2Zj|ꐵ1U|-&*/o[O}czygtwyM7U;\Zߧ?()WDI%&Mb$h3MH4AAD,(ڢS~kQuc$1;cscsw7"YTOWFZ+tB*5*\m@Tq@%r`@Ju*si|mټעӟ̇4[ڋ
+0&$.ybжM3*
+&Ӡ$E K m!ԃ$v :x@1c6Lh&#ۼ7Nv_:؍tLG2kah;k{D!q_sn(?~GEԪt?ukj;部nrTfW&'%cAnzeIR<nb__MRUNr(qrN:^)T':xFA,%WEjZ
+9&4G^2J.I#CQ~٫EF@֚ogkI9͏-iMR n<C܂YA<hY B (FaՋVX }>6\G0sL{~%t4@2TǱoWşYvҟd (kk4F|S-ϸ@ }9_>^y%HR9a~cϏ/Y/3䲪@8+*}0B,bOMBm*W	_=7a^;][!nѕ5RMjUrtS=㑑2W R]W:C1+'ui<Y0,Nςbĥx.6xP=t>sNh%.Td
+!tF?fs7hO"`WzJj)) h<f!@`xJ"nC3HzM p5b qQJiJ@ O!%-Xv2,[2Τsmm#tc{WIgQa{e06Ţ8='JΡ(8H.!@0=K*op]?6ZRyk<F#~mR_ߩ
+~&GMbSE&6qU# a~\?_O'|1l=gǸln`Q_Gڶ#k8GGG;S^R¡qAveֈfɔRf&m>\d.ߙ?ilm{&tz3=m?Քzui~-cax-z><U@s?9yE_KHKe_\v>Z;~r}~b_C0;ŗ0dSQv^rXg4RCBu-Pʏ(ExxH*:ys<x6N.Y*ݶkRVEXW޵rvtnFV*L:|I$Fr܀CB(Fy692T8 ^cy@^'ꞜTP!(Hm2x@޾NW+5jŘ*d +GrZCCtÈDWhO C>1Qx]š%izen5-ǕN1;	QAq)%@(@,Bw;446.3Mo槹k\Ī;-rn!$ش`?eGӰJ[
+BX&:r^c{ : M|%%a#MėGH5V;ÅOvtN Ks~~c/> bY0H*,j䃱RUVӨPZ$! іWȋ+e&W*M|¨WWkU%vK&5rJ>b [ƕ,24MW;PsҎ~+WD´A)4in#k!s8|
+}0TC{FތGa
+ao?svǇ~2_xi<Xc㫷-.*cC @+Zoë QBwqd4i!h)BЛG<Cpi4AeQUגH (8ZbZxmmV2畲\~m)?T+_eG$=Pz,-v=ZUbvufQ3QvTE^Z/4<D,X?lƗ:6%\mgnk%o+,$T'*2m'XwLx_J    IDAT|#K?^띣'/<kz뿉#9=?ϓ$o߾mo{ۙg.՘ڗVBi%F)3RqIN#+@uf#g?sؤWs4K۱t9'	Y8`lsn$SAۺW)P$i.GîBTfy7N:Sp| <Dv4E2)`ۻM}A"rԈ^^rkisʲ1BBkC^<Ci9wd,ۤio}gH?,Hbi,0;w)m>@*t.T
+ġiֈ;gX\5#T*">RF&`:4F:fIAr^%R&Gͪ)T5aBFwe0Jq)Ы:n7-GnAsq|^78zۀn,0
+#!R(C/PFE`} IPKAWf dǚ&rTmGӤ]G }_LQ<M7ۼ@\,2UT5N>GWaz^\
+vOň/K}iJ8 u:]ӢXRQɼIU-)Ӳ,1s>:SMѓؙEGy쭽i|W[L//C͙ԋLjp) (l4kdObiOcl/i'}0;`z/fbx5= {刦apׇ]G1ր[(l0\$,;hoH';雓4C?U4At'`G!!9A%C (@)0DSAE8߄oct=DA(}(׾U)sn3։ya,Uެ	xt
+:dsxo8[0G5Ƈ&e	ѕeRE+E}Rp,#~ul?W08й])6Q<Q|mS{us^ŤsŏJe+e@Doʨ?)3(gKZٯxZaRz]w7qd?~ [1v_8oGM(a gLV5w;"QS e̻ye$AJ".+O#-Bb&$bL^Ս!4gMti
+Ja{0XEDm6]EDi)d*$1!D<>Aڅf!Y:oEWqfxE߮J1.Msw_{n 2?w;)]ҥݿI^c.׍3-\,BH@|FmFzvS9$Ơ"BQ/FXr@*!AzD"lA ΑGVJL `d"ovzLG1y@EC؀}W?;ՠv2l}2bi'z^+~4NjkK6CuNJ^& f#YOa Aa1;!9x<߁aC1_þc)W{ 9xu~N3Gc
+{R зGEz?ˁE.(䒅!\lDD+j@l;z̠P&7@+Z. 'C2Y с{d&=1˪j y*Vطm{t!,Y.fK`4`$ث\˞};sB:V!(e`^"RB0p=& `Tiw^F2g$d2zMn˶@mPʒuAxJ!Oa؇n(;(~4(Fii	\6s)C#
+k4צY $6t<?XֽRҵFV^
+|͢?7yj_ޚ$;M*6ot9X9_lwd:%U1Lbj;B\,._wbFP~I.ǎ'34Qo|4]0hnl.|¤}+ V3yI;?WSSY?#o9W|}g114Mկ~3qW\̲n9vbŊ͂,-S&@>@5oK'm9R\zB&HHI f2ҥgiۄ뎁/Nm̶M1lyE
+@CJAfw&6F4zJ@s@@!CE :qL]ge{GwA2#}qi;̂8>M) ʑ\iS;߸q(R\m%JӭJ3~X̏İ&cRv3DV\6bdM*e}8U 2D@RAcn!6FBp+JR4}Z~V!vy]ݰ|cjk\#dф+c߾\۠D#I(COΗOu?ǿS>k;8{Xt-QaH0K&Dh 4 ձ{++QtN3^=8Hj9r:ɇ+e:}I~;݆B;Oskc[k]Qvv	\H(hXJIU<W6M6(qTEHpX@b2^bMKj;4#3<tH Y@A*63tjEF|L>C/GOCB)WI)jq|(K*䲐˂FcW6ՌGk?GWt!Ĉc 6iڞ,4WBI
+HPe[ Y
+`'dKFlf+Q#*:#JV9ti"P@uVixz(`a7`nL&sk[H"diPDl|awwWG-Ivce[*uL%BwK%PH+ˋ7֝ara&1u:{
+6\(PhG+5Xw$bNrlZ <xpL9ٱDm:8?Z,i$Lel<ˎ-/4ƶ~~mkJڌN:+:WR9t0s~7Spu׽=upv˿KqM6m W_}<\.uY`_m>/#k.1Ir(bZ2iNº1;hFLJb,cRy+[0`OtZ)Gc{s1VqodthlҸP|Zק-9Bs!ðaXH8CX JH A܂!x$sEP*Gރz+):]0燜Te/RՍ=^ntUŜ(=X>q(Cy_$?6J.4;Z*W!F;@"R1gs?4P ,&mrWfu|	JQXE5-mjI%[" U@B)V{9HNȬ|(G<B.LvĜI3-RqQbd(-	j;úd	r@Ja|e>TA)-THZ R!%F0^\ l_uFHzEA~\"[o7_BgsMdU'Q9Yr0|\Jr'Dj
+,31 |΄	R;K2&<)jONf*UG!F+蘤K@JLYKˇY-U!eddD)@HX,JH8Q'4y!l(,#
+|{A4ex+vYx.?îNzn2}ӷ1[yl>A%ObLOi7hb~j;(ACIf`ȓCEkrWvvk"(C#n	+#aH$!Ci$9q_2*zM$:]nMgװm?FgtҎ#
+F&n,X״Y׺Kc3>KpFT^Ivŗ[W*7KyoS:e|]3@ɼGc?= g4HW*K)3H_\?f2:#eg
+fݝe+%X,gʌĢv 
+_Jի?O|#y7ܼy>l޼^ysE]tog?c).B!,Ry. #TfzPf"\+hssWGF(;]
+S@d#ƦꃷJ?;-)ӂ@uilZֽ?4CeR0ʫu BvD8	jBq{#`A(By)A
+B$?V)[#S	)+	G'Q*FkwfS21d6i~.Fq^wvqzfHjt6N~rI;PAzL =xƓeC$ʏ#\z**ju󩖘d<PP2B/^H98Չ sz>R[	X&jtUlY"Gy
+jV|Coh'
+CKeX?H@HT~!*?빷
+g %Faa7Z{44w 0iV	
+p'<b\-]7<fF&guuR|#%Q)LϳS"F)G*/HIR9U%F%t˗]_ʜKdѼ/.`SsP X
+H+ȼ@
+68WٔAW;j[.OW#Ėz"´1*_=U@m4*OH;7+h	?2c!1cMkd9Zҕ_9 WwP\$&!jxm`8ܘs'uS_'}^_*JB=:mgTrL7؎,p1?%KB@ 3-:槗C!K/B@)vR9\I7`:zStlô!JyF~tۃṞQLX{^yV2I1HH<?{.\Bfɒ{ҦRvǿ!X<?NS)F\Nht\YwU)[Qz?;q/=OJ.hR:%\6Ff驌 i&slvsY4~|+V;kڽ{5\sPv~|]ֲ~ kojj{?6m:n& -[#jN(W<J
+t7:ϾCӚ@We%)uQ&V1ڒ3䒒wiv?_*%-N""
+{(t11t4fniCs##c$- P,(Esi<DW$q	?*Nbe0Ǵa	RJeL67Q}s7\ֹ<k-(9D(eb֟rYv^N:y.T!c
+"3،+/r$e/ri$	?VD"!PJBΫgqmFW=;HΌ1)X`G61 $jɛ1+G%ZP WaERl!y;gu6Ũr9:>^rJ[uJjF0C<F ݁h&9]( :dqZ OPKEo7Ojj&E9STB͉W麲
+e$$roE\,R`i7;bh{l60Po|vGW鴑	/Eyx%6W	xojK+"+S#iOZbfDW{ae+bj<mX3Q+LRԔG&|O YP9ad]k~xZq]nۑXHwXj{*W*twt|Eb59AoB`bU(A"xbJ!P("F~',gǼUӥĭsAսT(@e)|&myP+OشR׹ʹkjH(oIpQtWЍ,K=gHk;-8-ɾ{_MŞsG-Ęa<#e͏w§:U)~LrOCKts;XLHKa.ƃdi1ɏ*_FW3M*JbKM.*\dٖpeސ5d+bNվVͺUFQIGۛE䲚JIՉW͇q}Br
+%a|by,VZuv,˺K엾Gw}+Vؾ}eя~tQGqz?~0e/~ǌ^Y^7vsYjhdH4T6^'+Ɠybo[:[(9_N2B2.HY-_+S{i>GGX@J(F
+ϱD8tfx_\Jr
+B` l(AI yiif(8i<Flh&lRIe?i+[L*sBrn??*ř	/s5`۔)7bq*	_H47+s9ΎD0^~ZXF6,:+Tejk"gUZhUj{W=uՋ*
+Z@-Eɸi]R#G*dX'($R줺uFӳ]^zA|ntN^%$2M3V
+)$a9?(ړHgљR;8[	r.?qU/Sف]k
+l:+I	Nr|rF?;`f3s\,Q:3dxcϪ=%lSJΉJJrX\H夲nѴO,dGf;hA	rGC%ZU3)tC.=xɦe<|qKwbQ8ddN\"HJ82GP'2X^?}̍'/]j0oU&Ih7 pg0Ҏnݵ4GB`{uDA (X8 DB[Ϡ2N~?{Vi @C=YHh/lJZս1IIv&cSQv?}qT߆eitp!e$!~/Đi!4'u:W>vBn%Oj~ouCI,#ĨƗ;
+?p6.>Zf'Rґ=PRU6)]0u dT,\MϞ<AS~0߬TTvž6J閶U;̂=+t?WT.AɎS,6(	MmEgxKNOZ;=iiȨ_ZC@U_>e.G{    IDAT袳>M{vp/}\4o7o~s˖-B_8ϷZL
+t!W+	gb	cYJ~^K=a~ȑ$֑?:ZyRxmKUx$N#9_e[E+!Q!%<-i" 9JΡoiQ,@fG0D OHAZ0mWEtES\KULIW(v$tM鹩,Q~vo3-^WqUu.dr.#q:NZ^puOdfvZ+*% %t˕2h^!#ySev%h-A
+7< w)sڽ^^dYMlJ"&'rk@_ QH>լ^"RRPcIvR:gI!RzgX E8HAmTV/)xuD h_MtmWŸ]竹#5OD'9:6_2ZRQv^jkz4?b{_"8? el#~[SY4MUj_df3z%r0T!U1½qAaLCρ:]sf\:L-DR}0dzww~|՟}<G:a_{kjB,+o/.ӎW\j;rQ?8=Zx\e;ƚ),Fq)-TO0WzT]3	`ty1JWD1-XbRu` S`ȚM*RJ6%Jb
+1V|vʕG!K鼣X]@Ps39kˏYc3KśBІ?zOE=;2~e<\(ܛ$D!s?sdҞC-/i^e, X.نS̵7p?`Ѕ8~s?"k-:]qnS	<\,>)WB;hZ3|xԺҟ&$dLN|I{:m7Hsr1E(;Ko>)Ƴ!oV=O?*sϽ ֬Yq_wy\s#8{[)4	PEvLbyWG3$(Ol_7`T0bNVNɹj{HU+;мu#!KqPe0aȡ|f`8 `ލ,A@w*ˡ&$Gw/
+	4i@s'
+`X݀{T	+}>nL)yQƹ<2;^ cUTEbi|l!֠A|CEj$v<WdP*/m4̏Y|aDY4d:sJ&d:PNOm[+髈Jfm4G)LgjjC8UT!Gx~?)o+ɚTu:sC$scikֹ,hƗYlL]餡?!׵R9_a<J"	hW[F܃WCB҃]遧,P5iSoNI'vLOe!AD-U-P|Ლ/yɀM%'Wv_Z 4ݛԈKeM#PKH$4??J(3ztv2BQe-p*U9·3uV`]0@7D_!_Xm\LjJ)]MCFx^m]J/-8n-Мn2h7_ފ[2Gjl`ާ iۥN & D
+)tPAЀ.`:Bo
+C`Ð?gny|5+	.K?Sd'(E}^S;
+5mmna.&$Na$;j{~0,.2G0Jiv2Ù']qr8%M;@|=!EoiXkNYC)'YڽOFRVB3;Qg{«56(WLΗ
+Y]E8;2l7`*WrU*ORL*hS+u\|-1}_+`$uOĀ{ZZI5Y$k_Kgxr/_6}ST<F\ve>Fq)z:S(V>$wK)]rdVc-,@uaaapp?'SEy̥ͦl8 Ϗ~!y.,?࣮P=c"x8N+9_SgaT* Bp',~,4fIqJ2݇TxE0ćSE`Zc[? niA=mrFsa(W*hzϫsdJᲱO2T,VH0.0vwҳmm_+P_YCȊIQYO#JAA"89!_i5h^=Y!*dD5-RTX Kbp=,ީn$oZPN"YW#'$,t29&5h5v%±
+==1F(~t{< d-72):Wj@ߕ"nJ;ɁZk#!MqpSP<PF҃f6泶,?R-&\^[?KĚD2M<Z
+?e[$I慪S#U*ҖbQ*jba]x6|w|*eDK4i@y,ʞjU6{S٘MIJ+R<Wi~TS	\!%:ģClaj{خ( 9@%,K[uY(OVʬ>Lrޚ%ܽweUv>9@QTD	Rb@h̩ElQVQH&QPi@HHUU|{O>;~mgk]} EUPкBswxVB)!t@a:Mv9Oɔ@3n*#00!"<iե@޾1LG<ɅJ51%D"@(kέBѹ&>Z.ߔ(NzY'znHMy;s_mBڬR0t}OLGv	4˲ax^2s{cmh}m?kyj3 wQD.ڿ5&m{7iu?﹘/ONLe&F(3gh7'J/>_DWO榘/i%f.нh.9mY6\pnѶIH_wvTy-*Y҂M#埸ۿms׿f_~r܏?l^pJ[o3g\ve]]]sϟy:Bp@)5/_oPeco9юOsg?8y *9'Be,m"5s[_*Pm}7%kѴxݚ>$[Gg4B-΃2 .?( j@p!< 쇙An>	2EP$yh4/7WY?27p)vd0@*,i 
+b;DwHLf|Pi^zIvgt+>G;R@ѩRU$IpVZ9S;1^t2YU- ;*IE=c@<Y~d;6[-)YhKjZ$ۡ51Fth:S&=ѵc]l!]YxФR`NH;_1<zKoAHG+eJ(݂n9 ݀[Bs
+H@az򆱩Mc1JH,Lev*(	9)_гdhZ=KϒHt%fsmDR"mZEE[mQ0iJJqEڔ/:\6P1pJAm^d);Y|8$)=5A7A\ eV˟)Z2W&J1!JZ-1H{[Sqr84pZ.m8lDeF%V|>#^GN+\.B}BBl#*[	DDit]N3yˡgSHZB$QI'iٻ]ҩxN0.()hHgC('%My|Vx1oHKg~rRwL7o.[q1Kv$1q&cTY]mq0\aۯNU'dTnIi3NXۍW};!EFlVaz||x)5V+w35v8JN2WSO*q8=6oܒȮu7a6Y*[SqzL5|HJI5ǕQ6oi/l@.;4R<'O(l@rN'c1+87Ci,iۘٞX̜Ng؏$).|u]B3g޽kYbC=?~+#3̳>r?\/|lGy;ӟG?Ѯ]o~7tӒ%K>ύo۶1G[F7^H#YmZFHָ9yceߛ~ 9zQO=IZv'ц5r3?n^մ3<!<iD!Tj24v{U&E3пC2OCkP(GT 8tQv<e @i 4FF%$HRr!_TY bc|3R,k!ג-\%i"*0*aVOt4;hL/e(8`F+SM3x.hC>m^ EˤTA` H*鼪<U~vj=\Ʈ,A79t6^zBZ4Sb
+G.z3??J gd
+AII!l+z`*߿Dc#BmV34]JioA  MTO*u>K,_3 FRz&|TF|Ɔ=ze2U{R>cYzd(ȱ}`[
+RXrRp4Iº]tAeT(^Q꫹bRj"cp !T%:1r$,vNNrJ7e#nMTC~ӷmW/!49rQ5d4d4dŸ|j;wJ(`R왭&4)d>eY\ >#s5:Y~/x}_gfg8w}0]xU6ASB]Ei 	kw;КB~ נox$>@𼥔MsyjLNeb4hbك|w]2`9,tY|i|82ƣ1_QGI6	T8]Y~֝Bpq8sdtJ&Ҝ{TS/t݋.f!FuohE*׵~Q |.=
+Z|ಘ/w&|^oG'@:K~@&^+^|~+9;JO@RY񜗬##Dp6۽dm f3h#9&QFMH(o,W<Ja;ˎ~?nܸSOݳgxT+#'3<sj?ok'&&/_~p}Wux㍳fwh*ڏ7,:6'S9h#?JlҷVt_fhۃme)φ'~=v)}WhN|
+RA|5`;2*@`؈}h&4IzA4$D/bN㇎ٜFc=EkmmjZh^ YG6hmR"-54<Ʌ.%Д)fcᴱEWhŧ'nXړI  JEwhDj՞fDZԠH֖yREԨBE=<C&OLɧ;VЯh6VrJABX
+dUZ&$xP
+<VG	` E_|`{3$
+FGS93g$|Qw/m{Rh.LDB+W^
+!Q,;Q BnRTxd2#Lb3]n;OM
+BӐI>~1|$Ŝ1QIDgD.2(Z",4	h).pbͳFR;jrz,0ޒJ(qXMOJ`Ǎm\BFL_i}3XUY#6k2paJkJAt,5`DJ7HHN:S2	jl-)^|΂&F8˝	FV,tMqI$ ztī:ur3@x#Rs$YzKg 7-ZJL]2O 刅
+;X[z]1νu7p$KXKJe5mi/sV0R|Ҷf|LcQ|z̗gS1ӽvc%UԱ3]I20Qzk=4*I
+t$c>~&1:o5
+$2>=wXGֈ,/KlS'ght*HEAL6-K,5\}kW*f:@CIZ`'YoĻe>ׯϯl6A<2ƍ]͛?Or)7x㟣ٓ|uw%l_ߖշ$/k>IIONTom&9s "Z<]%k;;lc[	YvQNB]؍<E):К@IP4B4[
+Ri
+}h°H#	'd' w!Q*|'#tJIyB.6}uJHqL>blлb0"
+ՈI2&|:Ԟܽ[ZF*QG m$`r%Z]m'ku$MAyscW'<#&Wz"d!3QHP1膖?'(p ULzE2 LBpJz5nLdQU&פv"f%ŋS<M}s	ѫCվgA)!
+HEL"_״4IK~piGG'~^6])C*[A&zM	p|S8tcY,&gڤDY2D6o=(;hG #Α%%:_AK:qX=#vHȾcCmerbt5I,0Q0`P?'%'ߙ(hI:
+Asω&`ܻ>xiq>{G^=h4)0C(z2/W; ak]c$	J|Ǿ˲F*/9֯-k?G0虏Y76l(G _[}qaCIBԆ"	"	Q||e>ypXvLKr/P13jQ>n|9m˜'z2lq3|?_7C    IDAToR@Mֹziʗ\(t|gބ/r׼/ctAC۟w?|9ͦT/ܯ	k/G	'7妲7ʘW)e)\tw?6:vbf"\ipβ}K#@ьHUf&RJd۫3|vzx<D&J(%cK(f[lr6ܺ΢Ӊ,&qh-E0^% \e)Oeu޽{͛_wu:҂x'|n+FzwUW|͜s ]y]w8y:?9q:Y=ܢOڐnhUgi֛Tʗbg(N+e(|}dlcRVe{umQL D-+]PY	 APByY:"bLG1=e񹆶CʜT.\m}gzY9Vl B9*A06[p7[ɶFD\؇Kr 9N% ;šT#[/j2A@+[x=eߖ)|79jBAk-*V /H,U	BCfIDF7]N	yFa"a&b  FAH$BYDݙs|Rp4:nO%Jm%M	Kh#kc3"FjANӥJe8ƆՌxG*T)k,vKynB TSmKzU .Z[ty=xr@<1єX5\3"&v|
+,G9Fa4Uq7+ED@+jD<@OJdc7SzjI'Uc|rUU@aȊRzy]nKN6@8w˪eM9s?[,gFo`$aH6՝d:38ܠ	_26jY;hEWi4B>},S ᵨ 4&a:04A⿑4 8BC=24pхĬ+3	DwXcj\2WCv>W''r$*/HѷbMǢ7glJEo޾M)=LO;?n)MH<k>&kmgrF;7ڎ$]gNj^]Wo}1.mwq #1/g>''rm^!wMZO-m.՝M1_Nv2ِՂ1sY*OWh$$PC/x|!/Yp)y8\kG[|EpZE*fxQMQe-FNGa/J{j׼F_y_\|??k̙7pg}g?+iڗx`˖-#cǿed5|W,Ymo^Uv38P?Ώ*GcQu{]銚RR4S,a+Pؑ+]a!
+L?d`[S:t;Кđ4'(@mIܽ0]H<L\eSvk^p{ͯRNŜzt~wڏ=Չ;$"__CV I3ť+mOUc&;7PKCaSwgv76>Jiy\rd@=u%)8
+=Aeɢ1!(cdAyg// WOGzNSCUIИVO	HW[G6dl	n v$C-3kbYIݦ#HbV:Ǿ7,p^?Srnl2:պ"LO[k:b@q83vm%9B|x4QOg[N7ᑸ+Pu$&)RXU<`;nH5|/9/FDU;I9Ujx3#Q4U<Qq!y_U(tOjLsI)BL
+}Xu[ HTu]j5!v_t3#5f~8Ũ|D֤hj8O6j{/zE4QO֨=czb{zpe$z3ھsRkQ|%^;ꓨ5ti˒ðp <@4 APT)0\'eG%s2j	RJ3];20%FҦ0IN e{tqh{lV#>=eJg$(ZԣmmU'bKUwvW69V|@gѻ)(]ehM L5w6 L`[.iPZh5PѶdC_Ro,sJ|ߎ{e$hkq`n<Nl(e?YFr&X#DCѧ@-,@N%]ư/zmZDE=Od+:IIR66ߡ2^zO?]T?/}Ko_emٲeҥGk֬җ`֭vZw;$VH,ZoB8@it,jg?.SV?cߥ߱6O$ct$sΏ(ZgGOjAΟ5$IOoo(OSd
+hM"MP_�X53P J*Eנ?
+s<3MGR$d1O@ɚ%$1^o%JbUa#CNu`D<C/Rkuߖ}~xMԻh1IM>,)Lgc\nQl͸x5P1#LKL5R%8fv!^АR?g*VQXB/F>q@\WjJ,BET@KBBHDM)0GNDg\m49ekẇ'_J4,~F[MB	|PFh MyXLCӅM)+$$!!O;'X&SYftAh}^s]1YҢDwk8O,U.d]CmY>>&?H,wɼѐC)UD]`/bW|Ֆp2+2Y̪4%_S{9)PI%Ĵzj919}+`E2~ G%$bC\ B6}׍꙾x_ښiiT~T~4!R)y7W>pWRر/oU֔:Y}3
+|',	fU4kp2;Jc\̒yta$0U zqKMhW[՜
+fV	X߹kbhIzl%'je)+\	\Btiċϱ͔zRge1_bk;RPgcPEg{̹
+z3`ߢC16U9v|%a*z8+AJVv1_cIPRe)	٩fVI
+ƳBrƓj<W+H=]y}W+]ʳqJ?&%y(h
+ŕgTLYp~Mo/R4::tR!ĦM>#)8RL}Co֭[zW_}W{챧zğ)#|ANʲZ:m|Pu' Pr^|5^)?>|m=&+&kwsY0klƆ\i]bGn(^iBJT3%d*5螭tBG?``lҴvYɩ2!;-#)RN5EѤg@Uz[3dnShaq̑%y,'G~{?ϰN9:-;saLn˭R%#%1~0BcAlue6骪	ذ;RmQiKz.Kdu=\a{T96v3 yOCm9~,s]:)k"{d@AMID5{XN)1P}B)Dl`#dO)ed[ˆuN)	_\om}Wg4v.K޾MLaSV M됓'tmR|@\]//d-k)	]}sF6ز&dw7G@w]D],A{	D\W)!Z9=A^< ̐`ԡv
+f{"Yؒ.~8"uI!O^ʐrQˡu1'dZL :lÞr{7INV;
+d^YQ`04X65[8YvzyI+iNے},t/3g:OW9UD$'˥{-Do`r|Ña@r&fv^* j!Q4gtG$!U#6^Dج_X&52ȐaJd`Or QZ]*O
+B`ѠSK֓c %/YUѷe2FF+Re\}<4cX3Y%/>-uvoqc>>h9Za@DI
+c:/9/JN(=B޼hߒ3$2١OZ|YMĢvZ<%ѐl->@zh*: !_(5 4h%ɚV:#/V27m:$X\k~P)ϟN;+Fvy WyVtߟׯ?O|_ nݺ#۷oCO1}䟾?=)}K"lo*rS9(]&atvƳI2Ώ[e4v$byd[ѝ+%3
+N"6x
+ARh:Giv+$`GQ\q	iڟu}qgɩyT&JGl6T2+IAZUsG9|\`ǁ"8ANɻ}Z:I	CƥgMI@=[j,j}92;9,"R49<_jWm:a@zǒ #;CȕkYz@UtftYKUrC@*(E}(DeX-q2ZS(Xֺ+NW1ZɹyS1˵~%e9=M:(\M۟+	D HMazBֺ2M5PZ(92n*H3<ѯ	$5)|)(hCVզ^aE[8vEĩvwi<`w^A.l4KdEO5y jdEKJPm׋du)92;QE
+wMlzEM!3~=\8r0(-c5T$ǴԎ%%/['PW;;1k['Ȯ5ㅷ6ijo~z7	_	%
+ZɾYb1#F|P|݋.*>_OgG3<C03RH	 4vVՉk @{56)\96?dRhnDo_-d5WAN~[*MWB(P%
+6MNF)9m̠Ptؿ
+He= \2}@7G(ٿuíK|̗E||%ElM/-;7vn'K)Xv1ǲeߖ	n|>jYqwe~`<L
+6JXDɪ>D:ld#щ֌dDtZ"1ܙȎP(D(-Xcg3"ar+Let6lشi7|]O?'Lk}Y)v,ݩE-]D;b J$REccJ[6uAt[SվLv;;?SE&sR:_Gn	Lt's 8 B~T;MۣQ~JFxeg5P^7V{8,
+%Jd%Cjj{[ʐ9vGqh1H.g0֠WʊFkl-l9Ӽ{֍0'KNjhp<O.a#LȒږ'K396ȱ%Cj@,ҭ =F_[rSvz&otd<1j R>ma_C8R2DcUb*_܎B{	I3vF\vsU.B[BtRZZFmI)\.!aXZS1;~d^όz	_(Tֶs3ƳRƃEXfR&W!kjTyP]G\a[XɈ`Tdu
+/tKmC[WdѤ$UD!q:T"k#%*f@6HAfMm!o1D@j8'Gj"}c>_0C';AM1iW-	:t`G7K\hdfLVlvz骲ӼJ.=)wd[,\XU)(Y+M\me<pKHClkK%DA)󦱥}:ܨ;V6,Ԓmm*>2Ԩa
+CG^"a0dްB/\֚L~'RM-T[.-`$lE[g
+V* ]9,)cPI(f;jW.isajO]eGw|p eZޯZ-YY4ROﱍg4F6/z'L$s:*#! mmo5^KzAȜd`$JU֢̹s_3<4ө^֔F
+<Ǧ2HXVOT&F|`WX#aP=Ijznqev};0?Sg,l6iXV]=V0;zg<X%;5ug־^r-sjU4 TY*3fsR#~U1Yзr>/~{tWIzilNř,pևj'7Y.D1jE)q$I:I.Mz:iL@H siFI9C'CVfMm$ҨV/˧dLzIZ`L	8]8Hp^r#Է>o3,	n#EjIPվl~&SayDLalWZxu-Cf0BQq0)9TE`tZ=cjKWۤs&[<*ZMSbګEV3HWΕHB_a%u?96$wݭ}{JiztOT²etR^\}|Be[oEr
+U3	.fw[439F[bXAyEbYk,8_9s/^4KnU{]Py015T +mFx7YHa<&Э,2kUy"@$$hyj/SDjLёc&oG됺Ij&'ͦymFA:xDy}ofh(+/ϱ	dX<ǦMAB8 xrNt$$L6x֏"\?!    IDATL'N(4^<-SktvPO`z Gn 74]DHk>b/Jk2 VePq;ɱ:i78_Fے߻ksM'E¦-v해;UV5RiQ./jD'jܼ@39>3utGc>?klFBQKn?9M=X_vHS%㕂u{3Ya>U~>LNlg|M`%z{|Ҧ`>ZIJ/Z*MwSY*RBDF-/zZ.끉2ԓ(UӲTK/i}Hw6NgR,EŻb\|5_JX-9b@\C$;s[{ނ8޸qG>>{/;'mk{ĂɆB~lMfrTʶ1?Zc~t~gv I!y >ѵC~t!%a1ǍtJU lck/dfNez'HA4-BT7W:w1)0]~_/f'g)8~rZWZ!fet.fKd@JSb$Gfe`yU]ι>}tR @H$L؀6k^ . #@FQ@	%sV>Ory5Uٯ=[6fs5ZL0&#gqnLLf؅!ztX!,p<k\.c`}t܃ci\Wd[ ;sF>;vPfh@	trx"yW. @'fn@@`\ni1YY$MڗccmY} 8ޔYbWH+Br]ڋnEJS{hhO p-Yv'[5fk<LNNLz[wA#/ZX%,
+]e+0 j13l8"àHUgd޸>U8z]x XT	e,n>nidb%*<6{t<nQ	^R)\ñ|		Ӈ.L46Cs\J3%n ޠVM6)'}f tՉ2tdjG\Spя.qli!rm6WfKՙTொmݖQȓ%f4 k`@+$ɠHv"BNSGSC蘏:r/6՜CV$!,X@zpԅ vBAG$bdxԗ%N=:]\zhGхHFrxRJ[$H;ڡ^CVE=CFbC	 *Q񒟜ՋfB:dPT/>WbR]{ɩ؊"Yn'192QwY k>6f?F$9 j*#U9V@rRJ̴(3vńLzlw\Wyb!ޔyP.Ӽ֑i]m1>hsO׎Ҽ
+@MpWt_wygl6{ewy_K:Y"J9PlL԰grC3RbARO7{Fg=?>?e4A7IURli.:p{")t曆@J)?*7;#~M4aRDBWO*>a{uGU"#T'6kBP".N	~
+X0Ѕxcx}&$3 ŕ	(]evF
+VgqGj1\ޤ=14iMJ)X4 !`M	dСXƋ %zGAJBl`&zRѵ!IT[6鋵
+$1EŘx{r8!=)QE_axqM9ivc\t0BlIv3ƏK0ʺC;@+E`| [.]9	 -1	V_;wgx/7/3aYTm}٩b	ezĆE<uqۣ79c;U(;=:tģ#15S
+ps-43Kt /4}ρ:.Lԟ;,SÍx͔ќzzm/hXxwiDQ&HC PB9_Ydu-VTt55*&b?Kkͯq475]?v"|vZDIIR?$b)
+c4`I*a|P8_X5VDL-4,`Ml"׃#*z+A ҬgWY9YGj(:FRY
+px/R ,1y;b=-k<ؤ ,PyJcT0ieIZ]͏zb"t@RwC'2lOv,;cYJ&ay6eAjFiO;y&6ۢH֧x]Oi1`=% +3)Frfb㿸C#Sz/zom\ VY'
+U`rL㳺a	Rz)~ lukc4$䊣3vɱ34co^P67>_|k3i>뺻8ӨCroe8ZVND]_Ҫ+Axy^Dzy`v_{d>ۏv"
+Uqf>ҸRAROZc`_SLs4%jtaPB`:C!,(sx#xEK,L$HF]
+zwhws8%	t"20SJAL&Kto^UwxtF	!yi.{43M0PE"V|Gm޼Ԥ{RG݇woY:XEr$"9F`1~	nz]iʹх|D&/Y^rz?+
+#׼2s{9ߦss15_rB%S ȘlNR</N{?vT/w=照>ĭ癖=c.' 9Ʈ
+hIЌѱ6NBhIcjH7K0KP@ xZ	O7lÐ0FjNië%v^m@OHD/Sw{03®n?{4m"s5֛5
+͗z2h8ƪ5s*(T >\L	ǺkðZ6_^?4wH4)Ӵyͅnn7	9YS2H??'2KzNuCU)ZX(lDG
+x:ؠ	({td~0~֧FGBuU,Oy
+dU@t1sĠ|W@QCCO3LjX r|Q7rJB9MVգ*uZEn+@P%D<b[pŽ"9bj|Ic!X؋Ą"㭳PE`ZݎόI+*UK9 R#:	U8ǫadâ!@#,,OMt5kZtv ,LTk%⿑F{>`6ݱcǎ;>NYU~rr9@Vƃ醻?(gSۏ@KhkSvXQ6H\?tt&g-C=뗫Ah|Q!zGar7mG3kV_bPRZ盞w%3CPJ/~UygmC+Tiy4 )J7X}w 0$}ɊZ7n9ZZ
+YPClÈC t"u`wP}e ?>|Z9)pqHB8VP!ۇi	k;Yj᠉&=o
+r	y̇
+^Rmz]kBEAD0	vc	`DG:N .k iF뭸.+u4li|^3\ԋTd-)r,HLi\Aa%Y;ÈlB3Y(>6Ijͺ##L}Ֆ;H6rl39 h)1̷$Qmn'p<&^N
+EyO=W/'Jmt#cjrpPYܜcxev|s@5Ӌt7 0~2K?Q3MUuzr<Vst[Nwa@ͩuȺ0֧489v=:zU5a X#*ƾ)=9\aa0U2DN"'RaIv",	׼ֺf"W/j?G"ײ+f?NDڷp>7@8>1_:R)\랓\KQ  dh{*EQ|R|,WDbixI,vt~Z?4qd)n&miD BCxE1V50ՕyA$Gs,rtd)T)Qśb9cl=ԏ̙!C?L=Y&ab2/RVƼ_gXKNjuCCIT,VM/"=VP)l|դ9Fؐ_ uwV"! "5^d'FZxÛ~?fa'˵x$&"NZ?nr¯0~CK#K/tr?ÇɟM78]?>ηDQs~ 䨢̪Y?rnr,'iVK _bmߗu];*UElOXB2PfX6{nBwj>'X:a4R86? LI	QtZwEEbrnr
+c(B9II<Vn oI(EBOGV{T^'.ԲA$wUt0۴φ!|1MGڴ;M(IuFT%	#yܱLK@`:Ih43 Շ1Tw]A}?1]cD9 (;mf.$|3/OcVR:VYЕłR,W"()/:5&?OaIe"+pc<)X/]ay/9c(Uq3K=Ev )mޗK/	SKzVB8W./i.czIvg+"q@cjѫ+ F sCm:*!h[O5Q<e~fx2Jԃ[&JxV]F^`ZA>L0y	`QqE8pFJ/	OVt'J h2s:k*s7B6˥>Jvhl ,]o)r;?8k֝$)1vH^ u~"h߿^ӎ1}RExA`har]\(pGc2Trb"&ޥ(¸Ι+MzIteuu:j>pžB	jlg3ۺIxh*aoV_ʚՎHA`s	6Dbz#<PH%Ee-ɛk P4L4Pd;9̇,Lx'֕4a&$|0Ev=:3TN*5!mY&v,op$SLC\|ZPsQFBXӏte>>-)!U(Ot/:+k~C2;v48011Ϧ6ooF"55lk5IX*(^@"W2mwƏyT%xAq/"q|@w{h'KIunMZ)4~L!|"rN.s =/X'#zEAI`ƣA|?ȵʌhF:.c&+aS&"i@vp$;G,80EqO9*Z.^T{5Hua$u.^ů_WAACVaԔe@KH2rf6~	a-#xa1R[ [+xa@ %8/kЏCX<]U=FOa-y*ھd Lʷ>bޟ(m^Ob}$^͘?o@P*تHGbU9]sRsUC䤔.VM	 3Irgrf0i#>̦`ա J)14
+t<C,t܃M-:Dgjr4%!4:@%X>eΒa4$:d:;lO>h+tND}8 }KKxݺ}F/'oF`lz#tHG fZ]a'0q-&2s#[p[ΪoGQr17u_j4_(cVDI QcfȸX|1 bYNFp<f\{2R?vpBP{tJ	y1Fو:*ǆ	ȣN8ܳ+q_x\3Gwkh1j"ޑˈHZCTV:mY=eWbxixPrA謮ȎUYcOd|&PAmY$>+T#1{HĆbR=YQgTJzHet2ʽC)Dc$d(;g8)b
+b	2ےRp~Sߐ?:zryg{)
+^+9Ư8z!Fؑuh#1%'Kark>3VO?"2HlA]nĨ! j8~!r>Tt6wƧ	tĶdTLIUi_MxmyC]CR1Sߦ(&'d_ F^`>SXa?[h()aZuzŷ \X,G.gKb6VxYh5({{uxBUl,p>pFOF`.ঘ	߰aBJ^R+$x ʁxS-zen]iXO~{A=i`@HyEvQ;QNTFWN-	43ڔ 4s B˘"ҚqLֶC;ȱ#(ی0gr="s䴌/Dr+[&qP4*m8-e 0mu~ vpbQFX*Mk+4wi@¥٧:taBZC{];.g7 PDJGW+٩)60ί;d^
+^?(eqzI `}ߤWҰaJNOdpÔN j>hY=ak,)̞TJNYA-|r;LU^#?"EL~?>/^    IDATwY͝*_YƳ"ڔܡT|4$rEDԵ#Buë.5~\I^te?98e>Ћ.6X k,>IKpI'p[^SU&0492lH fTkcF01 ]+.~eOwad>=ohjG3$0BEF`O''Ɓ1Xfr31AV[ؓei&kN	8(MkM_em5Ym;ڛcg-$+,y1	TF_%I ޖ 5%tբ/𱸛[w.􃿶~C7Gpvn뮏7xoFbk'WM~Hŧhl_ȉP%>GorU(6v~tQ7xPz/ZG)Q|zյCiۙ7ڭRkitT 泟]J9_]qj#Dr\|ܨy?9ON7r0Z7$Ƞ&	-:YuBmM!T-)6+MU[V[[3+ceCNCkPXZtpJX/!V?`QGGf`>+	vӿ^ۃi\1JzKK}t,dqk79RAA:-Sq pTUYM8)ґB-	"$186$k,慪P0^$#pVԉ./ˉ\!)gyA?5԰1`J2$BPRr#"TyC:@:[Dj++|t΁	JêqwhaA=L>oы]zzpduǧM !rFB'+}:b~A39 Ā@`j-u^f|pI=?WhE/*;z$Њޤ;I^Ff'c|A^'8Q	ړܳ,1-0lcbjn^ V u;&]}Pj=ZB>6jyt{FCǰUo,UGgֻ(g?`_AtPʔ0;MmO, @&?Y2 bA+cȜ*S`#
+$^fv x>m@yP~߆-.T1-(U̩uGkܧ6wG&p $V1 hu|6 ` b jdByri.L[M#`yq#zR֘1И,O2*F$b˱},k"x}>Z(jIE>--/ff1W9,1JHYؕY(j|#Jto0Voy^7dDL7yml$oqJO~_Sk?dWwޟ:ګ;JeڷD*?`ߖv~>s~1~,:/?Mw}ivZ]̧Xh%T|_Q2\bCʺ3~a.,?eV])TNLOD'^|aƼW|'ftnɾGAE^9@O.۪Yy1C@VWOp{@5Kt@Q/xi9lʬ)N1W* R6fc2>}4*Y1x.=AIsbD:S|:6.hޣ>^>ޣ9^^Oz2Ԥ2;sI=Ǔ%-ྭ5 `oTfjNXeKmFb90TdDx|1ٓ$)ñojot]YE漣IMN]NUh&	䊜lp:Ghgh	2u4A]%>վ<.L'ޡ誎9*x~Y]ʸsDO͛R4ՔxI\bPfuBwl|&ɘF7h"d	w}jTՓ jwuhOX
+VG}aVQ3% C6
+$S 2,-ZߓiktPV[YDV'XpV[ord8)/zzaj\P]}5JF|@QK59nhoDD0l+Jwn>(Yz_ȚOw3M^$=ybͰ%*~Q>6@wPVD~Fax\>XX'=Sa]#)E__]UѸQD4<؆@K0SCZK:SӼ"0_j''SKZV崾ڵdW|)Q03! GWh*kcEu}9 ҲXYoZNN'Sy}ZZՄjR5ޑRkGddX0 Pb0&|f1	Coާ~/oH__绱Ç`͚5ThEgr4ǞF=D?'Xھ^|g{m]$'R_n]RR3lÜ/6͇*_,IxkSupŅq|2f  .k"|X7v{~tI.WwLR>1?tha1l[֩8l4%:bt4G	acKS2Y62:4+!$H289~2cR2,OD ˗h%U@ =h;SPG$jh踘+qWؖ:C'f~D<#Tr pSQFk#ЮC{w8Ҧ6jxWF$ *LF7f%-dDFDLTdDiĹHJ/x&-c<U,O)Z%^E_>"lfrKY:ʘxD" "$۠W}U# b^`8[A4ה.
+Gs섶Z֌xSrB~U^f'ˈdfrw7k``4ЬC}8*'zE<#fw5e##t3xB
+WΪ}kk&.T
+@
+{t,oQ27b~('L~lqq_g>Չ>p+J'rhpe:*xc :6^tB1Q*O,8-fY;zu/ən=Zg]D=ܽBR&j B
+ԃ6/п00k iX";UE8`-GW9Z$E2$Pɠ!Y_z	PR8㖆BWf1m]B8b=3O
+[;x;D뉾8I~8.2GfCYbz=96 5|GUAsZC(Gƴ	aBB*poD|@0VṆ,tFdM]"W:44*eN$Ai7ni^J;QoO4?TqM6
+[ܾc?gs/4a;z$@Ezes
+U	Z"kc$bS:QE0>ur$OP(x"^=Kr&=P e|X\y!Gd;t!7|,6f_Z"krb/zb b"T)"[xģ"[ݣk[2lħ	&V$YEԎ]]jTCMh'/ys a]r`!%#  !,ـ=8*rqTppȁ	y#x }X `MzF~\\u|0CƀJ`,jnLT2ltt Y 		ű(bYdAei$?1L G[Ɇ|u9BryV|z^c?^XOS_)YpюO)FԴ -"!jvmt9i\{\>C8ā3C~(S6z۠ YPEv1WfjF$$UY3! أfmި%pv帶2ˆ,fQӏG5H)\3ήf
+
+y!xO3}:S#m<Ei\_"M{4J;)˄kyNӱT:kH|/&Rek|^~1\$ۤ|jx$U9я.bsuoʺcwëm~Nkݯr9:X÷sUd.P"4PkƜ|CQwZ8ԥj8<-ToÍRy< ?6UtLehS8/#j/=eWf+tR2#5XBN@f󥣽2\P0&Ŋhp"M({2u"s1LdV2NɪlD(ZH@J?RԴc"#P6GѕzsPfyB-Ǹͫ*.'jб`$}tL|Q$,oD
+ j"%s̀yRC@G1~EJ!e?R+_w72n.8QB{bT%DZwܯ%b},'A/ۄDm>Xa0ǧ8L۷Zql,$ʄ)Mٿ:Z}c8Dlsm!p\z(_Irbljeӏ/o7XƫCʱP%dEpU	sb)%+uuX`m:U40;^q¼:0ayut,-.1tf}I= 09BGJشI 1qmc@Б$"hepu *Wj[s,@ K
+-ګc)I*6ee9,!^_Pu#1TւB5@i^)枎&(jHMf(+:m/כ̏Ħf|JZ*#鳾*x?&)eE	 uZNC8".͹8aVpqFOeoKKxsak^Edbn^J,˖43&=|Ƅ|L7/:ZP0t38Dfj
+~Kϱ]:M[["&)P7Yi3t' `U@
+	ذQ}3>+H4b%չ?7R@f7ji6Ýw8:lXw+U H/>`˽d[J#ZD?@j'><KQZx{߆bM޺+b%kcqXg%:̦jA` Pp}p\aҢbk`p0(#`Oa1'%#tO
+ReƒDN JlKO%!-%KB0Ht&e]<fbB4#Q1Mo,h׫8^k7<yomikAHB`$v38q0vbVx;b0 26ښyxVsGUǆޛz~zCQNլ\dW$
+c\5gJyc;-;._d-#   b2!ʙ\tHC%롿eW1h'tpe3$%g'Tۏ}?op?H|Qݏ_Qmh]uAt)Cz0I$嚔91]W^)k_+֑.kS}S+HR=IX?W8vzz+!X:1)׉K]|b/w䅲s!6S{ Rs GfrihM0-t(fbB`a\U%Bϻ.Jb`ĝPx 	٧Q$lzq"i*RY1e=LlKr087P3u,whAQ1]aCt-|)!?_c^ه?Sk=ΡaÇCzUÛ#H;|}<QY:5],/_0P06zqW=0MD2xvNyo>nSߌ>5@v9:45MfʖD';!rF7. Lxеm3ĈO03K0IZȎP+Sx? {280 JO Χd㢜,1զJ6"ިΣ	<| ˻v?^ь`Us~w_
+xЁr0a^CP p*@
+4,X6|+)\G7dkOr{.䵛4ڥQJE KYsAfv =u}AZj0;{Rruuybv_|Re.W5W^.&ǈUjL_Re5i2 P @O ݇D:M1 H6odW,_ހ/p20 <bBTGE\"&})ٴ+=7 fT$7&=C8~阒ԆXTUQ/ !H#h	gG&op"qEҦvYA]qB @Ʋ\D CTChӱ[ PR\.K
+(X֤!v3l߇XZa~d1RH̤h׼'s}S~ЌVrgNq 5 P~{`Kgr}}0^I	 %@\\`T%ۓ_1w;8y'J|y19fϏ">  Ljgk|pbN)Xyg&r;.GGpށ`NrT9gz>J|I`$vN'+33SJZH1bLiEaG lPj 	KLΔ|$`5Aޥ'wdQ" O$~<aB
+!,t5:u2B |\:_?UAdY"@d V eǮ*]f/X)%f,3n~BSI!2/x1x|£k/(|ZFHpBWAP0X.ȗHXQKA0МPG@.`Ms\Ʃ"6-PJ	2
+2TQc wmaa S
+	쐻"ٱ+.o+¶=bÅJsh̫ X«}ã pǆvBNiIG3ũ-kN3~j_<&v~IK+#fu*K]cz0{K>hEЎSU2 }}\SmBTgpsr2@uE0|YuD%kC\)WCo+xB_/.{7Wō	^y狢lǼyL6L(ݲ öt옂uPPh^	c'
+!բ\ϤPƺɹӑ"N bEiɌ
+zfAE]}(a(4N~C
+M="    IDATC+s]ődldkjY\cHNXreng3}7ZZ9b{ȑo\!ZQ'{BB6G-W٫+CS_׌7-s>P!oY~55s{xQSM{B?SƯ s4L)E7pm'k-W9r`h5Uw,3ԋ=zSfO00f8*^*^:]Yܮ)%;=-DRni+я d;#lAH0PPxe|97eGD4(܂k_S1f^58BYf87{T50/w&- zԞp*iB@DC<a5;)iBv`PEhblkJεZ. Qu
+4Tg3RTT	)@ s	9uqd&-~0=rnT?B2<,άx}\/!pПUCbY6bI ||OD+@̒<aOlW'4R 5KxMʴcp o>$ȋx@,qzħ-.?,ށ "x5fS)RkhJjPpTu7T06{]٫6D䚇bb-C}=ӬθJ7}({;{1D=dߩi'ZչwEgbvE|9ʩn8hX[Ե;̮+PUt/ ,ox |ׅHw/W~ zbNܷMk0`yqzF>k)OyI5ĭ`-M%Vx۶SnF]|E&r^ud\ֆ4 n"NHU'឵\L)lNU4Bz"5=QŜpU2YIBsŰtuU҈ P1sU}ι粤&
+mN|ߤ_~׻,_|'Ovl8}(y_/wDR}߫
+B=8'?Uzw{pS*շ PJ!RRӑ-Gq4<j/9Ó#[~0{=04~NSZ[J׊ ޽nv/5`梜Ss
+
+FA<ogbDEP	Ώ(PT؆7RUhD' 2SY")9S3 ,dE$,ŜMSֶ
+`*9O)!ֲ	Je_oyFo0%ጚH0fCQWG6!u3R5*t96-7ќcwu3 $%6Υ^: qзe]lE9yWW гg}^PE 4	?8o.? 4xW<s}6=Z»
+"Tń)9GMh\S.' Uͽ092^ò"nQhC;tV-{ďI
+eD`J8u{Rؑ f	Wkxx \?<YO$=VⰃbZ	B,i*b*TuŠ{@꼦}Ĳ犝Shhz'~f#x]bSɇERl[.r.|?iuQctwӷeh?{RJ
+'mgvbzb XQ-GJd^7΋;g2]w_@*,5ws:@p>Ջ_'7o'.Пᤂ	`:}-zϧH r^Nk!$WDshB=_V+ۚy-)og!N>;0$4!,!w;Fe64&p  ΂wo9!gsKd Y j9ζ.췓o驁i,E 5b1ݵl[Ao8 $f%}aZwyͲGFkXߠr$ѯݩA6FΓz~s#|y뉚:57)U~;R`?y'pARd/7?;ސ[nO~Eηj<3uOrDּ|X&q1T{6>0:[zoEu2!h% FF=h 0R͂k;)eU8fTDQh1(KL'@ UԊzL܄p׎łYSr̆=x<9톜ݲJb*6"P9$ W&| 9xCS2q@[E!>/Lpg	,7"aBd.Nٜ"JyI!evqd}O");"Mgm;늍-E߲Z3! Ķ[\
+qa5T]hF8ca2gn|g|_wοݱgl$E` 3 /d pE߲)ύ&6"Tu3vC>`qD5طܡ޵DY;]c7W^ |IIHM^[4ǏI`sx/(٣N:oX7C6
+t`+#FII7l',R*va-yY3GtsXquIJKD_ɋā#DF\G=uWk*o:bp9
+e~B pFSűm$l;!uu
+9ɀ/,;K߁rnIa{_esSx@[ȻX	.õ
+"7g}9*?<#^{ti)aB:&0؄UY(#f h@)yp+_*HqnV KPQȖy߭J7TA.<6e<#UUA!fvuI
+̔_@`*d	jᗜg,V
+Th_el7{>>D?}gگj<_1[dj(r^8r;_PM)ۣ3ZNn'蓮z*7R}Sf-6<T?氡i9ia1ow7# 0 EΓIT[Jm<oڥJݞ+:cs &Ld&#x)S0Su|YE;v(Z̢C۷F
+\7uD*GGfME(ն^.I(VҽsnQ+'v!%oK*rImOԎba4S cGs3lc0pEcC9ãVtxk̻c`9]5<:ͪS ^f(\pjP	$p3Nyw<1ٔ'%QѮ 6zvVdg큙7Z hx'bs`5w+\M(t, B,6 # {>{|~^^7!?59t+p(,-Klt.>}Z̥e(|tYC=
+uQzO55^24R9& P=U;t:Y˹QZ<w@w^ j8x)9f[׺"gjwMGdKsXZV	ˢH֩H*9g4y|5#nOt\e*앃(87ajƅk<?^364{HnvJgXh@TS.J\Xhmg2hIxϧ|*}%||Ł3>YH&r(3h@y/
+pcX͸5-JC߁ O? <'^q\% ` mN2Ԭ.xhJVe}{6[U>j/5ġ1w\%8`dYIj>" 	e \^JIwu58~b
+o)0Jb6ᡏEzuo}	~w'[C * 8/}~#?~g_;Ooz&rRs=D;R/L%5CIr!<	8w1(9OWҷ.qWZv$.zΉIM>W>oL#/Ss B`\
+ cZfo9
+G4-1 P"ihf5,TZ&ce#^	qu\n%9E	3ٴHLWhuM3ΉA~#Ɩvϴ#.̞HN2RΪ$'T<3*APlYDyd!f]"ј6ث*#SxఅW}#=MN
+Zeyd9y</y@*3ɶ8⦇4r7+=lfYUG2[Ÿga٭"2@ϔ.Ck{.T	olWg18#Xy̪Si|A ^5g8ӌ,Ӣ\2YUHəJbi_hÎ+a"1v~A =''DobNs.z}.8䌸 - hDל5̈v:W`cH_z=z|؃Fl'optcW )7TUCJU%W3I~gM9_^NCuEaG_ql$/}_C\,'#i=1jZ:Է(JL$j3D*Y*$=3@S@Bq&@	PUE3&pàY_^?`w7Ho|o_Bu/k~(=vp@s 5ug!r/bG26n/cE {miLlL#;q6b=Z)H[pԆ&uIf4\eOʶo}kBZQ)d,r#έ|rZv쪃!ms ={]mͅ]j-9ᦶ*Yqm;J r9ߧ*kΝ}&ӂ=q;6t92.&m0/.(yw1Ln}5D7OzR\%n\%/{ɻT_vry&p[-Rs<Á:@nw,9/DeXTMOlb6yܗe7]D5q(.VČdA4o:vC32 qǑQ(S堝݇H+=jȴ\ 5bl|LЕ-Pn$u}zQ l<U6,},ں; Df%ZAB&(tO9XCPB0̷9"v i;g{|wݞUsºJ}=Z,KJm]][-VBaxEݤ	Fj 4˄-x4EfcDv}|CSh.V6&1Z/i5e#3c
+_,dt `[so@=	)9
+|b 	s*X -b`S	~AbWKj%
+Q o^,挓'PZąd\pBv9E8xӻ7/>táMNU&GC(5gZ`q "wtm];c[Oe 32"5,w *(6t;5MkhzO݋6U$_)17w;7r75Gʿ 0Ci]bd4Zmsu֜ص!yӂJe|iA%<V^R{}
+
+`aBO_p@owo^OOx}+	tɌw|׋] <''DeD9DB0v]a	]e1n1wۦhXj6l 	[ŞIϛ'fC$ݦ{*aMOybaFYa.ꍄ	M`D	jS.|S],/|]Zӻe尝|![Ƀso?t(_|~~o~DdoK3)./!f"/@d{x0_XeG5t\ѭhf?q0U7Mg<u.Pg}+~owDƢߙ=pnj5rsU}
+ қN?0H|;s[0qc; 	2`C[.IsBcOx堼O v*pc[agd]]QYƚ|OĮeW^Ng4;05'9Uk '޹%DQn'w&j}0A~c4$@]vs7RPr:yPM/$CwQGWRs.RET4V>Uص&,i򢶎Pu Umq-[.	-d@Hsi,3jb⌓ 6S:XCh#\O w6]h\2\`_M]&Q؁2.jNC,_dmzSXa}v5EYA4݋TښJ}!]yI/Bo,6˘g>/cO8
+|1ʨp<(oHK|oe 3݇^,?yt?R!p` ܞќXW%ԝN,eċn60 ذ^].C /]5Iθr_loIc}#&=ى큂Z\yn9^9qFg@ r;)I٤&$ݖVEY,Jwۜ_wqṶc%8f`'|i/dÜWD\(%?8>|yNBX73 ]x| lAA/ᶆqb(-àWw颏uVv,g>T!`}_LtQ")O<KÚ3S0/b90 m
+e!Dm>	r1rYBBcǾ,Ƣ( жDϰSm*ޥ}aGG5?O|k_ڏ@̑UA]Rb]lo%P*x_@5:BvzO70-$eU~QF2}ll )-v{}Jn#XyrPP14wvRr͕bs|.ѷ	1JћrswbåNo ِPtѬQ
+.h R=9SBԐAU1˚syehvM+jhg
+I;1{%.R0T6qInP_Q3rwo9MRٹ("MǷ-pDҔQ`Eё p޲[	lW2̹ìj[1]Ixϧ41\7oQb2-qG7rp @^1`3))9UC[U(4D(OZX#;&y2NC8[	ˎY
+    IDATx8,bNưb!J]ğXoYώ@e VR	(( =#ntd8w1rmib *|6A(ROeyEGfyhPnG3
+Bmٯ_v"j(
+V-	:hg,'z_mkӾ)MH8Pl-U(LkQp_{:GJ(ݩGHpJ][fs/INfn(Wh7!D6t0WoeG<1Jѷz+yCA]Z!15(1roxԙlN)e4I5>L3$-0X}Eo"s`L1;5V;PB_w!CUe
+vf/8PC>p
+\?!!d_fMg_%Q!	AB B=˿o3PO}فb
+jwb߄חԑ3K1X k1  6=;6ʺYr{6WUܪfצ8d>~I_
+^^SX<ڵP*a.O))AP	ayZa6FQ Gd<mK^STJSw8*wHCD'B{}oƥ%v}u:K 0wJ= 2}~<[p1I6ѷT;[%ӷJqv7bB ^$s:]jfV{{V^U<4BZS#h8󚃮 NH@ ! J@NkMYix}53Z*{bm_rNF//Q`6GEm.O//~N8Įy}l7pK''U=p45| 0<0=|vk!.#`]]x ̋{x,Yg<єM-"GAQ̃ZES^݄<')MU*1
+D^35LDsǅƼ'!Y|h VqOv;;mX|_:Wj#Mx4)CE] +pZkݫ|ֵ@t@/s"Ω6^A@Ojuu|1ڙHmEO&q)9(pNhPEw
+
+MSgxW1l4ű-Y-ITnQm"@ 0-ͪ m]ΚKBZzdC녔ecfjy_NvZr0{ZfʩTp^F]Ύv@];9htԒNV16=7Yq4A`̐OX	_ߟE:߃7[ط̿_C2M`#}`9	ސO#&|xxbZܝ6JL7M:21 ^6FzL6QYy-nLClzX0ؘ\,ɣԫr6uqHd_ ,Y J,tYTͫ&f b@B@ :ќӝVU54`U~~yF>?b࿕ȭt*ApM~c?9&p"pg#/k# d8S]XߪZ
+DeczF)zw+ɋjhevɠ+ypuQTr)A <WEj ,Xk!NQ3h@	&vPu1QQDŹ͏+	9X:CEKvf_5kf//GjKIbEX>KK(q=ͼ8YbwA*)q+ \ u,}fBW0CFiqy(^jZ-$()@W7.GrOv*9hQHerT~U:<O+ڌ;/Gk7ud+b	"8! Y׋d0U5 `'AU3^e Xdi)8"(xva3_ y'{,DSu㌚o*&Nr%JϙŜ2R(+;5Yl!'k0z#yP)lGDlg[DBN)=c2UY0;r`dYXŌ|X8l*4cn~C"i%Wu&9'w̛sf͓JҌ$$$lѸi66nm61Ə~`llAB@h $T2+;ssnxxMķbX+V|f_ε^vCW~vEI(rFg͵t 3e1>]a#*P)\k Ta3X;dWx٤2x0m&Gs^iF!-<Bo}[t_N^Kgo!G+xIwP]:6#PR)a8U<CtGX9ɮzX0t`v	5xpdmL,PJ`EOls	BPZ7J\)P}nBz;'5Hi	>`;X3ޔ+6HCRoHAFce*Yhqx?bHXa~u+7lG;sD2Y l~zt9SJEĤh7xd8eO32y8X/J_\Q|WfGNfMff 2iǂ0?,0dڬqIsJx%"n*Z)Ȇq(`1G  B+'!Nk&=-)kƒ8bI7Kthl'?+jSJ+S5S4bror~4Io`8[-v:'K<Z'jf{*<d8!&u${p΄*Ӑ'θX_T+j'gvii39ȥ|3<a$:ۡrT$]`Ȁ橍N5U7'P(5d%[c6AlmVn_wlxtC sƴbሂGKx'+x,?+'"k	9@ejKc"0)ֈsP-֯7WopȲqq%|-`&ϮHnYw`A+fg35d	i3 p13O^]ДFBoDm?ԄjL	{C bs%)
+k='&l_VrM8&V>;]# d@%ÁUs9YDh౪T^M4dB5!Lu>c8n=e%du3qN8*u.BN{8	\4M,(bZѓtN񦀖Rؒ0<8S 0nup0i#
+bGt6LX~ 
+e79057qw@gs%(PKtL, *^S1)" Bt Uq>+ΎZ]U*nYFB#aWvYq\14cKz=  vK(T)׻zQtqL<\JYG.gݯL8_O3>iA 5.<hy#zÛDa~av#8
+~gL1Wփ
++*epM~1m07֓@(۞H$"Z<ii(w*CUY&vث$LxǀM@:9Z!	~EK-'l@FS~XUrioʺ`e`WO[g@&d}KJ*3̉HTH:bd>e7U&4yA~[%Q~}&rorwz ӹ 2_t6ra2U-ZP0LZGop6@̡P٤XePd XjKY#u03 ET1r @mmғU	 |XW
+!,HH#ἄ! Vfaa޲Zf$A3wLΔPM9
+yP9'wTDo:|c\[,͇fE<-'0qUUW2]n}vGk4gPD0yZ){t|_9wgtX8 0 pY=qlĳ;4"r	D%.5chrTDWdJPLOCJH3@9b#PNFi:ʆ%yPQEI	GajLG oBZZ_eLd'52C݇gLs`LB	w13iS	u4d66'wdQF&!he҅,0tJ^3":;S؇Ԁ5+muiA`)+8N 6=(HX04=)MiKkSjx81>DYmtmaqQ4кZⲲ^d+J%{"CC׭o#΋6^ ,Qw>y\5㱚Xi?ӎp\Wqۡ<XUif"_!\Wk&}?gEG9[l?W?/A~5KA[o%_;#]2y)PH:yڐR[̸4iG]ٰD@60A,dXMfXܼ>>pe1Acgd#xUlFBG\0%_zd3Ecޟ_2/ &&Svl>0,zd-q~ANߓ)FrO3YP6x3*7m[j8kf:^ 1E%EMr,D2?Ye*NzERD0[6= rv4CTA3eŢ<  |Vђ8S'C:I^lwLĴjBMAtqORhkKc6أBAPˀQm6yh0hd>S(`ʙ.9VX@\d8/X|ADrr]/E/rr"*<Vzc&!+Oad8ŮyX5ѮUg/hrLXEY]9^\es9$=pu`ެ1`)\rh+oB.0ĺѫMꨓ]2]dEuk20h7txĐL[5BU<l:ZJm kW׶U/K^`kRj*Z}uMzzQQ aM=FoÁ.=ra0؆o+Jr&VF
+^Wãmz$pO&T	էU< 
+aYPhO9,;$U<<+X`y0ChcmEi3ٔ!-;괉2PYas~FK@1-vwFE(ӹ6=eEҦ@^q	ZNvGtӉ<^g|>;~vm/y%͇hv_eTqT%q|vY_Vw
+	ֳT| Vuq :u.ߌzѿn7	L=V3Asmjb#(|9*4#c_+ |Y~x`SnNDDnqQND-64Y3#L$f%~9'
+Kk,x/W8u,'B"l2@Lz[}+qb@0v lk}tav+w:T@,pT*YΦԵS¥E/!.٦f	/O`sBۀ"aӃi4|(m9 h:tڥM̠W]`0!͖~	4}9PȠq\SZKAd2t4(&L,2ɏ@Wm
+m,(b[h;hHIi	D7,֔g0j9ȯQ~"`<nOx
+b5U2i ԕ7D05#"'eKZV4{ߌCIUu:Ƨ0 6<®nnoz ΍5LB6=S<-oZB֧&rFy50 @	(
+]i_`ꋅ@kIg,%&I\1Љ*I<!1WTgD˸;z_o sЄ
+h9m%LP)=K;h	/4PBGO,7|-\XO_̠c 
+hFb04=[+tڄtB&T=֦\a`)Gh}I1A}QvtWRh-hlVwjC#)ѐ!4FIaeI~H2*H̦j Cmc)jCEa kG|ܫ!1P@K '+c#~ߕVeI_~׾?#~pjjqnmii\r-*Xn/ߟ5p|q"Q߮'7fjًlh߅r]M*9 sFLq[\(')scgL*;|d[oFklCWfX`C3c1?jPCnVgg s2k]!u[Ĳޢ\j5i)9b 7Yǒh9HM+Wַm~_kǯI􈁃 C/b*lzf&E3t(-avKk5?r+qvg>Z0ƯłWog:ʱ2ݡ"p moqtcܤS/	diq^Cp%
++qIL(P&T{
+l$҉émއS9-!b#gԝrk[?Ԑ*$ l_ *xTS2gD1>%		6=QitN'׍uCjhjYqDJ]pHM X5Rө	"3̯L*]TT/3kĹTWlq$\;Y~c,8baޓ;(ƨ$yc*'ht\LIuC݊`MCoUE$Ԥo=ZO熴ڧ]B80n)2a`ZO%*5ސOzFLt,KJZ2Ko=LbȉHm}d&XJH@Kh@aL0EIOPMtiaH+S(EY.L10=uPAzFn?}:n`ه] pW9/ɓGn1l*ʇt]%&X|ٳ[fLۛ??5ke"2hWqX9Xu\N$zM 3=}4m:aAmIR +q޸%P98ګcI )bpvޘ`456$O
+-,  t% ?D    IDATZRا3%<X*e_˾icg9EN_(Gog>󙭭:Sooyw/R/Zߒnzb"X:֌ EZd3qBm<>ΑkG&/b1WͦX(Yfhfr59zK,~N ?dm֢7jv% `55vj6o/>9jnX-d)-%VP+OjM
+FzE\4M !phA-Þ9Mi7FtLQ-GWugs(_$+G	Mnɺg3Rn"^/t&Ou}瓩/b_W˂&aD|(ò)sXf,%]>2CV}q|~a:}ņqVyRaƚan=tRRZ++riKtN6=-zD]˨ҧB0Ї&}{_l8S@8gcC`	اgjxSmѐvJyΧ.$@-^O7gdDeA;R͇%Y}ώwldg>Ix|3m[<X-)*q,BW|}wJW%Jr9d d-k
+bce:}F`k3/4ĄEKj=szI\0v<{CD"ΕyQo%t`a)쎐s3q%NFѠ)Ʀ:TZgx	҄x̈́Uy*sCL	Q.LQƑ> >7W^
+LkxS/w>/hÂZB<X]	lہoq.9}:Ay8SR퀷Llf`;2hzXi
+^ܐny	h~iJ1vUwP`j%صܧAJ5d a5rYAnB) @{]Ic[ep
+a x}x{:24 Pٌ'S
+3ftOFtf؄QI\[[{{ַo<z'>'O? 7ɂ~,~:Uu#T_'C M_(Մcߙ6zk0? @_mT抓_*rR]2JXlCv8YAb/Gbd+oN"R5b(q"W7_
+Ѿ" UHX)  gŁJgCr*E@1ɞ
+Dv6S0n&C-C5%qb#؋;r=0&_nS<ǉ;MqF#݈eD^/z;H;QZnv׽V@|2;35lAe1b`ڼ2@+N8P"P \C08b?חx	~˻|@No}wWXsazEפ,o/c ̪zBQRg{,xNoн%88^Ѧ:W/)f`.a {86=¼y%F+2+1Ǝ4xgMaZF@Nƚja~0}y859Ɔnj:w&w+hnh*ӮeWփmqb+a~@bd=PE0?ؑ~jf#A~PUR2 (P>P%/a@ 98e<hcm9EutbnVRRP"2I x&>F@}o&췞y6vY9bbӣzt1L;CE^] ̠C .1sH6%.N,aUA2̕pWFI	wY	ID͐6t1͘V%]:-Ngh]SǰQ]aiCפzMlbYSC:?X#W?s =29hc  Q1wHG:U>{[w/{̓Ѣ4H+9	G{I)ж9C6  (,axJC vqRBP;CƋR60/ιE YcL ~H"_CFSO=u-<w899wG}?`}_4rW^PΧk$UfmaS,0#9
+E3e\j׎j=HL.mc_1 b@U$9ɍ=N>ӗ6Mbb1`9Ѩ!t2<`ZL5xN\ASg
+b`hapZ0 ߎ!ojr,~!S_4yRO+=6Yz&?ɮ1[xXV7|e>1|a4VzG_+d[n4lM~%
+&d\q*orb;/)b.6k]Ako8^L٤V	v;'ч/pk598Ԡ7qGt,f6ӛ~<)pP4\@xta?E_#T.SyЀNTI` Gg|`qHzhtR[EcbHECܖn=\3qICPfz]=qd}#W%say"rK]v[u5 *] eKI7
+yc-݌,.F؞[[tok`{s
+}`{	Y.&Zd	woFE#pSY_,^b)Jmal3	K{ވqgX`g5PnGTjB4s'0h(H	x;XO/mÂԂ?cC#x@D+tŴVgׅ`GJN}Rsŋs#Xhnҽ<R70'r Vޚvy0_k$9˸gr^>\fU=̪75iBYIm&>p%N2*cTOwD*(+!+)ua"Nv*Q!7S	4
+bObҐwv&*l`!zbe+~|Dkv[)522?GFwZ[Z|;QyuA\S~W` ֔LU
+-qzm[=[]~SQ:%c 	x?~i8ތ_ɵy-*aqS"6a?1u2Pk@Q2cEb1alN``KHW>;=AsZcNkl *.LYIufN|y˝roYoǚ
+aJκKUx8J<RΚu/c(}<f8wZk\8yc>JTj`<6\q1FJnA6
+n**Pel>s`E98U=]PQ#Y|cЏ,l-@cӋ
+6_i9Xu7qK>p؅9^	.ӧ<݂ңQ>[ăMzp_cm h$4(1O	TrHnVdrf>Z49Vvy"wK"7.%_*Rc~;ɯ)M^eq6눧y6p oAQ&[93@MՎ((jPN%{KDdm}i ;t@M7l$9a,Nj'!(@D=vvmmuݯh?Yy*TO:MXmC77zSX`i)++Բ֣s]:C;b e61ۃ)	CCV#	$t[+e<:a Lp7]6:tG=?ބ[t"6G2*XiA5@6o
+tѐ@?/-B[J'	t;'imԺjJ*6haF_RѲK!(Hy	-ǰ\qݤc6"8/!js6Ct1g̦g셌T]l?|Ucʑ.\ݏ}c\ cߠɶYds/gFZ_[oCfDU̇r5Yt3' $#sbpg?A;YB"g={
+Kds.Eeb#ｫh\ߘb<hjNqDX6}tXSKΉ30\lUZbG+Z`KhfJ١<v!	Ş[lKVRKo-6W9ƣߘ)cM(y%b$Y/JoEL۾׳7t{Q-HP*X8yǁoM 4ZUMfX*5caaa"k@ 	$t7Ym҃>ie1^Znص+^!PTSjѓ1l0jDDt4d}:م9);]ِBދ)|M҂ C-fC &L&mZHRO&D(5Ҳq჆IT.OW/8d+cփkW^K]uauu8|e>Z-gQTB?zTSi~uIdj%*ޝ랱`~8(ќQ&IO{M"pb%xN!
+K/qvYT_Tp/P&iiuK]H/= {	0u~zxds{G9& V30\cdt;%hPOBRa(̖iZNah1NKkd!,較E68Ni<1l'G!yF2@1W#6|K$>4Ȑ c̈́AQvr[ˡ?>S봭VM<Vwփ;>k8@1B~æ5՝~QAttOCy5HBA`M'Y	ve
+r`4x0C
+8h5&cSѶPYK.H*8]#ד&$hQǔ#;c!"M7v[V7<l~?\|k.9剅=#L{dK想Df,Oo>0|Vm/7$tc7Y?ȯ๚# I.9EV䕲qj9=n{\;)eCw)ޜ)%t2b(RHJr `} S\) s.G.F/2XOFv͸Yw{0?=`UH_pK~2NOH5XJ5)=i L(8ժ1M_oDo9ދ Ar	 {]~s ʽo{Ʊq|,GɂJ'JH`F`E@!ǰR
+!-2&Tn3[
+B6:0a 2mӷ:>==2G6ބrUFR×ư҇8oYTD6=إG+-zt_	wo&mY|wH
+|9^a3~Y].H]GƝBy0USFce7kN*5/|wk>_(8u]R[c)&9csWҗmY{1<FFz;y~qֺ΀YXPDd_ysȠfwv$}% ΩϕqNP.>]P-}v@pqRh4Ɠ޻hmd88 ]%eϕ%EBQ|WX1 hE +f_o3#" WĴ=ϊ]m},ζTb[r}V	7y%c vrJSs&ԯ+6֋%% WDEf7m'fOm@LaZ^6}iMAlAII	*P)=-}:2tEGߚ<</{ׅD/	LpŢ̆~FkBم	 h`CXNr0M]aVM̺x+#SEޜoogy꿇iя~Բ#Ggmm̙3^{f'~u
+b=׍fr3V&/ί"1.8OX|(֗DO-̞og5Yg2]3d_ie3/2OtayIDCM(9RWU;Q՞e LkEa8҆:CPVAk9KMyhHl.۪dw:.x2G&X?VHkg7wWdsځI5.^>Y>U;spb`2pxC9N!n\QM>	 @ֳ9&ٍEOַX*(?S9fFJU܏4Ȅ}/~-Y6(2^Q}=5ֆ!`G	+H$ e-*9p&CZp'h
+g	2#XSHp 7n=cp[f｢>ͮgssbꮮNRwPZƀxadc$D0!H!
+V:s=勹hfY|/^kg??MİJ7$SFX7)TQ]uѪQ4&	yCo][SdW\1KJ<16J;)^-Gf[a.kեi}ͷ;ao̾;T/60MkYd{9Sh$X	y$B/Y
+8>:_z褼P-50	_nU~agXYӠT^`yhCw<*1I@}¸wO:-?i>ġUc;I򪢡9س3p&(AMCaKOxw>%vQ}7VD5.P~	MY'kaz:n۫#;u(|fٽ]@'Syeq۔7
+AN҅Rn-	d^>+;$!?Ur2e!_yĮ7]rQQS:QmY'f[x?>_+ᣖ0[m	2VN1tL 9)O;:Jo~j`{ͥ6 ٪|Yɳ].z,,	Rw|ž?RV$"Z]]=|0?''O>{SN]4/	k^m˰|:`mo]KӅ9@f9vFR1U'\-)Sr7ӧHf'&    IDATx#\ǿ>6DtmLƖ4/e@ȑivӺ*X쀺!Ԙu9b&b߾4K-tSk]s[~q` ._H́xYvH#`w}Y~ئ+:whF̊WcO̦+J]<r
+?B89"/t?NR/w
+΃R9l;Ǵ}* E05Uڞ=yL1(26Nka4:)@sE	^mKƼI7THnoә-y ,4āݢyBp,XFU-rKڟZwK[DcS~nȏtKP+[	b\D, ١$RD%&1H,yP-; y"2Di[
+/7	ʤE<?'7j:ŬxœB>Qa8_T>s=ҹ5p}R~TTsI31YZW]j=?ЪEchBH}KM	O߱)_GKL|,ObMa`xg^?㭊8tǏg.Ix%3\/W"vZH9oN,ZKvdKA9^,vF60ӄspQaK yۢ<'trWbW%|jyO,ҒdUґ;|OMTڲfs׾^s:,84!,JZ:V7U~_C^DK8Y_s7yԵ(Kކ/hUԗٟcKo>G>5r☋C H#	3{K-:5bW+qf_;=jZn[1لvbif<-(JDR21SYέ'co뻾{3g '?)S U39˫>f-۝N7P=G5ܨ
+J&Ruax.2܎wo<kEI3G QNPlau| 'Xqc=
+gVO즁3=˺|EjnL,ۜ+eS5mh]M_QjP5)|9O)z]\/v*?+hx+B^l;	1.}<?؅zD:[$0ׅ\zˑrnJFXPꅖw'TU!:-{]_4x^z#~A$!ߤ75؎57}~\3Z/wę-f|&;|OC9U: +ܥ7ez[`0}_ʻsJv\"}cQ7H5>7c>-ttC_tHj!ϣx<]:yf3TLMs\8bIOݓIy$нo}#Fуzg|j]+z;Hы͒rdlk[3r|>t6F$s@"1T]g?śGxB4snؿsPsPSr7ebX|Ηr	exh3ދZyWuw$#;$_c-nPQЮ)D50;0".43)_eh|jT7e<tɷ̓g		XNaUݠ7EwYΜ7vHL|@9Ն0tϻI|oxm	rd'%f%;yX;]uqLxmU|z:cϿYG16	^TbECѶ̌֣CA<27	N7ŐXL7̣PN^60tơCw`$=j(N8Yʲb@'H&UeCeniy@A78}+@*1KMLJ1KqWwlG}V[iyw＼X^ܸxeݻ)nY3$eX'4bI[6^'D??{IHLm6ڹ%ܪoȗi{<Q3lcmgוWL'>2;b\q>)_v~!FvqY*<{#/X*?VRMSY,W|R.f*\;Lo$Jӗ+3*6Y7J?yʥ?ˋW'?Yy#&B[	`h{@(Tƥ.ߣΔ7\K}Z[YsK92gt|WDibHS"vlW`EtP1cQcr5HeG?ēǺx}^ڀBNN=	 sGPФD\L߸җzK>-͵@oU޿;wǖж3/UAI-$~(oD"GCY~<jJ
+1}Ѻ0`wg󀠹><ޕwJ1u:/h|/gт<1]~A^Hb T 0xȏtM	_^oCe"@Zu:Qe +!u2
+r?zGc9r͖O%	&v$y7%UL=oVlDW.E7U\-uL-Ćy~A8EOn1\j-ʐ&WW!i^PEBVe˹RĂ\$QbUw|"sU9(?8LF|7FS?媄S__1uDUYA]I<Ć}C)Yػ1Uo=y"%gl9-:m:,#彚8H۵_-Քs;OՁ Dqfoab5TjH,{5P(P㙩  e#@@j?d'|'KnGxG:_tWK()305mI^B{!ME|`P3cKUk9@[[v{%ǆ%rߗ56(lK)ٝt)S[͒WM=;Jf*@bD[ts.$%={ޣ&AtU7g;Mm!P0EBrs`RK-iIVq?h}}!ng?x*;)T{Gf\
+[7^/\%'ey1ꍿ2lfW7-WmUr(fiډ>n60Ӕ)-5u"/+1\7Lp#͂[C~<T3Et8Co禼*V5\L8Ք\E۝uN'PC!Ji3IqHP!`k
+@@#~@"K/cXܴlm.vԂG$V0IƑ/m nnVJウ聠V9bзq	0V)"L?IXt]'g0[c{Z>&mNV;p,	'<L<,1M:a@/ǮK*qgASmX
+(,ajtЧj[@4>|	>Ģƴ|LųvoF!4ˎ
+6<
+r+rdulyھ-s)IQ=ZjZɩOUE[AӹbIkYĴҤt_4_h?tgVy-k[DC̬݊!o=׼ Y	,݊*m)H7<?t<aDALTrv94b+߸wQg>7yD}9E.+e8cіh-"ZYLSı+#-Iz	,Zק692=
+vZS$q}!ob q,!AE]?m~+~^ξk܏HiW剖@smo,?fMi}`c+kV#џJvzvsUz٫v{*CCIѶRƾN-ij԰;rXVTZ	pnau>~]tGv'5pӒE2YңJ4W2-^mة_cl~(vr?{\Z-f}Y
+DwOD5hv3ԛ! |(>_^yQ! t>MbyK{<JCc919䚎l5CvtӉקvԘNlu:}Pv
+;,=L#m:'42SjcaJu鎄+td*t9.Q7S=g"+в"}5CuݥF3KDNglg3l9+/XkxOvvK/TTr0;J-Zz62@bRKO'?:̔Χ[e2H ϗ] *N뭧o7޳RI&U%zlǙU@Mzs
+[oϱ/4L^렾qKg6탚U:0{Ѱۋ+e/;Fç&W^OF3_|j^#ɚ4m7|vCh(SD_GY]4fg\rH8.yu}(VKN=r,ʬ!Z;>*_j#9{PǶM?cR(LM,^5ONxǻ⧶~vDVn&ca"&D@͡Q<9uEnb{U:4~$}۝ 鄄6kRP9&犋C;(=pЕǮA"[6
+zhH?, ͱ?39Nn8S=*ڲ_?75p9_FEկ[}m5krUmCAey<3rthM@[]J OJ3YV=_z=pmf_s}ܗ;򈢢>Rڅqys 4&V
+PܻW]
+My$EfNxV"`Qar9y	9rfHxWc/Zΐ`#ӥ]-gsĬ}֕/wv!vs=u7CRngݭ懋<c4|C-lZC>G>lvS\A~ ?JRcƶsbV륡1meh枽̰-.kaUzp)0ULmbaRdkM&%F'X/5hUw-Q3Ռ{u=3PUmze6>b:2
+VPyao%%zۘjs5zw]4A=UugF*Z+wb5Y6vQ:/FTiy`a˾$`U;[j|x#cyyz`cN?l~p4|wgϓ)jmFQ<\Lzv<qƓ~b}C>6OaV](Aѳ)g|ĠCo0r@+7HfS
+,v%89!u+""`fsA&`UrlaWTD7 hJw̚6LUDrXh[ga2XUpETLYlAŘ"j<]uEXwvbP,ڮ7D}ɠ)($7i52qSkj@킧E%jbx2#Gvܙނ85Ell##%ODp_ܖY`ͥK?ȸsGӶy^'(WEiYGMI{s;UuXg7m`#%&'{	DTB"8rS05D X3DMUbfW,?܏ ry`µsW~yzם.MF(Ĵ}qRܒ.VL˗{54.^X
+sp7cm3K)1/N,oeWsSl\rE}`K9u{T%  6g5g.U9Rb#SnE+1m3#})y8%PkauIqU/cҬ$ū/\o,ʗI)${uVͅ[FXT6H/nA,)Bb27C(Z| |-<F/?=֓VyJɋ을r۵QMp|(%K֣$My`P왗rLܕZt*FeLXK2 8GgU;3M>!u@muš
+Y&%3}~*_(0c	d4A2a%qf ":2Z[TZnNxmZ*F_d%)v'M'7[${['iACal3N=ik\AdJ"xpe A7<hE_ԣ_dpػW43-oص_Pqa},Zc~N7Uz咸{d>f.})E۲/FKꀀ,l"R;ga&[r9#҆*Z.ڍQC:+\*;1nGV2'p{ª:D g\^xaEK=+ 26mP(WHSSyʂKRUTe&}"{1U99gvMi|2;UUP[ZJz5'(N+vΣs޽Duέɰ=\PJkQy3H)_:N8wG|jM13f萜E:PS3\InQS.G9b#nȹ(	h35*%H&2U!*|PEpBy<r4f>m}l6^<ɭu%f[|iED"m9x)=&;7@,a/yL jMȏU,q{(ʐut»(,̞}A_FǗJ3}9b R#zv\L}%Ph[o#w0痚oO٫.-Or<qf^E^0چɑP.) 8kp<q Fcen]zoqvB֬ayz)6̞֒xh/&ȱ?G">tZYR!C.vMT/3#.E:W-˜ilhZ^90ٶm魆sֲnrdS^D%f#>SФ2hNYol
+w
+5-z;czyuqP#mħ支#|jgȏzٰl6uE]ۖ+?H(
+O]bd(uAC?<JKGt}]"^! *]AP.g"OXZZ)G7[[4r#PŬ<5f9N
+)pK_OPw@ޥUD(ଙ{!4vl@F:3XZ    IDATL$:ʖH3r#P/nI-&bB1'\.{BϠm=e_]SACS"+"DK9]Y-x*#GxT|!9RyM@Ok*"loX	ͲX$:O@l{3GLVE+sBOcb;~KxA$epW&scI
+P/#w<r,԰Њ[]mqê9NS\7 O,<j\6/;,
+o//h8ZpZNqƩ,NlLn½G Jh_nj+*gQC+uI@G#+Tr'hnMmRb7{}.Ltg'IyCC]Yｾs޼őۂR=D/2 rpd<[QW}1ݪs%zo%˄'[u_?6ʽwĩCԊj+E(qpavbjhe)]~0fIs^(g^:HU@˗Gާ؍']M~~89}R\T$\)fAJ$cD5B*$c${*bnQYr1 5WFRYƳoy_t6@{%ҙ-cZbNpI_7]BEO~GXRnbI _V U]SjJ4;+-ZXVqWG>q΂(Aa}I(DZ^gF|aOND80&ݕ$Ty&9ް! f)Z]b/52žyl}Kbl4v 1|2`@:C]ɧCx
+ML&pHdqEJ^Q:O̓Z+ dra85]̬8&qn* jԜٴ)/*hdCEM:$[rƏ4?}\q|jCŦyA/zkj4!c	b6zbjp~D/4#`h TϠ%wz1Ԛ	2j%VkͮKnf/	$9Dɰ
+H#nu9C37nxGlt_/ۉg6Zb53d>|97Ez/,fi`
+kNg!
+v#(ҋD:5՚CȏO9#nUT&,8q7UzC.	"ɽy3aHG5
+
+TR#oC'&@@C"Q ܶ`d,ml$2 DlvT8R^ùYn &@>aE+jְink"9CTԅAyRokSw(سL:bFHi G^ʉ" |
+< J_XoJy^s,Pٍy J溚6,郕K~}%ؙoiw*clJQ5IATHoW#~<b{)aJAe@(St]B6CP5T:j˘H #`l2ɯǊLvy{6WAbl'9KL<iiSCM-ER-ymum?}/N̸MB wJK^uTb#4Ws|%O)piqر}µ8g_tȌ'O Eƒ|VLf|I/,./.\<C.فI=
+<tcxzqebPͻ'gX|9pf仟/hF|/F=-DXZ֚$`JTZ` yzޥ[͏VnC6d`9ʵ.$Dbzet{/h<CstHS#o&kuM9D>~]f25gF͉U{[Dd` 3Ie /of#3u5HL>n(IcQ,BLjÂnX53UdYU[
+~IxQrجdnl3bABxbU-z
+ˬas&\V1B1= 0>dg	-2wbj*-P'ѳBr,jY5A󺨝۠[#ѝ]Ex{!_Uy˖9o0^U3%\*\My,.B3hHXIM( 55k*0pI\4}%ȟQ_mM_G(7J]^O޾l`bˋ3S냱MSS7r]?2@
+Tv$&Feߜ
+46WrA\R9P9	"q)xXP@M$Ŗ]~dLގ4#dG=A싴)O-ق(P^D,'z[} >^C{?7#߿h" 
+,Mߔ<Cdʃc:"- )5F(09tPfk\u=(54G%\w~b-sa#Z)9)0)<$o(~${rs^gzݦo؏fCH]unnJ̎yC IUJ{zTr	ԢERDy;GtA%%O+<ǚtgCCץfD+	.pJ]7
+uOT"v/87lJM*ls;Qqg}`.G^bQ9%amK9_wh4jc> ` i .Uۨ>ZBjIoU9m@[,R_zvb{&zRDB @-WC_}r-c}P򦊺|0#~e}>Cg+rt6\ gذ[sKJrX Z<(nawDR"- B(g:iTD𨗻4TD5RBhiU'"ew}<ЋfjDRЪ[K:'gnIhʺl˦"E$"mSJRM,fjg}&j]g!"͵7Ղrc!v,̥pl	Br?gP0~N5tͩMbZ: O{T5e7ŃN,If=gsL4ܨQ%J;֑O*V;>ڮ
+Qā`ɚKKAorz'C2-Y
+pPg]Q|+Mʛ f누Ybϥ̣()iy㒻PA,{ \xٝC%62 f)1/b: p0Kd)v>?2#Ͷ!}R5G4_ܞFU=#YbOD_+abUЬZOJB9p}h
+e(A2D0 et @>)wa4L	/< Pkl8>ֶ&y\45L7={k?g t74*Qȍ$b%bnES2)it3Oyx{u_EoWqS7b~W멧j]{-
+<$sNk%`E-YI'cko3:tR#9/.]-BQJre%`%Wᅖt8\5OVQ8s^+w(0(4*-!w_1xLԨBcQ=YMӌ]SZ~*cװ.T~>/PwKscV{+uq\OQ} @6!49 RcCiCPeX;(z >&?zU]eSsȧ#:	ݛ{O<yR0nl{Drh?\*Pnu3Mof8Pٚ:_&jgU(7J7Ǡ5'&
+S^&UuN̑ZzO|aOnGǐk X"RYMm̨a>䉭%Bmԩ4Oq]fMeUUxAą9G)'sӁܳ,s-1ӬSK*bALfp@Pl%+m	$©3Kt\-cCԤ@eit<UC9lE4ve,l *x;QK4Z2IKx'uﺗ*8|$ؐw^f눣7o8\PHYuEJѷ\Fԑ.=&G#fUT$v5*<q&qeu=K??z׻|Af~k_kzNl#֏yb7kŸg4咊.wnIUeRQ$}9-4Q{0Y]S&[+[eChҳIUB'u-WE䑯(߲OiE7h?ш%&Th`FXֈ<|ū|fN<g=ܢ&|2lG(#ٶq]_<XvO~yc,/7ĚWs\rc~}aiRliJ,0+E^D꘻iJW0gQ[Q _*((0CiI./eyb!V~"m;랶
+0sCl[%An6//fBw0xz?cId@76b1
+D5Ʀ9[7dTW?Vnp_nKmq#L?
+qnȹpJp5r{'zx | ;8G"2H܌"A)$+<FvGRs">ꜧr,o?$όJ/Uf)=H+(^"L7PdG:30h/c8zL#ϗn^,b&'rm?1FM,x"W+b/sTąHҤ|Qg$+Gu3ݜZuՆŦo?\wLMJAêPUV6ոw%ݙbykj<2L ׈lEk+˺N
+kl^CZj|^;ru$@I"e@prd\,;R@tB+feˁ:S5d1wҜη{=TĚդT]NŭM<29'c7IK.z"Y\r#{IEć7ra!uD9A
+͝NeՐIMOBQaYmYUC-PS;C:u&5RŊF"7F>%]YLJK7.Cl~oSO=w30~JdGS9*]sY/dvݩ]R`=HAAf&r{t'e9qy-uml1aryz'Sq&:9
+؋Վ8F"k:5`nŢfX@U xaCUvԒ	'TՕܶ"urrD0"E߸6@&جE\;??>?I"k#8" ?ƈH@pC>
+Ր l	 ÖbPf Rq-]薝u!Ǧ%<bK-Ʌϴ\O@Ѻq:/_߬f&-w4s_rEQ*(cVZ2$)Ub<(8sv"gVȜwe-y=uJJq2"Pܮc^oxAV< ^W Tn3_<|RZn.)]5 	SB*x>RCHD-E1$|>H09:	)
+G_q
+`Xu[ffx򗏶l݉os:yB5tqVա~qQ,,&=ؑRԗ4-ݬ̗ss /;+DU*֢tOzӲ?244b50DPl(ʱ5\uD(HV܅0ͪM&3Afd59Q4aȦg&kDHW$KS8M>vڒ]j3D2ؐԔ=xԪT׳88kMg*ڊ"Aߴ-KfB15J.5ip)f6ݗSU.B@:ޣŔ7}4-*-7RlJk{Q`ۜ*}R)b0UggvG>]qɟ_'Nw}oۿ#^W5W&1+:Wp3P.>?-}&m[VX&miX47bL,%Q<| RZ~<[e2Xc,aǌWbnL[KyQm?׵$Z5upJ6}W7O̊c][ŋGmۇXzN&W甞&?q)[<.H44 0AWՐ(STW0C]P>!1F!zZߕU<萼-fbd[27_;æ>Coqq{+`aG'GֵsCfٟH?N7rW~{p6~/7xr}	 I@$<7H$Þձ{n-f6x<[,_xF-TaG|@+OX`0))[K&W+^^#k7x~s1pBZUt 1wL!Q$`sl!5l	=e?cebVng:z]5m,f=qlspksPnYRbSOb`9^foHLǂ2O]zfc@)\N%x(_>gb/w;7M,]%wS @1KIif;׊аk>kdf-9E8?VjpZE'	g؍ROԶ7aQ95Cɲ\7 v^hqEVhܸN3'ΤWSI=@@hbI2g10]"JVԜI"|WP"D4!y{uQs?gP$2ǻ6'{BXի''VG3.jTpQad<R(t"
+ADuNQ?Uvڙ~]GC_Áa*5T/Wd;MrKxtb;-,]{j[+m3j]ڌmPUJSPIbHN&VD9[Md;r[vqwVPѤmOӁ1o<3sto	..{܏'f-y(<XIHTRC""[V{\aNxꂠann-HN5 l(ZVY JcG/F:[8"*LkUA93Ap	{
+dt2Ϳrs.r    IDATI-1rQj|	eyN+g֑pR{ky07[7ʊ	63 O<Ϳr.r{T6Ce܅i1ꗫb8m7r<v;I\!<}3)< ЈzRjq_ls0@uV繋'PYBYz(wǥ̭Iܙ;} ?ewכY<F:T`F>tl 
+"h#cx^(L Z|P(w҅]+;!uY'~틕wϊ{J{0?ԅ#-^Z=0J%ssҸv#@^ޥڎAFZ[Rr7P<4eCu
+(-Bp/M3&ChZ>+~`wW')\`ї27'PH-=Sk~|GrחWscj3˽Xmʥw1%劆v@ց|Ml dlD'.XhVMęX]a $N]glǲ_6})P%SMF9_+Ur  Te6q, \RUd(oiqQJE[f#[jkS$[@H`rpTaM'V*#3	S8t`YmsXTٝ_g#gW/־~QNmnn.--=/~{n~ukg8XYї|;(o/N2q^YJ*Ē>o/ʏwzjnhH]U\(LE=]U,j2)ŔEEB0XTx\(hsCKö`=fKobEw:ܧEGQ]his68mO[5&jUc5Eε=u&-[UCDEVU{n}$^:`4X`q9	E )آv A>k0@Hw0	]QieOϿ//]fS10LMm|yM*5)^NiuY®dKn_:%c#@=s!h*`	(\+T
+fEDİ2"uV'ՒK-7cAwr6ܧ4ZOܻ?efS,^:?1+[f`Ҳ hlڻl
+Qzeo
+{00NIufcS)ɡ)&Mtc(&g!W^yl  <m5C4ՙH=SQgmS0'WѬ8Ec&c@xq=ֵ=yhV!f]|\q}l[_u\JlEgf+HȦw79;׸2|OoPRPP¬LZU_\a=HTnu0D UZ_
+>ێ~۲bCum?`d^祶LLMZA㈁̶c9ؗ#2651sWDQ4, dj"P$ي"mE-ixަ˒]ʎ^qUjIl Ql`*^)+SC]ަv) xֻ`pU/k32J\ع"$=u]7c'< PS1;#5Qi9ąG⿘YHֱݶYtvGYoŌfv-;u?t~Ebٳ,- L26ԕ9N<*olN˛y-1rHą9r	ZfW3n\[T,3akaNʘZg+ude茆p(٣ʔF4AD@7|:Kc{&Gڬ<" DYVd׋*ԵG$&*l8Mꉞ'6=uqab2y_2֧|I-.OPfh  I*
+&EPtaRHH!^<d
+=E2$Vg6aj[>eW?<i'ݑ:8suǍɿn8-/<Tu6\gKM#;ooVgUoL	鳍-zr3ޚĨs!+ZKrp!m@Rm賽Yn1OSS.?ŴA9?*Et"ᘃeئXY/O
+CX}12:'s#u&_>e]{,GS[gg%%P_Q h``oFr,lr+7GiW̡ǾZ$|md=.u |sDegoG]qoO?^UU+;X%]I}Vӥ99ξlʗ2ss)(O(LrfKa
+8~T{ٷ3Y=ѭf^?qm֦>w5;cً7wVԬj1];wA &R-=?~K,
+WPgf7'ŭC8&K2u}jjFvKMKDmG,a|ޛX<\frAt 7`fDoDqUȽnykyyɧω[
+xjC7i@ɤ/R1s۷U;iVJ^UmLcQ(7&ao`M Xd.ё2g5;XYY'?_ϑ/ErC,E6}cS̒&Q2KV{XY TY2ErTrp]kJUf5RWe71̩#}8waG mHז=S%aBhRGuiA5Cc3u	2E|
+ԏlC!2Aut\@Z(|1tW>/'b3BuShV~+[V=tRP
+~" c	!LȺHAJ!L. :3
+~&_f{/<2\-1-4ǿr4e_١,Wsa}n2yTʝ3ǿ4pnc}!wьYS鏔P|;3Ⱦ'5ؤ2XBuf;{E$F Om`vpui}~\ϱnqڢc03tǄ7|ΧN.J7 bOTC6'sO,۫jjU@IWlnv*$j}:ם`[gM{i҈:G* !ه_߀ <L!Z `|G1d+8!E%.@v(9RW[_0`ߺR~EZ?m1s
+C`ʋ7$+<#go4cIV=Rѓ{`Kefŋf-jJs/6tmEpL( N"h
+`X"䵱9<eaʓ-ܐٶ!=1439o!3d#y[ȲW:_8+UO] b9&VeiTzؙ9=Il}OJK:k1d+9L\;$}r뙩*A4qY)*.;GKT_ҺtA案BblEN& M]kʚF6)scX"ȬL-AQ2Z\u5]dbM3??-eճIR򖷼?y\JZkUfn֣eHWݪ*)Uv]M}ށf?jx_.ٻ<Eq;X{dMz͹5Ȓ7Jmǰ᜕G>zm]4$XD]{)*"4{juV?m>sáPqGã[\ %9*1;hQKWdrgZ/OYo~?0P?￡47j\_2@yBEH&WE<hBT 0TUAEE(ހ| c$i@^xSԗ6 CFDrnUbCL"JW}\4ya%}!V_ K[kt9.庵?9}<,obTM9AUǎFr/pDopɱB	J~9Z悇U;tMʓ@SRw蹌rɰ퐵	_w_17,9$戱9/~1ҥ׼Qeot W!p#\ C	x5Tf!$D7颧;m(POJ'`O*̉f#INӗEqN~<CmS_Ov@ bAVg<K=`>-^y[7W+ss!b/2'z_gzާ-W<yCGՊ:3u6=u!b`΅4zʲc-Rfs%/h1E5^˵@nO>砶-LrZ?!XOs[`b#qAC_ Qh" UMbw#H]Ml\1ľĲkIî@LĮK	*O3 +eDțv/0qI@"Bӱo
+"E|16mi%5PD,cuR2~ovkgћw?S?uwG?I_YG;\-jXVPӤz`杖+rbVt+̜+K$޳ٮ"+OuH6
+?֖٘+%UQ7.̈}Jg<Do5/+X~~jҝ8p+]>P'oʣ E.u[
+@(w2XWSzRlf׍׬o6~8~\p^
+vϣ<IvP9 @HwA3bt@tCjd	&cw\P/lFE8Mn	2MS!ИhB0@kt{xO
+ǒ}d5~_wz,ƘcYq v_5Wr}ZrzlVef=0/iE1r_v΁)ZMj>bѡ ^wMMxcWA2jSN1|.dRSCDfN[:iPrۘL!5΁-F.`!e`|X%oj8~.{VYzG)	*Clm_wDB	?ɑL<c{$&!`C;qػSπ${upT\M{ssSnWW/$?Ǉ	5 f	PrW9ך4a9T"X7{MFbl <uk%v.sޡoNNͪײDX0kAj@nJrT0s0P'9Nx\PcP-<XʃcA/sv|17IAIf%&_C^Vj;rSjgXhib+&Q}@l`&
+hy{X'
+\'u֒u^X{IԶc,`P]?u5mVwF$dxV	*f,,uD5_pYtCldV+AO3\"@nhP.gnfNbbƱ*VԅQVSyO}U{ɚhꄷAtԫ9ǖ@3B@@U>?Χ<>(/tAR"阖fŽC~"G9+1*{h;.7l6űۨCO,%eqJ7lTˤIy23~qOW|ib\FB7|ޮ P[@ڃ1CH`}`z\  PY	8<xx{oP-PdCy>1G4^pNfITjqIR>*cJO5?/n@JИl</oꌧghxcߓkGK%XqXmKUԥpU=hXZ7Ǐ$$k/,"jTHr)v8z/oxy[]Y].@(v&͉a&äc~t}g`sB0>dtdE,@.b`rƍ``r#UԎAV!XITaحd%IPE/J:ԙfɑ0FskQmE!1ܯo<
+)1L 8I5>y 8-iſ4 fcj-4;_Y+<yŽwL[GwG ]0{;/s\o"luxb޺4Pt&w$#VrEQW.L~f@=(62GG-n.\M|(c=968m˪ 6SNRץা%AnXWkJ⡙2vC#0ʲڨ6"l{?81 U%&䬬f.oy
+	(P-Z~=Yr\+7;?{P 176rl9 35&	YWkrPS;O`-ʪ?8_UG`KN~/8Jf"đVә]ގuթ]X_(keN9(9Jߣ²޷^:0sF"$"$ٌh&r3! 
+:
+̹yy<b6sǦ|%Cc>a[@V&n55FT^pa,>?D&)PKUMQWd$ RĎ)b8ROWxZ޵\g}8ӼĬW/ 30%*-+VB; #YCt&lsax[Lf򎼼c|jn]mu3GW*ï b)z[ k^0_l}؏>FgGjm2y;웍c-׵\4ڙv®LsCyr*b~CC |pyxOhlAMD]Kx]>աlO1,iF"ё?ƪm^bh=Y||M\{~(5)^ǧO~fhJ5{x}v"t ` 	!ۄ }dew%?UTtxa?Ό,!1ޅ)1{ ^"l_RZ!&'HRzRa2yVӞ&M޺άw_
+sR-%7n=%c?/[r?{ݡ=Ié9))(<UR=O])Ҥeع|jptAYڡUˁcaO{K|6坩mr3CџHѿ6}O 3U*r9Dpk12:5MaIE9zӊhbk O^٩JNPy    IDAT:odbN0!'[?/`+@;0AP=ƦiEr=#[b||̏&-Ӄ Z%
+>ɒ]	2N5Ml˘nUqnqB@jZ,HnO<ؕ,<|ёJd_c0E|]G+sg_ZSMݛe'2t`9z(ܠ<6M4@+aѮ;$* *]㝝UM9lqwk"Hxqx^mJwOO+``%[-07+xK![Q~k1?#K	.geWy-<fXyO:V$$bmL0`c`lL\al,F 0 VVܧ'+t?/Uz0ƨ13AdyvH0OKM9yĸ{h~HTVvjI..9g?2D/f']>#rA9lvbTPx :(F@5;p37A%A|`L+Ϳo-k֡GF/~ŗ߱~G""^Wo6mJ/8ݰJ6zǒx{tk\GGW,=X.}}sz,&=ς5h+6;t~ .pTnXBl)c|cM C|0"SN>bʢM#xQzue$
+!GsFDDI̚6oHT_'-Es#m%QvC{c?m*D~or^﹄ C$Bւ?V[`$ê:6Z(h}{7h?k\|wˏ.eo??3g1j'8{|'sPѭȳqDk
+Yv$u~:Zx;N=#L"0JLmv75[*}~R@\ͯdvFWJ&Wrf
+?"t ]nNv@pʴzv͸=%eY*ΏrH323O;5BTeqGVGcG/h:1U|֯ǅR=ʉi3]UvfૢVNĖ&JjtSUkė0XՁ9Dz𹎲{O'iX=9|*UtD_\ζh8jj%]-ڊ۳%Ic{9eWh7d6l|~8)ƵԸ|c-fʴWenC(TbJ>:#	埭ܚZ_jc)O%YcO.}.o#02z;k3$۝aXreEL4ZKlkŹ{UY""ȼ7wHhxF߻f?ɴMԆsutgvWs	@)X*tN\R!	*bqiaKbq܁i.H*20Tb-喎ifs>xG?~o?z_.痵oN+kP}z-|:*=Qڌ{ ]9(_^Tgi4Z+Nەp25!ԆO uQ?{o>ܴftb}owt*(GG#O@($0RqFߥDoAoLgbwJ?Uqފ(ͯĞHO-{_/O_.3nJJc3YV[e.踄vGYYL_@lnb[<IY?L780+>f&훵rr-b'1l5;5xjÙP0|#*"i'!hRK08Ù/6u rNos]ճVZu
+i_G֏k'nWyћ	b:TyqYS2A Y:8:<J3D޲[kJO]RVr)P|LB-H9;㱵,=gT(rMǋo*O-4S.?[ra@- 08=Sqo-ƝXKcE`ug </ɌK\q,TIz3GRQj06<լ'HR!5IJ֜Y}"5]9sS#r]f. +FY
+S2)tlF{RLಳ!M=jJtM\5i`\\IՕMi8:md$m1gK5/2Ak98MPdB	cs"jcZ/tA3mYD)<֯8?$>)Icb3 OȾ>5.uUQQa:μzJvE@KE}_%fB^ D
+dg<?btߊO_Par@;3)"rN[žטwX!.҈-&Ke69Ww;Yt~PO^f =}3(p'ՆRSR}axOq"n#A	`!c+}&v)UF-Dp+jD磯}::􇌣4z"׽O2k>v^ݴoڷnj΂^	q d7DNa5d?!rt0`ͧZ?>W/TӃ9?k&0S/Ho96`P+K5*,^d[b}s8OlPVȞiJ~3ޒmyK1z!6q'ݧbA{:B}ŷvzCq%BN8NhT~yJ\9@C=E0QyN#'OKtןmޣ{k;5tw^ay) c-_n}g??gTƳA܁ʑ0YxXXt|,?'* KKZ3>ـrq@}Zkp6g@=8RnJ~AvfZs:b_ğh&Ǣu9TchӺУu Ou?XR[t	`}3s5)H&{>=v<;8mK]&(0N:eXnkɡ(tTĦJپԨ3e\4qX#SUhۧٲLO4%i,7dK;Ib5ZƧ$]I/Gs]#\B~LM~( ]9ňP RFtB[L-*]Hf^EͦjǏjG|2AONy]F֡*,+*^;IOsRG	
+k""bUbDX$e䅣ZMB1wΗc#l+'AVxWZAz>'4bmS#l7K܁iVȹ`n;?5YyhQ.;LrPI-9.ƫF!#%rI`dI{ٺ:=ogl:PHGz51!rk.bKt@|1>Sz.1ҬozS XktV]Fc܆!rh6 oz	
+;
+wǠ5/Y,u1poފhSn~'Voy'K[A
+"J_:275d&D#(@	.|ZCi'88sG$%=d=Vxs|ni0z.ټN:lQBovi!۴6E0}R0#U	@ڄc^#/|\_#4Pg7ɳ9{4wK,d&:40#|#׮Kۋ?\b]v|$&"/ `@8	Eޅh$L ጢv!(op[7|eoP|0vcڑwQB'D	EdTDnȲ(,"<$^Jnэn]cM?'No81jٙ2#\mrG\6^vŏLz\҆s=b@\mjb óh/]2xk+yTuv,wjJ,Fu"=-(m1TBB{oqie'.Uy-[!UmFUX	DN9#9<<nf~Qg80^qJ$%EW,f:(*8ޞm\Ox=P)S 1"2S_(j5ޟ[POhe艭[K:=xE;}ס[wpM:]?dUێ}跏 ogEW?!{Ļݢ;VJTiצy[| :fKxqi`	u\l(ЖY.>MHQBcܫ!>D`M iR6).;9'!*=<a<$[ScG=L-;Ss~GM*DW|A"nfYu(5N*-bWX˺:Q`Ju`?{K;VÏ4WGvW ~tLȲ9!dBA-)%{cV:v>ӓSEȞ{\\Vz0%tht֩\?aM
+{/>$mߝu~OtSE JafۅRͭv9p~X+'
+G ~-L1<1jcj4Tq:rdԻ} w	 ؙh>%xhV`"<n29o.	;@caruf5D3tD+rӉ䐩Zz+C|)reM]nG<3p;-n)[߈+ 4TgB"]̉/LxMv=v`/axja8>؏هPhyA-%]mU{h9<Uj]u0x.4,{N9w"[tŵK$rO"#RS  wNz>H_c6Mfeu]mWt~ȝ]E+9M	Q?ame-J冾*E|#Ba h5!
+-gԤ)0t0N:#tm-ڋ#)5͐C9R.Hј9lI#6a{1SS-'`z
+f85Vȭ Dsh{B>	iW2^GY]
+,YiD}&J*)&j{&ϟM/umI!|>MI'V#9K7 62&jNO馛.!ko~kMNwNND!oE#tA+ҥ+lʴEc=k@)]2)[ͦ{ &5!Nψm"vlEZWo,ʦȣ^G7R>}\n4qv>4oØ)  rӔ+-Zx8v4ǚ@{yMmTww&NPDY0JߖOjekZ]TO[.vn<#dn|SGG[NuuJ,.ٜP
+Kaw%E;")P {^B> O-vND[CYIgVF!38ҟC\?ʡ% ˀf҅} `9h^u%oMݔJ~8߷T-3h($/\F(@+.mr7Z|!jͬ>NXVХ5ȏt!
+G!^;c6E^gh6t̉"2̢eբ%ZDCt%n uutO{KG,pFq	$aUм'{g~Y\Xe$spkFٕ#J<`=	֬P##?B[|x/|xnr&h}oqeh\%^Vx.z}AHlvB0Y~QvٯZ['.nwN*BR:??5V=$
+j#n5ZboJV|~8Uj'Nw1gMdRԨC{.;wQ
+SrقMNq(BڮBuX'8:{b_OVC=y1,5n-gRu|Ui#tA@;q [NԨEؙy#;l6Ubά7Lke'와R:C|䅜[ˉpD	\ٴ Q#5cHٚYʐ-sL3BUʸ.[#޿/,XؿWZN~M0??^$;qVd_h	ԈfQ%uL6JtO9}Y?تEE:iPaVTRt](6-% "IOL[UB#3IV1l95:86ǪlL7d+9qpy>Y(dc6o%DOs|FϚap
+Ȇ2]u^@Ϝm6*Ifs60"90=3[YV|8m"^_igWjg-~mέTkC
+[H*e=<A`7SyrcusGx.dgM,Y(΅;CT65#`| ;Dc,ơdGI隁JQ~9?EiCťXJÕîu`vTڄ_:}B~ԡuDW{b+PQLVA7X+dOUŧ4	-18~\!{dO@68k`"n~6yu#亓VȄV~b8@乡+"J4j7g,^5&BYj}"1s2EgG >L hcnԆt]KGx pG MZtYNYa^D\6\~MPpN /ۀht>6:yK}P>N
+1uƖH[MI|߽=/+xTOdro=`,~t#Č6<ϴWRd{ǯrk}Z:s,BI:vF :uJz"VeL\v2`8tŦ&SZsHUڙkB_O|%ZdHNX9#hj2:aRqٚOKqxQ7G*7؇s]s؜4zc/r]m3mNXnL֢ud>pY}5a3P QVyO/8T2I
+Br-Q	qz*R @8T_gl\v8/wO'ۭ=}3 p4 .Q}M8#Bd_lr2J|em"@@Ӿv
+̠u頧
+n(֝Rn&Ia4CUu0='EFtJ\sJj~,ΰ:HlTpOkQ5aI	8yq<j *4xh<kFR    IDATDv,:%r0Ŋa6CP![f5Cs&+ 6a}̪E	^)URDG&fԞkw;6+m=>_6xl?S_K=*_}d1
+ xm7|7)O0D< #"O0`|s.d^gPx]/~g2/)S._Lnm;t-z͵#m4$@+mOuՃɥJ6dY`M-2G5F~QOeZs_	bnFB"E,1gQr#+ЉF
+cUȮFgC5̬-32P#r=z,/Kʆ79^F?ٿSV@mzQ#CFty  cXE0TlZcΜc2w|EdKH{`2G?BU%e9Ꮣd-B성hBrv8}^}öNuzo-{s7yi)-պTCG3q~"+7'5-4׺gh%/崭L1W}_,wKaҔ
+j]pWln vA7"bKE6BS]9dj:EeeXvfscEl-QefZ	|'GRoCV!vlZM?:wlDM mӆ9:F2c0 bԡi\GU'Yaε>[zZ}K.w3{C\[u9bx}5&%xW4:X=e,Utʯ	#YȏXbi[/nqqiܖ^-kk1QC$ =L#)Ϊ)EXnCOU);fvK>-{:̪.ƺcC:݋)z>8J%BY7wqa
+A`eX+O8a}=s0q,7g~
+l;baJbd
+Ñ)*NlfJ|Ltq}Etb ȇ^sIVhu^HÆZC=*T!5d=F4ĥ9Qu-*:o]޾O{7> yVy .ң?	^=u!]Q9&6J;;	}hV0FGJeQber!W*㞷8?H_RIrkУBÿnoz'ܶV[b<3Vd=*}D<*fb,&f~\=rwGgB`EdGP),+>Rr,2=082VfZUM Bx֒EhS8|F'Ïk~_mOƧ ؃ރ!$?o0`!DYZQ A ^NZ 2Cs?9Os5i1hP]IPѲf\O)i3ٍu!׽ \%$kч-~'$؜Az6^*J_^-tCqm_p
+vQ/'DI LMRζ+rt teg25ُŞT7Dy
+kТh3 dOg
+LG]m)X38I!wD7}yO؜E0N;vZs]YW|݉-!_j1Uul?*uXk 7`vB6P*Y7󕡌heh>Bd_sؼLYY#vzn+j(wIB `Vkc$tW?"K&_3?^Ԝ{,bu1ĀL,d"DB]-N2s,-Lb U`*X=iDSpUlM]U\%]?;*u-N5R$[fy>+5}>;c'#O6'4Rp`\l+B\Vk=#lh0s	|O!jhC=Lq%>0nȆ,G 5In9H()uqD.	zLZzE4tf$5-D˦=![`dS_8оoPs2k%:,Lapǐ(xztFGA\h7[=Րt:?lnu82j_]]=#N_@Hj&Glv&ilՒzzUQ#}Yf\ND[3ngEpVdef\b"i䂾cI?fsΑ|ný-ClI%Lk[*  )ٝ7+zMti~P5{^EZD 40lU7]e3y/n{d-Q1w`~NV$!`VOyw~ƝS/~)wa96zkhHz<KG`و
+Zكb rx_Kɱ|P ~uw1> z%RtS1}Dȭ6?܎ߺ>/Ϭ=Rqoؙ~8S{KR=HW>jzd.b+5H|_^oes6%8idVh=JɠݢZY̮Uuc3ԬM[%j?^WkAX[`¸g&(D]i%i`D?{2+WSE޲.?3?aӅƾvr]XqOP- XN^6#me"(㴔# U-3}&DlFbh=9߳\~@nj+ҫװ-vz~''B͏%r4<EB$oMswӶOԓU
+2 H~d583f^l	(JTmvb"Jd@{)!r`:>&Frs./ό%FOi>WFآ~oNLV/<fǇ5Y"gk " ){8B-伳U\X(g{ao
+p5DHWL?0.U "a\
+iw`zDs2f-4z@Vb|6*lI#	z=#͗5pr "u![P	DB'@fQ܂G0y
+:@`- r8K3< OeSJMf?urߵH=K걁o+ c̞_uoi]	!75AЎ0d-f,kRCS@}J*OfpC!Y7IJ/pd<s:keH*#D>1ζFX`2stEUVz\S.`\Q*P݋x6Fr~Kt~G{]3q<,ZMG! F:`PpAm@$K~qF.*PECQmξ%J唶{}s{?}ΖMt?5Din;:w+9w+6Kdj%rE~$
+=<V|1XOmBגv~~z/1ut9fahZzNvmW="tU2_MuɥLme$Nհ0tw$iޱ0xZ2Yu}Eh%~e2%.0XPqhTjYϩ}#Sql;?]xOut礎OY$BWn!ؒބs}aScJbJҸ	t=5޻^>B׌aq:ݷ=tDy;]Yȷ_Ѭ͒om
+	.?jD+4HZʸ gjHVf{b;.^)	(	9!!% 1p]0'Ʀ^	i9b֢:rCnb!>MqNJJ!fMf1GB7MS!ƣc9)8jc0-(\P6CBX'hX"vp9Λu.G1%I5r_d&eu/ҩ"ek8ԊXfM#NR*q#@yB-Xm蟴m,A8n5= 4Tϴn:&*b0p390C~XeP*@TxMh>`y*t4(Gg,F<n܁5Jy0`<__$/'9?]~36qE/6z}0/LXshB{#KVZLJ+{aH֭;#/۶xoѻcG~){4yE
+k5rE!5_a_8+fkFMZN"ND{ÉPp3`BkƸ+46~cQ (\nY޻'X!'[;
+ق@5lBby*H 1@ҁid
+/WH:ہ!8|+cFpQVKYvck$#nJz9[ҺuU7&X[izH:?[.d M>/(Lm[*˟eY,\Mp:紧LhL{Su5۫V1պ~ yfCQFơlx!1zDh&i3%X,4Ц9wI5ίf.3qpBC^6]zJo2T;b+' zN@l3jJѡJe:jlZ
+]@ZzodDlAfj5/y_ܳ>%ؔH#8F}~Lrq W~\@Y⿭bMt-wX{jCCm%PhVJޛF[VgVO_NT= A%M&1$6&1h46(F#6b4
+ PETigFqu8ax=sg1F6N N3j<kHp@٤Nu_$70ʱM/İ4KnB2Cᘏ	 djhsSU*3mrߨ
+v6 f4[N2N/HK %8[k"PgR8YȲ4"z(r=N[wr~Dd4?}rU4bXU+pցdKpl$s|e]r?Y b[tԆ3#,BxF
+`U\DpX}
+Z!nq~FhLnϻ@]wRjcZߨ}ySA]dE' \nJN[fs¢uW3y,rҖELK&/b@ Fu{=}âoD8?$\y̥2BUgE`[$BU#TcחkçUN;iF[ee~Jn,Lv;gZHP g>?vdC hy*]!i7WtUԄ]w a	+hᡷ$@@y.8q<<jF)<>eianpP7&/+_q}v*٥werpS{?܏D 7eQ5Ƶ\GxbGSyԵDM|x$RlLnRV(GG/r4vjēd]/|:ϺƎp2%)'1c1i1ZOeYJ8;]ˆr6<ϏD!#y vwsui0Z#H\׻rsOm(S5B88mXt)W֣@^pf4U^+.l4}6IZ-T}AE͆E;E<ģ{X@c3~mqv!!iH6E>~1Bv30aplPˀT#1I@H"y<۹?{@F&雎9}ofm;Jœ`s8aqm᾵x
+BRO#of^Qɺ%m9ࠁ3,eGy	L( .Uq+g"9a5(Mawز2.Ei~#qAG}[MRN~	yBmT*E21zC5v݌S\:ޓ-J(<36r$M	¡3>{ f!LCg:p
+ψ862ILJu^Z/ Rz3hrSZٷ7+S#U϶wav%i_Hҕ%!KRq>n:g#fn&@SϮ*AswH6^.֧hSXu٣@F&UZ/hx7iS0v{ ur4Y
+;
+qX\>[`2$+h<مɑ.@Țk)k@q27>X%(n~'C҅?fhd!0q lxe2GmǠ5 6yJ\n񼇣K<W
+JaGܬMA@.z^?EHW~WnBz}ſ|`.dF˯on!J=*(NI$hI=t5L՘sآEAWS=Ru~H\֥\7I"CA%[F/,o7Rs*8j¡]el|ԣRWb5EJ"H]t0?}jsQF$OhKK|/b/Lռ`RCIPt,
+ ^v
+ԝ{njmž^\uo#`ܖ*#CFbZt~tx$T10VmdZFfS]o.7Zjߦ>8F.Ց[jH<Y#63 T&M(e&(ډ.Lg$&(/۞rNWc 6Iش{:(4aͽ5\@(MSGOx4!pAx\Ǟ)\34(x@6Uy%r:ynbпTt<F-[P[S!2r@Ex/ru_Bž|C+~H@\g߬T>5>}gyFn	#'""iPP*3D"_+"_Qb
+;=r~1<
+BP،<DFB
+nP xgFtQ:4BqcYU{e=<_eNc8{nߑLMh]g8|VVR7UD|as,51ƧE1HLg`Efٱh~<M?ʈ;N/NЖNpr H`%#Z=&l8g3]/(ZKm)]3b~%~Ғ1(bd37ᡴr J.=.^x{~T    IDATZwnܾ-A0Dt:P9׮bI{W,@:O."1lAIhadG@hJ0|1vGl!ƓyE^ZёT
+W_d+KsZqvTcdkF8aѾTη-6k#ʔ=0?j6UƏK|V,~hߖK*~N9"MGk>SKG÷ĬÏĪ&hoqg.[hO+R#*cЀ内nv'h;\}*Tu ?)SkcՃ((9|0?b>ZS]S-bӘ!%*V[] p*:+ZFjD;ڟFzRXM dǇOOٱ1d>kŪgfN7G~cgϞbxe}#O~n?9Ϲgff~;#)P5F{qε44*{yd *cX.46hJ[@4 ؤRk9ٻ6L/{dmܷ\7l<f`<b2I^#1KuUɩ10G 9qsPT"b<RVP W૜8.;5xTQ$h3ӓ.?2U}I/KFz Meqz5o'1% N  D?:ArF|I8^6.lh<G	EeQ`W]t@8 i")ch<=hχnl+ 8$Qt]B"EX[oį4 $?.IuAd)>um"}8EPH>0ŶX4[CMCsgvZ6F R4d<rEF6۫a,O*p'Բfsqb4D<
+."r6Bgp'A=#kBp֢ ۠"+>!e%-cxz>NYQC}D]4N n2W-P:\n\qjFo<%h|~͖؝fg/Y~cSy%BJW:. caW[ћj4ܛ[+
+q#Z#MFP2Lպ\W\~8(TѺO ?-7rLQ6[ i+SH줆g%Zr&`}{"OYJOmXs]@IeVzr=ec" eg	ǯR쉇H]3s]ӆؘa~g;iUѡ<_R}~<Sc)tF43Ζꕝ}=8|vFFզ0{VT(]RM˶SWs "نįS;Y_n]x[@y䷾WUz?5yW|7po˕RMˡ=9V7;x>PŽPٍwWS펉nF.%QfP04d=MK
+Yiz`<c͊:$ԴzC%t_ڤQ"8c2%/X0?(4}YD#e7MSX1>)xN@
+XiG&Ȫ2n_6vE8|v=OTO#0}9Ƣ x`;WA(
+ v P$KPbkPCadhCuzm|Mnv? 8	«HTց
+XPf8B(A²5eP9ޤhwR
+BQo|ZKM2m1_iYlVKkߡu0S`s m-VZs~@EWԥE\ZikV4o\՝D[/Pl)z@ǌ1TtU$rD6Pc52Кd&:@|d\tn.t1x5;ǹ;l![D=*;A0
+b!5
+{̃# @ DCU:p-!	A"@@
+Tc@(QXs*,~0Z߷~}g(wD!JmcOi41끐$N.NkSY~6,-6Wv3O	c-$;/r]E_/!W<:YyTw$I6;PXY3Җ`+.G/GҌj^~R/?^G`֯u#XM,uq'Z$H}6c5걕?n	ϚܼqAW{ß
+āqKџ?l1VӝH4uxڕlZSuj}a 7NU-/EbYuo(_v:NߨLYBD_9u{avTr	޿ޜȭE8|;/ꫯG?zwqӟ[kv_wu=7XMiaK9L|q(̸h䆥_X ##aQ̰2Qm׸6PEME2&<'F!FW!c}Y 'wqRX6OWu1*9 ̜4"T'8yÔM6ؕPb06U3Z)F8%i	Уաb֗آ+S-[ݎ+H/_:L^_s5L,bbcg4*D]$0NO^@|AmF )4 @h|6!rsG>ӞEFAȆ(EEo%0CVP^<Fԅ_}<UwQK%ɥ zF?˖{7&ٳqvO-vtí0|G7UBLHj_`5$.a`G>V33 %|^M2A_mрwΖym-3BG@v(?RDCȀs.(H򳵩SjrsnBvI*B k`2Th?~	aC+1Y;p±v6Qa .
+󨞈(V y;@< HV5@
+{B8@)|AǗ-YaZǾWכ+;:|Rk*φգ_)|kr5ٷٳ8]䶆	-	IuΏ;
+V74ӗj:tVPpn'lk[قvex$82c׬=6ь<E.vrmG])5g)B^fF7@v_=6z}My7/EHHǻ%;.M౶˟žArU*8q_vcK}|^HRuhxBbŽi%hѕVJDo_0hXWV`=eKE~ӦQc)V/ߚojfZԸ~לp}ueYV(ItΝ}s'''lC&|]s]Gd$ˌVk_ZG\kscm:.MR3cXvG*M(74erBMo% (61b1CsBNtf@B5\$1ssGq1Ճy&^n+
+9/3@lE-(J4@_(w~ua~z65J;?g]W.ẋY4pr<_À
+CTép'6 C	=wD]b8@(/Bll{F4W.t@!<0`Ay
+%"K\G_'AA8
+4~$!vZ	2=/nTm%Ưsq~Q<(RJ(?/E*HD]J4MSFyl٧J'gzjEtlmR|Z.Yy.&VħϤG]emӀJԅj.$}q|&cS#$]Lcx<(l@8ڠ@({
+?8:̷QB#51~/Onnozv& |'@!Say!,^QѰaW1,2p@|~䱉l4?o}h<,?-;)mqa~.%QѾ;.r\npF{_l`ߓg?pn%,R2D;9O*S$jMI(}tF[m+H:XaG	#)Hf,v``9A*O.g/%ϱi/7eFA;Rȥ޿:|O>ߵ~9~s.Q&rE>*ާ]Ѝ_v?XRW;cɳs-@<2H^6f?)uѳ6	I,6;d|)|E;8Y JŢ}L/;Wo3)jM_Nt3='G}C]w!n+6߄cWj.RE֋U#^Eˑ*t!Zо/jCt=3cIM(؊nf%+EZHW/4C=sJΊR1ܖ!eLps%SO8gvXC%XI#Mؠ[,o`/teb|hZ>4O5rJ|ާ9O{ieQ3Ǉ>g|n5zk.!hm
+(W"@<@ˇ+ `J`.*x:'ஃ7cX HWr7Ip.D/e:I/ 6BH{ AcH hD=H5C9à!%j|g}w}U-]<p	~~ey]J\;\&ABTIiɷ]mM`[b/'<!S͇XnG&*uWmW{+zoMi)G'2De5D3`.?Vse.}d]L-/^{m2:Ae2ې`WpT.6!>	tC<x>3|VL\`fg|a!%Z,)ڦ_\Z鎠(L#) XY|)o.]NksnJg5^iRmʮcAۋl+ZqJxT]< ~ʓ3;(m/@5ÿ"$4|~pz)CJ3OrvFu扝#=3w*Hl(CѾߦ+;XP&V拉ոǟ_ňfgSjzh̫Yme f=g?L/I=Hom/88YzsûfGq[0@Bn?ˍڈuT02R/z/[s]	iM$EG9<qm?GOPxPzi[B/pĹg(7|w%|ϗtFx	;{m>2Mӫj͚5=.Q>;SMr'g5uЕ#|Uec0X25<2VTt|UГJ?*dUr퓉5
+6_ذn}C Oe.;ג7;3J'w1bB##6%@&ar[Ѫ4:*MWtԞ)"58[vnRt\Uox_,_#h=mF߾v/TiBA) y-!37#n#J1<w y2` g2D,d](F"p]n"hĪ%?wNhE{mX܃Qhp -AIhBi0R$WBaFõo+:'$r}\<!L"D.7XnW^_N*7$Wf)<{5(ݞInt[pWS:f(M,VZL#ծ*XXɌk1LwJ]dq6OPJccLK	`P9K YlP	cP	>(BE=H;p.Kư?ΉtɞL~T.	\69F	@Y Cb` ,d)!-W)㢳zi2"$GցR`Zj}kb=ϴAxmNҋV;[;v0ڱ\M$%
+w]̓u):616ng> Ö?avQ7}~;$o=LՕwx	|o"OIT͹dӰbݻ^K_tׇEH݂xeMX]50J"Juޥc5L^[wq}ԍDgOHt5Sm U2N "|F6	 pƲiA*Oacw-ʷEkRM*SùSƯ%X\a9m
+vLe&;?hW^$-bYZk6LMo9JKu#`QZ쩠$fMPdQǚfJF,j#ΎdbeN+YMJΜ̯ܡ9`3Gil GX7O3_&?32s)zٳ\#PɨB6K5."=f&
+gush3*,v,%?$q6KP{;wrVQN%9(Cjck`l*0YZ0K? ((̠.diKww+'<y׋[(1~+M#Yx<kp 	PrM
+ 㓟kw>y3[dJW	\6׹Cx\$?ozO-v FHS-I2]DIf8P]e3bܘ,KD)22YOaid>p+tӾDIc4C.Mſ-Z;\6wl!sC-k< R!tiQ0CepKX"<D҂--MpDCe܅ay}[h&NSfG]QzkܟY?KO(#K1lF2%qBJ0	!TUcrcƸؙ$,p#[>S,.n׺^΍ -[MI`"OĮ8?(	rn^i ?X!Hʯ1`q,6 JbO/Yl .Go[/xӅL7X%ʓ=SgMm\z|C9])(XAqfRU5*ؿ}C#/    IDATe>Wbw#cK )[I׺Dn-Rs4yj|%}Ңˌm?Q3GgP{_^L3JWzd*x*pv4Q'qv@w	I)hxZHm'O\nL"yUWz뭞=ڶ}iW1}9߄	a6ѝ|gKAqҖrn,D2PF=]PFbriaVǺ)zqU&#lҐ.)IK6O!#-}Elv0jL+s4mն&#uMsw4Eأ>74fv4͏^7Udѫ46D4TϨ93l`+ZhSJ}{EyqP`peyA l"PDd=@C*a>.x0|
+*(!@T5} ()14%1^rzŖXІ>5xwt㍭|;n:nuJab<GO/7
+<`YZCznUpRQrjRM|hWF$WSb]4e`sJY4_ŒV6@gF/7Q'f<MX)Rb_q9a~r`=< $4Ȳzksv[(T[QD̂?fX%PA^4D`
+!X MӸ'}e<ǺG~|ҿíwЄʡr)a761>
+Oj-P@I8ddIZ!/E`qJۺh{$ٳޗl;)0v<N喕W'/drkk7<Q
+JW|߾ѕV^i6ye(} ?9lo |sDnj&rCE&Od hL1i5ſFLMk+S Dr/vl\zY*O:?TO%af@w:lWGjl%[;T4{RJW)	k:%׼Ou	mT>qS5}^GRUw'ri#|Zs6L/M6Ϻ7׹]u/8xX`-'[{)SfPyUj8Ofd R>?c3~O|yG7Q.mfYWշ_җmgqqqΝ߄OGb5f@P(zX+$4-xjmI*e.P@(v$+w:w/lC6xphhi
+9%6+exhw\
+JN[w2C3Ӛ>55G(9}	y*rQHCSUޤ$%12`"x@ic۬')2ڱnǺoLnR+!M s0<
+B <q	
+
+*\e7 BK0$-@`D}WráҐP
+y,W
+͔D͂y/FF?pQg
+&eʐgZ#I6,^.3h<7J_v׾cű[aaTn6sWwUgQ~br^]jw2]׃:2"*tXtf6)&0oZl ))XdmmCq#my4$Wo?:XS./f8<qf~	iAoSvrV".B-:3{H;1=t[8vO[{|W+y1#	
+FemGHukjj]flq x\g~<_ksJ1xEN&/#3cۍA]f&W4*oPj̀pF B5՗(5OE}<Y8P1Ζ	 6puERWI./f6Y/̞m@rwvQal0?<g\M$jiR(Io3ZӲ<z[}u̞Bad]%*cn9!1؉؉ X@AH00}fo}Y˵\Yg{ݿZs_%Vیu8*S8{l,%@I.H}@M%&hZ d)t$8o
+2ڗz1BH[kF\md/$6U#<{?#}e+K!PF
+Gӹb}QйC\o,yI=HL˓)Zee&=U?Z?N/Xm]ɭ%!~!FG}[p	WEYtM{	\z饟>q ngVrmjz8[?l#3)祉)4ؾv#FopC/XV'
+uN3uZ{BK|	Fa]DϘ9bo(G84pS`kU{ς]#DQ
+}U9	8oǻfa3.{v5R`5j,8CGlVp	Ɔn(}RM)Hk)BDiT AsTt&C>@dNGaQp*Hf j m!^ `scRӖhkH(VDQ@ܟʭ?{]cog9Ynuq,||7;(T䊇
+ΝTR1+G6Eȱ|k}'xKIqV&Kc<2nbGBenu##\Xjeɞ=S$S(XbljLpNd&	h.HRBTn7֮}?Itl'9V6pbyLa-V!jk	%d$@.r (h0AX6:1#Etbڭ05n%@<|8J.\'uNIQ!N.gųKB31N=ʭkgP
+ORڮ~1>(sk=G{7DK8;XEwëGHvjRy|Qk]߹:gt%-ij%ǵRֶPSwDLws{HlaHLwr3Qu[9]DIR	1ZQ9lHmؼNnso&?+ FhpE:찶AS32Ȕ)IǄle'eV/K67͑Ǵ\m* ?;8ƺ5us7@F]W<7#*S;OpŅZ_\T_v-_b=2LKţ ν{W !'Jpզ+w8]UVm$&zcu>;Eȧ)PZ^==⑤oAK?Pr؞!u6HMX3jʒr/$r-d$ԬUW&ǕxLdhW±1fd˂]@); gghv#|Y$	IOX2;dkl2D	VM6KR;(yNTpitX&PVV2@k2e*_o(zJڜt㿨'(~b^p9
+MJT/ [5 n/@'.zP9`޼bЂt{^}kAX*8HToGY~_n-//}CE>7+OtڧJ]YvN?yskJi|ϽPx`iXGzˊm4]c5LQ),^dߵgzT/@}5deXU	h>^#[(FtۼĊu3<N
+
+X]@++6`M^W~^
+^[KS˥뵂_:9 @eDa
+Ǡ%Fr0<Sc1#q.nclnu[O,-!sSs2@j2d99zQj&yHbc(:[})Rae8y_](-s$Y6AHR(.\	:F!{mZ]Bk.?P-:SqQ~>#mCiƔqN~ZY<RM]t5W[K<J`MY_סyé<}5^u
+:OI?"yy/$otiׂ&R-9Ue7<as=I`J3A~HU낟z	eFg7UwCw^NZ ]kEy+yKQZN
+vm 2S+j+ ,%Q?QL/~+1uG<:HϹOK\v%mBWJO,9wjKJ;|ofj~o!{?r_ɯ?J,X%*5QY
+8Iκ:ˉ^VKҾzl6TieҺN㔐98F_0LN-tMf2\;j"0ۥI-Ce{sE#*9uޠgvYaBA8:9〾J+=rsLzȾ.mg$'
+[65e،~+}u*OԶ{S9Ͻc^\5`-n08,D
+iʐbxs Apː= 1؋ 2[w/@FP>uD3x}̣_טWeJ8:ƿR3~3џ?z6;\p1\ |beT=~fiv6zMZ?w,8yxs᝭p1W}}߰:3#/?7dFq%ֶ0syZ58]K+[	vNR(
+(%K#dQg'nr/}eAlJpJ4{aw.&k9@kp<X=(4>*FpPt
+B!0*Ag	c  O]8Zq^,\$ztޏd=*'ă?gJO)7 $I;^){{,p4A*O"^Ճ^,?-Wgg4H_\7^#ݢ{S9#ժ?5mRI[I%mւǟH:2&75̥-iɥ^9zt{[׻@>oל$Uggٞ{jſM=&hOacXmsbS){7XW<IݱPP^_۰`G8=2P4x<$U]ҶGiWmʙ:lW	N[;iJl9ߖ*`MSTm	[?/>3u6iGg:z+ꧯbtգ*twė?%H~ѶzI~f(4JH*ؾ}^rGIS$6StV=f4igުV,:kR4DFU.63lrYM z`dTo	BVɉ!$!v.FUrʰҠ[+t=@ְSRo`ӜFX?c7	ezS4=~c>Qck`DQǙvܘ1rq۔xZe(+=)
+>t<Bc+T6yP	d@4 I@xdFA*e!#Vۂ{m&zClLc&M#u+	5_b;V҇[lyX#pEe<I_Hk=x\]pؾ~
+F ʎH3)rMetGlju2z0@Ob=RmlIYUa\tfpvgڔd`{B7$|҈mK B 87-mEB7
+au:f2C!t/@ @8]$*`LVCHV' : 1haqaBнGm:V!)9Aj斒yő:Mi?'e4JR)T-wʳ_SKAZ+%
+?V2*sC2	,&DY-[=(X5ҶK~(q"I2=1~-Hſ:*S)AgBU?{n~%*zy	l'<k}JrՃOG,LJ"GTF[	\۠<S`$Rf2	
+b@neDwpݽAQf*'Z)?:2KbGziږ٫Ѯ6Rbs`$ZvX8Q-[JM$E䭩b/we?9?P<O(yCKnp	uG$DYA'}9'evc?$?r3^c~
+?Re܆<쪀%|!٤(hkN{,SUjhAϨoevd۬zvC-M``f۲F8aE'CEYKds['iMJly
+teV(= 	bF|&UkS=*'i?)Ԃ|k T[^g$NTGVo{ed,2NiF@ACHV3tf6!J09#P	0.AEB܇SA k	-aksiT,3nfخ6GM]h>ݼ!{l/4/x=ُ[ GrpR
+y`i!vM3}^)D+W||cq?W2-R,('z»KR&/0M	Q!%&, anYևK0kӓٶd
+ !Ynϖ)#5
+?]x-|Tuq4~m (BfHhLaF#cAP1 e$x ^ed)[culHC@FRY5ّH`sڍ/[I_7R~g,Ou:_d/Бi^1Jۂ>Pѿ.po7'DLT+}<N/HtgEy)-\/}DO_M'{p-Q~K&̑;V_ep]iZqPd/YM/v!j'ЦJ\c+y%=c#*S`G^;^DOn*[$*{7j6؁w'#>'pVji^Lu5;#3
+?Ғct	L1':NN~X%ߤSjp5FY[L ~ّT	DnmUNFx"UezjF##w*˭u{{
+uՆALm^8[q߽9k[	Vw>*͈0-}ӥKS>c+ecR-wj BߋZ#?˭ ʀY`I/pLyleFuI2{p(Z@i    IDAT4q3;]Uq`<B(y6ao[sPaMBl1%} $ݮf+sȶFYݥFX4-!̬q	Y(m9G8]u\??H4Zz }M,Ϩ_>G|W9%Q~rι+,6crd8spCBq$ܹrf@,h4NDB, G{7PhN	>YDkGtn6-fQ)Y`E/HqK=լ9ɫJ⩂{c-tW=H.{e%Q~^;;<(Me.tas逑cҗEUS%ƚ*f85rbYIȜ1st&ݶd82XMt5,	!ڣ ]MJ<_':N抇kݔ/w;]A(4ƨOBe:wa,"C!T
+ʰ>c4=>N^ݨf~RjVuؖO	Io)*A%zr$"!!C.yW|'tne:'kr\RqoCwJ_jw
+R;iwҥ~Z飰|7&st!mM F@M5R].FkE(-eOx`ӽªBxڀӥDfɹH*f[=ypJSb뱪s_??96e <mH롒Whw&zkEJu.>O_J7R2p]AJ6ZR3v{rsI<fpJ.m=N#F?so޻*ug:?,?L[;2Ř`&Bvz2pO)c,^4=vOI3˭\@<"\>OwCǵ0oR9;;]5-ɬ	w̌@l%kNUmsH&o΄d\4CgmL_##rBf@䈹J쑀/{VR#.Pv0uHyD%ZV[a1ZbGĒbMglYIb<n+}@}6>3֭x?Q t&S'ZK9]rӎp<鼍#,:<F:!!(ZqsvoЯYjfZ iFB 5& Nh2EiIacJٻz|^͗Hku !S$.]LKC;Fi4+\F[Wt,O;*[e 4cȷ^pmצ "%A~+;ɓjm:b=20|"[AvՓ|T\!#X$hӧI3 &!9`da)8lv&gX^w#g]VwUkwB)P
+)92 V@(sAKhn@Z~
+d s[M;uK,kSN	sMot(!fL	0"iF-^)~F?WoaN]k(}}ϝ_@Hꦯ8ew'I~2͂Kkŀzmb+iF{˹<aqf(?O<g/o%veFɭέ{V,]Ԋ=fb2#,p饯(GVVI_J|-|KAcHMU;	M:'?\d3W)8N){l
+JrFb?^)|qucٞb6`z s%H_~pձ>]yeECͯ>~5.c{5E{7)\]_*^gw=R~r\A~ G-p?C0u9Kϑ`d!Ii.mjIk&E>I*D!5@@}ҴSg!ok:"icfZ09cw1+urFڵS8%2jwY3ʎ_#8 ^L@ +fYY9d5>'22yn
+K|z)~D?0ZJ(6pC\BJ:ZYBr8>|PDuSN-Tfjk?a$&d	F!m#: ,((Y90ʑŰL0\P)]<2ݼ)61?g<>-H#K1vء܌j<})y]ofXyG:J	@o)I|7#:wՖXn\nlƯ]SNUΡ}m-.'Af}3_C-PdY42&bS)O"ˬZRu\Jm>YZi൒w ѕ8{qiWg/[	8ΎNx@}$i/6/LQJћ!#nadt (8u+`>Fnvz9]q@ڗ7
+[~άjfu^Gt:e+ Ѷ.bzƎ4Kkb\OBLmvr/\Zg\=Of$O_Jim-D0Me	uneݯ&O18]@1<3xwZxR$Rl-G_}XmX!e5fM'3?~"B#g-,E!$XakW:iHw6UmkriM-Yqibjm]HSQ_u-:v)HJOܔعε56 f{[Hq`lP{Cr^}uar')rs6D%0󭟯FHWz"jx?p~?Z~+%I<HV|9N.h+mgU4qnfrS(vt8f{O.f*\Z_z(wu~H=ݷ-Wҵp߱)ΏӋvo+3x-l:TiC8qRK=tt@D/J6|rި}&5XXCeAM;ߕj#%+R+89] 
+5f<m%vϳyם,us;QBBUY6ej66NHX&/`nd-X Pp^C(S ,V o#("dCPB{{zO_5Gۙ$y*R;}ObjO.$%m΍t7>Q[ѦԽRЮ4N=oR-=4뤯,g|XOt}Yw]BRLqZ9F_a4]ydmuruCY#̣^va_/'9]酔F+syBQ6ë#*CJK @PΡ%ߜGHp|ExEpN2L@YpQD,(xEtۣF.+TfM\\~(}X1Z\n*pI#,G_`w:#ă%GܽT4߉6A9]$gyޭ߿zgỿ/fwkHɀ~ѽkbiƫޏg/_ε~3'/wKz6ap+q^IߴS{%mKrY7t\?}ņ{_a__[s]MHAհ{aTObÖjle}5Ugu
+kEI<.`kTn5V:s!?dA[rbȽΗb,8C^soLNQݻte3S=)Sک?/	.۫LI۠|廛C϶)en,ϜoP	5q|s/D9N;J{}J_>5G(ikS+״e3H9'*h("%@yΙeN753]@DT9EJ0>*12c$bbF)PvHç8mGvm`RX
+T!Sb{j$6rL2)c)@yhؽ;;<ς)(<+(Fzlz8{E.|_Qm`%!tp0,Ak!cLm>>+[#֐<nPt"(A{'@&>FsckCWFJg/%qHLWͯ?Z#ξ,(#h0Ӗ%>'ܬme-u3+JHOnOuKn%z$&YN܊_ =M˙qs8>pJABe!6nj[|G3['\A̲!d)mnǎX2C [)R23U[;w\V.}Iz{Og1kⰆl<àV2	t@.(C9q_}j5'-E<{JvJ|N`ױSTŶ9TbZQuio Og-diT<~=/ӗ.'DK%Q[W΃eT|VJA~#ߨ?4?"p:3uHM{ֶ^~G(;/W-:IZS4M_g9ti<^,{q/%@3zk7?~ ^H__?m-/3ҋsbEe__<ӛlu6~yJM	<ODj@3׽%7W{	CL+{An#ͷ~ O7LI.ќvء;J{l<U'tʌJ3n^O-|Չ>@I T.c1ݹa]XvO.%ϹwY4?{mROJut+;Gп^T+z7=CL?i?~װo_uPs)ܞVï2b:ʖUA٥nll@&.)iiIE`Sx)8
+}dFcX#iЍפ(̶5RY>ɈW<jGJ ;ln4SZ X>7cogU_+=* "آéYWvni>Kސ꣬-|'X	g{Gi:r7E <I `%ҧlEl^X>(Cq9	]q*{h`ge5I|'PrKuhI]vuEmepIΝii\Cj~ޖ߭lUقAIHmc(K=l(v
+鵱ZψDL۰|vdYln5-dV `gC(ƶd5 b@M]8(V6H<2CIrRRkJ_n
+ڵRU	?yuvFcJ]~␅IYmw<ZtŎ5B!]h"]ϱMXk@)A]R`ԞZoK(.'|b̧8AM6@M.b"ut[^n\oQ#ulge /z<dxB}Av5Sz<G{bcQ~wS~~N.OKvzEe7d:xDKkFv$໓T# @<1'j3em1i.d'W'0S=!PW뭙p+Kb!~HA<]pZ{XpV:3k2}\z#JvvAٽ٢nzc4vvnȏ @*RG=s1Ef"$`9H/Ӕ/L?fiO_;g:צ2yfs}ڑ3jNR_HQsB*U^Sp~wCr8/##~TjܾTSuTVPF>}b*][4CQ?#m5&,>[bmswQɰ3D8(PnX.,$#L3Ny`nVVv5!})iv|eSXW2lq6yMA<S+w=Tmm!b7*_<P?qjSv/)WkPQg1 (@HP)EE8Fu=
+A(kz a	E,:
+Y*Pmm/?GHVcyT4Vө]H#Tw48DG5UU=]-$RI['5EɭC\:c9AITr)g,X(vTA<cӓTޗ6# ]2+H^PDk$3s2JYY.6Ud: N|WvrI"-sIRt~X@!NWruRZ%MHB:%$|<5Ezhy <_	@!{JB)BK	~AEɛ8;|rQ E`3琉md'C};S$SVm`6lu5;73ŲXlFP;t17UklT7A7}}'h&Z^g>>TD*O^WH$D&O,?զ^іŵhV^;OsOGIВhI	?r2`0rm16~6c",Vs>qfcYU~F o{qMo G	diDa6):S<mwpxCл}# cUw~Lg9{Dol[>2m6rÂcIΠjPm䍞8<Gi3ʺs1fm`,NfՕ6's{:ֶ)؀#~0gzw.+or~u6fqw׽=SG]y_V^S??~wg^^-EMCyu/#ko]?C勇V6NQjeVN _MFDه׷umvG`Z{lhOUfygDfίMvtA)Ii<1c(S|CsHh;>Qe2'b.$\2gh$x|Ԑ3jb=ՈĲ&aYۙޣmP{su! DXvji	GUzWRwn_hC=XoD|t Z}_j
+T)dc2Hס*@mD`]׀*D U@g6h .  &HzI RTWN`J))*lA3[Nkݰ?YWcftlj2D>;,(/鹼4SX5z{KvW(۶M,ٞ"5ν    IDATe<YQCE)Ek@>÷q@aMl9ͷRvr+cn:5݀YVfsEX/|SB"0QfڽAU	ӝ3PլjAzk'Ǉ*dC A6@ hoZOP,NTk0$~cG*+Q[n[kN-V#Xk GbtbqH`կ.rKBGDNۻe\=Cͩ
+ 3n?2L pA3͗h;'[eX	~aCŕ
+᫹>:?1嘖z[ۻy\=]^Bۣ!_/e#Log8\{XtM M^_\qu5v}/Ug#E,`Pfz%U @b"ͿA{azK5ˣܴz:䃑s'u?򅁼I5iםi.?lakVA){7˫gxZ=|i.)13Jdgy+Tf3wUc;N-{K}Mq@4[)FamG>o~v_iYZ%/Gqā[)cȆͷ
+DGg6c[S$rmlŜ
+̳'4IieB	m81}+y!L53.<lbZrlXsw.im7RWTW3Bf;.om+toglL$jphFYӞ$/rKSt_s[PTUYhl 	0p	!B@ЄIƽYUjlg)5^)b[2X>㜬ٷ}nN}yp PكU<aabb(qMlҭC]&,8CXnlTڎ/N-:PgI6_J;ۑnz p(- 	Z\E,LlR`'ᔨΔ0i&HDhDի.l[%5S&=K#KĕX;U=h;[UV.N!VМ^*-qsd*pHF!B _FJ93 <zE\!2dXf݇NYm-T12:f	ӏbܑxl	+ŀhjidoT>'?UQ+'ĂhSݽ0{#w-78B  rP^;ogzӵ9(lX=jO;$+:Y>7+snFRdX|R{P/'$XNv*vMlM] BbR-#ӞnG<>aX6o!+r|jQuŴj Ċks%+dPAR=-W{BX=KX/TzgaRv1g{%X-[OWY;[{qBӒo5l#_J|8z寳pızmt7 r_STW;̶QP:#F.f{'~u'\I~:ׂ/-F^$kjc;Pn?X<fK"!Cgj*֜6hUw@R?eZ$#1p>d8z.BKhliLPg5C#38319?Y鱩OnKdOdݽ-.l;ʫ;ǌ[M?&Ѩ|Aު6Iw׮8hi6nE̴i;΃Rp]JǆrUzaM[ĮzW/&X~L j`xh&Ac =MQ` @c&=@Il?hdac2B@'7gũUMYjѐa7ei?whA# .H=I.qg/I3W5x,Ns`qȮU`:|k<Q=:1i!o@qQME	 bΓcX۔loz_B__A@cg|u%Q(zsg?"'J	~P=qqa2'k ^r<ń82LqF/HJʶ|qikx
+Jg	,?CG.	6^'ӆZD\])U{Z/Iu2c˞x@Znl[^ﰬ4[$VڑsH> =uEj/U i;;eUO6ZSu5Ǽ}u\>@w]~,M5ܯ;|e T,jj$ze3,888;;j_KZKs[$fsfN.2H>"Y@X>~W Ԃ/*}{&peNsi	gcwH fD]!wѩ֧26nͫy>"_J+A~z_<ϭGMqc[JuY YL]5[{{^]Y>Q>Qnmg\B_4|MwMZv
+}7G9FjM䱇ѡ|us"ȑ42T,k@@
+&Czl:[LtNU󨇡lBvهM1Χ<)1{hAKЀ2#(ȗ3c%STfִO 3󘏴YʇqPEz,ȇ ,4^DYk[fߘ"!*hB EUQ <>pT la01xu j1Y< @"	k MvHq8_qk͔9ߑx޴Ɔ=]:.aWiG@Ͳs*qC5> jR]M#jWiU_8s8i0M UR:2Оgs #ClxqG;Ҫg^aE4n٤\.lld*963n-˖Cվ1  M{`me PKրY@;@8aA.!| K0
+:tB|ꬼ.cAGDN)
+~6f:@g/a'ǅ&vef!=.F:@''u>6l9UnbX
+֕LPİău{/l?}{R>7DA^FuK
+>AcTzG|Z|6	hXMUx8UH~jP\XrL4
+_< {Sexl4W<|N'Vvm_Tu :tyڨ޽\~}I]Pޛ哆,ʺ?3ZJzWtaw'Og&̪+e 9r6l
+ _\qps[>h:_>vws */XՓJ}a ~Ͷ+px\UzmeqnH~(mm')53nmFfϿiW~֛IneȢU}Jr˨&-1qꔹ/`邪nm8=@x8bA|BUíR*3.N%ԝeeM88.Z,%EՆQaail˻D~`kTo[XRRFqmZ/(N~1bCHyXF-9%qQlT{FP@ou>)@ k`k	T~&!h x5: (2.I6>77v|R{8_6q}5 uuFȚɊ}OٛS;Tt̐l~K(
+ b)9MCYym&vcb" 0J㐅|sB}7L5/ft$QBՄk(3ZӤCB9g:ȱ*'%\US>.`k],."Ʌs{O_|9/ؐvUQ@yaݎfǅͻ] 9=T	Oo=:U	k Bg櫂:ν l^=cfk:f0T.rCj@.ȅ)M{	g04YZUԙrʐlKӫ.,.c[Вe!ߨ|ϟn^ l,K/GN>P#0;[jR]`C7KWo!	P&TzW,NUvv[gjolPs\~PXPÑ8<|gtkZemі{_ԅ@Y+ޖ*ew3,4mFNSL*츏tűX&?7u +U ԓZz˻1?l#򾒖Eޞ߭RF.důe<y'+m8yu܌^ph;;wjO2KнHY}q*Qܮ&G>x$2K{xiZ^'给sϏZwط9*1.C\lpp΀p{NA dDĐ;k8x |B튂#NY0
+Y+iAalQeg*-R1Ys!BpTl-PޔGXANgK~z\>'*}.m 8@_W8Oש2DYΗڴƙWhE 3a ou	\@QuI5N0I
+L	C 
+6X9uYZOgŋ6ۥx(o[WWauOkʅx	qkK.4+3mkZbeMQ|]Eoj dLie	M*nke4fx'ghONMy4;sId!d5"sD$V23Yv/
+.qx߰vjkɟv꿫4,ʧ{Ν,{vy/鯭0gހs()*#] BU0g4KG̨RUn  )׊|+gϛJk8XUfՂh.4@/W5Y^	#E
+\`B _`H pP ԸuX`5]]ENIzX=@po 9c$D(ͦATY6\/+͗+MY
+C) 5(Tω{<Q^<ך4M9׎J`>.e_G(+]6T5;GBLQezs WfKn8wi;hxi|_<BĂ|X
+j5{*q`:{X Mgz3ظ HK_=8zkJ}LΆ PO4_وfmvoH9UR|tg(p ⅑IJͦR]_z9‱ pNH| (ޢ"tCQxyΏ8K.˫gD]_-hr E+?)L݂P g gDbkSFu{ MԌ7y Y88RD8c1U	T4#}z4F1 P0Yb 楌p݉-9U=wJ>d& /d7VvݾZJj~CW<8wmL qy\3λ.j#s; a8(BuafIȋ ?ƌ*@80\ 0!
+k!   2x1s!Xup}bl`0(u %:a.ɻ<~ Q,W]mT0r #&L;Xߠr:YpI 8bnISW2Y0$ Y8xu!ôQnftn53@@&ytqggTX $.`Zz#{ZH̊CxV钘!I ex|D=em^j?]~xjݖ;!c\[`4yG2@@MƄ@CA_? "?8fu?,#n_3:vy oTF'})lx8mh)}p=U.'DEŵ$_M XH`}:Eih)đ3ەmK_pK=qX򦁺hlͶAu	 WO%ߎ9yYnrVw,>em5'r6 @bLK~ӹ#` ȯc3uNb𕱞l0P~u16C+31$}6͢D!@ 0WvMvubxIx%OVYLg%<m$)!h77X,A}"_ޣWӮ5+^˟[vτMWz8=F6wv㍆jB^KSVY[kpBeGkl?г	BLb${*4` ѯ c(CԇSX`j0JLqm!lNQ9Ƿ!8*5S|29L-fdpIݤ]~\XQ<BP$V"bIQ._fSavJkFPnScjGAŵ'k `MR9JݘS%H lB0F1 H`m=(;@EQ5@|ey@<j}Ï77p8U4WW L-yv){SA9%p҉6; %!neO0-Xz28j~agFQt6֫)klzFXS().Hb	q4 ۩Xr#r4 )Pf>Ur@i/9._/qrdSWIQc'5 ${1sI2FǭYSyr֤U9κf$DҭB}:*7S!hȓ:r0~w{곎
+ [v|4uե=ۀf*P$JVkP.rh:(aCB,1#s)Ű&elS  V,u[S;EX[+H6B>?\oY? CQn}y4Bqc鰵O7'ՓF.?S-,6O5瞵RHQ9>3p~UkIa$Ӏw%K\@8A +h1Fa
+	4X;P8>?=>Sy?<*Y.+ޕ+lޒWW24s' tivMG. #UWC&ۧԮʘ9s>bxUKSUWNɠ*8p?}{'~R06r叕٤]{53
+d FJ=IUWvR/l    IDATICas_RմdAmN:1Ϸd5=bӐ
+Y;ENŸy@9xnNmG2%.>1Ƿ# FGP9GLhB(l?Vqrԑ8m--G<CM̄LugoT|;F䃒l}'-^(fmzF%ƺ\$  =8EYtϜ jUdTgx5/2C: @Xk9ό!*A8Dms(}s|VQ]<y_V]Jw&"5qd9w~&m
+.܇{ڌDd	..gƋ;1î$0u6ՑG/#zMkhV0f=zd]ڵ8ւ"ٰ\hZ0lĦKBEDE/YQu9B}ek-[NYrcI<O<
+ YnfQ^+qRpQc>ku(VZ8~leS'^U3 Te'/s(Kt=ʒz1x0XA6v\ka]2_YxQ'^&+PYǏϯ*2صŮxػC؜ÚZ	i&D3'}Y&^喵 381KpbyoejG1 u3t9]*"$3SwK%rcYlTfz{ f63uy075QuW?J(_?:MX}Kr-}yOR^{8o,/TMLVaGniZ%yMyxlznl<QK&3ᇓ9NG%Wdmg\$Uf[=$M|fb.p! H[zosLpxn(Lǿ[\Y0CRALmw#QmzcZhkApJf 2}Ly8\^>cn:c@#)k'w }/C顼~?,/IJ;&<OZ呗;sFOi\XcHOhŀ(EtHkAOdRpJbApg!-F-ƐbSEVS^cǄ@-{ܐ}I'z!JCƉ>;rs<h(b"GB&~fi;>^p|9-^0R{-k']o?Y^}	h<8gyAthy9]t"˞Ӟo4Af5X~@W]9^O{ =0DSP C>,2@PpCb@lւ?_t4_֨#*uK ɟ?V1@D0+mlEG)j}38}j+5?}m*_DьCDb[$1U.Bp>WAÙRM)M l-u6s<GWbhL{<,$u-%k; >)z₶ꚴxq!+ci-H.Pk7+=oJǉ󌳓Y;Ga]MMx} L'izym#<C 5| -'K~b%}Cz`]1)HRZ!(>̦p7/A@oW<qX"161&e>e3,Q.E7lW_r־Qe5r)G~$4Iy)X@]Ij6._1˴zM|NEʹG*+DS#381[s!5o|5ջw"O"xovx|<j`pv*QOQ1VO- ח5^ŋbD{ْݑs{fcZ='['[oLmjߖJa	m|[?8}m,v˗4mGwYPf#- ,l=aga26fTɟ{S#Kk6iXBZ
+'~qxW<?GC{"Ye{؅@I-Z%e14P	$F)!p#f8x @$VƦ8G7nTbB#n*KfZ@AD=0䡓rœb1O4D18-dՐN1H~?򾱑/I:*}&~:QVh7TB߻1~s_VWm{}ތE PF'n 5  FCQ4hP0 ]t	`^E@8`҃x
+g=!d	f
+AYFHgH}[JR=-ю߽6h|/{KRbvZ:
+2 зGYpV.2WDcl;-::`f	@'p4]ZCq&t]YPgK.<V6P(J%m6aVZF!`BMjZ hb)zcPČ]6Fxܒq2Q>_07(vQe?i<^F) 㹷'k xS_,X E6z+ԣ)1SE+c:JX)u童d˶裑Ηi4"TKqw2ؒVO&0b6_BޣgάѷZx9אf-X$ 5y3ΡjReW\c [s¶,Ǌa1!簾WsoJX5,"M5N-op|7یgovP٨n]ft)|"1[\66$q|``{G6Kj91̉!_Qn\^Iӻ?G,򗕶a+[lqbMy|a!غ8U9lŗkWkPsse?h~PMEmݣzapSo?s̋ mk2;9۰^>/lERq}um[/ޛWWWfs}mzlE(V_寊ݛ8nG2iFE̬k;%~y5/*??(kcw*A}{@9!pjA,9X!P`8:b9g"q1r(i^M-UOUV֘\7G޾|s[ir
+۬{f@dIŅdsO;z y' %iud]Kad̴#m=KaV='J9?'-o&E~ ӷQhlHFEN C0^9DM$Az@P0 F^ïb08q6  nln;}佈J' vvpb1<`}B\V `|.߇-Y! % T0jmC~CĒ' љ!wa:UEm jKhk9Y(GvC mQ&<,6\r}.[9w~hrqGg#O8iG~Q/*nD۹J$%U@`-X;%(1;7mzoM aؿmԢxq7uCՈzw˛?1T/(mfJ_'%T[  cIs^nq9{`M\to~=yF$(HA 0F`p&&	,DI 2&h켿7w:?[u-8*[Z?Gz^/;N VX`` k#̧;xd33V,jǲ~~,	<fjr:%'#It 0t&<%ࡘk@SљOΉSKT)'%pK98G1M&\ ੩KtmV;1n*fwf1ۥ]܌._)HDŉ*ũ)G @CblJ9 *}k78*v1f~ O*}z%Vwn#C~\:$ѦQ-FOv?#ё}pۂmF\Κ\+jmR>(}|?-ΓlSx̖OL^uaƫ;ڰ5.Isz33u
+gsV&ΖfKʛ5r3f\]3 r/6uhA.@rgЭ
+2ʅaK	s"C61cZΨWe	iU٤Xj/ھ3f Y"e tYZuy	&:V%[1`)GRuP'4Tg/(ߓ FZvPs:w9ޜ.|:EWKsEEV#s@F  BA1 C[!`A`;``'~THx(:϶O u͊OiUW }5^/*E.4(ОanxqJ6#8|n*Îa'Y8N=h܄;xqf'i_dAy0с}CKCчC1pāH݅64Z
+*nXe&0k8([&" `Uyb&o뉩8U2Caž떳Q~Dva&ubCDո8Л8k\~4˶g ds̋ W-/3o1FgG^{;=A8me[CP~p0NR~zp}c&Ym6{4l}IqV/a8s3 \,bK0߼O=ƞ?KsaU->ʡ(N2tC!8l,1aD}ٱq!k.3abʊ0DLy|Q'YHr6l\1E× j=a/ -U<p"=y$fbIQPoo0C"&@7[ hKuq~T)̰!s X3=,QY,ikS5yl:[13(NU[z"ѓL&$]b#Dg^]@oaWOJmr_+~gzM|rR)@7.
+Y͞}b 0MT].O3֊*~At?
+qܒWI~Ղ.vb^@(y6of7<\l<{LS}ה&|%,,KtP4i:ez,nM!hwizyR3	p㘾
++blr\on6cDJb =qBA Z8扃a4~}U:y{CODol~Dq1%亿)YS9/i2:?AL8!#-H+KAna/,( ",]8j0s *2`U Kׄ(v2
+IB3KJ y-$Jp?rͱnH7{Jbtu+ ЉbE9*7霢qBkx: 0ۇ;hvXXhiӾk0K{5mzg⢹;yG 8gps fL@
+0``m>@M{GTlVRuMAUB]TĔ=/Qxg +
+jŏ7fXeF	XQ6x5CG iJ/4̊Kq,kO]l?_cќ"FJؖye++]E]鵈y~#qkx_`Oһ&LC燱Y{leMB5=>9<W 0*.LJJ,h~ԡ<nNUꎙMm+#XX$R>nxľgY"1])D[n|OJILGjSWmUti)߰" j
+dW[˖8NljK,c%nb]pw--S5C&zMW]ULi9߸TdH ddnG>WmrPMΕסbϾ-+{7,oJ|a:k4JNzBZReح*~,,<y0FUwnLŶ,׷\$Rgڔ>O_`)[mGާ:MKlxY_cx?J_9rL}6Ѳ9DF]ca7
+Ӽ;gf981S.fD`6fXSf*64oj0ta4*[D.KrmgQ#V!,# Oس5q<VS 4ޤdLXHW-L~'rR?yb6U.+vtn?I	t?^-{-q{a8m=5<DSW2!'uNi
+q|e=9ٛtAʨ׉GfKk<ITF\@҅8ژ!Ġy
+Q|߿7&B'r}{͒7&YdZX2뛨 w]i!hȎ/p2- O[9ؚkHpd6C#xQ=8\ggu9=g I
+.cOi/G9iF=zEY !Q>Cd$T_B bO/w%WӎxZ!Dj\OEY~)Oũ:By~O=6mAoP/q>kL5o,_r^oLM"'Wk/,7,8~iV87z1! JY:O1@Aw*0LBk420Ӳf|OLL]@߃+&}Ja?7 XX
+z}xuoʣļ" 3l*dTnlp%֐4 9&!pÖR&,haW#%V~ӕҜkrj
+SY{iLd!LzNҪ䵚܂XfF!OX+fzӆބ;iB/YMkK	i 0sӅӫ\CN6
+->/ 0Vy_,FϽ;xo>g51hE\m%0Ӻ-^X)=Y? t\+_;)W<;+W<zC"H_ƄC{[_8k*=~TF6V5ʒ?s_	W^yG>gǍF]*_A1̙\E,ٔuxmX48^b6PE@	NQmЂVغ&=Qekm1vN	'S-y<ݷ3 TE77j P+88UDQ)	d9,Lc>g2>b-_ݐŤ8~1q_!H)ww!  Ȳ+_/y7	,{(6)	yLX`Y!4/~!xi^xAc d]	gO -X,ے/Nl`^
+"|6/v9ݮ|L(S<(ODsoRcF;F    IDAT21 G-уJ#ax~w._a	v
+A<V+tb
+!t[ #`AK1STDȆd|&
+A`7lyo+rDy
+;[}d"*U#plq0Vr=5|x?z쟹y?~3gM^zeR˕{#I1CsìӾOSET͑L>-ΫWt2Ky[>XwkN)W0:ƺsB9ZC2TyUVyc<UPF¶@"f#t6Ԫ`LpkB04&6uƀRB(ОW!T\WlDV:eRQ*#pO))W5]2T^&zU``^$G#$ ڜ*CQzSvXXN/NLV{6圂T5]qzjBH1MuÉ^[Z'1UzR狆|]KLz[畝ȸ8
+1|ZqGI?PO$k?{s9Ǌʟ1|[f5f8(3,آG^-q)CLdĔ[yqJ7iQ~ $/ΙF/.I~8%Kus$gDetttttT*>ߙl.eܐR&STqbwa܀bZdBCB!S+" u=U$]@)vɳZZ	y@Cl\?,YR	B&J;+QkB{FU",w%z&~s\?M$e#?kSgPHCA[o6"Nŕ[Z|` d'܇iȧ0M4*OOFd<lhTd@+ 
+2?R-/GOE+x3DືHAJ8޼~@	_l6)zm?A(|^=Q՝[!}InXN1.ba0mjx'{pa4gCZ7>Á<>5{a2A[t g9x!l!ʠJN blm%V
+7lg":3C^E:S/`8ծR&EGZɫf}V/~ҏb,a^tk&K=u?mcDIqve5kƈfʌփgɶܳ0 r_+N01KjS;8ff){^wT]:3yzq|"7KQkp~/^-!DdLK氂
+ptOArOb 'a j!ϛJ<B>3TytT3jZY3<<$"[dh6b;1Сg-"ô$ϧ8bM~ODg8Y<ZAcBOfck 2` kH~L>fL0=%疙ùޘ5)ƶd0 T1˭ەݯ-~I׺AzӶx^SYJX|2^x_[7XU|(W[Tm_SbHq$d-)E+jo__-76?Xy1G_uUGz9Xv<l<_ |P,О܁F2@yhٵrÒ>pJ<Dmt -sbLԇyz&%Sf1E4T%1zfPLxDřQ~+S>^bTmo/v3 ^_MV/̬ڷ%遲Uu֬8CF9y~)jry
+QaٝhR+CAϕB0i\@P"Ahex`ab?8(cE@j		;&#q8}m=R-}-ve&o]bQq
+üd=ML {&y8٥'
+hǿtgp?mc `ۚp<.i
+h7a Xqזq
+=b;Dذ!kz69wD=t9p6^%uyMϴSfjT
+$|62!\@%jɽ7*RJ|WuQ  0H_9?U$)תlʱ'=V|N3jާsMK(~jN6h38Y]Ez_fwbP`( bSӰY8DSurDQ2v
+)t*| (4 LCҡ}:"G;B+bU4XZӼ+bJ5ѶTĺ^PIS ցMҰkm%HbaS1K	&W[Z:e56l=U]~58;ŖTGoXOU , WKͨϛYBMT/(supuWN+=5ui~a6[b y= ܋ުM#*Ηlіz-ܛ[*k5_Ar-莡k&0l)/No~-/5׏W+]^zmZ@+z/Ceӫ"GıTms$<B|?s#`p9`0ꪫo߾_½׼ߪ+sG>6{߃)C
+k]:Cp`jLsT\V3
+tKlj-]3vr] ZP>nn+ ,Y3euyjsf*/[jxҹan&Fx=ڌftve8sV#%﫾oZ-z ͤ牐j}MyjũBEE1ُQ[.@+(ա㸩ѐTԜ8jtn%(q>7OȁlGXz8_ߚ绺-qȘ% nvyŹc@FyAa@
+LrƮ[*qIX;:^>1%X
+spg F@i_U<EeSWZ)K,0CATqӥC|gl"kU00]CTfQE)8 PV!.U@*.',38@PgXzI>)(9ߋZe%HXe/,{_0T;CKkOrG5Um4U	>I_wA8Ŗp"$C+?u_'zhuMuw)dוfiJoPfس~P,Ǻf,3@]C{M6K9
+h{0";8mSS	:V,hTj"F#85HAn@wqˊ
+H)8ԠjOJOKlFTb=
+id^Q~H$Ԕ9Ը Kzi	EbXOMR(1Qլ=OƛuRKY[/lrf*QOy#%5٩L#]B fILJ06 
+]F@edׯx{C_[S~G/y%ôMe[/ܑ +ʊf/z#*ZCA[1W;$?KvܱDosNq/}I#Bnuym|~`idu|9zd͒՞uY 8?b^sc7}vVݯ%Źx4/q~矀G~o;Ϋ_gO=͛U]w]tEܸq97Gj!K[PHD]C@`hXbBm&WUKRV(4>Zckd3 Ǒ*?)6kB%HQ5ʿ)*h5f=^FOM|YV%
+֩ym)Scɵ|8*]r uSs{,"'/`E,GX^V<Ş{sQl|&iu*tAl,-,'xq>\}Lv=1&Ѡ1j[ʊӓ<G>dǤ|3xub:zĐ{49̸ϛ-5!l ZTQUR59Kt	|e<ߘWဂqE CKCY @1ooWaum	~
+˫؅Чրmvi_Oo>F9eS;jw
+4Q3f$AِGc=n~kL][Emʽ;k=ZOfYLmYeCƔ[[<Z-Ůui~v)1/Zpnv=Ir2Ywpd7nIze_87f;xP	1o
+[
+ lٳnϊ]Q~Nh<ʟWv^MD9ud5uO&y]lFp4Ms,mM7eѤ'E,a#І	t	7h~yN#MZozu"Xj&Rf{|0>Vb\fD<1<&'샩m iSòbMR`@-Uckrbd"YSQ)aAb,X'zLlI`'9KE-`@ua,R[wih*ez6_f8[HskݛBkWrhQr5B!Ł8+/'o<0O_V>̤`ʌ{ݜZ[<n:%?0S O_fȗ|^zR熒6LV_%
+q$.qE\\8ronO#q~?;;xݺue/(
+n͖PxhX RL!ln#!lh@:h>ĩ65ՑZbLG MN<D㚰mXĆ&DQVzeXS+H5uc[܌To!n*7
+~XeG 3J馯^% rʅq1%Ǻs4=:?rѰ8sQ^zmCsZqCs`NA}ukAw,aHj^,)Oq~|c_Dkc۷"&5f:urpc(fySeeF$FPFŢyPA:	,2 |@0߅'L	N>>X˴'pBCqve.a)OaGa}sD
+	adLX-Y`D2ttE[	Nפ@'9h`%u?5g~iTO9a [7-W_4`
+~P/ɵIk]2[ z9`;=燾۞}[t}ڌXQ?ocLŵo7a}|hzRt>eANZ3ne2cBJhF"8&
+ o-]c"*pz.<j(MѾ!`.YhHS)i".KϪAFGVHT$sfѐq_>nkcR$dUlMY 
+¨|W6kkX2Y'JANߤc3DO*׸ ݟDRvAG!K2$W>-.uusܵ`XL՟٢O-v1ڋzp{-cn}*;\6~ =GÕ?)F7W<J ْ&uklOԯT|1
+8ԊxcٜǇ/{@Sw/D<;s}6Qqsam0OE Cڵk[M-v41.[!0qey(*fomt5Eg٬j95Y1)fcF/0C- ܄>o(l=T9Ɋ<-b!v_Dfm֯YP^}oҗւq`	~"ή}Jm|%3ϻsn g,^eLf>G5.ӚK K40ZC}Q No3  ΓU(|zĤT9gARbm=b?}eN^7}.dϗ10GLd2Ɲ'2A@`@U]\57?)6E˰MB;3XDT5D-z(-p(z~L
+1vӥGQ	,"'lì~"=vR o`P<: kg"!K H+ 7|ެȐ^V~âLL_h6 *A5F]dK@Mq~qߖeg?s壽)A	-K!lL(fG>R_8Z{ynv͏ ,?k幞\$S{1HW+r&jZ?]fm)66|6du|yf/X4Z.Ý	LVByah[Pk3SrCЂ'4MCS"0`r'3NF*ADO7q,t5O\?[1YUyxuYnjP8
+/r^.@"He3ea%b!M/7zK.Ê|@ <d!: XRB$AxY)x7Vf*Q'!Bm>IVY'^X\'W7+{%jT ىI>̘6#%Wq"'/Nf8s8j[6ڮCT$o_T¿Ov| f˧^
+jLK8,G
+ޓ>5п@9FcL۽ַwyo{~ϑlvJ4 zt؆!j+L`^CBAD?dݯHئ9RP:Ǐ[i5]f}ֲ[*d2]90 kWP 3$j2#LcGcurj5{s+3T|"~wzO>?N3u%@Ύ"og髲lm=XWg!Qzcdg-Zw EwY]v.sh{+$(2H-ZkN 4 B3,hXm""l@QWmyI Y3[|g5-Nx~7Djcdp'Rh6a<Kx~L3%2O?rhYc8!F`2^
+sI|iZ_ 75RX*ɳ
+n/ "05nTT<&aFFEN޾|'Su> ;jD"!W.C*S/r5*SRH /üZ?diqa{f̱̋3.E;U8[f9*C2L9t|J(.    IDATAU'zwɻLui5`iqoˀ	WfҕOfjX0X{  Ʋȕܔm_k,K\aOFpghᅣlgK(+4^ ٥	R8CZŁFcnI,	9eAjޟzCVMMO[sG_mL1$&E&Yڬ/e @da=qH#Yg>;Y")qgxY	(TњHL0~FɰhIdIa,2jŚ1)2y8@`{[	?gJ6ٲj_/1ˊl7SH~,/u{DUyV2B`y;_+Ia-w	֜yI4g$[|c~aRG2:@'}OէG֡;so>Gye/{g?Yq~_[͒_um:XMtqR8Xi~N
+øEOM򳺦bm<D`<hN$F.s@F* 0܌ٺ Y V$[exey8RFřRs>S|(U[88km~ bG 8UQm-F%|XHrC-8_,?wo+xC  |ۮ30Ɨ2J͌7m{m,O@?x(KJ`E џ9Y~b\GV]8'/sݶP\yfLTo8|]064:H%ZY\)Nf.@ :ףB8{l㤪9O/YJWT#(L$1`F$1>ƨ1c.(JtX.;;;vK!ɣx߯c{w>s~;Ν0(.v14.+6}яFC;Ī0ZFj
+_}	m|M?KH[dyJ"Dl|']3@5/Yer	-Uʖ"c֐*7ݱn8Wɾ}KW|ǥ}K?	K%\rb(+A]]k
+Q^ke+rԔ|?b<kK?xi߃l#i-o'eϫ?k#:Ҿ
+7dvY/YڬJn)lP-Cڲ<N(Ҫ$+qFMȊ2c%LLXi^KǀeG@7"`]ǽ6R:/$a4w-@8PDKTǒBv*^Xу+[%K;RԍIRZy;%:?SVʌ==Y!LtFUpALA*YGXnN\cR>CCU~Wt }GbڋYi,D73lD̬W!՜=9MՍhqe"UWaƟM~i'V<qG:XA<vN[0tL*mG<SEǩ>eEGzdic͉CPYqG{Q}a4Bq?Brޢ3'(<Yf4iW4pfSG~dO/AX~ttStDpHFHV5~iU8e(]Tre6PMi@PH"$A6 E[((%2x,# 1ne2 PT*y#(oGQ~h1rhԘ}6=ѯ)80lild4=XvN#8Mp1/FTvaRy78(;@KYQ*dokKI\>ťtm-`QFIj)&ǆry<nnV)+&U[nǰqGB1BuܓUe#!%KrEu_ԥnޞn' _y`4j2H eF2dgEM'oCka^x`S(e@eaC%>PoAk"00;;ɷ2
+<Vipb $P$$N`K(&'!sL'lvYs .fJ7kpx4I#"Tp&$A=ڳ0lhdYnVwmg2A<}@}`U*_(H:#){r[e¡C>MCyǥCG9"&keeʺݱe}2UѢHD*G"2"H+ǋ\vSܩC?%	`i.dH!0-%h"Q4-VY<OVA+%#l1EHB`@-Fxʭu$1
+Dʞ>e~ S-4s
+2A	#l*^
+qn 	 	kHG0-cBO~R[Bz,(C(>/T(^Bad_Vpe=ƣ; aK+C_ؼگGpJ
+aGȩS	Vn52ٖ+.Gb?}I+}ΕՕpv%]`0k9BMYek@yX&kgɸd1ku"m˕0֓a)T'XW?~dy;Ｓ[ny;)
+$k1EyU*ȇA@w	~Pئ$$"PeMQD IYkdBU77R\F qp{j; lVZ1B L*XfUL!eBZzE8iʛw-:d4qV[=[&uezcA[]ʪmtzEԖ|j0wt5J(뉐h>!@9N@B3r?IR"UFh%;#@Q=ٲ&%:w;!m79nIJ{d*q.H=]EYB$<?w˸#i~+44:W3Z_B\jȟ'H]4+vq{^l&`B!0n%G	P!nAӂ0DDIH0wD
+TE&)4υ%(Fp)HAAҖv{pVZKv!*Y$+0iSMg:;}mzI2Uv&sa\;Se}4i*§+oi(l>TrOa5ܟ]!;e=0Ѐ8?o^d Ё-wEzU^_(٧qKoL`q;`$ 8nGA4q]?}хEFF"W6X$+#M6xŁt+,b3'N}=j )44;" [?@j!wH2)9e>+r!r<ƀHҏZW"BX nq[[2vV ,&F- TJv{dja&pӰAE j٪UV
++1Bin1AY{BzQ'俍TNCYП[:sM|%
+{	9uu)m?sm,եy[HYwC6?-vZ$KC~;W.W	IrӞE m^ൎ;8_qDRSBMerNgbJ'1.d҅_M/W_,w0ԟ0U˃*i<'mrf?3gν;o޼^{~1>s[P2EP@#&2F2&͉Aԛ
+#C9n"UbKSFEzK [ʑ
+MP'$jrJ; vx@`Ī
+kI`D9i'%=36$.iUM&]U+_YtD|1>m*?1%{,()&I_(qOִ(Y_0B(ҲuB:	"+!
+UG@¨@Y=) @Y]BʖfS^gғTHkdU"JB+ʖm12wO^4B(6t:ԗ`WOtivfac-z]2@1_MN @E
+b[	8* LHЉ
+2"HG5EAPLQ:eRa8
+˩J̄Oa*r8h:.c,*dҊN -h<#f윖֤.^JWVvVbet1߽+^xMe{
+>Xq2+4qS1ѕ<,0פ꫺
+OIYu^BE̘Puv8EH{Mr, uSѫj5iJ(PAT5$
+-C0DxjE:Թ89
+]Q*?SA#я{٢ -*{YGԣ,26q</(l
+GE0 аf`)[<I02b% \z;+1gD{ꤠ  IRbîFRVbs].0CF< H)	1	4qb,2>IG6 ]JčJi_dΫK3}ӺKT"m1,Ϫ`4(EK3}JBvn#g}k;\Ujdgdψ([4!.;Aqn'2iHM9W=t޺0俷dyh#u8Rۏ<*{e]vE>裏VXq;FCDCu,
+v bP:^S0H (,#_DeBAFr^tQe|=.2 GpU\n<D9-$N `q%,7<@.HY;Av>RpyL%MPW/(;HU^黃fyc2w_@~#඲}޵8?  d(C[# wÚXTվy%)U])@e"_8X+<FTRcyc29[>]O{1 lTg_Q=AW*d_2##3iN*}I@l*'ݲueQf(N@͈EYN3  !v܁ ! ~8_ 
+38D#Ï$uw\!Baܭ#<VqKvtJ\.|N+	2ΤVZ`"PvBPM(匥 24E!eYyۅLh:90e
+DSb>ٰH{q>eBH%mɔYɪzU^9kͲ'tB!}qN1 LJ0
++a<o+Q;-IC(	T1{c( [*:2GdO"7<F`Łb	XGެ*	YAF,OT/#h(i^F@Z؆٭
+R:zA:j$(
+YaB@%&YP !\UdvPNF}~ȭx#q&HUL`k82\!yW n#rL34Z4}l뫔%n$
+Tln0tҞtS4X""oqQ"2Y- jwc]*G	i15UgiL\,!$ʻX T2JR3AԞ~e0*8ʊbi"mɖ+2wOUkړ[
+?7	N:Gڛ~X~.s* `waڋs:1>	Bp.@RÐQo?ض={s0  c؄	erE	S!u~-TRTyVB"
+cPz*rpX- e*`tWl>.pgE@~)IeEh^<eE.rK X#JiUFk7r6jl,yTF
+n^xOrP~?oAkĠ4ߧ
+e'Ϣn?aA"0WuUI:țH)Y.˗ɤv	񪥎>|a&%JffkڊPC޷.[VTU]|J]YqRQ6FR6Sw:PB%G8Qd EwB%VZXDi%nv\hYn)(	mBc Fj4] s Cc)!G"hx(&
+&$`qT n2
+POD Rq;FB)JJՑA"(ࠁyR<?śt*1R
+~) oux%80b0 QQy"CkLDXCޠ{K\-0` w`5}ytMy%qh:EU{h-/yT7k()ty&䓶w\!DL+!	T "oX-h2P @> !@U~ԣ v%RPU_meG}hx	pAQ?͍a!&0WSLD./vQ?!ލ4\A n᫅;rM!6i- 42*<f'@E߫=}RV'PH
+IJBD
+J6 01Ϻ^3.	DGD#%NP@UŮN:4S>*Қ.xJ(].ɛߏQ팱S1d"9ű+Π5M"jjiUvjM}r4G_@i%Hbk2CvEا=W#]?tѦ{`A$,	Xʛל[!}rLU"FlXe E{Dn-9OeGZE xGqo*84Hu@EJP?
+Qaey{Dp+0Mh$](E7{IâDg|C[aG7g/D4,M
+VA+"ROJ'*iF/wEl`yZXGNԲuzWi)}tiX+7L:#WBZ"_kʪub/-gG7K;vO.Zozҥbʋc7/{/\-+fsÒs(73
+n$,lT"%{eO¶eA_.[_+go]2c}GdFmRC}UqwD6!ͮ $C~lYeJQ$!#QF
+=FU)N=\  \`cQXprbvĠFWTS0*"`J;R	N# aBcRKq|sj܈^a %
+?+$%yQGiL6=#LP$.wyn/Ϋ	䌷@J1X Pe   5IDAT@d (npiO p)=1o~ŨߖΗIc5vG"p%r `<Wޢk/D
+\=*9 8$o.Z+;` *p(	~[:FU௶e)XŠC}Q̋M>hEP(`x&3+7E*AyF @r;{Mbr-[\6[EF+2CtRH5 X'ˤ&c#exsT `1eAnٮV=آ0 $8*p\B,FSbP`_FG aӐZM.mdXZ" mvZu. <ף[P-{2eum[N!Ts)]mohfu>PatuS5ɘ?KueE0'!<~B.Gidi6Y\!՚uU=)ᶖf*)*k,g||>eSiaA,=%O{I_9rCsƏ?{-9hR_Ɗbd2yhN2<z[&z܋/ƱVUUz$رcVx<{v{=֍7Bx<t̙DbܹTj	/xHxx<^x<x=x<Gz<Hx~3
+0j(_[[{饗vttl$\Zpam۶iӦp8|gpλNl6;k֬7rW^yŋLDBGSg
+r
+qx]@7x裏㏯[nʔ)C~Fq]w<LϞ=8#g;&zI&`Xl̙˖-[zGX/o߾o;~o߾corw MMM
+>眇
+pٺHu.^/#GqUWu^onnF0O?1.Ggnnnoll@W7k֬S9ݠA~_v^w]cxcoڵnBV4uٺNu|:^/qxն7viuuu[f18N 4p>BK.dzC9[xaþTVVN8w: 3|饗G	ãG:VMW+\]@#?SB[nBg8?яf>xe%{gƌ˖-;餓&O3twqG=UU7oK/TQQug1.X ]:r!_Οwy7|sIgϞ[ou͚56bgL6m pI'ˏ?%\EΛ7oƍK,~'=uyqS ]:Gvu29X/*rlsk&޽{K$Im^xg(')tswo۩S:;>h/Kҕ# 2;sy_~0#g3uY7ovm7f̘]vu^B޽{]$_ 8]$޿H.^ ǡO<L2x\gkjjVXl>BcgxK,$ߺu^kM:uРA+Vضmۼy!֭;2̆|I Xlن
+3Ou9u8\.^ g?nZUULwMˑ]v9۱g.ݻaG^zuʖH$fΜY]]mưaÞ{coVX,rx]@0t]:+qex4Gz<Hxx<#=zx<^x<x=x<Gz<Hx<^x<x=x<Gz<_`~7I&y睟M}*g}c==jGz<'JСCCsVZmS<?[wܸqsϿkF_e޼y7tcې<^xC$=Co e͚5k6lpL:s%K|;v, ,_ې<^xO#Fk.R˲~_`otp8p P*f͚D|>9ҹ9n6mZ 뮻r矯z>}-Zt>~uȑ7t9
+N8%KtGX ]to=gPuuug믿O8qӦMk>[o~o~0A[nӦMF3fV6mO?mE/#|9円s=WQ~p͝;۳gϲe˖,Y"5kV߾}z׏;vn#ҥKcB/8p5J+V!&NxwZ%[z(E!<tƕ+W2o\~رŞ?QV\{o*}⮝W^y#F?O7o>?a%K{}-ۄ<_B^|<s p
+EQf$u6K!Ğ={B|wK.s~&$7\r% yUWu^w}-Z4dȐORiG}thɡC.\1׿'/7ogyso0a¡%-[&˲xc/G}05k:駟aǎvrgҤI_kݔSO=swUUU;v8||1ctN=!O۷
+B(ڵkO?h41cFSSӧWܵkeYFqƽ{~bRtIW:~|2LZ0uƪ|믿&sYg?iv:BЩ$aIι8ӦM3f֭[)뺟^X,@*y}bh4>>GC	?19?X.|x[q(J͞=׿'?馛nڽ{7 (JCC(^$I^dccc"߿zcum۶(󫫫	!?GQCgG}gϞ`v=p@o+x=9>]s5}+`ƌӧO˄X_s5W^yEݻ|KBW_}ի7l0sq>p??w盦iY_cVWWgFgۺuCٳի[ZZt$+̙`{k=ԕ4iҚ5k[fĉH8dɒgy<tæM|O/|뭷Μ9+0`9s:ǟ}ƍ.\p?C6maG<<]w]nf͚ç^{zչww_}߿7C8dƌ[lF϶W^y!yЧ_J{<~3w}<?믿ۏx<ǳ緵[׺yn:ϗq    IENDB`
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-handover-target-scenario.dia ns-3.19/src/lte/doc/source/figures/lte-handover-target-scenario.dia
--- ns-3.18.1/src/lte/doc/source/figures/lte-handover-target-scenario.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-handover-target-scenario.dia	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,9 @@
+     ]s8_AyC	h]>d[8'q6 	98ƢV[_/#Q4Lt4n~e\ΈSnȲϷOOOn,nTͣߪFyK`3Gyp΄L\&x6(ZIHGwOkp[C{b"LcmH]4TMV:6eT5~#K*uL%0&*BHe>˘nrYve˲*ar$q5kўO:}Ћ0˒7ԙ;lĭhβ*?$>>ɵhfnp&bVm@iQ6=4vLqfs$L;.5çY͘$4+;ߌ3.ggaڀA?:Z)jJn*BZh=IKu<G O\+Gb<Mx,Yލ;=ÖUz
+QeJĸ:v̮`1H:pHH9գ.8Xi~iuĥZ$®"\߇P	,t1JS_}&. >ky)2>8g4kG]DbH@<3ȭm,)b1F0H^Y33a6p!N]h!#XTXi<ϭb	N(\vOf4aN1I휈AA:F(TsO0<Pa@()ߔ~p gJnw0> cLKԿOLx	pM7	N+D&g$֦JZ !'v4.
+b;|Fj$qTY\*8PȷؒS%Ӫjk2a.cM9J0Q8bibvŋNDjJ'2m4879a\k}4PcA0dniG *'V5jU˟vpK0zxhk(Ƴ0U#;|.A#@P9xׂO͑tV|,Ԥ*|Pyo8`;$]hOpC00a8a83
+YxB	ވ`PF
+x޽]z26 !ߢwo:d˫CNyoJ:j"6pyɰOJU-<NJѣ|`IJSxưgRE!.Rz/YM9Ԡ|+M:!ZXç(UT܈ߓr.,y0@^VB?Vb]!d6E(VI*N^JȇD.5V+J5XZ	vM6\)y.Cq9Y*2*Bh5Q5Q-6vpq<&jKi$^#uC͆&ݻ@6lA#jHb gPlu62^"ڹmmKWCqc{.y8DxwVx?`
+gPԬQ:z:esl`C0s7ww*b<9Ǩc;k﬽끽}2kQfc4=<_<y6<kQkzSh) =-pI4LKVrњPM4bbЗr~ˮn}E|zE|r`u{r/">">9o:fex!!6c<6ӟl书/c|866ڊ
+We7{^ױ{kɳ7O̰׮3+QJ/I*Nڻ5mv5l\CӒ;(O#X@8LtnMe?tqSôǑM-9oCxCCln^YtrB<],LN.
+\yhCIp&}|<1piDEڪS	utOzv?T	v`@`t=VFeI؍%v#zAк
+^IrLzHAצ,ʒXX0XbW9`[0h+,>GYK?F<h  
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-legacy-handover-algorithm.dot ns-3.19/src/lte/doc/source/figures/lte-legacy-handover-algorithm.dot
--- ns-3.18.1/src/lte/doc/source/figures/lte-legacy-handover-algorithm.dot	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-legacy-handover-algorithm.dot	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,23 @@
+digraph LteHandoverAlgorithm {
+
+START [shape = circle]
+GET_MEASUREMENTS [shape = box,
+                  label = "eNodeB receives measurement reports from UE\n(Event A2 and A4)"]
+CHECK_SERVING_RSRQ [shape = diamond,
+                    label = "serving cell RSRQ\n<= ServingCellThreshold?"]
+LOOK_BEST_NEIGHBOUR [shape = box,
+                     label = "Look for neighbour cell with the best RSRQ"]
+CHECK_BEST_NEIGHBOUR [shape = diamond,
+                      label = "(best neighbour RSRQ - serving cell RSRQ)\n>= NeighbourCellOffset?"]
+TRIGGER_HANDOVER [shape = box,
+                  label = "Trigger handover procedure for this UE\nto the best neighbour"]
+
+START -> GET_MEASUREMENTS
+GET_MEASUREMENTS -> CHECK_SERVING_RSRQ
+CHECK_SERVING_RSRQ -> LOOK_BEST_NEIGHBOUR [label="true"]
+CHECK_SERVING_RSRQ -> START [label="false"]
+LOOK_BEST_NEIGHBOUR -> CHECK_BEST_NEIGHBOUR
+CHECK_BEST_NEIGHBOUR -> TRIGGER_HANDOVER [label="true"]
+CHECK_BEST_NEIGHBOUR -> START [label="false"]
+
+}
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-legacy-handover-algorithm.pdf ns-3.19/src/lte/doc/source/figures/lte-legacy-handover-algorithm.pdf
--- ns-3.18.1/src/lte/doc/source/figures/lte-legacy-handover-algorithm.pdf	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-legacy-handover-algorithm.pdf	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,244 @@
+%PDF-1.5
+%
+3 0 obj
+<< /Length 4 0 R
+   /Filter /FlateDecode
+>>
+stream
+xW[o7}hBPKE> +mB!4{f|ɢDJ3gϊ4>OY}ESt:[DY_3RoOq<t7es^X}=^AxHd{lW*-:2iIYck0@ig%>^Vl
+Eou<];N.kXcu!lYM2]'gwguJC~Q	뷻n0p*w dm޼w{O;ClCb;GqrckKjW}zd
+#ɡ1~}dOG%1&g'QkEKLBlꁌ+1Uw'x훮hymW|pt e-ׅ~ݛN|ƦXF܇d
+1H$=	Ubr*Y\4!UucE_BǙ
+ѓ>@rj,EY7
+~V.-`s%.yW~+^Jl9^BBv?oI/euhH3K	EQ
+;vYwg)5Bb%4ΦDgJL4Gl%KlGWb9E^l=: "4#FH|6Ht(	(P$Ti (#w>bD֢`@x,v&bitAjلû9i#Fq	jOI.o_+`7[F0˅W@d3ɍ$:AՔ{&tߠ8	-doL׉Py|͂ L܁936HjXw
+ &!G	I!b)l5sxaJ+c;Idwւ(㦅Nv\\Rdٵ*oR(?/vonVt[俽k/(t>C.mdA8;>y8V2X8\$~44"t0ͱ徽.{W ub2u+pՆ
+l;_qPsi{
+0uU̋h%F@-۝c=X4s3>_x5FaXu_5-x[Gt1.x=`helWҍ0C.ErA\;6i:w=:ȞcOsdm7"Ol'fQX^RyC;s2f\B3'RtV#1LXxP̴mGtdxoƅݚxBG;-x(#8R-
+endstream
+endobj
+4 0 obj
+   1416
+endobj
+2 0 obj
+<<
+   /ExtGState <<
+      /a0 << /CA 1 /ca 1 >>
+   >>
+   /Font <<
+      /f-0-0 5 0 R
+      /f-0-1 6 0 R
+   >>
+>>
+endobj
+7 0 obj
+<< /Type /Page
+   /Parent 1 0 R
+   /MediaBox [ 0 0 773 688 ]
+   /Contents 3 0 R
+   /Group <<
+      /Type /Group
+      /S /Transparency
+      /I true
+      /CS /DeviceRGB
+   >>
+   /Resources 2 0 R
+>>
+endobj
+8 0 obj
+<< /Length 9 0 R
+   /Filter /FlateDecode
+   /Length1 10644
+>>
+stream
+xz{\Us̹OؼaAD TtGj2uPS'Gд43%Gj104+LI:Ǔ]+1F9?{oy?sb\9ǘcw#)&@<9i-'ݟ6~ʼلVBeǞu9o~OHiS'N0OsӞ|zA}h<߃UO̘2g營`&Q<n3{BF)@TlU7DA5Q8I;xo<ߘ}NZ@dYZl%PRvM$<c13hYllLݔ_qm/2ѷ޾SHq%t]klil;qá74ڮrv>tXf%
+ItؔS`uw
+1	IY143{Iiͺ;13#sѝoߵ蛿/?6~tK7ѰGySzR/Uzڟ\Scûw!	G[VFr(|CK]$zcF:Ze5шDO{Nb%6jc74l7&@;+kgZ"͇5{{.8FbgWN~!ZFaA4U(1v.՜֧|]G:Z-gF}sBhQC2#3bP0PacXk~Nc<fdE(ae+,+[]Y/8МJR~e;I9B9؁s9
+'n2̲ąv
+
+\(34f5z.ߔ[д1Q9 
+Nn.
+aG|ǒ YIR$C\Lwڝ41+fe59ЍR}mB.ڃf-{;CV/孫ee/ui|r*Q_;lV|
+]'x!qH2ӟs3h+5*jGyMTineQu`jl]5H]hяX?wHEM]3:pψ4LEm8bOE-ޚ~j?^^hJ7Tf;Wn㏟ОH>eݦO9@cT;eUQ74PEjF\ƌ%?/֤_zwSWgj1SjP4BH+cqe>-vWkcit::N߈_7oĶ~.DJԘkPuPͶk~o?O!)T"Pd,2,E֢"[QiQ4]ٸ_ن74QwåO_SoF#*:=I}W\7HO'X]5B[cЄ;L3@=66\k]K?SS8#T788vWvTW:Li;`/g/#l?O{I}3ipy#F$zHPXJˌMszbF
+OT7c.z+f`uf
+I$S;o<@˯Zqe;eӍ/KWY
+dgu3?QB`]I%vZQp>aèYݙ:;N,H.a0$vpkjz]3[S UC#I	]ɭ%;	P25 Ґaa5hfH[dqȊHAoOX9͓'}y;'iW^>wrjDڗZ]B'+"I-TdfkAK#Bǳ\Cbn5n<F^"Grß Q&0`$DAG(AKpд'9nhk*qA@hp+k7ql\??MgbU2MȀI$@
+ӲHx6`|1dxV@
+8LLSiZ)+
+
+VUD)'tfI#v+U	֦գMA{ާ#<eQhvn5ZEFVqW{Un#[jDfU5WN[NnAH?2F {z{zMq$&NN4WshN)q)%S%`L1*&06@DB6$Ky4(8e]JEJSJ8cֿ8_I\w$X=|U&oW׿ϿoWt4jp󋫶zge{hh/$lٶ1$_m5@!<(Ѫ\Ցz{)v-$7*\G z4\ow'&L\X;ף@ j=.'qfܵjfnWMM~항+[Kٶ/jk)Ƌ&/&,8e0'{bMa+y-LJbFx$$-k@q< 5\oA8|HOGǤǦǥǧ'KGc8?!7:7&767.7>7!7yfҘҸ	+c:xぼؼ13cg͌/)-+pC{NAQb/_:Ś~+iAMyGFM=>?XfA9k]`һ;pmorr+'(0Rj_cj3e42Эbv05d .V	7v'boc=Pxqzj}JVxb&ns<?0~ϭTkG@nf:@z~s<'P>7{U&}n2h*Sq{!B0J&(l>n:lж\zZLO\[_<NBbcwm򽵭ogQ9W:"5F#?HXzF95t!GtЈeL{PsY%mmgHvmOŸ7^;AHq 'bG	5k)l*FTj%4@  Yu	[۵<IG\w[OOq4tfUMyOkS\/N%>];}8CmE
+r%;C5f7Qf]c KZ'":Fu  rb]uA=чuE2:ߴX 9{K[yE^-s>	V<"/"#L99_s0n~RLW+5rfnC.j{;UTk6/&r{`XHnQ	84ZmV9uጺpCBu#	.;*ryXݎde7)oe߫We+?Г_]u8^93D4%nh	Q2=eαbhpn#ƨ0(Ѻ5BG=p@po<q"^o-(gcu_$EzTNGH4̍t2RY,rY'Ҏ8Ceu'=ۃ9B*n˰9I.yΏ<;s;{Ww=sf!({e`!K`!`R+^#f#R4nބ2[uqÁnu4|Zt&88O%j(ME>
+pAZ@EZ% ԩg"YtDkZ2
+~N*Nf$vRbrpFp}߲gfb#nVPV^br(\J
+U^0O4>u\1G%КIV'jBED'yf_q8d=ek&M^Ϣ1s\ܹ9lV-ڞN9 +v,۸sƲR6OCFp|Pv5Ë?<u}t̛]:{)i/
+^s'E61 mz8HCJn	ybh4:@ʑ+6:#'L$wBZ,朐R ek,13<qb:p(lud_)/Hh৓z;jz1H([)\HlG׿.QaCԷ4jD~ct'D'ӝaMu=\ |;n%L"A*"JQvDU q۲``nE7~ZztT'(o![krӣTm} f	;4cɸWev
+9멟B]}@4pHdl$kO8)H.&jdՂ?A.:G1щ OM|AvFOnr >}'g9Kcg93(m:eAnܻ
+$L&nvr*qRra1nA$E8}z2hixsl`4î0&#3t]Jݴ̙9~|v'|sw4hشdMQL]6f\Ļ=5mj̘,ݤSc7KQЋpU+]֐Py]uQQ\}Mhvlծ`l
+hhPK6BE#)`٬!춲YG7P>*rfBY2KVb[%6rI{9 0N;T%UAy9e6{a8~~
+M+of	bE9Z|?`oj=UZ[g/uܽ5YPc1ԄׄTGnp	-^:yG=vxLFʄ+|[,WMKkglm2Ά1(Y<b"Fm4hFSf2WFTaƻ턘sD
+wLd4h&XUvq8a
+;tDuN o@ΆD3m汣OmP`2f@0{X6bOBV"Q^dFc-S 
+7	f2f"R4Ln^)d>$>-ِh7yНwײցl~#_kM~ߪZư\PsQѦ)$Nea*tea1\2.dK`_")E"H]-4
+LK̥lXkD6эll/	BO+7o"h%}|xMyMݧU߰cmQmxZއ#0PwLW.|{Z~qZanT@yt|z	U. B YdNzПl%3V/2l
+^^#U%"ƨz	 kG`WڙEuWL%ӎ'<HǞ #^3 zM  ߬iɷu+ W @v0D G('Kp619"FG"/Iv1.).=W67NRAG<g߼oǸHЭtI?~ӽs`
+n)7"E}q$)1&R8Ic},jov3ByЌL$fjrw^]xVݳ"+\y+"M3<CH&.DQ0#h`^7#x5ϑ|?_e́K%2!jyn%%Wp?C֒JRsqsJ#[pϡ~;Jz8Dz,QM.O[ND=5RgcM|FCWQ؛
+(R`zzq]cQ@*g̂/
+{ 6#k[geBl>ϣ{<O@<FD|ņ2+`TMΩCx>oPԄ̀,2
+d-) COn_ksrwkkt=KB,gbU}8.k9qU$ʲ0-w,fDT*~]kcZo뀼7r,~ϰ\>W7eZܳgMՕ" =gl\>I_?o9`mE4rד27~ev{ZhpR~Y,$6dh<-!j/rY,k=<P`UR( %=S& XR%H9|^S2Qzd<G68rTaI~a(\lQ1{pfȁ"zbi<mDtC!4^>&iBuxD8Ϣ=󄸇aB13a^-F	h>#/,nHhv?}[ZXg	%aC~z^kc946%|ˁ̀+#ŕrhFof&K\e9\.9?_)>HT$|"c	qV(NK8.NFP'}	IxW		H8.ᘄZ	oK8jPr(	o z*GG&%Y$P%	u+a^烽x'Z3쑰[.	;P)Vj+PTv	^6m^6֗<bk>&^h6[&	(Ça	6XfXm^ºĺa]1_O ky<'anbY{aJX傕&(Ŏ|(AM` a2X.aJ(P$̒%	K|(>X$aVoyF+faV3̔0CSKnG-@T	H,aR/kf a	%ka~ˀ1Fȣs`FR#\xHB	0.00dMqhlA_rP%Ǻ!mw(%{{ЧE@o-g=Dt2621iL"C]&HO3t[Wf}"5:8Dg8SOt}3 QWBBģ1(BL>D[ 
+5%!"r'	
+z-%)78$QV{ؖ@H>X%X̡"wC$ho$.PEd+P	xP
+endstream
+endobj
+9 0 obj
+   7620
+endobj
+10 0 obj
+<< /Length 11 0 R
+   /Filter /FlateDecode
+>>
+stream
+x]n0D
+C ŇE~D1%]N=-gGĪy9gY6=9,It}=xVpv|Ӣ^7x󲕛{NHJk(ʜOu]?Lyӭuކ}8nj!m%mHqItYHe'R}u?M{E9,Z)~EekA;nW5/\7־<$	I4r|A^V͋f~ǋ'TO'  ll^x0aߡv#Y[0[aȴild:J>8;ᴨ[[Y^_ߋrNz(l^0ɷ+w0$_ "s=Z
+`:{2usc]V骿
+endstream
+endobj
+11 0 obj
+   424
+endobj
+12 0 obj
+<< /Type /FontDescriptor
+   /FontName /QHYSGU+DejaVuSans
+   /FontFamily (DejaVu Sans)
+   /Flags 32
+   /FontBBox [ -1020 -415 1680 1166 ]
+   /ItalicAngle 0
+   /Ascent 928
+   /Descent -235
+   /CapHeight 1166
+   /StemV 80
+   /StemH 80
+   /FontFile2 8 0 R
+>>
+endobj
+5 0 obj
+<< /Type /Font
+   /Subtype /TrueType
+   /BaseFont /QHYSGU+DejaVuSans
+   /FirstChar 32
+   /LastChar 119
+   /FontDescriptor 12 0 R
+   /Encoding /WinAnsiEncoding
+   /Widths [ 317 0 0 0 0 0 0 0 390 390 0 0 0 360 0 0 0 0 636 0 636 0 0 0 0 0 0 0 837 837 837 530 0 684 686 698 0 631 0 0 0 0 0 0 557 0 748 787 0 787 694 634 610 731 0 0 0 0 0 0 0 0 0 0 0 612 634 549 634 615 352 634 633 277 0 579 277 974 633 611 634 0 411 520 392 633 591 817 ]
+    /ToUnicode 10 0 R
+>>
+endobj
+13 0 obj
+<< /Length 14 0 R
+   /Filter /FlateDecode
+   /Length1 2612
+>>
+stream
+xTktTW~$0	H4\4ȫ` dRhL@IKC"b	GP!*U
+XRhPkuy=νQ,"YtONms,tӁWLysfg\Cʅp6ڊ/ܳ|qI1+faw	v.|Qa[$`s(G,*'2jdgyNi1jnPVȼpin+͝4~%ݿ!{'-!WK=i\^^dU1δ.3>jsͲ57<w˽ߣw]K]6zxN8r9߼hiitwtd22ۣ٪>\6Is~,n8.Kͻ~EW[32P#|iOPPH]!'9hL-:/ki([XNb:,>k^mf18lL5VjTFQeczL5uA=QDtבFOЊz&QBu$VA+*}0gT+mY!Vmv^;6CG;6j+^eAjmTij~g;dyVJbkky%ڱ})m#*mH7^1Q݃-ڣ*]_fjt(ߧIT(H'd-RH$Ө4Z,j94ONU@(!Oچ;bø,5i;ԊCAD!v2kguk| 7iL/La
+_c{{aMaX1aJ3O,,1scJ+*c	-Y4hXY/}fmZsΈLb癯'~L=b(:ZűӢ?=8u]nhP~ yԏ)FzF}U^=FċO-|cm-|Ceޏௌ#|x׏kWԵ"s%K,\fqɏ?yxۃW&qQ/VXVcqn<n8-7_3ZC8ے2ZR+?`^Vw$43N1~xs?ed`41ql16F#3&]eyRGfHÌpcF#FC ?:z:`ރ^a}2W{KTv]Ηj'e'vlOV;ؾTۓ8lalfFȅMb)6ƫ21߉MEƆjC62^TL/XXxysP+e֎ƺgj:VNP3Ojn|TuzQ]oPU,<XXeN,%TF8E,dT0ɘo0ռ"<(\AFQƘ͘5|͉0̘QfDPIj1Ii(NDf.Ŕ	F_bLdɌI&eLDƄ	S\jq.e|11!03#7aD1xxG=Ũ5ʃܑ.מ.`gU":TCPCL808.91ȁY5Ѕ,dƪ&2cߏ~}-/}<>dThr^	Hg<43_ ="HRHqt;[], %ҩΌ$1JJF"Z0@<LR.SIp0L2bD-a!BCn@"_Tz&4@zàuu|Ư
+endstream
+endobj
+14 0 obj
+   1862
+endobj
+15 0 obj
+<< /Length 16 0 R
+   /Filter /FlateDecode
+>>
+stream
+x]j0~
+Cqslrfhd8d7t0gkSȠ?93@q+[@6]lےqGնo".788Q`hux5;HΪLz73ws|m	RFK2Є=KuzN!NG{|ʮ̒n)sY)BSFp
+endstream
+endobj
+16 0 obj
+   223
+endobj
+17 0 obj
+<< /Type /FontDescriptor
+   /FontName /QLJKQB+DejaVuSans
+   /FontFamily (DejaVu Sans)
+   /Flags 4
+   /FontBBox [ -1020 -415 1680 1166 ]
+   /ItalicAngle 0
+   /Ascent 928
+   /Descent -235
+   /CapHeight 1166
+   /StemV 80
+   /StemH 80
+   /FontFile2 13 0 R
+>>
+endobj
+18 0 obj
+<< /Type /Font
+   /Subtype /CIDFontType2
+   /BaseFont /QLJKQB+DejaVuSans
+   /CIDSystemInfo
+   << /Registry (Adobe)
+      /Ordering (Identity)
+      /Supplement 0
+   >>
+   /FontDescriptor 17 0 R
+   /W [0 [ 600 688 ]]
+>>
+endobj
+6 0 obj
+<< /Type /Font
+   /Subtype /Type0
+   /BaseFont /QLJKQB+DejaVuSans
+   /Encoding /Identity-H
+   /DescendantFonts [ 18 0 R]
+   /ToUnicode 15 0 R
+>>
+endobj
+1 0 obj
+<< /Type /Pages
+   /Kids [ 7 0 R ]
+   /Count 1
+>>
+endobj
+19 0 obj
+<< /Creator (cairo 1.12.14 (http://cairographics.org))
+   /Producer (cairo 1.12.14 (http://cairographics.org))
+>>
+endobj
+20 0 obj
+<< /Type /Catalog
+   /Pages 1 0 R
+>>
+endobj
+xref
+0 21
+0000000000 65535 f 
+0000013857 00000 n 
+0000001531 00000 n 
+0000000015 00000 n 
+0000001508 00000 n 
+0000010408 00000 n 
+0000013697 00000 n 
+0000001659 00000 n 
+0000001873 00000 n 
+0000009588 00000 n 
+0000009611 00000 n 
+0000010114 00000 n 
+0000010137 00000 n 
+0000010884 00000 n 
+0000012842 00000 n 
+0000012866 00000 n 
+0000013168 00000 n 
+0000013191 00000 n 
+0000013462 00000 n 
+0000013922 00000 n 
+0000014052 00000 n 
+trailer
+<< /Size 21
+   /Root 20 0 R
+   /Info 19 0 R
+>>
+startxref
+14105
+%%EOF
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-legacy-handover-algorithm.png ns-3.19/src/lte/doc/source/figures/lte-legacy-handover-algorithm.png
--- ns-3.18.1/src/lte/doc/source/figures/lte-legacy-handover-algorithm.png	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-legacy-handover-algorithm.png	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,194 @@
+PNG
+
+   IHDR    5   K   bKGD       IDATxg\Sg;	a,ъ*"*`'"8pkֶYE"Vq jŽGeX'U@E-pÈw_99uH.O    @ޱi     h	(    P|   @!(   %+++))ӧO?~$p8mmmMMM555---===KKKuuuy / Sll'O={<jjjZ"x"bLMM---ufii٧Okkk6
+\a  ӧO111߯211077ѩ>|HLLL\==!C8888::v%  / )))9{cnܸQYYiee5tPGGG{{{==_EDDdggL2el   ȌӧO1bڴiÆkӦM3m'$$\|988ٳgfffӧOcffL[ h>(  2"00'%%z̙nnnm۶m
+
+?sssGO? 0 _  VZZuLWW˗Ջbs<zhС?<  ×  ۹sgN~ᇑ#G&%%meeɓ'?|ҥKeee
+ @(  (&&O>?)S^zN:?F_q8ϙ3'''v(  QP| KzzW۷oO;T###ϝ;nff_UUE; @P| HHHH^O<$͕W'Oϟ?<˗  @*Ο?m̙ϟ?wqqa455}}}<yBݻwHHD  5  M:4IUUՆ6nw^MMMډ  #  4m۶ݓKp8k׮=+W쒓i' /  M֭9sҥKoݺeddD;Č=ǚwޥ Lu  rΜ9!!!GqssYTTT̘1ٳAAASL  PPRR2iҤ3gk%(++;vl֬Ynnn    
+d̘1<8W_}E;Np8SWW_dIiii' Ņ Тx<ԩS=zt֭~юX,[j?͚5v" PP(  -=""͛
+z֬YSVV6gɓ'ӎ  xzz9sŋM6L>]GGg Y  Zw}A;5&L{ntt%8 XP| ZBTT5k~'Y(+))/++i  233{5pӧOX,qKOOիW_}B; ( yUUU?QSS;tZ/} / @_O8K;=ze˾Ǐ S  QBBB޽vSVVfkkfoC; ?_ R]]=` 6f:?z]l,  B \:ѣ={jٲe˻whg #  ";;uϞ=H++?~v s8 ,֬Yfׯ_O;SWW߼ysHHȝ;whg 9#  baawy"ZYY 
+ @͛s@Lw8p[J; -_  	KKK333۵kׂhg%͛ _  	3445k 2fժUn݊  HRvv/_N;챵mݺsh #  rYlŋi   ItuuҢD&M8Q__?00v O(  ѣgϞ͘1vYr]]]1 / [XX"_xq=A @ HFeehm}޽{pp0   P| $>|@m)Sa H/ dܸq̌v7v?yv 7(  JDϞ=/A @ޠ H@AAÇil6><<v 7(  Q|%UUU \A nݺ"'?~L; _  	xN+AVVVZz!   WP| $]vB~X,KKϟ r 󳲲,--%>ׯ,Xйsguu=z,]̭,1fkkb_綄磻Զm߾}qj:KKˤ$Ɏ	 
+3 4ݻwұcG	PXXX&[)xynݘU5f_paږDl޼)))  4URRd][^^gϞ}2+BTTT_'^			#F^vmC%o޼)-- p ~s%$$HvXuu.]>sPWa߾}-200xgddn"%)						ݻwo B_ 544pzpBkk뜜ϋy_MMͦh###Bl / @SiiiI|B<<<}AfnÜ9s1ہRQQSBȨQ&p8999T r	S  j	GӧO?w`I֬YcjjZ{{DII)##COO///]v_666qN:U-0ՁҺuu-^Y G| jjj={ӧ>>>&M255#Gzՠć8q!DOOo	G}G͛7S3˙@ 4UQQQM
+KMMMJJ6lXAA+ļ;?|0!`f;9r![~mNNΘ1c233%+R^^Nk  P| ӧO-!ss`Bȝ;wļKxx8s*\'''&!)))u/3fL^^ի%\nEEA h<0O2VDߺ}v%%dJPUUM\B h*--bkccs|}I&BpOfX5.6fO>]PPP=<<x<7  $ 455$>l||ʕ+r'No3±cʾg066ꫯʎ;&b5k֨=x;h媪-] W(  M7..nvvvzzzGCCG}ݓ'Oz%L᯵	={6lv}|>ʕ߃e  8/ @S͛7͛7ׯ_Dkii]|4 @/ @SikkN!o>|@xa ?(  MչsgZ=cCjnnN; _ ,((`P$%%  ,--	!ȕ$ _ j׮vRR r%))v
+ +(  `nn+Y(  Y(  н{ǏN!?233h   ѥȉ[nq!C r @cbbhSWW 
+/ "'/GGG) @ޠ HСCQ|%)))(  q(  1dȐ|v:` A @ޠ H3	D=ztjjj A mmq""""i 9  1QQQ^D=zTOOo̘1 B #FiѣȰ@WWW.K; !_  QRR2e|>,2Çnnn |B sxŋȤ۷ws fa	  SSS>|bhg%IIIݺu?LB; '_  	/^D;,={<yfH h(  SUUu1___>ߺu눈ډdׯf̘A; - @|ŋ0s̎;.[,22ݻs??vM6v g8 $Q-[$%%yyyYYYB꫒h|pYϟ?ٻw9shg y H5*wn|G۶m[d	Őҏ<_:  4+  h kkk޽{?y$((HB~UVedd)9r޽ݻw@s_ `0YXre׮][{-RXZZΘ1c _  xϙ3gAAA"Z/!DMMm۶mǎoeJJJ  p 3x<ޡC|||޾}թS'>uԨǏ6_HYtɩSM8v P(  Qy;vAۦM[nq8)3|Lr  PT^{yyYF!eWiii544n߾ri E9  ۥK%K><99?hJ%c7nTN흚 -	G| ݼyszzʕ+MMM%587nݻwܹcii)aeݻ===ON; (_  R^^ر9*@iiSJJJTTT!ˮΛ7gŊ A T^??/X`&&&ͷB{{⨨m6߆ӧLlٲm۶  TW^ׯ_߼ySSSH]~~6z萐60 
+P|@ᔕ۷oj+`ooߥKK.䦩0`@FFƀ._B; (( HYY	[Bzկ_z;s̫WFD; (._ P5*oRRh屴mժՐ!C=zD+FXvڡ @Ac*Q^W/qㆩa/q${ݺuW>|0"<zk׮ޕ_ [\~-;;{?1P5}ҥKk׮]j|+##-66kkO2o:l6]v  +--ݲeʕ+'NK8wsጡCfffN$'O֭[NNǏK2e`ouuuBBBϞ=lRUUE/) ( RZZs۷}}]6mh˽{NZUUbkkK;N#UVVYf˖-'N=zXf;vLf -G|@N[nٯ_KׯǏ;xN`={۹sS[/!{WW]]C 2P|@Yyij0s]~s[lJ,o޼qvvvtt޽˗/,YRj'NTVVbʕ_}UZZZ Ņ 2d˖-&&&ׯ+lر?ݝ;wh'|Ν666=
+			522o'W9N|||bbb% _ M%%%v>}߷nݚv(	_dIttիN;())ٿm>|dɒuikkKuuu6mrrrj,gC=~=  Up dstQ^,L={s玖ֈ#z$a򼽽۶mf͚s禧}Bllf7mtu|@/ Ȍ?n߾}Ϟ=%%%z>o޸q7t2cww2ϿsN``Sx<ނ~v5hk׮9.3tM6uԩ" _ [QQw}7CQpϜ9믿lz*888(((55jsiܿ:JJJ8N;r8ē C [[UUUxxxPPЙ3gJKKmllԪU+Im͛7׮]yfTTTfffΝON2ԩS^^^6lPRRׯ߆VX!  A )UXXgϞe˖֖wՈ/^4B__]߿߷oCUWWy&))))))111&&&!!AII_~:"{BȨQK6nܸq׾ a*ݻy<޲e<==k8ݻwo~IbbbAA!\___OOOWWӧO.]rwwgRTT\VVFСe>}[ <ǳ￹\nl / HT^Ixϓŋ666l66mtڵ[n-0cN_~/B%  (_ 
+;vؽ{wUUҥKQy%͛7;wf;88ЎSm۶\266O> |y|kvoyڵkz%ϏfsܻwR˗Μ9t  q8 ۷f{{{/ZH @#dddVVVX,''WNTTkkkOOM6 rG||oo:VJKKBm>;v`TWWS;_~۶mqqq _ hQ[lٻwŋhs999nݺQ$Buuy<^ll,%<  Ik
+ (W^///k׮*JJJf>k.Y @/ 4<___奢ӧO%JJJ9B//;vxYig  ͈{QVV^bŒ%Kh&Va<Oxׯ)%KyyթShg  Wo>??r{CCC*tQFݸqcذa _ K9rdƍ\^^*)664ȑ#]]].\X^^N; 	_ /]ĉ7n|ҥKQyi)//ߴiSI.j֭YYY~~~ @ 	TPT^)q񬬬:o}vi{{{oذ͛7 <_ ho޼ZZZsР
+!d޽wyUZZZNNf\.)++Y=z/OY @@#effʄ]]ݭ[v!===--۷;w&O3` Y @@	**{Q޽_xaffF;Kc899޽{b 2s|233'O__xtR^闔ܱcGAi֭<8y$   P|@,L=uԦMʊN:q8AgϞ8 4/ |FFFƂ:ut)??KlaaA;EYYY d/ ݻwLxΝ;SRRϟB;4Xrr9Mbdddɒ͛7 
+  .]ڹsgjj**rP|	!Wx۶m d/ ʻk.(D,**VZ}~~~ LB386    IDAT$))"ŗtRUUUA+oΝ+T^ychhH;hhhXb׮]߿ d/BKII1c*|	.ܾ};   {P|ԫWf̘ѵkʱ$y*G; _ #111x3PyǏ{I;$-^XUUߟv 1( 
+˗ʫ222zE;$ihh|7w.** d	/B`*onbcc...bccC;yzzVVV߿v %( rŋٳg
+Hܹs+++ig  keeu]T^c9 weff:uv ( r(99Y?
+7ρall<e\ ć WLҵk׿>~Ky-OOGEGG @N*o|||HH'O|y@0`@~p^3 /KJJb*'O;yd6@?~kbbB;H3<sLZZ    Øۭ[7>{ٓbҌ\\\tuu:D;  AȤD&$$B}g &dSy?B*++={&g+Ӝ9s222^J; H;YȌϟ3ӧYqqq{ٙ2 [&Tؽ{j✝wŋg>}>+::ZOOʊv0w.dff Ro Oozs޽߽{wه:;;8bcc/l4iFHH   	@ڵk7mb~jrӇ<@8p -D]]}ǎ DhZv|>OMMe޶=zQ^horN/^ o lܸȉ|>~rwwׯ_rrr``{jӯ_?AZc6m2 @c?B|~zzzJJʑ#G={p(&۽{w---AZqqq9q   P|(]jU7{诿:t(-m			 Bhi{oD999			m̙3 BhQ~gb@ܹsb2vfϝ;G; H)_sĉ%KXfs8ׯ_X*?={եc޿ 4R @Q>}͍9S2ǫ X֭[wرK.;vdXDDNe>\UUʕ+gϦ K#ЩSRL  DOn֭[:ujĉ-Q2vXeeӧO R#8dGWWuʴ@ݱcGKnڵkgذa-Q2jԨUVUVVr\Y @Q|L9  U(|kprroݻgggG; H| @~k׮1vtbddI; H_  ɓ+x%2 jC ׮]344/i>**9k
+  / ~#%%%< 8 ȍqBݻwi   '._fǌC;},O>8 54KeX,̌^.>3&::1D" U^^ձcG.+^Ϊ_K<UVH/ѣGS ti#^
+l:==˃U%I$|}}_~]_tW^?~< /|EQQ   Ewƍ+++ub|>|rҤI|>ݺuCՁI;@s?	!aaaίP(**Bݻwuuu\\   EZYY~СCͷp8;w޻w/!$))v Bĉqfx񢵵uh&&&(  ѣ:::***fff+V(,,?L_b˖-666666[n>H:aMMME4.0Z|[ZZ٦M%-x<>}hjj;88\pA
+lccbBCCSX,qx{8prv\\\n޼)zgϞݪU/ߟ7}t]]]իW8%z۷or_.XHXg56ijeƬڸqJ׮]>,'Էkd())Y`ĉ_~-Xtun	BPnϠ>}ĉi",{ϟ? v'N |'P]]V{++BvJٵkrPeeeC=cEEi߾M&MD0)))'O&,]T2w믅nɩǹioNqvvN5vXB8zxxԾ3x<w\~5bΞ=*:aik,d~lԬ;[{BCC{4j]?/Ѿ}\t=%wܜ9E<,ou	!/_lɖ9s:v
+ ". fggۗ}8~8!]vZ>>>C}Ç&+VBLLLkOF3PCC3Km!o߾-++0aBC:>rsrr%\.~A	!k׮MOOͽp႓]/,,\x1!UV5ى5ʕ+~~~}2NXgըqOS3,3
+Ҙ34"53Yb_?7wLn6(ϠyD笓-U|-ZԫWފ166 Ho	!o^+BH.]oUUUG(kIX[[B>,<T@@ f?^p3g?LǎCC!={BćLٳgݻ	!ƍs@trrZlY@@/Xǌ:G7otvvn۶$UUUV	l56ijeF~`B蝪S]?C]s"7wLn6(ϠyD笓]n[YYٺukf݊,
+cf Ңŗ9p8f1\.A=JiӦͧOjIB!DMM竨B	0vvv Q!!9"ć3\8p +g655~9rdVV].++c~s	3@HHH}sXD'UXظ9vV0&Fa/B]?C!/y~Dfr։Xee
+Bgw_-P|oܸbRRRu+(!!@; H_A㙛B|}}ks464 rA-(H[^^Oy˗/	!IXYY⢩IquuE/lnݺB.\cHȴjʂo76ij/8T{M34!߱Fspaׯ_/LMM%iӦACէ{ݬQ>}R @`eeEw^^OD
+0/^H tؑrM	S۷omI~ܹFܷ6eeiӦB=;wssJlmmǓ'OBOD|
+cnnT[nDD6mBH Д`ͱbY3a>G׈;֔MrJ17I'O"utt233i !)Α	漼m۶=p@jjjIIIYYYRR㙙"]]Çֈ0of:OĞ~|oFڽ{wzzzYYYll,F̵ͻtBya>lٲ..^ jժP
+FpСqƥ}ŋ5"5ij/L!ǏψS m"ۋ7Xs9#GBo9rDKKؠG|CBB\%
+bݺuS hpZywlqpp`>Sڝ;wD=4ωbEEW_}U_F<t|>{=z4(Lϟ/.v Ϙ1֗?"t&>Mͱp֬Yu޷:o3C|	Lu&iXs9#GШQԷwȑǏ󦲲+V2SM=-CYd	  -S||͛7]\\\KgeeeΝk//++񱶶VUUUSS޲eRRRƍ7o޼ߐ3ټy? z[nevJCCA+}|֭[۶mkP9stؑ<O]g <o֭]tQQQԩӺu `لr֭|."O&l}aj,,((Xh	]2Us?~מ>GWvLc)}}}{쩦ֳgO___قkU'7kMKKcٵOXz9)+&OB; H_=44tԩ|/  ͘+yf??w	5"s)))aaacǎɓ U  @#Gz	!k&N(rOOOOp:    ALLLrr{X,Ū"0{foTT{\Spx{8PYY]v...7opQ33+V6Î6jYY  -0@Gղ^WM͛7yscX̙3Ǐ#vΜ9̉DjO\^ULLsqi)}F N.###,,lѢEu*k J!dԨQW\)((HOOg.&믿9HHH!dڵ.\prr"<xFFF%%%111}6m,;X***8   {:;eʔ={vNN)u}kСCbbbLLLAAAǎ;vXBH@@ !?un!!!;w>}4sf)   @xϚ5N81mڴ<y#G444d#AeK-J_   2ŋ޽[`A~z>p¤${"ַ}EttիW.]J[v}0[J())5
+  p @ٳg:ujн^zEiժ֭[dkkkkkKIIIܹ3s۷ocv   %w޽y󦗗WChllL+((8yE?dȐGxSN΋Xx1!dܸq_.---//ONN>p Ӓ <Xvm~G+lmmY,VkbŊ޽{kjj2]d	ةO^}]n]cR|پ}{~M63_1bܹnllr=}tBٳ===߿?o޼;ZXX̟??66{ _ܬהf~ab>-} ӧO]]x{'zݼySPyktA&%'/^p8?Sk"x[vEEESN֭ǭ.sر#500?x<`7oq\555++˗Ih_%k  W}7>}^H֩I{B]ƭzڶmǏ?}TXXxŎ;B%Z\b(++ҥB\5n-**RQQYlYSCC˒ŋ;u$>A40Lum>}
+:t:,PYYLٱc!$88BxG}666cƌaα]*ٝشiSVVojjjL
++///00pv  +Ν;WXX8lذƆb
+/eX666%Guppa&ԮXPp+3jƍ***]v=|
+k~vF>|гgυZ[[?^t֍"z}۷or&s_!&L400XhQII6h|||֭[׶m6lX~~.???eey  #!3w\Bȍ7j,ְ}vBBLULjXYY
+oã:+aф;w|Bȑ#E?F%z1X,ٳgk b_rrrڷo/|ӤI>Gc+++?}W^%,X@AHu5++KCCcMJ} ʶ=zB޼yScySNeee)))qܜfIvv6r>| fgg0ފ
+ƍG4hP$Kzz:QQQ***l6;--<}UV,Ν;5jԕ+W
+
+
+***!}SľXbbbQTTޡC;HS{TB"~аC)0_f``@l΄={0?޽2n8G[o9~.]ru
+)))--Iٗ6B\]]KNJ{ڞ>}_BV\o޼ܶm[%hj"Ғry
+gΜމS[vssh֭[vAzHuݻwP P|eSj[F8p !Of~d-p8fق\.Wx+̵O56-f񭮮f.C%\=i:ub.*,&&FOO2ڷR9EsN|
+yyyN̝>OY}2'< $lٲ6m8yk  W>+W^|_^^ܪVgSέ4t[Wx",X/-\0))lbsDOx@戯gwG_W322շl"H
+k  gumgi!G=z(!MYYʊr޽:o
+x<<(G0aBIIŋ'΅Ә>>>檪ѕN	ܹ#X).b'D3O:(_~EGGgɒ%  <_MLLlg͚E9vرc?2/^L7n\@@ׯKKK˓8`kk+&ZnM9y򤈳>}bhiiil6έ[Ξ=}{rƄ__߼'O2nmnK.;U߿+jyI) >|xС-[hhh  na
+kݻ3{Q&OOOу9`e^ݰaÇBv-zD<|    IDAT{j_bƌ5|v_z:3wݲe!ĉ)H&:88O)=P'0mǏn3gά?;wy󦋋USSZ|y\\رcѢE&&&\.ukC1{li-_|֭]tQQQԩӺu1۷Ǎ7o<zliu떎s:P/^ܱcn  h,QЩS2oߟOBۧO.\\dE_W+++{ѣG'O6G05 #2ۛԸ0ȟ'N())yyy-$   55_ @~ʼv{׾}~GAA{kŊ洳  ϯRoڵk׮iG|rCCUV  WP| ˥KBCC]&:2  P   Eʖ.]D; A "[n}mh C   -<yqM6  p @*:::._v  #  R_~y7p6 f @_ddۏ9bddD; ܪ`  uJJJϟ?fww (SNm  
+ӳ  ȹ)SL2e
+( 5sĿv Q~7oiӆv  9:w^||<  ze֯_oooO; C5d33@A ꖛ_9ۛv  rb͞=;((v|Y8Çq2 l̙.\&k׮ (P|A1СC 7n>>>vvv  (_s׮]{-  z_=g\ svv600
+
+Bk.Y  /9eeӧ<x믿p8'Or  (_[hQ||ig PD( ]Ç8Э[7Y  /(SN
+|͆pYx  P|A!XA@]vuҥW @Bvqqlhy><yiӶmF; CEqxA@$''56   % Ő!CtrA@Qdgg7M6!!!8y 4@Ebf͚\^^N;ȿ|''+WЎ  B9sfAAh9PXXxΝӎ  Bbdd4rH|U~~a>~allL;  ?_P,׮]KKKSqq1cnܸѡCq  bqvv600
+
+Pyyɓ\bffF;  ԄN>СCմ\)))0a}ukkkq  (p<<<RSS###i|ɓ'_~%8  P7_P8VVVW@R޵kWq  ^(<<<
+
+
+hݻ!C|1**ܜv  +		d[JJl;wLLLh @EÆSVVv_|A;  |/((2޽{׿}6  +P|AA2ȑ#9y!Ci  q1cFpppyy9  K7m4?SEEv  h _P\3g,((8<  3|||,YbŊ={p8q  aP|AqknȑrW޵kצMX,D  `J 1y䴴:+++k	IIIW^>|88  H8
+ ((v^=ӧOAA{z d/(4.~СjY@;w"&&̌v  h_PtsMMMΞ={\\\&O|e]]]q  P|AYZZ0 _qaeeesYt͛:L;  H / ϧBJJJ/]?Ў  @MpBBBh]ַo_UU4v  $_ _טѣbZUWW]v̘1Ǐl߾=D   a( ={X[[;++v.h!EEE6lذaUUUi'  , !dРA_|Ŵi^|Y]]͜ݬv.h	qqqSNϿtȑ#i #^zݶm/^TVVVUU|BHYYtм}533z Ș;wkה***!<Ox_;k֬ׯo۶oeX @Bծ]6mB[:ȱ{_vv  h	 
+-  `\.[KKK[8_uРAqqqh  	ܹsG|Orr}||._ܺukډ  ־r劖^b0W(++?ydƌ  @KC W^URRzFnnn˗/onݺձcGډ  |B<uT_CSSS[[ہjkkK4,4LXXؒ%KbbbO;  Pɓ'?{l+ğؘ{;&&fjРA211iWXX|C͘1_GGv"  	/ɡ<bǏGEEEGGGEEeff^z-\ή]v̚EEEwTTÇ;VXXݯ_?;;A٩)ŋ^~}c8?!	7Z4ZnvbzjXmzP#rPQB,$_ɓg>3`𙙩\  C/w[nrvmhh1W"TWW?88X$y{{)Ohff&b1!tÇoݺU `cc{Ӟ<yoo;j  ޚ Ǐ/**ZvH$a7++K&988ӃGnu!N)..ftFF\.3D"www=={?;7,\rcQQQK,' P 0={ŋ
+aa^4'&&>}]P\\rKڵ :H4hРHSSެXPPtDxxx:7
+---;w裏/4/ !B_TTTtʕtQ$a(((LGDzzzJJJss3:"Z}vppprrﾻuVccc+ l'(_A(N0ãG{rGw툨7۷oȑ\W |Ag{]VSSciidD77^a^8sLHHHyyG}׿U 5j :EaذaL}0hb&q~;..wٲeB 6_n=^^^4yxxhECbwDH$J鈐J_|<dȐ{N<@! /hzz6{MLLQS;"o޼)FEvuDĬ_ѣG~ / !v~\\pyyy2ɉ95M{ǏnLMMJZqڵu֥/ٺu-@ 6_P{<==츮Qedd	+))ٸqc|||uEe|4r/zz`Nk`oo%I}!?A}_ `CNpP(6o\TTGe =څTQQѣ'OܲeK^^oɡB 6_UUU/a^r֭[=!H6mڔK/999ucg! /="hذa\?LMM?ⴴuDܽ{oۏ?gtw  /tOOOp*V__uONN.//g:"<<<&Mԯ_?W?h"ŃC 6_x&=<y2;ǏׄKbAgݺuKOOgwD|{555ݺuUB!UB 6_xirssr1c i#6''_޵k55B 6_	&8A;Ў˗/WVV 2_ `C=}4!!&ݬZA$TtDL4A! /zC%%%)))~ 6_ `CӔ{=<< jnnΦ/_~䉩+F (0X[[4:"|O(((`.z@юq |W7577_v	oookxV舀! Pa0`@`` zPu_ `Cna hSUUUjj*G  Q &L`nnu E&eee|ʕ2tD T0
+k#~{~::"t/ !j(ӿҢTWWЃ: |5aI7==FFF~~~a 쎈RvGH$F4_ `CRee%sa	@ 犋MD|P(i4h@kmvDou6_ `CqR4%%=\xM=oUaϷ^~I
+mC>?|ɓ'/]˫Sz~CUVVZXX?~导
+{@#	 |{!33nСzzn_^LL̙3*ՙR[[dɒg*ŧN_TtD<TM lƍu ZRi^^ކΟ?啒BL2ҥK...;v455-,,=t3Fͩ!-:uꔅEXX؂lmmKJJN>VYY9{옘+Zڵk( u{̸_xtqCCC^^ȑ#_uSN:իcǎe<''ǧٳ/B'`:"⊊	_ ` -SYYD"+++_aaa999/^Hdofĉ666ZhQll,3ѣ#Fشi/<5448x(x<iiiOƌɞ޽{s555~뭷[M޽[566dUiԔ7ULx}ٸqcK;vƍ	!ڊt@ Xnw}wGEFFzxxΟ?ΫWnܸu  }:s`'''>vڨGq]x対SUUUt/ܵk!dΜ9͞=__<K*EٱZ`,Rtڴiϸi*T'ӧB-[ƌYf!tժUΖd]f1!^E
+eXlllL={vxxxBBBSS'N }
+Ԕ>{l7{-[\x{T*-//6mB8p !dQQQeeeIII4<̙3555taII@ 
+O<KʄBP(,--e)>2dHLLLUUUQQܹs	!"ذa!ʕ+555W\WFwISݻ<xؘ4NmZ
+UIM	dvB7o{ʕ+
+
+:;!!b	!*
+srr۷l2fbb]QQuZ vѡ~~~&&& ֲeۗuZoфiӦs󔷷7!$>>=޽{#G҇4>}մs!ݻ>	!se+/\,'ч?<!$&&:B߯^ʔurrȜУNMN𵴴TQ0ѣGQQQk׮NNNn; l}9Ђ^ HE͘1D|>)1B>T> v)BĉCVXɎqr=RYYPF!1f67]beeU\\UbNMNUC0gׯAGD  [z;h~0@,H>Eӧ^~e׶Owݻw	!ggube.lZ/5k,BȪUTJP<~bbbҩh֭[ۜ3,,;^5<#L|Q_E\|M{6^@oeeP(<==	!)))*ƫMf4xaWՁ>C{+H8p@.lZonn@ y&!ظSS]pbjj?fGuu t =ȑ#<hnn.--ݾ};"""!(((ollݿ?à"BFEY~wGGxGGGa?'}>lllLNN'uaӺ|
+Epp0!dѢEmے+**駟huPPPR(=T={ЋmٲEEjjj?dYXXtD/_ `ӑ0hҖ`lHHHHGsqƵ*/,))e@/ [T*2eJ{wvToi{=zdddRSSmB;5B1cl@ ':"ظi&zpu^F :Z_Z=+997ptt
+־cbcc-Z4x`PhddgffgUرعsgԉ͚5*88v0@I;vFGGwmӺ|
+Ehh(!D,+͛7YYY|qƽ{EEE?Ì3l۶ME9#O(&n޼Ykj GnY|z`D/
+'LA:h _^|Z4Ν;7n(
+3gr]t633&&&>}ӓyN0A__{sÇ:ujjnl )55Y矖N~~~nnn{t_յ_ݰaCuuW_}EϢ?OΟ?u9	---ofBpAA}_(n_@"U~@hb-//OJJoÆcѣ|>5.S\HJJCbӷܔf[3>|+}]|cÆۏL&ۿ#GݻSگ[ocB=z̆!C,X` 94"*7o{ۮz7={vKZ    IDATϞ=?477.H$///zk-"*x?sov}7EZQ(K.[=윔 YUNW  N;"!	cccwww.KV待3g]vĉƥ'O|RRR KLLL$%%}Wϟ?xo9x/"(($33sݺu\l7 WoyyKisjz  4#"55U*;"M*{'Od2а1cܾ}{ڴiNNNcǎ1bsڵxv{~~G+
+ jૺӓ^s  H]]]FFVtD|O8+	,d$))^+,,d͘1666`0=pCBP(J=} 9=|^o߾dk֬ץ 8T~ĉB,,,|}},Y+Bnk/:;;߼yzjhhXWWG/f%dDrܹڗ_~Abep" 0zoMM͵k$D"zjMMm8qY  zL&ΖH$III>^$=s\HHаӧ̅im_6`eeU^^啖[ Ϣz|iwD"7Maw  TYYٕ+Wh{CVVL&0`@`` uuuw(ߑ#G޽{o.^RRRB	&M
+566|mmm?cX<p@==EFF&%%q nP]]B=%ICC	$z*5۶mG>yK(B8}w}R^^(VXӵژ|-ݲ'z\.`Y鹻3,uh/رcӦM˗/H;#]j h+ɲh+--e"(  Ɔ
+{effVUU)?;=jjj/^|ܹ6U]'AYk)))FFFn"h	uaoKK_|XoHn3^z.]za~FbŊ7x;99~6l˗/wuup|[)..fs322r=,ɔ)S.]cOOOSSC1:ܼ͋yy*߿x!D<_|G!jҸ8vM@@&0	\ A/:"8WTTtcǎeggwל輼#Gvל:w/Я_W=YBU=	owaz聆Ǐ3=Ug C%Ҿe˖:"<<<֮]{s]N)//'YYY<rH@@@~qƧO2y>P(_O8ĉWWW[#>c{{{}}ѣGGDDg{9sLLLz꺺:$/2!:FjnN򚛛3` Phggp/ަpWWW######WW>L*]ͣjۡ/^eXLb-[.^XUUu=
+ vѣkzxx;;^z/LKKkii@T__?̙3%KÞ՚5k!V:tPvvL&k5F.:;;3t+ݵk!dΜ9fϞM//l9zuEEEeee`$[n޽oTڔR;ܜv]).666N4IAAALeOɓVjA?|0}
+C]l}lnn lvP]]Ơfffazt2ܹs˖-o'ӧw555L?m6Ћe2W\YPP9p !dQQQeeeIII2|Β@ 
+<yB	BPXZZ~a2dHLLLUUUQQܹs	!"ذa!ʕ+555W\IАРz?QjkGZ:ܜv]B>|(JcbbMz	!~-=g)o=ޞ˗/? ĨB8K//lzzzcQQQ=ކ lvܜo߾e˖t">\XXu}oo={Jsrr,X@WmaaM&ǳ_r=Bȑ#CӧOyΜ9{҇_5!dܹ̀6%333'0|ߨJp:hguXm_6mڻ{;wtj...H<HqssS.:_~'61_鍁/\%_ `tD|}||^lb2c\|>_OOOOO6
+t}XQQjSNB&NHkC^[r9{!PQQf^.Wgs˓H$̷jƌ̯J_+---%)oW+,,<|pppa_lپ}rrrB|Mн-̼Y̾dǎkkk	!@,kg_SV}	-^A/JT^^~=B1bĈg^<֦J+++f+?l۶>P]ب:ӪSL&KIIw=w\mm/|qukddXVVfmm(++122'}M߹CU fz
+gf/wmmy&]}IIIIQ+zw![n#xa*:İo\waF7Fh륭f huhӧO=={6zԇ# J<yK$\]]mۖ\QQ\ZZO?єD<dkk{3=*
+KKK#5^*8==lg	!񵵵񎎎^EO䲲ڵk׽{Ri}}[ayGym߾t^zrÇ"##\VPP0л9880=ʗ@|o$$$Ϟ=~*3׈f_r/mƎۍsvXXX\~H<eرtq,KJJlmmЫRf|uu3T܅joUl{ksyppmllW!00Iy|߹У|odV|>`_~ԗyf???+++>obb2nܸ{E<X(9;;YhǎtΝ;[=N
+l0//o֬YVVV1c'OΙ3V ;v͚5]ިQŶ9*^7xQ(Z[[۷9 z]\\\\\oΤ^s511z7uѡ~~~b			m^F mϮVlggGO+DMt_xekQXXOCrss[ZZE"}=z4ml jkk333gXbbӧOMMM]]]g?s*:_յ_ݰaCuuW_}EϢhSsskә0	&xxx: |AKK۷\PPy&3BRGRRs4 ӧ			 ++Ғ☛G! o+..f񤦦JR#ۛXhgٳ';;|Ȑ!,v
+
+
+K{Ƅ]0p |{V]]]FFDH$Hdiiu 9= |{#"==͛H4l0kUVV2wMSapww711Fh/ !riii:"^&LQ n3a08991Ià|W#;"***LLLЛRiJJJ{=E|WЎV\;=uuuVVVa nܸ|dza% MTwDЛ s]#&Ra000wlmmz/ !j17LGs0UTTH$vC'NH?ؘ! ?SSSg|ZZZSS:"qsX777W.3W|W_~0^t_O0 / !>vGĭ[
+~ S^^D322?ydzjz |akk><f``u )7o2xa u  oܜM˗<ybllN;'OܿkKАݶ>p@k- l;"x<5+//t=50X[[CPue|@;"+766#zz! /t@#B(\,vCjjjII!s4oook݁ l9舀.x˗oNvvvss = |몪RSS8p@///=== C&eeeєsʕ2vGDPP55BjllLLLaD&L077Fs|z툠]~Ju@ F|z\uuuJJ
+Ff	"ZS  |W;"JKKFhaH$UUUFFF~~~a ͇ lbaFF\.GG(++r
+deed2 0vA 6_&LI=MAOOݝ2h k4_ `CMtD	WWWtDt&馤TWWt/ !h#M5~xtDOaСtgt/ !vZ{~~~FFF\רYryFFsu90@ ld2Ynn.=}vGD@@5rCחooo333k C#Ύs5Ҹ8vIx }/ !nb:"t#aqa h |A;"
+Cr]{OOMC@+ }uD]rF{iͣG\|L>}jffmGz / !GKK۷\PP FEf@@}ϭ>))k׮XXX[t/ !HOOOIIinnѵd2GGG&좇! /@TwD3rP(?~|VV~m0 t/_ `CvDTUUSh%ӭK{ƍ7mڴ?U LrssionRRRnn.!d̘1~~~^^^$55aiI=++ Y m<y,H$Izzvy/<s̜9smmm{Z  |WWW׿W_}Z t
+/ iօ&ooX  e aʔ).\
+   ]Nѣ۷os]  B^^^C  @A 00   h
+X|ҥf  M B,Ԥq]  nBG2dŋ.  @7!hX6_  AL\]]u!   :@▖  A dƍC  @O@,b  _ "oܸ#  5 %  ҥK\  k|4|  /ơWU(\  S|4X,...uׅ   _ eiik;   t/_   н|4є)S⚛.  @w hS\vB   t/&5j   /<y2/  @7BPbڵkUUU\  #|4Ԕ)SZZZ.  @G h(6x<   /:u*|  /2eʭ[<xu!    @sM4g/dx,%!!!&W^x@#Flڴ	 .)
+k vM<yРAGeK#ӧ.\x)*K~uvvNJJ277UQQQK,' P8ѦLf`aիgΜQoUVVV__uƍݵ-   BhSN-))Q%_}̙3MMM	!Ǐ饗&N?BN>ٚ  4/F𰲲Ե;?$|>>|8!  h&_ ;|---[-Qmhh`Or\nnnZ   @Ӊ⸸&f	2LHmBB{3!$%%Eіg   bq]]իW% <yQ!jjjΜ9=&̝;MMMyyy΍  .gk}U:e~m̙%zDD{ڵk6׎w	^ /5c~k֬
+^=zP(2d֭[j̞={bcc-Z4x`Phddgffv   pG|?tҲ2 @ 6bXPq]  C֮   bŋ  @!hX  t/v4iK.  @[!hCCC___  t/֠mrB   /O<   5Əoeen  A|>   ]MLu!   @L:>))B   /6>|#    @   ]eb+**.  @ h)S(˗/sbb"u  h: @'477߼ys̘1/zzzrʊ   4/ӧF@ S֜  |@ss͛
+!I_  @1b<gMLL|   /vx7Ne  u|FDDq_4  @k4h޽   h_ mt_|Q(2K|%  h_ -o>333=$   e#""{	!<  @ g޼y
+mx8  @ ZiϞ=zzz2G|  ԁ?P(
+  w{A>LJJ
+e"(!!!-n3    IDAT-Z s=u  BAIIIK,
+}7n B9qŋ ]=NPp].p]u 4 mڴi\   pr    	    '    @    }/    	    '    @    }/    	    '    @    }Fx<OV(
+{F3~նĦ9g~F[[yǷVXXzÇ7nݺu]P(N<9k֬̘1W(=  du0џEV~CUF3~նĦ{gzy6÷^LL̙3*U3!vɒ%gϞU,O:ennatu'NXx:{ /ㄐSN555iǆBzݱMMMryXX뫪\\\Ο?_^^Ԕw^//NEYrٳg-,,ˢ"Tݻw[ZZƾk=  G|{---r\-pėpk#=Y\\<x`CCÆظ!//oȑ8UllԩSMLL^:vXsrr|||Ξ=/S9_ Joflllllcǎf"H,,,|={M---===õБ!!!O>qpp0003fLdddaG0001bĦMmՔy޽s皚Z[[[mvmvRBH}}ի^|B)5wBۅ%vijjjllBgaa!钬,ZgVV]"-,,x<C
+u<gQW=L&o&Nhcc?hРEƪ-055emiiIaLEƍ[^Bرc7nH9tPV qcN8Vhll4i.((H*3*.\`lllbbV_;Ͼfr:gg窪**++c\`A:\)3y-sϕwaW#VsGIiӦ)	!iD蒌B}s*){=ֵ9}s*Ԭb[+O ,[fBU:-ɺ6!$''b?q!'NPgdoR} 
+onBIث駟;Uk<x3gjjj:|Ȑ!111UUUEEEs%D":t$\!W\r
+qD)X)3ޞsCB6m]bgvIݻ<xؘ4.
+c[|9!dϞ=)Sb1]B>b
+ۥ<:{Wua6uvN{ӶpNcccBHXXÇRiyyyLL̴iToK{efLMMͼyW\YPP٩	!mS__O144Tr_ px;A|]\\!$3YѣGq㊊:[k9}_pYO133	!Wݻw2rH
+yBHLL38::Xb~2f̘N6w+!dOuvW۷~KYhB300ݴia}}BXh!$""Bv)ϬΞoU]M޴;sфiӦs:^l#srr,X@B,,,;5:R|@uWLeee셥###u03fJTTT99i-3>h1 
++400 TVV2VTTT<=Nhs{[=pGBJKKi06P(ŭ~wڥz9B1p@BH~~RY=ޫ0:;iw8D"a(5cƌۢz׮]K*..V\XLWکiupqqQr_ p8oo>rHy#V(
+BHKK\.WqBTNBRG)3lذ!C?D$D"cc߹sdС]{|/t8;w$g}h"SSsέ[kv=k֬͛79j(:!!SSBN:6ڵ\.' Q!./믿B;|;_v{ٙ76Ubb"D"tyGiO@^_~Q~GM.\pn@e2YٞeWgN@qƓ'OKa\pk.@pȑ<*++IGWLSjʕ;vcBիPhjj   I{rÇ"##-,,ܦb {'OڱcGZ[[766߿ĉׯ_OqttgLRTɓ'BΝ[TTT]]믿2DJ}33Ç5WJ!_~%]_BNJoU=BߪgT=˳sw8#G<x\ZZ}vBmiV_+
+WWm۶%''WTTO8((SS)
+z!KKKzT*}={_$l٢`4a߾}j(@_ۃ:|ۤP(
+Tp?O8	!۶m*agע&^b_RRbkkCO{Z)}/b_άÝ|WBW+Q&JLwj;w0ܼy.qݻ*=|a%j,usgw8g˃UoK{eZ####޺!ׯ_T
+fƌʳlݺ:۬\={lmm 4oP(]\\\\\o$-u=>HuU%]KE<X(9;;m˛5kUpp͛7	!J7xd޼yӹ:	
+"""bBpȐ![ne݅%JwAWgbbȾ@+}!CQ^sϵjΧOY^(R3Φz(Gz7xQ(Z[[۷n{^CCC	!r7o󳲲&&&ƍ{Z]E(\?̘1cLG/mV>spp
+ eq­2_^|Z Ν;7n(
+3g*ͼe'|rر[nq] hc			Տ?>p =u}w4 Pǆ6oܼhѢ.!˟) c\ m~V@ @|'|	Ut2zf!  _%gΜ>}7nx%}}} Δ0* @S/莙3gߏ }AYY'U _  Y8 l  =u! )| @7ݿ_&1B @S  nw!d\   tӽ{,,,. 4/  | 6_  MwE 6_  M\W   tPEE|  tPvv6!͍B @  ̴    Ǎu Y| @I$'r] h辨(K  [JKKܹu! Y|{ܒ%K. oH$zzz\ P( OuuuHHȑ#GBBBonhhuE aÆL ͂_ 
+ssÇoQQQNNNIII\W_III8 |OuE :--mҤI\  MLL޽{w!ݻuE]xQ.O>B @ xǏ?rAvy///KKK  իk֬Yrŋ+++~{M mϟ?uEܼyÇ3f D bqff{PPкuR)AoYYYyzzr] h"_ ~?sdddDDH$"+~=  z˳Bݻ.t߃]`  =1..nӦMׯ_`'Ot/bnn.. 4nY !99yҥuuu3gM'O;vׅ _ 'N~ԩSgϞzz+]SVV/r] h._ %;rȉ'N<9a,+ߛΞ=B @s!@z饗222|||o.˹tđ#G^z%CCC ͅ aaaߧO^\\uErrr_{5  wss_&Mu! |3&LHOOϟ|Z+$ˏ?xbu- p93 ީSV^mmm}1-믿Λ7///o\ G|{.qtt	kii"&׿b1R/ t 4ٳgwuE
+
+
+Ν;zj - [.--ѣ\WZ`vvvs  YƎr˗/^@sICXB p] h_ 8w㹮4Աc***׿r] h_ PӧO7nɓ?TuEY
+Ů],Y2h k ˙FS(x;6rH+MO:533ŅZ @;/ h4&\]]wuE)ˀ ^ P/ h1c$'']_payy9ܹsٵkr] h: 6WX!"##_xάXٸM1 G|@L2%'''((h֬Y֭kjj"ݻw; # ǎsuuUo֥Knݺ 	VZ|yvvv~|||o.˹zIQQQDDĆz|@[9::Ņn޼yƌ\Wa_|9ׅ A -&ݻuEг>|w?АZ @ Ș>}y/_^WWuESm6hР7|B @+!.077?rHTTԯyu+WPPp>׵ VB K/eddx{{p]tC\B @[!Nt'|m۶I&s]t{:t>
+\ 
+ ݔkݻ^xV{QJJ @ tWVV֊+.]xOr]tŋw܉ G|@ǝ>}:88ȑ#\aoo/p] h7|u `''>늠s"##o߾k. # '(={=ztȑ\Wj9r䫯_p] h=>[.--c\Wjپ}{KK? ] }رc]jժzk\Wܿ׮]?,-- tZ /pʕ+
+EDD/u9жW_}5;;;33S p] hڴi^^^fZn]SSSry/'N|GH ]p .Bqرc...gbǇU}L&򲶶x"׵ _ x<^pppjjP(޽{7X-[VZowo. t
+ O??őtX,V(zzzvZn5vOe!`శ۷o}'6l =  qҥ˗K?|ݺuO>|>?99ˋ	wܡx	!D(ۏ1rBLF	xȑLj
+EPPPMM͵kۻ|4It/KtI)PE#ʨ8EdTq888#\)Jf`@xBiKҽ-%mIMۼ_s>oN7'= н| իO?w" I144Կg۫u:݅.^t:]]]b!tZhrrrjZv&HEEE[['$$QTR[m۶E9so / |F(ɞy晿Je\afܨ4auqǧa>_|nN| rnllh4,xw\- @g| .u9D"ꫯO%l2atVsrr3i.\.OLLh233=]Xpc.\M @ r"##KKKCL.ng\+}f4#WiXV(
+ÇO<y߾}SNk# `B ^
+
+r|ʔ){}FI\NWSSc$IJJJϸs+++9dIIIW^4Rw 0 ! b;vf#H6l_RѨ+W2FIMMO`&IՊ?KD'/. @f9sf޽wﮨ`iv\.FK.knn&dE`!!!ٴ>l6׋.ګbcbbDWeeej 7| 8wӧOٜ{QQtjȸ]ҰiڄiX}m "_  z}yywܹ:*J[gXD𨮮f'Y/) | BS;;+222rrrRRRRiCCÒ%K?a>KI@ @jii)))]\2B]YVrYZќ.\0LtsfxȑQQQ z/ |W\qe\RhD7))_l555CŋFҰZɉw p|`@ѹ2nXXXVV]2!JKKJÌK  @q\ee(jZvLр{fѰﲲv"NMMEᔔD_ 3.hFDDddd.GƅnG'z
+4 @p8DWכf"LOOW<w2.͙@\QQFD!!!p$''j  !̸|J3nTTԈ#D̐q?0iXo9a =nWWW~X,D<w2.l4:\BD			;*: n/ t'qEWEȸ sf4ba _!@l2OVU"njjjttg\JrybbLdffbj gFQpd\FP(]5e2Z诲4*J?_ `(--eܚ,5>>>$$U5Q    IDAT z@*!ɒDi8;;;44U*_q%HRJ%aignKK]5@OAeee/?v#_qEӋ&$$j N/ދ/i8&&F􁐙/@u72L&ILL j֊~*//lD#	(###""UkkkcWTj4ѐ>d\ st/^4sOOOw BZ[[ϟ?/elQMJJF l6[MM(9@<rȨ(W@_*))}%R>|K ?/]ANiXV1bذa./?\a7<<<33S79Y4\a%@8,FDDddd.Az=uSRR$ 9g.t:DD颩q 7gf
+ZH4]uJI]__o6(:::''GI =af.\hii!xy䠠 W}/Wmϸw?B !4ua1a!j7X,DRd\  rN'$$VTRUCoC2cq%IJJ(দFGGj  JKKVEJiH/
+VVV&cj%''>CBB]5  t3 :QUUp8rybb|F_F(̸^=^zgϞ嗰+_mf?+ӥR!C_|VUU9rN*{ｏ?رc}qoݺܹsp_J:U>~x;vڴiטz 0Q*|`(--eܚ&JU*`Wݝ322'|_أ,-򂂂N~yyyk
+ͦGٿʓ&MڵkWdd#ڛV/˖-	b]\]]me2YRRpΝ+***((ϟ4i9+JjiVZaÆÇkZ{s=P(:::{txS^_k|xƎ˯sѨQׯ沲_8nܹDoX,wy]9mڴnq@~>~x˗w3%٬j>aÆUVM6MV#&M_PPPTTtܹv3	穹x"əL&(]tttu].Hg|}
+ihhW(F-	5鷸#GaaagΜ1b%%%ƍؿ>M탛to_><xoAPxjͰV^^nو(&&F4pfffxxH~
+ ?ikk>cƌS*cƌyᇅq-KC>S"z7EYvtt<8<<|֬YBf_"***88855uŊ---)7nСr<..nܹ:n<f{T*UpppVVVaah57pN._<}/^C7;?f 77WT*ܵk
+=wY`xbccR.'!CKND?Cg~S=^V^MDw#E7ﻨrsshǎرrss]7ǃǃe~1cƄ)_{i=tkQQQ "<733f̘'x?7>_=,+ϸ[__zgyaa:ga<MHH~:q}䴶rO;?K</Hp7U755m~d29_CDs}]6e%Wco:'x_gɒ%DSOmݺl]Trr2,DR:Kn"wQD4}tᎦMFDosp^T"eɷ4QnzRB<<<HD/v
+YV4~W^yaȁn=ܹs۶m&̸'NqㆿFIDբ嬫U*ձczѣGhʕmڴ㋊éSإ߫V8}^Mi|ɓ'7Myl֚3fф	
++^"d֮cǎT*1N=OAAEGG666666~jk׺۷O{(k׮3g
+W|'E'=h4,`0BpS7E޿޻zL&|sr\.ollP!no*7xyZtԩYf4QnzD4j(7 nܸq	acWZm۶s	C  ­jnn7""B۽BDX{/(;;;?.|V%t㲲h˗/߼ysEEƽ)y!~	RDD{233_yϞ=.czQFі-[Um޼F\V{nĹ#C9}%%%sa(::iS$e(}wӧ_f̘A%F\lܸ)_iBDCu
+7n"#iEjnnw /Aq###E 6oM~޸q~>ONIRTOr$9;y$L2ի{S[Sp8/Xhwlev97;?싿IؖF"R*n:^CaٲeD4hР7*++4i{w|ڔ7e9{'JN(}w]vѝw7nǾT"l&YCxXVa4,7O0'JÇv _pyqDq΂i&Vɓk׮7o;裏
+7My.._3ǝzo/K3_	)иY"z\BDaaa>mB}W]n]sϹV6Q.d6LDZD4x`܅|4v766}=У4_)q4j] :q_Ktt]w%Oac|DO~;={˽jgZ=cοJt8OÆ:l۶MBu6lt:~@fͲ2L&ܼŋDӦ:DDϟmlXSHx<s,tR7/x<xsP=6mTօ6ƗXaϿ뮻iX
+78g\FOVEsn#}lVX6lئM*++d*++۸q#yĉ1scc5k_D}Fpc%_|E"JII9~x{{SRR|_m۶-[o6v3fԴݻ711/qD4o<077_?}7_qsO8M\.bzw;7e(}9wedd9k;᳾T"(""buuu&.4cǁ:4<i$Z͎BhvFv}e/zw`i>fϞMt]-]:\$??Vxod3JD_zj+e2O;u?&iĉ?;͕0}%wT}}RH$~-ɛBDӦ8SLqZHHHgqeQȑ#]9D,}Y6}K;[O_5q{!!!F.|=2oeܒgioo|DٷT{{EbbbfΜ)]#G̛7/>>^.+ʜ^x8Ӌ-JIIC?~KZZZ,YRuVzAs{Sc2
+
+
+FP(JQ֬Y#	vaaaVV\.OLL|W|
+4\jM4_뮻$JFM1>2eСC_uo
+}Yn[7=ͻAb[!aaayyy3>5qɓ'GGG7h4IÓ&MZlYJøeqb۫{"92{![#ǳزe6nxu~ǀ~K=zߵooƊ+r_~9uTO89<:::Ͼ*zlE* "*J*Cl6[YYtl0FXׯꩧ]Ko5k֋/ѱwޗ^zc<??J믿v9cAe˖UTTnaN',&33M|d2]pAw3qRJ\Z瑱Yz}[YQycƌ9u(pP݊cN6W^w!"YquunwNj:'' *(:jjjl6L&-2.Kwׯ'&&Ι3=?y;@54grDiXѸW=`0Z6B\Z_*    VkmmL&ŉRSvv6Kb vK.	ߪ/677Rh4䯡-    }f/F"UYYY\2рq²D   ѨK.uttQLL貨Lvtfo9x`II˗V+lNNΔ)Sj5   &Ţ***;vA67#˓X`0aW8jof0HT9IHH'   np8.;a BCC]26-inn9d<(     J8UD"IIIQ;qAg2Zh 
+c;@>3HMMt*UܧOT__]({q{>ٳׯ_NII0a¯~qyQ+qus577Č3WE򶴴Z8%r 5˨DS8g\Fڅy|{[ \yEx?xgRGyd/|y?PX/Z Hח*@x{Z>ui|-4,|1:799~O3gܳgOLL/<s̤$V]]7lݺɓ^n}7oޮ]W^=gΜaÆ]zuݫWnnn;wo*>>a'OJ."_ 7***D'3.3K}[i(#Gw 1jԨLJJ=s>`|<FEE9s&++V6&9r;s̈#*))7n\GGǑ#G>0((8y-B`Z[[ϟ?/2T*UTs{Z٬j>aÆUVM6MV*~xժU6l8|pCCKO@"L8>~z>#D$\.Z?/~bŊѦ/_>}zXX/^̦l^{MRgee:ё?xYfk\PPT*Jennڵk-KgU\{.66V*r裏џ'oѧ>|ǈh.7zj"Z`u8jƍ:t\.;wÇ_L3L*iӦD՚f}cEّvNZ%t={<#r?3r}/lݞMDp9`M$''%MMMqqq5̙#&{OYTT$Z-I`2n>̝;Wi*JKKw=#zLD%%%.7~y"R՜/׹K<Vg\B49XVc(}<O<xf	2	}v">|h䜲ڦM(>>`0:ujرDj*Ѧ8{饗(99رczرc,GSKLL,..nmm1cM0AJb9z(rJ
+
+
+@aaaccccc~ȮXvsUέ>߷o^gٿYokψ?zg\JDWX,ׯ_/..<yrתs~fGRtVU^t4z/6F4իW};Oݻ>v6jZ"JOOmL"*..W޳gw!~N#:{|DqܨQh˖-ª6oLDGvʹweg}<y7o\QQq+}v]q5qhh(nZssB˲v"
+		CONN/kll,**OϜ9Ö^zw!O?}o6NMv-dD$-hS
+l6777W$&[h4OǱ?I:Q(FQTL!C-jjjU*,5Tf7nN\]]]ZZ6_{F0%%$''y%%%#GT,lSN-X_2eʔm۶vZ>pTUU7D)B ;U`0a	?'OnٲEQpppBBhJ-StY{{_~駟9rfkpMo.><}aXV/p@H"t^獳:};y_~-̝wYUUk.w׮]l?~|EEٳgO<yك<xs#@բ9R "P.׵=ƍ7Ν;WTT+jzҤI{j =dϞ=>(?nG.O6o[GGoSQG}DD	T~NDgϞrSCEtYuuضmp$0l0"t
+_78pܴמ=dń?^ϳGqSw-4hղ!l6VgϞI&j~jH6VW^)**:w܍7]r_]ǧaw]w3
+ra.***))t;vI$	&vZhҜC3KÆ۴iSee`0Leee7n;7/QJJۏ?⶘m۶555555mٲ/n{hƌ555mmm{MLLvz7tƍǏZ8?9s&k;S[[>wٹsK&NZ5kQhh=oZRRղ:'**ķ    IDATjq=_flЅ\BDr<11Q}3FO:૑#G.XX?9mO._l{r#l5sss̜9󫯾dOޏ={6;$$$2'D}tсN*|駟fO/oYS8??0Zhʔ);w޲؛1.Goذjzꩭ[l)OF:Knx8V BopNd$_rvv65@l6[VV}\>8}tccL&S<sss7UQQѣ
+b޼y˗/h4Cmlll~eҤIol6۷o///H$,X|I[lYvV6l3</d2罸8n׮]}ѷ~{ڵ'.\pܸq]qWTTuM[OΟ?_b	gΜټy?񏺺_W-^p_mkk߿|GwbMMJA
+2n@iiij?{v)rO۬,6 _~ҥyyyGw- u.]rCD"IIIT~VvзL&V+O111233?k_fzsss;::K/{=K knn&WWѤ
+i^lM9\UUp84,7#Mǌs)  #z}yyh0qEǇj@~]-uuu5qONZZ?@w}~zbb9s~^|Yte\TRD?E&$$߫}/(4bi}N1C  iii)))f\aE|aZų4Vsrr]5  +W\pAt5˸2,##Ctubb"?{._ӰNx";sV)))=qX  9UVVꜰT*5w C7VSS#p,--5DP(`a >9s&BCCE7))MSѐK.uttQHHH||hWrrrPP GUU芎zLDaaaYYY:|ݎNxoYYY{{;E" t0|MΠs ݉93\^^(888!!ARۢ 8^]]-:PWWgX("""##CtN|4_|nN90 x,&3nTTTZZh2.:_ a/\BDr<11Q4:-33W` @d2'ZD#nz/@"J,_r\aJ h]
+jjjؼqqqsN::dggj CiiK$d\;_~d2iZљ>Ĉeeej D*@8g\FP(]5 l],RUUp8	qFFFDD>Dחfa7(((99Yt1n|||HH/ Ұhz QHW =Bqd\ |bԩ$Hw^ZZZTT.jmm| qRJ/ D@23#F6l_*))]2L&KJJ]  ܱZΓL&rW{3Bp8,11Q.j B lŋF#uSRR$8,*JF#KJJ-o !@ihhͰVZZj0HPj)(a y~c	i4Çj~ zVss蒚v"
+		8LNN
+
+w =pTUUFכf"
+]f@ "_ v;:a .//s]c40=q#""222W_ +3ɠD@RIRWp^]]-bQdddzzuȸ  4>󙸤rybbhcff&aDkkkV+EEE1B4|a\B0NPjL&eƍs;B93\瑱1fd\ V+
+1D]VVVXX^q%?H$QMMMw u pL&VpLLhpWLp/^n q5Mjj* <  DDf^t1~UU᠟oG'\庛c7(((99YpsrrCBB]5 _ NY,:9BNW]]m3H[[[EE+,JRJ%JBBBpp A 0efkȑQQQkmm=h0 3_ n`ZkkkEI DiXV>ʕ+s+222D$&&&rW  / @OqN:ŋF\aU*+,*JF#d\   fԈ^ii` TQKIIH$.pWYY)jVmii!lQp> ^  }BCCh K:::HP";*ѨNg2(,,,++K4z / @nG'BBBE$''ZyY__o6(<<<33OH  ogr^OD			RR-nWWWRx]]b!Q
+G ` 0M/_J7a>I,&3nTTTZZh0d\ | &QSSsfZH "jBHMMMOOOKKKMMek&%%h
+ n @8K.QVVVs  ] ϟODEEE. g*        |         @@@           /    _        |         @@@           /    _        |         @@@           /    _        | 'D"
+         /  $%FqҥvL&.wގh'|rn ]  hΝOdΝk.B۷6sԩn
+ ;8  D	W8s̾}zgL>۷555SN;ӟ  / @cg|\O޽{ݜ7n?~|ĉ
+:.555=='   !//ח?~`SUUս x  ^-H$,WF
+,vY֞) S  ?afymF7=qp":{,Jw %_  СChΝ&ɛ5-_V۷gf̘y檪*h67m4~h ;  =S[n>f2":pԩSK~B˖-{\_@ p  ~o/YDRrorybb⫯qF:#G͛/˕JeNN/@  _ @ǟw!  =g|         @@@           /    _        |         @@@           /    _        $  U|믿nC@DT*~xb 3| ˗;{V"TTTfI   C  NZZ+@"~H 0 ! Rt_ @/P @p8D˥R+Wꗪ  z ؼ<T*\(Jz`B PO< u  PmmmCX,দH?V sp  @EFFN:U&2lڴiH 0! n_` Q  L&Ӑ!C:::(<<IP( 3  KP̛7O.y! yjZy гd.  SQQK~nQss3]0`@H$. R/80ر`'OH$ƍw!Пax;   / @     /    _        |_ۛzϏnہfyժU)))rɷ-yy> 5   ^[vmmG_^[oDk.ܧs\]2 U]]MDgƏ  g|@3K.d2p9V1cFxx!C}Y
+D'EGG\c%CBBl"|oy'r'O|!熻HeeYX,Yb0D5X,5k֌=:44444t֭ZѣGK$"K$ѣ[ؚaC={vUUMolwyo+..xrhpwmv"
+
+
+w^?_pggim6_;366688x;r;. ~vΟlܹsEojj~̙3ǧc=꾒OVTT$ZGH"|oڵk			ne2ns=7|O.,~ڴiD[oPE2			ׯ_lS`X&O켂7{@1)z(oy"}ܾGkog}rcǎ._p(}7>>~߾}z/%'';vL;vLR¦M^éSƎKDVr_IgILL,..nmm1cM0_<p@KKb{뭷hرodʕDRX=$lTAAEGG666666~ᇑDvZ^*rkKr\.ollnq.xʕmcx"
+wjkkM&өSf͚M;%z묋߅lUP"Zzu]]b~zqqɓ_%.iY/޽ʙDT\\?gV;]hZ"JOOw_Ig9tDQDDȑ#ӧO6liBFhϞ=
+_|QF"-[kۼy3==>}:hƌ=-gggw)M%7:c;%zs&ڲ7r&O|͛7WTT~uP7ܬBD7nivK*JҠ 6Ȓ WYCF#pwguv(BADMMMHTv";３=7n0ED8}MylR$"v~Zc;%z묋o~g{fn4kO<,<hLrigZ-d2o*/G \sGDvn;5,ȧJXjaD1q>lYYn[L6mOtZ̙3~衇س=-uצ/oF5Eew޽w6~'O]v޼y|;[РADT__/\<|+o_rIV!gϺGy~.((`III!'NK
+W ݻ"
+/ID|'|BD=Xpp0{'Ź`<6r~=v vmD$zBu޼cqfBg2l+Vعs?@D9IpV gϣ~_|RRR?~q>KyBaa!6lӦMd2mܸǔǆ~ׯ777Em111۶mkjjjjjڲeKtt4	.8ܹsDND}TOtǋۄ/؄?D~:tivq⽹{%3fԴݻ711ћwʛ묋oOKD۷ojln8qď?j666YBCC;֭[(22r۶m[FDDѶm<V%u,kիÆ#3g`8[t)u}%]hmi.\M.f:':7'//7bȑ#E{n={p#ә	_	6{3l+	rNyuu|Ie܂6lQ~~~gSLq~Ƀ>FS|?!0Po_zA_x
+9rd޼yr\TJͶnݺZꫯ>}N7cƌA׿`2
+
+
+FP(JQ֬Y#Jǭ[7pnNvK{{EbbbfΜ7c,˺u
+aaayyy9+,,ʒ剉*?T}콳.KK˒%KT*\.ʛ#MӋ-JIIC?~l6]k*JRvZ~*b^|!pHK "Hv1.]wѮ B1RTT#@͚5ĉmmmW\ٴi/L7
+   	g|<<Ә1cN:OPqi8=g|?_ }=qqq+V?!W   M2ϫ  2uԩS
+p6 @g|         @@@           / -H$3mf? k|` x4@j 0/  ,L' }   @@@5_"X,5k֌=:44444t֭Z]c?&''dggoٲEO>$///:::$$$--mʕ`0/^<dȐٳgWUUyM;>|y9M[DH$:.Z3Ç5xܩܩh!{h4.]zmd ` !;v=tw;?u=X,6?O-**b+8{9993g%			ׯ_f5iKgeb넻hjjɷzobwYܹs=vT ڱc: 
+!eX)(( ?022֮]Ӧ剉ŭ5553f 	&6mDDEEEMMMԩScǎ%UVߝJ:v^?zhRR\қmի,׋'O-=:^z%"JNNf:vJr7cx{|ۧYWe5jmٲEpD4zh6/?tDQDD{xwǅjD~w{|D6h˗/߼ysEE7m	wID{q7cx{|w/Gۉ)}  IDAT dǎw!})S*&iȐ!¦XRi0h4*
+㸠 ~尰0 J%rbqhyРA
+h4zS,X :eʔm۶ƺiKgeb넻S(fٹ]z<cxBƍ111*=#Hп6 nG4\=ưd`vp8|Vps9{9~'O]v޼y|绶^nǝvk4]0` @f. ݻo999DtY'?ID)))^nS&?~Ŋ;wСCؖ[o]rr2}7'Ovy7omFD­ СChΝ&_f!X|G}tڵk׮mݺ^~So~CD3fؼysUUh46m?~.]g{{cӧ{ͻO>lMMM9w-޺iӦѲeN8qĉe˖uy7oFa}=3] o@AfO>d8qa^^liSwH-]aٳ+uyܦY:_zuذaufΜID2̧ob`L`pqG8dBYKK˒%KT*\.TPP0j(BT*Gf7ͦIi9rd޼yr\T}gc[hoo_hQLLLXX̙3u:<}ERRRr!CƏa-q_^^C4(??ŋD4tPvyrybb⫯ʏp_	0aV:@~K=zߵ0G  j֬Y'NhkkrʦM^~eh  = ^W_}W%cƌW= 8p  zվ}x+Vw] 0/  SN:U @ _        |         @@@           wH$ɸq] puuugΜA`@y] ;w     @@_        |     i    IENDB`
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-strongest-cell-handover-algorithm.eps ns-3.19/src/lte/doc/source/figures/lte-strongest-cell-handover-algorithm.eps
--- ns-3.18.1/src/lte/doc/source/figures/lte-strongest-cell-handover-algorithm.eps	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-strongest-cell-handover-algorithm.eps	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,5124 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.12.14 (http://cairographics.org)
+%%CreationDate: Fri Sep  6 16:41:15 2013
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 3
+%%BoundingBox: 0 -1 480 361
+%%EndComments
+%%BeginProlog
+save
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+    { globaldict begin /?pdfmark /pop load def /pdfmark
+    /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+%%EndProlog
+11 dict begin
+/FontType 42 def
+/FontName /DejaVuSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 32 /space put
+Encoding 45 /hyphen put
+Encoding 51 /three put
+Encoding 65 /A put
+Encoding 97 /a put
+Encoding 98 /b put
+Encoding 99 /c put
+Encoding 100 /d put
+Encoding 101 /e put
+Encoding 103 /g put
+Encoding 104 /h put
+Encoding 105 /i put
+Encoding 108 /l put
+Encoding 109 /m put
+Encoding 110 /n put
+Encoding 111 /o put
+Encoding 114 /r put
+Encoding 115 /s put
+Encoding 116 /t put
+Encoding 117 /u put
+Encoding 118 /v put
+Encoding 121 /y put
+/CharStrings 23 dict dup begin
+/.notdef 0 def
+/e 1 def
+/v 2 def
+/n 3 def
+/t 4 def
+/space 5 def
+/A 6 def
+/three 7 def
+/a 8 def
+/d 9 def
+/h 10 def
+/o 11 def
+/r 12 def
+/s 13 def
+/i 14 def
+/m 15 def
+/hyphen 16 def
+/g 17 def
+/b 18 def
+/u 19 def
+/c 20 def
+/l 21 def
+/y 22 def
+end readonly def
+/sfnts [
+<0001000000090080000300106376742000691d3900001024000001fe6670676d7134766a0000
+1224000000ab676c7966cefcdf900000009c00000f8868656164feeb17c7000012d000000036
+686865610cb806680000130800000024686d747866a80b180000132c0000005c6c6f63610000
+b43c00001388000000606d61787004840671000013e800000020707265703b07f10000001408
+0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec
+310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f272062900020071
+ffe3047f047b0014001b00704024001501098608880515a90105b90c01bb18b912b80c8c1c1b
+1502081508004b02120f451c10fcecf4ecc4111239310010e4f4ece410ee10ee10f4ee111239
+3040293f1d701da01dd01df01d053f003f013f023f153f1b052c072f082f092c0a6f006f016f
+026f156f1b095d71015d0115211e0133323637150e01232000111000333200072e0123220607
+047ffcb20ccdb76ac76263d06bfef4fec70129fce20107b802a5889ab90e025e5abec73434ae
+2a2c0138010a01130143feddc497b4ae9e000001003d0000047f0460000600fb402703110405
+040211010205050402110302060006011100000642020300bf0506050302010504000710d44b
+b00a5458b90000004038594bb014544bb015545b58b90000ffc03859c4173931002fec323930
+4b5358071005ed071008ed071008ed071005ed592201408e48026a027b027f02860280029102
+a402080600060109030904150015011a031a0426002601290329042008350035013a033a0430
+0846004601490349044605480640085600560159035904500866006601690369046705680660
+08750074017b037b0475057a068500850189038904890586069600960197029a039804980597
+06a805a706b008c008df08ff083e5d005d133309013301233dc3015e015ec3fe5cfa0460fc54
+03acfba00000000100ba00000464047b001300364019030900030e0106870e11b80cbc0a0102
+08004e0d09080b461410fcec32f4ec31002f3ce4f4c4ec1112173930b46015cf1502015d0111
+231134262322061511231133153e013332160464b87c7c95acb9b942b375c1c602a4fd5c029e
+9f9ebea4fd870460ae6564ef00010037000002f2059e0013003840190e05080f03a9001101bc
+08870a0b08090204000810120e461410fc3cc4fc3cc432393931002fecf43cc4ec3211393930
+b2af1501015d01112115211114163b01152322263511233533110177017bfe854b73bdbdd5a2
+8787059efec28ffda0894e9a9fd202608f013e000000000200100000056805d50002000a00c2
+404100110100040504021105050401110a030a0011020003030a071105040611050504091103
+0a08110a030a4200030795010381090509080706040302010009050a0b10d4c4173931002f3c
+e4d4ec1239304b5358071005ed0705ed071005ed0705ed071008ed071005ed071005ed071008
+ed5922b2200c01015d40420f010f020f070f080f005800760070008c00090701080206030904
+1601190256015802500c67016802780176027c0372047707780887018802800c980299039604
+175d005d090121013301230321032302bcfeee0225fe7be50239d288fd5f88d5050efd1903ae
+fa2b017ffe8100000001009cffe3047305f000280070402e0015130a86091f862013a0150da0
+0993061ca020932391068c15a329161c13000314191c2620101c03141f09062910fc4bb01654
+4bb014545b58b90009ffc03859c4c4d4ecf4ec11173939310010ece4f4e4ec10e6ee10ee10ee
+10ee11123930014009641e611f6120642104005d011e0115140421222627351e013332363534
+262b013533323635342623220607353e01333204151406033f91a3fed0fee85ec76a54c86dbe
+c7b9a5aeb6959ea39853be7273c959e6010c8e03251fc490ddf22525c33132968f8495a67770
+737b2426b42020d1b27cab000002007bffe3042d047b000a002500bc4027191f0b17090e00a9
+1706b90e1120861fba1cb923b8118c170c001703180d09080b1f030814452610fcecccd4ec32
+3211393931002fc4e4f4fcf4ec10c6ee10ee11391139123930406e301d301e301f3020302130
+223f27401d401e401f402040214022501d501e501f50205021502250277027851d871e871f87
+20872185229027a027f0271e301e301f30203021401e401f40204021501e501f50205021601e
+601f60206021701e701f70207021801e801f80208021185d015d0122061514163332363d0137
+1123350e01232226353436332135342623220607353e0133321602bedfac816f99b9b8b83fbc
+88accbfdfb0102a79760b65465be5af3f00233667b6273d9b4294cfd81aa6661c1a2bdc0127f
+8b2e2eaa2727fc0000020071ffe3045a06140010001c003840191ab9000e14b905088c0eb801
+970317040008024711120b451d10fcecf4ec323231002fece4f4c4ec10c4ee30b6601e801ea0
+1e03015d0111331123350e0123220211100033321601141633323635342623220603a2b8b83a
+b17ccbff00ffcb7cb1fdc7a79292a8a89292a703b6025ef9eca86461014401080108014461fe
+15cbe7e7cbcbe7e7000100ba000004640614001300344019030900030e0106870e11b80c970a
+010208004e0d09080b461410fcec32f4ec31002f3cecf4c4ec1112173930b2601501015d0111
+231134262322061511231133113e013332160464b87c7c95acb9b942b375c1c602a4fd5c029e
+9f9ebea4fd870614fd9e6564ef0000020071ffe30475047b000b0017004a401306b91200b90c
+b8128c1809120f51031215451810fcecf4ec310010e4f4ec10ee3040233f197b007b067f077f
+087f097f0a7f0b7b0c7f0d7f0e7f0f7f107f117b12a019f01911015d01220615141633323635
+3426273200111000232200111000027394acab9593acac93f00112feeef0f1feef011103dfe7
+c9c9e7e8c8c7e99cfec8feecfeedfec701390113011401380000000100ba0000034a047b0011
+00304014060b0700110b03870eb809bc070a06080008461210fcc4ec3231002fe4f4ecc4d4cc
+11123930b450139f1302015d012e012322061511231133153e0133321617034a1f492c9ca7b9
+b93aba85132e1c03b41211cbbefdb20460ae6663050500000001006fffe303c7047b002700e7
+403c0d0c020e0b531f1e080902070a531f1f1e420a0b1e1f041500860189041486158918b911
+04b925b8118c281e0a0b1f1b0700521b080e07081422452810fcc4ecd4ece411123939393931
+0010e4f4ec10fef5ee10f5ee121739304b535807100eed111739070eed1117395922b2002701
+015d406d1c0a1c0b1c0c2e092c0a2c0b2c0c3b093b0a3b0b3b0c0b200020012402280a280b2a
+132f142f152a16281e281f292029212427860a860b860c860d12000000010202060a060b030c
+030d030e030f03100319031a031b031c041d09272f293f295f297f2980299029a029f029185d
+005d7101152e012322061514161f011e0115140623222627351e013332363534262f012e0135
+3436333216038b4ea85a898962943fc4a5f7d85ac36c66c661828c65ab40ab98e0ce66b4043f
+ae282854544049210e2a99899cb62323be353559514b50250f2495829eac1e000000000200c1
+00000179061400030007002b400e06be04b100bc020501080400460810fc3cec3231002fe4fc
+ec30400b1009400950096009700905015d1333112311331523c1b8b8b8b80460fba00614e900
+000100ba0000071d047b0022005a4026061209180f00061d07150c871d2003b81bbc19100700
+110f0808065011080f501c18081a462310fcec32fcfcfcec11123931002f3c3ce4f43cc4ec32
+111217393040133024502470249024a024a024bf24df24ff2409015d013e0133321615112311
+34262322061511231134262322061511231133153e01333216042945c082afbeb972758fa6b9
+72778da6b9b93fb0797aab03897c76f5e2fd5c029ea19cbea4fd87029ea29bbfa3fd870460ae
+67627c0000000001006401df027f028300030011b6009c020401000410dccc310010d4ec3013
+21152164021bfde50283a40000020071fe56045a047b000b0028004a4023190c1d0912861316
+b90f03b92623b827bc09b90fbd1a1d261900080c4706121220452910fcc4ecf4ec323231002f
+c4e4ece4f4c4ec10fed5ee1112393930b6602a802aa02a03015d013426232206151416333236
+17100221222627351e013332363d010e0123220211101233321617353303a2a59594a5a59495
+a5b8fefefa61ac51519e52b5b439b27ccefcfcce7cb239b8023dc8dcdcc8c7dcdcebfee2fee9
+1d1eb32c2abdbf5b6362013a01030104013a6263aa00000200baffe304a40614000b001c0038
+401903b90c0f09b918158c0fb81b971900121247180c06081a461d10fcec3232f4ec31002fec
+e4f4c4ec10c6ee30b6601e801ea01e03015d013426232206151416333236013e013332001110
+02232226271523113303e5a79292a7a79292a7fd8e3ab17bcc00ffffcc7bb13ab9b9022fcbe7
+e7cbcbe7e702526461febcfef8fef8febc6164a80614000200aeffe30458047b00130014003b
+401c030900030e0106870e118c0a01bc14b80c0d0908140b4e020800461510fcecf439ec3231
+002fe4e432f4c4ec1112173930b46f15c01502015d1311331114163332363511331123350e01
+23222601aeb87c7c95adb8b843b175c1c801cf01ba02a6fd619f9fbea4027bfba0ac6663f003
+a80000010071ffe303e7047b0019003f401b00860188040e860d880ab91104b917b8118c1a07
+120d004814451a10fce432ec310010e4f4ec10fef4ee10f5ee30400b0f1b101b801b901ba01b
+05015d01152e0123220615141633323637150e0123220011100021321603e74e9d50b3c6c6b3
+509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde32b2baa2424013e010e0112013a23
+0000000100c100000179061400030022b7009702010800460410fcec31002fec30400d100540
+05500560057005f00506015d13331123c1b8b80614f9ec000001003dfe56047f0460000f018b
+40430708020911000f0a110b0a00000f0e110f000f0d110c0d00000f0d110e0d0a0b0a0c110b
+0b0a420d0b0910000b058703bd0e0bbc100e0d0c0a09060300080f040f0b1010d44bb00a544b
+b008545b58b9000b004038594bb0145458b9000bffc03859c4c4111739310010e432f4ec1139
+11391239304b5358071005ed071008ed071008ed071005ed071008ed0705ed173259220140f0
+060005080609030d160a170d100d230d350d490a4f0a4e0d5a095a0a6a0a870d800d930d120a
+000a09060b050c0b0e0b0f1701150210041005170a140b140c1a0e1a0f270024012402200420
+0529082809250a240b240c270d2a0e2a0f201137003501350230043005380a360b360c380d39
+0e390f30114100400140024003400440054006400740084209450a470d490e490f4011540051
+0151025503500450055606550756085709570a550b550c590e590f501166016602680a690e69
+0f60117b08780e780f89008a09850b850c890d890e890f9909950b950c9a0e9a0fa40ba40cab
+0eab0fb011cf11df11ff11655d005d050e012b01353332363f01013309013302934e947c936c
+4c543321fe3bc3015e015ec368c87a9a488654044efc94036c000000013500b800cb00cb00c1
+00aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189022d00cb00a6
+00f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4009c01390114
+013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2055605a60556
+053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd03aa00e503aa
+0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a009a006f00cb
+00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f600830354027f0000
+0333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4009c00000062
+009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d300b800cb00a6
+01c301ec069300a000d3035c037103db0185042304a80448008f0139011401390360008f05d5
+019a0614072306660179046004600460047b009c00000277046001aa00e904600762007b00c5
+007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f007b0000001d
+00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2002d0396008f
+027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029006604ee0073
+0000140000960000b707060504030201002c2010b002254964b040515820c859212d2cb00225
+4964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559b0051cb00325
+08b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d2c4b505820b0
+fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45442d2cb00225
+b0022549b00525b005254960b0206368208a108a233a8a10653a2d00000100000002547a17ec
+9d3c5f0f3cf5001f080000000000cd383c2600000000cd383c26f7d6fcae0d72095500000008
+000000010000000000010000076dfe1d00000de2f7d6fa510d72000100000000000000000000
+00000000001704cd006604ec007104bc003d051200ba03230037028b0000057900100517009c
+04e7007b05140071051200ba04e50071034a00ba042b006f023900c107cb00ba02e300640514
+0071051400ba051200ae04660071023900c104bc003d0000000000000044000001180000023c
+000002b400000330000003300000042c0000051400000640000006d800000750000007f40000
+0864000009c400000a1400000ad800000b0400000bcc00000c6400000ce800000d8000000dbc
+00000f880001000000170354002b0068000c000200100099000800000415021600080004b802
+8040fffbfe03fa1403f92503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f025
+03ef8a4105effe03ee9603ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e453
+05e59603e48a4105e45303e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe
+03db1203da7d03d9bb03d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d2
+1b03d1fe03d0fe03cffe03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c6
+1c03c51603c4fe03c3fe03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103
+b9862505b9fe03b8b7bb05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b525
+03b4fe03b39603b2fe03b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab25
+03aa1203a98a4105a9fa03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a164
+03a08a4105a096039ffe039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003
+990a0398fe0397960d0597fe03960d03958a410595960394930e05942803930e0392fa039190
+bb0591fe03908f5d0590bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe03
+8b2e038a8625058a410389880b05891403880b03878625058764038685110586250385110384
+fe038382110583fe0382110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b54
+15057b25037afe0379fe03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe03
+6ffe036efe036c21036bfe036a1142056a530369fe03687d036711420566fe0365fe0364fe03
+63fe0362fe03613a0360fa035e0c035dfe035bfe035afe0359580a0559fa03580a0357161905
+57320356fe035554150555420354150353011005531803521403514a130551fe03500b034ffe
+034e4d10054efe034d10034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d03
+47fe0346960345960344fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e1403
+3d3c0f053d12033c3b0d053c40ff0f033b0d033afe0339fe033837140538fa03373610053714
+0336350b05361003350b03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e
+2d09052e10032d09032c32032b2a25052b64032a2912052a2503291203282725052841032725
+0326250b05260f03250b0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e
+64031d0d031c1142051cfe031bfa031a42031911420519fe031864031716190517fe03160110
+0516190315fe0314fe0313fe031211420512fe0311022d05114203107d030f64030efe030d0c
+16050dfe030c0110050c16030bfe030a100309fe0308022d0508fe0307140306640304011005
+04fe03401503022d0503fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b1d00>
+] def
+/f-0-0 currentdict end definefont pop
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 -1 480 361
+%%EndPageSetup
+q 0 -1 480 362 rectclip q
+1 g
+0.25 359.752 479.5 -359.504 re f
+Q q
+0 360.002 480 -360.004 re W n
+q
+0 360.002 480 -361 re W n
+[ 1 0 0 1 0 -0.998047 ] concat
+  q
+0 g
+0.5 w
+1 J
+1 j
+[] 0.0 d
+10 M q 1 0 0 -1 0 361 cm
+0.25 0.25 479.5 359.504 re S Q
+  Q
+Q
+0.509804 0.498039 0.509804 rg
+1 w
+1 J
+1 j
+[] 0.0 d
+10 M q 1 0 0 -1 0 360.001953 cm
+36.336 8.949 434.281 293.688 re S Q
+0 g
+0.5 w
+q 1 0 0 -1 0 360.001953 cm
+36.336 302.637 m 470.617 302.637 l 36.336 306.887 m 36.336 302.637 l 108.715
+ 306.887 m 108.715 302.637 l 181.098 306.887 m 181.098 302.637 l 253.477
+ 306.887 m 253.477 302.637 l 325.855 306.887 m 325.855 302.637 l 398.238
+ 306.887 m 398.238 302.637 l 470.617 306.887 m 470.617 302.637 l S Q
+34.246 47.357 m 34.621 47.283 34.91 47.115 35.121 46.857 c 35.34 46.607
+ 35.449 46.295 35.449 45.92 c 35.449 45.334 35.25 44.889 34.855 44.576 c
+ 34.457 44.264 33.895 44.107 33.168 44.107 c 32.918 44.107 32.66 44.135 
+32.402 44.186 c 32.152 44.225 31.887 44.295 31.605 44.389 c 31.605 45.154
+ l 31.824 45.029 32.062 44.928 32.324 44.857 c 32.582 44.795 32.855 44.764
+ 33.137 44.764 c 33.637 44.764 34.016 44.861 34.277 45.061 c 34.535 45.256
+ 34.668 45.545 34.668 45.92 c 34.668 46.264 34.543 46.529 34.293 46.717 
+c 34.051 46.912 33.719 47.014 33.293 47.014 c 32.621 47.014 l 32.621 47.654
+ l 33.324 47.654 l 33.707 47.654 34.004 47.732 34.215 47.889 c 34.422 48.045
+ 34.527 48.268 34.527 48.561 c 34.527 48.861 34.418 49.092 34.199 49.248
+ c 33.988 49.412 33.688 49.498 33.293 49.498 c 33.074 49.498 32.84 49.471
+ 32.59 49.42 c 32.348 49.377 32.078 49.303 31.777 49.201 c 31.777 49.904
+ l 32.078 49.986 32.359 50.049 32.621 50.092 c 32.879 50.131 33.129 50.154
+ 33.371 50.154 c 33.965 50.154 34.434 50.018 34.777 49.748 c 35.129 49.475
+ 35.309 49.107 35.309 48.639 c 35.309 48.314 35.215 48.045 35.027 47.826
+ c 34.848 47.607 34.59 47.451 34.246 47.357 c h
+f
+38.727 47.451 m 38.371 47.451 38.09 47.326 37.883 47.076 c 37.672 46.834
+ 37.57 46.506 37.57 46.092 c 37.57 45.674 37.672 45.342 37.883 45.092 c 
+38.09 44.85 38.371 44.732 38.727 44.732 c 39.078 44.732 39.359 44.85 39.57
+ 45.092 c 39.777 45.342 39.883 45.674 39.883 46.092 c 39.883 46.506 39.777
+ 46.834 39.57 47.076 c 39.359 47.326 39.078 47.451 38.727 47.451 c h
+40.289 49.92 m 40.289 49.201 l 40.09 49.295 39.891 49.365 39.695 49.42 
+c 39.496 49.471 39.297 49.498 39.102 49.498 c 38.578 49.498 38.18 49.318
+ 37.898 48.967 c 37.625 48.611 37.469 48.08 37.43 47.373 c 37.586 47.6 37.777
+ 47.771 38.008 47.889 c 38.234 48.014 38.492 48.076 38.773 48.076 c 39.355
+ 48.076 39.82 47.896 40.164 47.545 c 40.508 47.189 40.68 46.705 40.68 46.092
+ c 40.68 45.486 40.5 45.002 40.148 44.639 c 39.793 44.283 39.32 44.107 38.727
+ 44.107 c 38.047 44.107 37.531 44.361 37.18 44.873 c 36.824 45.393 36.648
+ 46.143 36.648 47.123 c 36.648 48.049 36.867 48.783 37.305 49.326 c 37.742
+ 49.877 38.328 50.154 39.07 50.154 c 39.266 50.154 39.465 50.131 39.664 
+50.092 c 39.859 50.061 40.07 50.002 40.289 49.92 c h
+f
+106.625 47.357 m 107 47.283 107.289 47.115 107.5 46.857 c 107.719 46.607
+ 107.828 46.295 107.828 45.92 c 107.828 45.334 107.629 44.889 107.234 44.576
+ c 106.836 44.264 106.273 44.107 105.547 44.107 c 105.297 44.107 105.039
+ 44.135 104.781 44.186 c 104.531 44.225 104.266 44.295 103.984 44.389 c 
+103.984 45.154 l 104.203 45.029 104.441 44.928 104.703 44.857 c 104.961 
+44.795 105.234 44.764 105.516 44.764 c 106.016 44.764 106.395 44.861 106.656
+ 45.061 c 106.914 45.256 107.047 45.545 107.047 45.92 c 107.047 46.264 106.922
+ 46.529 106.672 46.717 c 106.43 46.912 106.098 47.014 105.672 47.014 c 105
+ 47.014 l 105 47.654 l 105.703 47.654 l 106.086 47.654 106.383 47.732 106.594
+ 47.889 c 106.801 48.045 106.906 48.268 106.906 48.561 c 106.906 48.861 
+106.797 49.092 106.578 49.248 c 106.367 49.412 106.066 49.498 105.672 49.498
+ c 105.453 49.498 105.219 49.471 104.969 49.42 c 104.727 49.377 104.457 
+49.303 104.156 49.201 c 104.156 49.904 l 104.457 49.986 104.738 50.049 105
+ 50.092 c 105.258 50.131 105.508 50.154 105.75 50.154 c 106.344 50.154 106.812
+ 50.018 107.156 49.748 c 107.508 49.475 107.688 49.107 107.688 48.639 c 
+107.688 48.314 107.594 48.045 107.406 47.826 c 107.227 47.607 106.969 47.451
+ 106.625 47.357 c h
+f
+109.121 50.045 m 112.871 50.045 l 112.871 49.717 l 110.762 44.217 l 109.934
+ 44.217 l 111.918 49.389 l 109.121 49.389 l h
+f
+179.008 47.357 m 179.383 47.283 179.672 47.115 179.883 46.857 c 180.102
+ 46.607 180.211 46.295 180.211 45.92 c 180.211 45.334 180.012 44.889 179.617
+ 44.576 c 179.219 44.264 178.656 44.107 177.93 44.107 c 177.68 44.107 177.422
+ 44.135 177.164 44.186 c 176.914 44.225 176.648 44.295 176.367 44.389 c 
+176.367 45.154 l 176.586 45.029 176.824 44.928 177.086 44.857 c 177.344 
+44.795 177.617 44.764 177.898 44.764 c 178.398 44.764 178.777 44.861 179.039
+ 45.061 c 179.297 45.256 179.43 45.545 179.43 45.92 c 179.43 46.264 179.305
+ 46.529 179.055 46.717 c 178.812 46.912 178.48 47.014 178.055 47.014 c 177.383
+ 47.014 l 177.383 47.654 l 178.086 47.654 l 178.469 47.654 178.766 47.732
+ 178.977 47.889 c 179.184 48.045 179.289 48.268 179.289 48.561 c 179.289
+ 48.861 179.18 49.092 178.961 49.248 c 178.75 49.412 178.449 49.498 178.055
+ 49.498 c 177.836 49.498 177.602 49.471 177.352 49.42 c 177.109 49.377 176.84
+ 49.303 176.539 49.201 c 176.539 49.904 l 176.84 49.986 177.121 50.049 177.383
+ 50.092 c 177.641 50.131 177.891 50.154 178.133 50.154 c 178.727 50.154 
+179.195 50.018 179.539 49.748 c 179.891 49.475 180.07 49.107 180.07 48.639
+ c 180.07 48.314 179.977 48.045 179.789 47.826 c 179.609 47.607 179.352 
+47.451 179.008 47.357 c h
+f
+183.395 46.982 m 183.02 46.982 182.723 46.881 182.504 46.686 c 182.293 
+46.486 182.191 46.209 182.191 45.857 c 182.191 45.502 182.293 45.225 182.504
+ 45.029 c 182.723 44.83 183.02 44.732 183.395 44.732 c 183.77 44.732 184.059
+ 44.83 184.27 45.029 c 184.488 45.236 184.598 45.514 184.598 45.857 c 184.598
+ 46.209 184.488 46.486 184.27 46.686 c 184.059 46.881 183.77 46.982 183.395
+ 46.982 c h
+182.598 47.326 m 182.262 47.408 182.004 47.564 181.816 47.795 c 181.629
+ 48.021 181.535 48.303 181.535 48.639 c 181.535 49.107 181.695 49.475 182.02
+ 49.748 c 182.352 50.018 182.809 50.154 183.395 50.154 c 183.977 50.154 
+184.43 50.018 184.754 49.748 c 185.086 49.475 185.254 49.107 185.254 48.639
+ c 185.254 48.303 185.16 48.021 184.973 47.795 c 184.785 47.564 184.523 
+47.408 184.191 47.326 c 184.566 47.232 184.855 47.053 185.066 46.795 c 185.285
+ 46.545 185.395 46.232 185.395 45.857 c 185.395 45.295 185.223 44.861 184.879
+ 44.561 c 184.535 44.256 184.039 44.107 183.395 44.107 c 182.746 44.107 
+182.254 44.256 181.91 44.561 c 181.566 44.861 181.395 45.295 181.395 45.857
+ c 181.395 46.232 181.496 46.545 181.707 46.795 c 181.926 47.053 182.223
+ 47.232 182.598 47.326 c h
+182.316 48.576 m 182.316 48.271 182.41 48.033 182.598 47.857 c 182.785 
+47.689 183.051 47.607 183.395 47.607 c 183.727 47.607 183.988 47.689 184.176
+ 47.857 c 184.371 48.033 184.473 48.271 184.473 48.576 c 184.473 48.877 
+184.371 49.111 184.176 49.279 c 183.988 49.443 183.727 49.529 183.395 49.529
+ c 183.051 49.529 182.785 49.443 182.598 49.279 c 182.41 49.111 182.316 
+48.877 182.316 48.576 c h
+f
+251.387 47.357 m 251.762 47.283 252.051 47.115 252.262 46.857 c 252.48 
+46.607 252.59 46.295 252.59 45.92 c 252.59 45.334 252.391 44.889 251.996
+ 44.576 c 251.598 44.264 251.035 44.107 250.309 44.107 c 250.059 44.107 
+249.801 44.135 249.543 44.186 c 249.293 44.225 249.027 44.295 248.746 44.389
+ c 248.746 45.154 l 248.965 45.029 249.203 44.928 249.465 44.857 c 249.723
+ 44.795 249.996 44.764 250.277 44.764 c 250.777 44.764 251.156 44.861 251.418
+ 45.061 c 251.676 45.256 251.809 45.545 251.809 45.92 c 251.809 46.264 251.684
+ 46.529 251.434 46.717 c 251.191 46.912 250.859 47.014 250.434 47.014 c 
+249.762 47.014 l 249.762 47.654 l 250.465 47.654 l 250.848 47.654 251.145
+ 47.732 251.355 47.889 c 251.562 48.045 251.668 48.268 251.668 48.561 c 
+251.668 48.861 251.559 49.092 251.34 49.248 c 251.129 49.412 250.828 49.498
+ 250.434 49.498 c 250.215 49.498 249.98 49.471 249.73 49.42 c 249.488 49.377
+ 249.219 49.303 248.918 49.201 c 248.918 49.904 l 249.219 49.986 249.5 50.049
+ 249.762 50.092 c 250.02 50.131 250.27 50.154 250.512 50.154 c 251.105 50.154
+ 251.574 50.018 251.918 49.748 c 252.27 49.475 252.449 49.107 252.449 48.639
+ c 252.449 48.314 252.355 48.045 252.168 47.826 c 251.988 47.607 251.73 
+47.451 251.387 47.357 c h
+f
+254.102 44.342 m 254.102 45.061 l 254.297 44.967 254.496 44.893 254.695
+ 44.842 c 254.902 44.787 255.105 44.764 255.305 44.764 c 255.824 44.764 
+256.219 44.939 256.492 45.295 c 256.773 45.646 256.934 46.178 256.977 46.889
+ c 256.82 46.67 256.625 46.498 256.398 46.373 c 256.168 46.256 255.914 46.201
+ 255.633 46.201 c 255.047 46.201 254.586 46.373 254.242 46.717 c 253.898
+ 47.068 253.727 47.553 253.727 48.17 c 253.727 48.771 253.902 49.252 254.258
+ 49.607 c 254.609 49.971 255.086 50.154 255.68 50.154 c 256.355 50.154 256.871
+ 49.893 257.227 49.373 c 257.578 48.861 257.758 48.111 257.758 47.123 c 
+257.758 46.205 257.539 45.471 257.102 44.92 c 256.664 44.377 256.074 44.107
+ 255.336 44.107 c 255.137 44.107 254.934 44.131 254.727 44.17 c 254.527 
+44.201 254.32 44.256 254.102 44.342 c h
+255.68 46.811 m 256.031 46.811 256.312 46.928 256.523 47.17 c 256.73 47.42
+ 256.836 47.752 256.836 48.17 c 256.836 48.584 256.73 48.912 256.523 49.154
+ c 256.312 49.404 256.031 49.529 255.68 49.529 c 255.324 49.529 255.043 
+49.404 254.836 49.154 c 254.625 48.912 254.523 48.584 254.523 48.17 c 254.523
+ 47.752 254.625 47.42 254.836 47.17 c 255.043 46.928 255.324 46.811 255.68
+ 46.811 c h
+f
+323.547 49.357 m 321.547 46.248 l 323.547 46.248 l h
+323.328 50.045 m 324.328 50.045 l 324.328 46.248 l 325.156 46.248 l 325.156
+ 45.592 l 324.328 45.592 l 324.328 44.217 l 323.547 44.217 l 323.547 45.592
+ l 320.906 45.592 l 320.906 46.357 l h
+f
+328.152 49.529 m 327.746 49.529 327.438 49.326 327.23 48.92 c 327.031 48.521
+ 326.934 47.924 326.934 47.123 c 326.934 46.33 327.031 45.732 327.23 45.326
+ c 327.438 44.928 327.746 44.732 328.152 44.732 c 328.559 44.732 328.859
+ 44.928 329.059 45.326 c 329.266 45.732 329.371 46.33 329.371 47.123 c 329.371
+ 47.924 329.266 48.521 329.059 48.92 c 328.859 49.326 328.559 49.529 328.152
+ 49.529 c h
+328.152 50.154 m 328.809 50.154 329.309 49.893 329.652 49.373 c 329.996
+ 48.861 330.168 48.111 330.168 47.123 c 330.168 46.143 329.996 45.393 329.652
+ 44.873 c 329.309 44.361 328.809 44.107 328.152 44.107 c 327.496 44.107 
+326.996 44.361 326.652 44.873 c 326.309 45.393 326.137 46.143 326.137 47.123
+ c 326.137 48.111 326.309 48.861 326.652 49.373 c 326.996 49.893 327.496
+ 50.154 328.152 50.154 c h
+f
+395.93 49.357 m 393.93 46.248 l 395.93 46.248 l h
+395.711 50.045 m 396.711 50.045 l 396.711 46.248 l 397.539 46.248 l 397.539
+ 45.592 l 396.711 45.592 l 396.711 44.217 l 395.93 44.217 l 395.93 45.592
+ l 393.289 45.592 l 393.289 46.357 l h
+f
+398.988 44.889 m 400.27 44.889 l 400.27 49.326 l 398.863 49.045 l 398.863
+ 49.764 l 400.27 50.045 l 401.051 50.045 l 401.051 44.889 l 402.348 44.889
+ l 402.348 44.217 l 398.988 44.217 l h
+f
+468.309 49.357 m 466.309 46.248 l 468.309 46.248 l h
+468.09 50.045 m 469.09 50.045 l 469.09 46.248 l 469.918 46.248 l 469.918
+ 45.592 l 469.09 45.592 l 469.09 44.217 l 468.309 44.217 l 468.309 45.592
+ l 465.668 45.592 l 465.668 46.357 l h
+f
+471.898 44.889 m 474.664 44.889 l 474.664 44.217 l 470.961 44.217 l 470.961
+ 44.889 l 471.25 45.189 471.656 45.6 472.18 46.123 c 472.699 46.654 473.023
+ 46.99 473.148 47.139 c 473.406 47.42 473.586 47.658 473.68 47.857 c 473.781
+ 48.053 473.836 48.248 473.836 48.436 c 473.836 48.748 473.727 49.002 473.508
+ 49.201 c 473.289 49.396 473.008 49.498 472.664 49.498 c 472.414 49.498 
+472.148 49.451 471.867 49.357 c 471.594 49.271 471.305 49.143 470.992 48.967
+ c 470.992 49.764 l 471.312 49.896 471.609 49.998 471.883 50.061 c 472.164
+ 50.123 472.418 50.154 472.648 50.154 c 473.25 50.154 473.73 50.002 474.086
+ 49.701 c 474.449 49.396 474.633 48.998 474.633 48.498 c 474.633 48.256 
+474.586 48.029 474.492 47.811 c 474.398 47.592 474.234 47.334 474.008 47.045
+ c 473.934 46.971 473.719 46.752 473.367 46.389 c 473.023 46.033 472.531
+ 45.533 471.898 44.889 c h
+f
+208.883 36.096 m 215.055 36.096 l 215.055 35.252 l 212.461 35.252 l 212.461
+ 28.799 l 211.477 28.799 l 211.477 35.252 l 208.883 35.252 l h
+f
+215.652 34.268 m 216.559 34.268 l 216.559 28.799 l 215.652 28.799 l h
+215.652 36.393 m 216.559 36.393 l 216.559 35.252 l 215.652 35.252 l h
+f
+222.695 33.221 m 222.914 33.627 223.18 33.924 223.492 34.111 c 223.805 
+34.299 224.172 34.393 224.602 34.393 c 225.172 34.393 225.609 34.193 225.914
+ 33.799 c 226.227 33.4 226.383 32.834 226.383 32.096 c 226.383 28.799 l 
+225.477 28.799 l 225.477 32.064 l 225.477 32.596 225.383 32.986 225.195 
+33.236 c 225.016 33.486 224.734 33.611 224.352 33.611 c 223.883 33.611 223.512
+ 33.455 223.242 33.143 c 222.98 32.838 222.852 32.424 222.852 31.893 c 222.852
+ 28.799 l 221.945 28.799 l 221.945 32.064 l 221.945 32.596 221.852 32.986
+ 221.664 33.236 c 221.477 33.486 221.188 33.611 220.805 33.611 c 220.344
+ 33.611 219.98 33.455 219.711 33.143 c 219.438 32.838 219.305 32.424 219.305
+ 31.893 c 219.305 28.799 l 218.398 28.799 l 218.398 34.268 l 219.305 34.268
+ l 219.305 33.424 l 219.512 33.756 219.758 34.002 220.039 34.158 c 220.328
+ 34.314 220.668 34.393 221.055 34.393 c 221.461 34.393 221.797 34.291 222.07
+ 34.096 c 222.352 33.896 222.559 33.604 222.695 33.221 c h
+f
+232.859 31.752 m 232.859 31.314 l 228.719 31.314 l 228.758 30.697 228.945
+ 30.229 229.281 29.908 c 229.613 29.584 230.078 29.424 230.672 29.424 c 
+231.016 29.424 231.348 29.463 231.672 29.549 c 232.004 29.631 232.328 29.756
+ 232.641 29.924 c 232.641 29.08 l 232.316 28.943 231.984 28.838 231.641 
+28.768 c 231.305 28.697 230.969 28.658 230.625 28.658 c 229.75 28.658 229.055
+ 28.908 228.547 29.408 c 228.035 29.916 227.781 30.611 227.781 31.486 c 
+227.781 32.381 228.02 33.088 228.5 33.611 c 228.988 34.131 229.645 34.393
+ 230.469 34.393 c 231.207 34.393 231.789 34.158 232.219 33.689 c 232.645
+ 33.221 232.859 32.572 232.859 31.752 c h
+231.953 32.018 m 231.953 32.506 231.816 32.896 231.547 33.189 c 231.273
+ 33.49 230.922 33.643 230.484 33.643 c 229.973 33.643 229.566 33.494 229.266
+ 33.205 c 228.973 32.924 228.801 32.525 228.75 32.018 c h
+f
+239.66 36.393 m 239.23 35.643 238.91 34.896 238.691 34.158 c 238.48 33.428
+ 238.379 32.689 238.379 31.939 c 238.379 31.189 238.48 30.443 238.691 29.705
+ c 238.91 28.963 239.23 28.229 239.66 27.486 c 238.879 27.486 l 238.398 
+28.248 238.035 28.994 237.785 29.736 c 237.543 30.475 237.426 31.209 237.426
+ 31.939 c 237.426 32.666 237.543 33.396 237.785 34.127 c 238.023 34.865 
+238.387 35.619 238.879 36.393 c h
+f
+241.402 34.268 m 242.309 34.268 l 242.309 28.799 l 241.402 28.799 l h
+241.402 36.393 m 242.309 36.393 l 242.309 35.252 l 241.402 35.252 l h
+f
+248.73 32.096 m 248.73 28.799 l 247.84 28.799 l 247.84 32.064 l 247.84 
+32.584 247.734 32.971 247.527 33.221 c 247.328 33.479 247.027 33.611 246.621
+ 33.611 c 246.141 33.611 245.762 33.455 245.48 33.143 c 245.199 32.838 245.059
+ 32.424 245.059 31.893 c 245.059 28.799 l 244.152 28.799 l 244.152 34.268
+ l 245.059 34.268 l 245.059 33.424 l 245.277 33.744 245.531 33.986 245.824
+ 34.143 c 246.113 34.307 246.449 34.393 246.824 34.393 c 247.449 34.393 
+247.922 34.197 248.246 33.814 c 248.566 33.428 248.73 32.854 248.73 32.096
+ c h
+f
+257.184 34.111 m 257.184 33.252 l 256.934 33.385 256.672 33.486 256.402
+ 33.549 c 256.129 33.611 255.844 33.643 255.543 33.643 c 255.105 33.643 
+254.77 33.572 254.543 33.439 c 254.324 33.303 254.215 33.1 254.215 32.83
+ c 254.215 32.619 254.293 32.455 254.449 32.33 c 254.605 32.213 254.926 
+32.104 255.418 32.002 c 255.715 31.924 l 256.359 31.787 256.812 31.596 257.074
+ 31.346 c 257.344 31.096 257.48 30.752 257.48 30.314 c 257.48 29.803 257.277
+ 29.396 256.871 29.096 c 256.473 28.803 255.926 28.658 255.23 28.658 c 254.926
+ 28.658 254.613 28.689 254.293 28.752 c 253.98 28.803 253.652 28.885 253.309
+ 29.002 c 253.309 29.924 l 253.641 29.756 253.965 29.627 254.277 29.533 
+c 254.598 29.447 254.922 29.408 255.246 29.408 c 255.66 29.408 255.984 29.479
+ 256.215 29.627 c 256.441 29.771 256.559 29.975 256.559 30.236 c 256.559
+ 30.486 256.473 30.674 256.309 30.799 c 256.152 30.932 255.793 31.057 255.23
+ 31.174 c 254.918 31.252 l 254.363 31.365 253.965 31.541 253.715 31.783 
+c 253.465 32.033 253.34 32.365 253.34 32.783 c 253.34 33.303 253.52 33.697
+ 253.887 33.971 c 254.25 34.252 254.77 34.393 255.449 34.393 c 255.77 34.393
+ 256.078 34.365 256.371 34.314 c 256.672 34.271 256.941 34.205 257.184 34.111
+ c h
+f
+263.598 31.752 m 263.598 31.314 l 259.457 31.314 l 259.496 30.697 259.684
+ 30.229 260.02 29.908 c 260.352 29.584 260.816 29.424 261.41 29.424 c 261.754
+ 29.424 262.086 29.463 262.41 29.549 c 262.742 29.631 263.066 29.756 263.379
+ 29.924 c 263.379 29.08 l 263.055 28.943 262.723 28.838 262.379 28.768 c
+ 262.043 28.697 261.707 28.658 261.363 28.658 c 260.488 28.658 259.793 28.908
+ 259.285 29.408 c 258.773 29.916 258.52 30.611 258.52 31.486 c 258.52 32.381
+ 258.758 33.088 259.238 33.611 c 259.727 34.131 260.383 34.393 261.207 34.393
+ c 261.945 34.393 262.527 34.158 262.957 33.689 c 263.383 33.221 263.598
+ 32.572 263.598 31.752 c h
+262.691 32.018 m 262.691 32.506 262.555 32.896 262.285 33.189 c 262.012
+ 33.49 261.66 33.643 261.223 33.643 c 260.711 33.643 260.305 33.494 260.004
+ 33.205 c 259.711 32.924 259.539 32.525 259.488 32.018 c h
+f
+269 34.064 m 269 33.221 l 268.75 33.354 268.492 33.459 268.234 33.533 c
+ 267.984 33.604 267.727 33.643 267.469 33.643 c 266.883 33.643 266.43 33.455
+ 266.109 33.08 c 265.785 32.713 265.625 32.197 265.625 31.533 c 265.625 
+30.865 265.785 30.346 266.109 29.971 c 266.43 29.604 266.883 29.424 267.469
+ 29.424 c 267.727 29.424 267.984 29.455 268.234 29.518 c 268.492 29.588 
+268.75 29.697 269 29.846 c 269 29.002 l 268.75 28.885 268.488 28.803 268.219
+ 28.752 c 267.957 28.689 267.676 28.658 267.375 28.658 c 266.539 28.658 
+265.879 28.912 265.391 29.424 c 264.91 29.943 264.672 30.646 264.672 31.533
+ c 264.672 32.416 264.914 33.115 265.406 33.627 c 265.895 34.135 266.566
+ 34.393 267.422 34.393 c 267.703 34.393 267.973 34.365 268.234 34.314 c 
+268.492 34.26 268.75 34.178 269 34.064 c h
+f
+272.684 33.643 m 272.203 33.643 271.824 33.455 271.543 33.08 c 271.262 
+32.705 271.121 32.189 271.121 31.533 c 271.121 30.877 271.254 30.361 271.527
+ 29.986 c 271.809 29.611 272.191 29.424 272.684 29.424 c 273.16 29.424 273.543
+ 29.611 273.824 29.986 c 274.105 30.361 274.246 30.877 274.246 31.533 c 
+274.246 32.178 274.105 32.689 273.824 33.064 c 273.543 33.447 273.16 33.643
+ 272.684 33.643 c h
+272.684 34.393 m 273.465 34.393 274.078 34.135 274.527 33.627 c 274.973
+ 33.127 275.199 32.428 275.199 31.533 c 275.199 30.635 274.973 29.932 274.527
+ 29.424 c 274.078 28.912 273.465 28.658 272.684 28.658 c 271.902 28.658 
+271.285 28.912 270.84 29.424 c 270.391 29.932 270.168 30.635 270.168 31.533
+ c 270.168 32.428 270.391 33.127 270.84 33.627 c 271.285 34.135 271.902 
+34.393 272.684 34.393 c h
+f
+281.223 32.096 m 281.223 28.799 l 280.332 28.799 l 280.332 32.064 l 280.332
+ 32.584 280.227 32.971 280.02 33.221 c 279.82 33.479 279.52 33.611 279.113
+ 33.611 c 278.633 33.611 278.254 33.455 277.973 33.143 c 277.691 32.838 
+277.551 32.424 277.551 31.893 c 277.551 28.799 l 276.645 28.799 l 276.645
+ 34.268 l 277.551 34.268 l 277.551 33.424 l 277.77 33.744 278.023 33.986
+ 278.316 34.143 c 278.605 34.307 278.941 34.393 279.316 34.393 c 279.941
+ 34.393 280.414 34.197 280.738 33.814 c 281.059 33.428 281.223 32.854 281.223
+ 32.096 c h
+f
+286.625 33.439 m 286.625 36.393 l 287.516 36.393 l 287.516 28.799 l 286.625
+ 28.799 l 286.625 29.627 l 286.438 29.291 286.195 29.049 285.906 28.893 
+c 285.613 28.736 285.266 28.658 284.859 28.658 c 284.203 28.658 283.664 
+28.916 283.25 29.439 c 282.832 29.971 282.625 30.666 282.625 31.533 c 282.625
+ 32.385 282.832 33.072 283.25 33.596 c 283.664 34.127 284.203 34.393 284.859
+ 34.393 c 285.266 34.393 285.613 34.314 285.906 34.158 c 286.195 34.002 
+286.438 33.76 286.625 33.439 c h
+283.562 31.533 m 283.562 30.865 283.695 30.346 283.969 29.971 c 284.238
+ 29.596 284.613 29.408 285.094 29.408 c 285.562 29.408 285.93 29.596 286.203
+ 29.971 c 286.484 30.346 286.625 30.865 286.625 31.533 c 286.625 32.189 
+286.484 32.705 286.203 33.08 c 285.93 33.455 285.562 33.643 285.094 33.643
+ c 284.613 33.643 284.238 33.455 283.969 33.08 c 283.695 32.705 283.562 
+32.189 283.562 31.533 c h
+f
+292.848 34.111 m 292.848 33.252 l 292.598 33.385 292.336 33.486 292.066
+ 33.549 c 291.793 33.611 291.508 33.643 291.207 33.643 c 290.77 33.643 290.434
+ 33.572 290.207 33.439 c 289.988 33.303 289.879 33.1 289.879 32.83 c 289.879
+ 32.619 289.957 32.455 290.113 32.33 c 290.27 32.213 290.59 32.104 291.082
+ 32.002 c 291.379 31.924 l 292.023 31.787 292.477 31.596 292.738 31.346 
+c 293.008 31.096 293.145 30.752 293.145 30.314 c 293.145 29.803 292.941 
+29.396 292.535 29.096 c 292.137 28.803 291.59 28.658 290.895 28.658 c 290.59
+ 28.658 290.277 28.689 289.957 28.752 c 289.645 28.803 289.316 28.885 288.973
+ 29.002 c 288.973 29.924 l 289.305 29.756 289.629 29.627 289.941 29.533 
+c 290.262 29.447 290.586 29.408 290.91 29.408 c 291.324 29.408 291.648 29.479
+ 291.879 29.627 c 292.105 29.771 292.223 29.975 292.223 30.236 c 292.223
+ 30.486 292.137 30.674 291.973 30.799 c 291.816 30.932 291.457 31.057 290.895
+ 31.174 c 290.582 31.252 l 290.027 31.365 289.629 31.541 289.379 31.783 
+c 289.129 32.033 289.004 32.365 289.004 32.783 c 289.004 33.303 289.184 
+33.697 289.551 33.971 c 289.914 34.252 290.434 34.393 291.113 34.393 c 291.434
+ 34.393 291.742 34.365 292.035 34.314 c 292.336 34.271 292.605 34.205 292.848
+ 34.111 c h
+f
+294.434 36.393 m 295.215 36.393 l 295.703 35.619 296.066 34.865 296.309
+ 34.127 c 296.559 33.396 296.684 32.666 296.684 31.939 c 296.684 31.209 
+296.559 30.475 296.309 29.736 c 296.066 28.994 295.703 28.248 295.215 27.486
+ c 294.434 27.486 l 294.871 28.229 295.191 28.963 295.402 29.705 c 295.621
+ 30.443 295.73 31.189 295.73 31.939 c 295.73 32.689 295.621 33.428 295.402
+ 34.158 c 295.191 34.896 294.871 35.643 294.434 36.393 c h
+f
+q 1 0 0 -1 0 360.001953 cm
+36.336 302.637 m 36.336 8.949 l 32.086 302.637 m 36.336 302.637 l 32.086
+ 265.926 m 36.336 265.926 l 32.086 229.215 m 36.336 229.215 l 32.086 192.504
+ m 36.336 192.504 l 32.086 155.793 m 36.336 155.793 l 32.086 119.082 m 36.336
+ 119.082 l 32.086 82.371 m 36.336 82.371 l 32.086 45.66 m 36.336 45.66 l
+ 32.086 8.949 m 36.336 8.949 l S Q
+20.59 60.674 m 24.34 60.674 l 24.34 60.346 l 22.23 54.846 l 21.402 54.846
+ l 23.387 60.018 l 20.59 60.018 l h
+f
+26.555 55.518 m 29.32 55.518 l 29.32 54.846 l 25.617 54.846 l 25.617 55.518
+ l 25.906 55.818 26.312 56.229 26.836 56.752 c 27.355 57.283 27.68 57.619
+ 27.805 57.768 c 28.062 58.049 28.242 58.287 28.336 58.486 c 28.438 58.682
+ 28.492 58.877 28.492 59.064 c 28.492 59.377 28.383 59.631 28.164 59.83 
+c 27.945 60.025 27.664 60.127 27.32 60.127 c 27.07 60.127 26.805 60.08 26.523
+ 59.986 c 26.25 59.9 25.961 59.771 25.648 59.596 c 25.648 60.393 l 25.969
+ 60.525 26.266 60.627 26.539 60.689 c 26.82 60.752 27.074 60.783 27.305 
+60.783 c 27.906 60.783 28.387 60.631 28.742 60.33 c 29.105 60.025 29.289
+ 59.627 29.289 59.127 c 29.289 58.885 29.242 58.658 29.148 58.439 c 29.055
+ 58.221 28.891 57.963 28.664 57.674 c 28.59 57.6 28.375 57.381 28.023 57.018
+ c 27.68 56.662 27.188 56.162 26.555 55.518 c h
+f
+20.59 97.385 m 24.34 97.385 l 24.34 97.057 l 22.23 91.557 l 21.402 91.557
+ l 23.387 96.729 l 20.59 96.729 l h
+f
+28.273 94.697 m 28.648 94.623 28.938 94.455 29.148 94.197 c 29.367 93.947
+ 29.477 93.635 29.477 93.26 c 29.477 92.674 29.277 92.229 28.883 91.916 
+c 28.484 91.604 27.922 91.447 27.195 91.447 c 26.945 91.447 26.688 91.475
+ 26.43 91.525 c 26.18 91.564 25.914 91.635 25.633 91.729 c 25.633 92.494
+ l 25.852 92.369 26.09 92.268 26.352 92.197 c 26.609 92.135 26.883 92.104
+ 27.164 92.104 c 27.664 92.104 28.043 92.201 28.305 92.4 c 28.562 92.596
+ 28.695 92.885 28.695 93.26 c 28.695 93.604 28.57 93.869 28.32 94.057 c 
+28.078 94.252 27.746 94.354 27.32 94.354 c 26.648 94.354 l 26.648 94.994
+ l 27.352 94.994 l 27.734 94.994 28.031 95.072 28.242 95.229 c 28.449 95.385
+ 28.555 95.607 28.555 95.9 c 28.555 96.201 28.445 96.432 28.227 96.588 c
+ 28.016 96.752 27.715 96.838 27.32 96.838 c 27.102 96.838 26.867 96.811 
+26.617 96.76 c 26.375 96.717 26.105 96.643 25.805 96.541 c 25.805 97.244
+ l 26.105 97.326 26.387 97.389 26.648 97.432 c 26.906 97.471 27.156 97.494
+ 27.398 97.494 c 27.992 97.494 28.461 97.357 28.805 97.088 c 29.156 96.814
+ 29.336 96.447 29.336 95.979 c 29.336 95.654 29.242 95.385 29.055 95.166
+ c 28.875 94.947 28.617 94.791 28.273 94.697 c h
+f
+20.59 134.096 m 24.34 134.096 l 24.34 133.768 l 22.23 128.268 l 21.402 
+128.268 l 23.387 133.439 l 20.59 133.439 l h
+f
+28.055 133.408 m 26.055 130.299 l 28.055 130.299 l h
+27.836 134.096 m 28.836 134.096 l 28.836 130.299 l 29.664 130.299 l 29.664
+ 129.643 l 28.836 129.643 l 28.836 128.268 l 28.055 128.268 l 28.055 129.643
+ l 25.414 129.643 l 25.414 130.408 l h
+f
+20.59 170.807 m 24.34 170.807 l 24.34 170.479 l 22.23 164.979 l 21.402 
+164.979 l 23.387 170.15 l 20.59 170.15 l h
+f
+25.883 170.807 m 28.992 170.807 l 28.992 170.15 l 26.617 170.15 l 26.617
+ 168.713 l 26.73 168.752 26.844 168.783 26.961 168.807 c 27.074 168.826 
+27.188 168.838 27.305 168.838 c 27.949 168.838 28.461 168.654 28.836 168.291
+ c 29.219 167.936 29.414 167.455 29.414 166.854 c 29.414 166.229 29.215 
+165.736 28.82 165.385 c 28.434 165.041 27.887 164.869 27.18 164.869 c 26.93
+ 164.869 26.68 164.893 26.43 164.932 c 26.18 164.975 25.918 165.033 25.648
+ 165.119 c 25.648 165.916 l 25.875 165.779 26.117 165.682 26.367 165.619
+ c 26.617 165.557 26.883 165.525 27.164 165.525 c 27.609 165.525 27.965 
+165.643 28.227 165.885 c 28.496 166.123 28.633 166.447 28.633 166.854 c 
+28.633 167.26 28.496 167.576 28.227 167.807 c 27.965 168.045 27.609 168.166
+ 27.164 168.166 c 26.953 168.166 26.742 168.139 26.523 168.088 c 26.312 
+168.045 26.102 167.979 25.883 167.885 c h
+f
+20.59 207.518 m 24.34 207.518 l 24.34 207.189 l 22.23 201.689 l 21.402 
+201.689 l 23.387 206.861 l 20.59 206.861 l h
+f
+27.664 204.924 m 27.309 204.924 27.027 204.799 26.82 204.549 c 26.609 204.307
+ 26.508 203.979 26.508 203.564 c 26.508 203.146 26.609 202.814 26.82 202.564
+ c 27.027 202.322 27.309 202.205 27.664 202.205 c 28.016 202.205 28.297 
+202.322 28.508 202.564 c 28.715 202.814 28.82 203.146 28.82 203.564 c 28.82
+ 203.979 28.715 204.307 28.508 204.549 c 28.297 204.799 28.016 204.924 27.664
+ 204.924 c h
+29.227 207.393 m 29.227 206.674 l 29.027 206.768 28.828 206.838 28.633 
+206.893 c 28.434 206.943 28.234 206.971 28.039 206.971 c 27.516 206.971 
+27.117 206.791 26.836 206.439 c 26.562 206.084 26.406 205.553 26.367 204.846
+ c 26.523 205.072 26.715 205.244 26.945 205.361 c 27.172 205.486 27.43 205.549
+ 27.711 205.549 c 28.293 205.549 28.758 205.369 29.102 205.018 c 29.445 
+204.662 29.617 204.178 29.617 203.564 c 29.617 202.959 29.438 202.475 29.086
+ 202.111 c 28.73 201.756 28.258 201.58 27.664 201.58 c 26.984 201.58 26.469
+ 201.834 26.117 202.346 c 25.762 202.865 25.586 203.615 25.586 204.596 c
+ 25.586 205.521 25.805 206.256 26.242 206.799 c 26.68 207.35 27.266 207.627
+ 28.008 207.627 c 28.203 207.627 28.402 207.604 28.602 207.564 c 28.797 
+207.533 29.008 207.475 29.227 207.393 c h
+f
+20.59 244.229 m 24.34 244.229 l 24.34 243.9 l 22.23 238.4 l 21.402 238.4
+ l 23.387 243.572 l 20.59 243.572 l h
+f
+25.68 244.229 m 29.43 244.229 l 29.43 243.9 l 27.32 238.4 l 26.492 238.4
+ l 28.477 243.572 l 25.68 243.572 l h
+f
+20.59 280.939 m 24.34 280.939 l 24.34 280.611 l 22.23 275.111 l 21.402 
+275.111 l 23.387 280.283 l 20.59 280.283 l h
+f
+27.57 277.877 m 27.195 277.877 26.898 277.775 26.68 277.58 c 26.469 277.381
+ 26.367 277.104 26.367 276.752 c 26.367 276.396 26.469 276.119 26.68 275.924
+ c 26.898 275.725 27.195 275.627 27.57 275.627 c 27.945 275.627 28.234 275.725
+ 28.445 275.924 c 28.664 276.131 28.773 276.408 28.773 276.752 c 28.773 
+277.104 28.664 277.381 28.445 277.58 c 28.234 277.775 27.945 277.877 27.57
+ 277.877 c h
+26.773 278.221 m 26.438 278.303 26.18 278.459 25.992 278.689 c 25.805 278.916
+ 25.711 279.197 25.711 279.533 c 25.711 280.002 25.871 280.369 26.195 280.643
+ c 26.527 280.912 26.984 281.049 27.57 281.049 c 28.152 281.049 28.605 280.912
+ 28.93 280.643 c 29.262 280.369 29.43 280.002 29.43 279.533 c 29.43 279.197
+ 29.336 278.916 29.148 278.689 c 28.961 278.459 28.699 278.303 28.367 278.221
+ c 28.742 278.127 29.031 277.947 29.242 277.689 c 29.461 277.439 29.57 277.127
+ 29.57 276.752 c 29.57 276.189 29.398 275.756 29.055 275.455 c 28.711 275.15
+ 28.215 275.002 27.57 275.002 c 26.922 275.002 26.43 275.15 26.086 275.455
+ c 25.742 275.756 25.57 276.189 25.57 276.752 c 25.57 277.127 25.672 277.439
+ 25.883 277.689 c 26.102 277.947 26.398 278.127 26.773 278.221 c h
+26.492 279.471 m 26.492 279.166 26.586 278.928 26.773 278.752 c 26.961 
+278.584 27.227 278.502 27.57 278.502 c 27.902 278.502 28.164 278.584 28.352
+ 278.752 c 28.547 278.928 28.648 279.166 28.648 279.471 c 28.648 279.771
+ 28.547 280.006 28.352 280.174 c 28.164 280.338 27.902 280.424 27.57 280.424
+ c 27.227 280.424 26.961 280.338 26.773 280.174 c 26.586 280.006 26.492 
+279.771 26.492 279.471 c h
+f
+20.59 317.65 m 24.34 317.65 l 24.34 317.322 l 22.23 311.822 l 21.402 311.822
+ l 23.387 316.994 l 20.59 316.994 l h
+f
+25.898 311.947 m 25.898 312.666 l 26.094 312.572 26.293 312.498 26.492 
+312.447 c 26.699 312.393 26.902 312.369 27.102 312.369 c 27.621 312.369 
+28.016 312.545 28.289 312.9 c 28.57 313.252 28.73 313.783 28.773 314.494
+ c 28.617 314.275 28.422 314.104 28.195 313.979 c 27.965 313.861 27.711 
+313.807 27.43 313.807 c 26.844 313.807 26.383 313.979 26.039 314.322 c 25.695
+ 314.674 25.523 315.158 25.523 315.775 c 25.523 316.377 25.699 316.857 26.055
+ 317.213 c 26.406 317.576 26.883 317.76 27.477 317.76 c 28.152 317.76 28.668
+ 317.498 29.023 316.979 c 29.375 316.467 29.555 315.717 29.555 314.729 c
+ 29.555 313.811 29.336 313.076 28.898 312.525 c 28.461 311.982 27.871 311.713
+ 27.133 311.713 c 26.934 311.713 26.73 311.736 26.523 311.775 c 26.324 311.807
+ 26.117 311.861 25.898 311.947 c h
+27.477 314.416 m 27.828 314.416 28.109 314.533 28.32 314.775 c 28.527 315.025
+ 28.633 315.357 28.633 315.775 c 28.633 316.189 28.527 316.518 28.32 316.76
+ c 28.109 317.01 27.828 317.135 27.477 317.135 c 27.121 317.135 26.84 317.01
+ 26.633 316.76 c 26.422 316.518 26.32 316.189 26.32 315.775 c 26.32 315.357
+ 26.422 315.025 26.633 314.775 c 26.84 314.533 27.121 314.416 27.477 314.416
+ c h
+f
+22.48 351.299 m 22.105 351.299 21.809 351.197 21.59 351.002 c 21.379 350.803
+ 21.277 350.525 21.277 350.174 c 21.277 349.818 21.379 349.541 21.59 349.346
+ c 21.809 349.146 22.105 349.049 22.48 349.049 c 22.855 349.049 23.145 349.146
+ 23.355 349.346 c 23.574 349.553 23.684 349.83 23.684 350.174 c 23.684 350.525
+ 23.574 350.803 23.355 351.002 c 23.145 351.197 22.855 351.299 22.48 351.299
+ c h
+21.684 351.643 m 21.348 351.725 21.09 351.881 20.902 352.111 c 20.715 352.338
+ 20.621 352.619 20.621 352.955 c 20.621 353.424 20.781 353.791 21.105 354.064
+ c 21.438 354.334 21.895 354.471 22.48 354.471 c 23.062 354.471 23.516 354.334
+ 23.84 354.064 c 24.172 353.791 24.34 353.424 24.34 352.955 c 24.34 352.619
+ 24.246 352.338 24.059 352.111 c 23.871 351.881 23.609 351.725 23.277 351.643
+ c 23.652 351.549 23.941 351.369 24.152 351.111 c 24.371 350.861 24.48 350.549
+ 24.48 350.174 c 24.48 349.611 24.309 349.178 23.965 348.877 c 23.621 348.572
+ 23.125 348.424 22.48 348.424 c 21.832 348.424 21.34 348.572 20.996 348.877
+ c 20.652 349.178 20.48 349.611 20.48 350.174 c 20.48 350.549 20.582 350.861
+ 20.793 351.111 c 21.012 351.369 21.309 351.549 21.684 351.643 c h
+21.402 352.893 m 21.402 352.588 21.496 352.35 21.684 352.174 c 21.871 352.006
+ 22.137 351.924 22.48 351.924 c 22.812 351.924 23.074 352.006 23.262 352.174
+ c 23.457 352.35 23.559 352.588 23.559 352.893 c 23.559 353.193 23.457 353.428
+ 23.262 353.596 c 23.074 353.76 22.812 353.846 22.48 353.846 c 22.137 353.846
+ 21.871 353.76 21.684 353.596 c 21.496 353.428 21.402 353.193 21.402 352.893
+ c h
+f
+27.57 353.846 m 27.164 353.846 26.855 353.643 26.648 353.236 c 26.449 352.838
+ 26.352 352.24 26.352 351.439 c 26.352 350.646 26.449 350.049 26.648 349.643
+ c 26.855 349.244 27.164 349.049 27.57 349.049 c 27.977 349.049 28.277 349.244
+ 28.477 349.643 c 28.684 350.049 28.789 350.646 28.789 351.439 c 28.789 
+352.24 28.684 352.838 28.477 353.236 c 28.277 353.643 27.977 353.846 27.57
+ 353.846 c h
+27.57 354.471 m 28.227 354.471 28.727 354.209 29.07 353.689 c 29.414 353.178
+ 29.586 352.428 29.586 351.439 c 29.586 350.459 29.414 349.709 29.07 349.189
+ c 28.727 348.678 28.227 348.424 27.57 348.424 c 26.914 348.424 26.414 348.678
+ 26.07 349.189 c 25.727 349.709 25.555 350.459 25.555 351.439 c 25.555 352.428
+ 25.727 353.178 26.07 353.689 c 26.414 354.209 26.914 354.471 27.57 354.471
+ c h
+f
+9.902 160.92 m 9.977 161.127 10.133 161.33 10.371 161.529 c 10.602 161.736
+ 10.918 161.939 11.324 162.139 c 13.324 163.139 l 13.324 162.076 l 11.449
+ 161.154 l 10.961 160.912 10.637 160.678 10.48 160.451 c 10.324 160.221 
+10.246 159.912 10.246 159.529 c 10.246 158.451 l 13.324 158.451 l 13.324
+ 157.467 l 6.027 157.467 l 6.027 159.686 l 6.027 160.518 6.207 161.139 6.559
+ 161.545 c 6.902 161.959 7.43 162.17 8.137 162.17 c 8.598 162.17 8.977 162.061
+ 9.277 161.842 c 9.582 161.631 9.789 161.326 9.902 160.92 c h
+6.84 158.451 m 9.434 158.451 l 9.434 159.686 l 9.434 160.162 9.324 160.521
+ 9.105 160.764 c 8.887 161.014 8.566 161.139 8.137 161.139 c 7.711 161.139
+ 7.387 161.014 7.168 160.764 c 6.949 160.521 6.84 160.162 6.84 159.686 c
+ h
+f
+6.277 168.791 m 7.23 168.791 l 7.055 168.416 6.926 168.061 6.84 167.729
+ c 6.746 167.393 6.699 167.072 6.699 166.76 c 6.699 166.229 6.805 165.814
+ 7.012 165.525 c 7.223 165.232 7.52 165.088 7.902 165.088 c 8.227 165.088
+ 8.473 165.182 8.637 165.369 c 8.805 165.564 8.934 165.936 9.027 166.479
+ c 9.152 167.072 l 9.301 167.799 9.551 168.342 9.902 168.697 c 10.246 169.049
+ 10.715 169.229 11.309 169.229 c 12.02 169.229 12.555 168.986 12.918 168.51
+ c 13.285 168.041 13.465 167.346 13.465 166.432 c 13.465 166.088 13.422 
+165.717 13.34 165.322 c 13.27 164.936 13.152 164.533 12.996 164.119 c 11.98
+ 164.119 l 12.211 164.525 12.383 164.916 12.496 165.291 c 12.613 165.674
+ 12.668 166.057 12.668 166.432 c 12.668 166.994 12.559 167.424 12.34 167.729
+ c 12.113 168.041 11.793 168.197 11.387 168.197 c 11.035 168.197 10.758 
+168.088 10.559 167.869 c 10.352 167.65 10.195 167.283 10.09 166.775 c 9.98
+ 166.182 l 9.836 165.439 9.605 164.904 9.293 164.572 c 8.98 164.248 8.543
+ 164.088 7.98 164.088 c 7.336 164.088 6.832 164.311 6.465 164.76 c 6.09 
+165.217 5.902 165.846 5.902 166.65 c 5.902 166.994 5.934 167.342 5.996 167.697
+ c 6.059 168.049 6.152 168.416 6.277 168.791 c h
+f
+9.902 174.217 m 9.977 174.424 10.133 174.627 10.371 174.826 c 10.602 175.033
+ 10.918 175.236 11.324 175.436 c 13.324 176.436 l 13.324 175.373 l 11.449
+ 174.451 l 10.961 174.209 10.637 173.975 10.48 173.748 c 10.324 173.518 
+10.246 173.209 10.246 172.826 c 10.246 171.748 l 13.324 171.748 l 13.324
+ 170.764 l 6.027 170.764 l 6.027 172.982 l 6.027 173.814 6.207 174.436 6.559
+ 174.842 c 6.902 175.256 7.43 175.467 8.137 175.467 c 8.598 175.467 8.977
+ 175.357 9.277 175.139 c 9.582 174.928 9.789 174.623 9.902 174.217 c h
+6.84 171.748 m 9.434 171.748 l 9.434 172.982 l 9.434 173.459 9.324 173.818
+ 9.105 174.061 c 8.887 174.311 8.566 174.436 8.137 174.436 c 7.711 174.436
+ 7.387 174.311 7.168 174.061 c 6.949 173.818 6.84 173.459 6.84 172.982 c
+ h
+f
+6.84 178.697 m 9.59 178.697 l 9.59 179.932 l 9.59 180.389 9.473 180.744
+ 9.23 180.994 c 8.992 181.252 8.652 181.385 8.215 181.385 c 7.777 181.385
+ 7.441 181.252 7.199 180.994 c 6.961 180.744 6.84 180.389 6.84 179.932 c
+ h
+6.027 177.713 m 6.027 179.932 l 6.027 180.752 6.215 181.373 6.59 181.791
+ c 6.957 182.205 7.496 182.416 8.215 182.416 c 8.934 182.416 9.477 182.205
+ 9.84 181.791 c 10.207 181.373 10.387 180.752 10.387 179.932 c 10.387 178.697
+ l 13.324 178.697 l 13.324 177.713 l h
+f
+8.699 190.045 m 8.637 189.939 8.598 189.83 8.574 189.717 c 8.543 189.6 
+8.527 189.471 8.527 189.326 c 8.527 188.814 8.695 188.424 9.027 188.154 
+c 9.352 187.881 9.824 187.748 10.449 187.748 c 13.324 187.748 l 13.324 186.842
+ l 7.855 186.842 l 7.855 187.748 l 8.699 187.748 l 8.367 187.936 8.121 188.178
+ 7.965 188.482 c 7.809 188.783 7.73 189.154 7.73 189.592 c 7.73 189.654 
+7.738 189.721 7.746 189.795 c 7.746 189.865 7.758 189.951 7.777 190.045 
+c h
+f
+10.574 193.471 m 10.574 192.752 10.66 192.252 10.824 191.971 c 10.992 191.689
+ 11.273 191.549 11.668 191.549 c 11.992 191.549 12.246 191.65 12.434 191.861
+ c 12.621 192.068 12.715 192.354 12.715 192.721 c 12.715 193.221 12.539 
+193.619 12.184 193.924 c 11.832 194.225 11.363 194.377 10.777 194.377 c 
+10.574 194.377 l h
+10.199 195.268 m 13.324 195.268 l 13.324 194.377 l 12.496 194.377 l 12.832
+ 194.166 13.074 193.908 13.23 193.596 c 13.387 193.291 13.465 192.924 13.465
+ 192.486 c 13.465 191.924 13.309 191.475 12.996 191.143 c 12.684 190.807
+ 12.262 190.643 11.73 190.643 c 11.117 190.643 10.652 190.85 10.34 191.268
+ c 10.027 191.682 9.871 192.299 9.871 193.111 c 9.871 194.377 l 9.777 194.377
+ l 9.371 194.377 9.055 194.236 8.824 193.955 c 8.598 193.682 8.48 193.303
+ 8.48 192.814 c 8.48 192.502 8.523 192.193 8.605 191.893 c 8.68 191.6 8.789
+ 191.318 8.934 191.049 c 8.105 191.049 l 7.98 191.381 7.887 191.697 7.824
+ 192.002 c 7.762 192.314 7.73 192.615 7.73 192.908 c 7.73 193.697 7.934 
+194.287 8.34 194.674 c 8.746 195.068 9.367 195.268 10.199 195.268 c h
+f
+10.027 201.658 m 13.324 201.658 l 13.324 200.768 l 10.059 200.768 l 9.539
+ 200.768 9.152 200.662 8.902 200.455 c 8.645 200.256 8.512 199.955 8.512
+ 199.549 c 8.512 199.068 8.668 198.689 8.98 198.408 c 9.285 198.127 9.699
+ 197.986 10.23 197.986 c 13.324 197.986 l 13.324 197.08 l 7.855 197.08 l
+ 7.855 197.986 l 8.699 197.986 l 8.379 198.205 8.137 198.459 7.98 198.752
+ c 7.816 199.041 7.73 199.377 7.73 199.752 c 7.73 200.377 7.926 200.85 8.309
+ 201.174 c 8.695 201.494 9.27 201.658 10.027 201.658 c h
+f
+10.527 207.061 m 9.871 207.061 9.367 206.924 9.012 206.654 c 8.66 206.381
+ 8.48 206.006 8.48 205.529 c 8.48 205.037 8.66 204.658 9.012 204.389 c 9.367
+ 204.127 9.871 203.998 10.527 203.998 c 11.176 203.998 11.68 204.127 12.043
+ 204.389 c 12.398 204.658 12.574 205.037 12.574 205.529 c 12.574 206.006
+ 12.398 206.381 12.043 206.654 c 11.68 206.924 11.176 207.061 10.527 207.061
+ c h
+12.652 207.951 m 13.578 207.951 14.266 207.74 14.715 207.326 c 15.172 206.92
+ 15.402 206.287 15.402 205.436 c 15.402 205.123 15.375 204.826 15.324 204.545
+ c 15.281 204.264 15.215 203.99 15.121 203.732 c 14.246 203.732 l 14.391
+ 203.99 14.496 204.248 14.559 204.498 c 14.629 204.756 14.668 205.021 14.668
+ 205.295 c 14.668 205.877 14.512 206.314 14.199 206.607 c 13.895 206.908
+ 13.434 207.061 12.809 207.061 c 12.355 207.061 l 12.68 206.873 12.926 206.631
+ 13.09 206.342 c 13.246 206.049 13.324 205.701 13.324 205.295 c 13.324 204.627
+ 13.07 204.084 12.559 203.67 c 12.051 203.264 11.371 203.061 10.527 203.061
+ c 9.684 203.061 9.008 203.264 8.496 203.67 c 7.988 204.084 7.73 204.627
+ 7.73 205.295 c 7.73 205.701 7.809 206.049 7.965 206.342 c 8.121 206.631
+ 8.363 206.873 8.684 207.061 c 7.855 207.061 l 7.855 207.951 l h
+f
+10.371 214.486 m 10.809 214.486 l 10.809 210.346 l 11.426 210.385 11.895
+ 210.572 12.215 210.908 c 12.539 211.24 12.699 211.705 12.699 212.299 c 
+12.699 212.643 12.66 212.975 12.574 213.299 c 12.492 213.631 12.367 213.955
+ 12.199 214.268 c 13.043 214.268 l 13.18 213.943 13.285 213.611 13.355 213.268
+ c 13.426 212.932 13.465 212.596 13.465 212.252 c 13.465 211.377 13.215 
+210.682 12.715 210.174 c 12.207 209.662 11.512 209.408 10.637 209.408 c 
+9.742 209.408 9.035 209.646 8.512 210.127 c 7.992 210.615 7.73 211.271 7.73
+ 212.096 c 7.73 212.834 7.965 213.416 8.434 213.846 c 8.902 214.271 9.551
+ 214.486 10.371 214.486 c h
+10.105 213.58 m 9.617 213.58 9.227 213.443 8.934 213.174 c 8.633 212.9 
+8.48 212.549 8.48 212.111 c 8.48 211.6 8.629 211.193 8.918 210.893 c 9.199
+ 210.6 9.598 210.428 10.105 210.377 c h
+f
+5.73 219.053 m 5.73 221.131 l 6.418 221.131 l 6.418 219.959 l 13.949 219.959
+ l 13.949 221.131 l 14.637 221.131 l 14.637 219.053 l h
+f
+6.684 225.264 m 6.684 224.764 6.934 224.381 7.434 224.123 c 7.934 223.873
+ 8.684 223.748 9.684 223.748 c 10.684 223.748 11.434 223.873 11.934 224.123
+ c 12.434 224.381 12.684 224.764 12.684 225.264 c 12.684 225.783 12.434 
+226.17 11.934 226.42 c 11.434 226.678 10.684 226.811 9.684 226.811 c 8.684
+ 226.811 7.934 226.678 7.434 226.42 c 6.934 226.17 6.684 225.783 6.684 225.264
+ c h
+5.902 225.264 m 5.902 226.084 6.227 226.709 6.871 227.139 c 7.52 227.576
+ 8.457 227.795 9.684 227.795 c 10.914 227.795 11.852 227.576 12.496 227.139
+ c 13.145 226.709 13.465 226.084 13.465 225.264 c 13.465 224.451 13.145 
+223.826 12.496 223.389 c 11.852 222.959 10.914 222.748 9.684 222.748 c 8.457
+ 222.748 7.52 222.959 6.871 223.389 c 6.227 223.826 5.902 224.451 5.902 
+225.264 c h
+f
+12.09 230.549 1.234 -1.031 re f
+12.09 233.729 1.234 -1.031 re f
+13.168 235.908 m 12.277 235.908 l 12.395 236.158 12.48 236.408 12.543 236.658
+ c 12.605 236.916 12.637 237.166 12.637 237.408 c 12.637 238.064 12.418 
+238.564 11.98 238.908 c 11.543 239.252 10.879 239.443 9.98 239.486 c 10.262
+ 239.299 10.48 239.057 10.637 238.768 c 10.785 238.486 10.855 238.166 10.855
+ 237.814 c 10.855 237.084 10.637 236.506 10.199 236.08 c 9.754 235.65 9.148
+ 235.439 8.387 235.439 c 7.637 235.439 7.039 235.658 6.59 236.096 c 6.133
+ 236.541 5.902 237.135 5.902 237.877 c 5.902 238.721 6.227 239.361 6.871
+ 239.799 c 7.52 240.244 8.457 240.471 9.684 240.471 c 10.832 240.471 11.746
+ 240.197 12.434 239.658 c 13.121 239.115 13.465 238.381 13.465 237.455 c
+ 13.465 237.205 13.438 236.955 13.387 236.705 c 13.344 236.455 13.273 236.189
+ 13.168 235.908 c h
+10.074 237.877 m 10.074 238.314 9.926 238.662 9.621 238.924 c 9.32 239.182
+ 8.91 239.314 8.387 239.314 c 7.855 239.314 7.441 239.182 7.137 238.924 
+c 6.836 238.662 6.684 238.314 6.684 237.877 c 6.684 237.428 6.836 237.072
+ 7.137 236.814 c 7.441 236.564 7.855 236.439 8.387 236.439 c 8.91 236.439
+ 9.32 236.564 9.621 236.814 c 9.926 237.072 10.074 237.428 10.074 237.877
+ c h
+f
+6.027 242.002 m 6.027 246.689 l 6.449 246.689 l 13.324 244.033 l 13.324
+ 243.002 l 6.871 245.502 l 6.871 242.002 l h
+f
+5.73 250.584 m 14.637 250.584 l 14.637 248.506 l 13.949 248.506 l 13.949
+ 249.678 l 6.418 249.678 l 6.418 248.506 l 5.73 248.506 l h
+f
+Q q
+36.336 351.053 434.281 -293.688 re W n
+q
+36 352.002 435 -295 re W n
+[ 1 0 0 1 0 -0.998047 ] concat
+  q
+0.498039 0 0 rg
+1 w
+1 J
+1 j
+[] 0.0 d
+10 M q 1 0 0 -1 0 361 cm
+-2554.875 412.77 m -2398.535 412.77 l -2389.852 376.059 l -2216.137 376.059
+ l -2207.453 339.348 l -2051.109 339.348 l -2042.426 302.637 l -1912.141
+ 302.637 l -1903.453 265.926 l -1790.543 265.926 l -1781.855 229.215 l -1677.629
+ 229.215 l -1668.941 192.504 l -1573.402 192.504 l -1564.715 155.793 l -1477.859
+ 155.793 l -1469.172 119.082 l -1399.688 119.082 l -1391.004 82.371 l -1330.203
+ 82.371 l -1321.516 45.66 l -1260.719 45.66 l -1252.031 8.949 l -1199.918
+ 8.949 l -1191.234 -27.762 l -1156.492 -27.762 l -1147.805 -64.473 l -1113.063
+ -64.473 l -1104.375 -101.184 l -1069.633 -101.184 l -1060.949 -137.895 
+l -1026.207 -137.895 l -1017.52 -174.605 l -1000.148 -174.605 l -991.465
+ -211.316 l -965.406 -211.316 l -956.723 -248.027 l -948.035 -284.738 l 
+-921.98 -284.738 l -913.293 -321.449 l -904.609 -358.16 l -878.551 -358.16
+ l -869.863 -394.871 l -861.18 -431.582 l -852.492 -431.582 l -843.809 -468.293
+ l -835.121 -468.293 l -826.438 -541.715 l -817.75 -578.426 l -809.066 -578.426
+ l -800.379 -615.137 l -661.41 -615.137 l -652.723 -578.426 l -644.039 -541.715
+ l -635.352 -541.715 l -626.668 -468.293 l -617.98 -468.293 l -609.297 -431.582
+ l -600.609 -394.871 l -591.926 -394.871 l -583.238 -358.16 l -565.867 -358.16
+ l -557.184 -321.449 l -548.496 -321.449 l -539.813 -284.738 l -522.441 
+-284.738 l -513.754 -248.027 l -505.07 -248.027 l -496.383 -211.316 l -479.012
+ -211.316 l -470.324 -174.605 l -435.582 -174.605 l -426.898 -137.895 l 
+-400.84 -137.895 l -392.156 -101.184 l -357.414 -101.184 l -348.727 -64.473
+ l -313.984 -64.473 l -305.301 -27.762 l -270.559 -27.762 l -261.871 8.949
+ l -218.441 8.949 l -209.758 45.66 l -140.273 45.66 l -131.586 82.371 l 
+-70.789 82.371 l -62.102 119.082 l -1.301 119.082 l 7.383 155.793 l 102.926
+ 155.793 l 111.609 192.504 l 207.152 192.504 l 215.84 229.215 l 320.066 
+229.215 l 328.75 265.926 l 432.98 265.926 l 441.664 302.637 l 580.637 302.637
+ l 589.32 339.348 l 754.348 339.348 l 763.031 376.059 l 928.059 376.059 
+l 936.746 412.77 l 1127.828 412.77 l 1136.516 449.48 l 1362.34 449.48 l 
+1371.027 486.191 l 1605.539 486.191 l 1614.223 522.902 l 1900.852 522.902
+ l 1909.535 559.613 l 2213.531 559.613 l 2222.219 596.324 l 2578.328 596.324
+ l 2587.016 633.035 l 2856.27 633.035 l S Q
+0 0 1 rg
+q 1 0 0 -1 0 361 cm
+-2554.875 633.035 m -2242.195 633.035 l -2233.508 596.324 l -1877.398 596.324
+ l -1868.711 559.613 l -1564.715 559.613 l -1556.031 522.902 l -1269.402
+ 522.902 l -1260.719 486.191 l -1026.207 486.191 l -1017.52 449.48 l -791.695
+ 449.48 l -783.008 412.77 l -591.926 412.77 l -583.238 376.059 l -400.84
+ 376.059 l -392.156 339.348 l -244.5 339.348 l -235.813 302.637 l -96.844
+ 302.637 l -88.16 265.926 l 16.07 265.926 l 24.754 229.215 l 128.98 229.215
+ l 137.668 192.504 l 233.211 192.504 l 241.895 155.793 l 337.438 155.793
+ l 354.809 119.082 l 406.922 119.082 l 415.609 82.371 l 476.406 82.371 l
+ 485.094 45.66 l 554.578 45.66 l 563.262 8.949 l 606.691 8.949 l 615.379
+ -27.762 l 650.121 -27.762 l 658.805 -64.473 l 693.547 -64.473 l 702.234
+ -101.184 l 736.977 -101.184 l 745.66 -137.895 l 780.402 -137.895 l 789.09
+ -174.605 l 815.148 -174.605 l 823.832 -211.316 l 841.203 -211.316 l 849.891
+ -248.027 l 858.574 -248.027 l 867.262 -284.738 l 884.633 -284.738 l 893.316
+ -321.449 l 902.004 -321.449 l 910.688 -358.16 l 928.059 -358.16 l 936.746
+ -394.871 l 945.43 -394.871 l 954.117 -431.582 l 962.801 -468.293 l 971.488
+ -468.293 l 980.172 -541.715 l 988.859 -541.715 l 997.543 -578.426 l 1006.23
+ -615.137 l 1145.199 -615.137 l 1153.887 -578.426 l 1162.57 -578.426 l 1171.258
+ -541.715 l 1179.941 -468.293 l 1188.629 -468.293 l 1197.313 -431.582 l 
+1206 -431.582 l 1214.688 -394.871 l 1223.371 -358.16 l 1249.43 -358.16 l
+ 1258.113 -321.449 l 1266.801 -284.738 l 1292.855 -284.738 l 1301.543 -248.027
+ l 1310.227 -211.316 l 1336.285 -211.316 l 1344.969 -174.605 l 1379.711 
+-174.605 l 1388.398 -137.895 l 1405.77 -137.895 l 1414.453 -101.184 l 1449.199
+ -101.184 l 1457.883 -64.473 l 1492.625 -64.473 l 1501.313 -27.762 l 1536.055
+ -27.762 l 1544.738 8.949 l 1596.852 8.949 l 1605.539 45.66 l 1666.34 45.66
+ l 1675.023 82.371 l 1735.824 82.371 l 1744.508 119.082 l 1813.992 119.082
+ l 1822.68 155.793 l 1909.535 155.793 l 1918.223 192.504 l 2013.762 192.504
+ l 2022.449 229.215 l 2126.676 229.215 l 2135.363 265.926 l 2248.273 265.926
+ l 2256.961 302.637 l 2387.246 302.637 l 2395.93 339.348 l 2560.957 339.348
+ l 2569.645 376.059 l 2734.672 376.059 l 2743.355 412.77 l 2856.27 412.77
+ l S Q
+  Q
+Q
+Q q
+1 g
+127.172 21.689 225.656 -17.398 re f
+0 g
+0.5 w
+1 J
+1 j
+[] 0.0 d
+10 M q 1 0 0 -1 0 360.001953 cm
+127.172 338.312 225.656 17.398 re S Q
+Q q
+130.965 14.002 32.035 -2 re W n
+q
+130 14.002 33 -2 re W n
+[ 1 0 0 1 0 -0.998047 ] concat
+  q
+0.498039 0 0 rg
+1 w
+1 J
+1 j
+[] 0.0 d
+10 M q 1 0 0 -1 0 361 cm
+131.465 347.012 m 162.465 347.012 l S Q
+  Q
+Q
+Q q
+0 g
+171.246 16.111 m 171.246 15.346 l 170.941 15.49 170.656 15.596 170.387 
+15.658 c 170.125 15.729 169.875 15.768 169.637 15.768 c 169.199 15.768 168.863
+ 15.682 168.637 15.518 c 168.406 15.35 168.293 15.115 168.293 14.814 c 168.293
+ 14.553 168.363 14.354 168.512 14.221 c 168.668 14.096 168.965 13.99 169.402
+ 13.908 c 169.871 13.814 l 170.465 13.697 170.902 13.502 171.184 13.221 
+c 171.465 12.939 171.605 12.557 171.605 12.08 c 171.605 11.518 171.41 11.088
+ 171.027 10.799 c 170.652 10.506 170.098 10.361 169.371 10.361 c 169.09 
+10.361 168.793 10.393 168.48 10.455 c 168.168 10.518 167.844 10.611 167.512
+ 10.736 c 167.512 11.549 l 167.832 11.361 168.145 11.221 168.449 11.127 
+c 168.762 11.041 169.066 11.002 169.371 11.002 c 169.816 11.002 170.16 11.088
+ 170.402 11.268 c 170.652 11.443 170.777 11.693 170.777 12.018 c 170.777
+ 12.307 170.688 12.533 170.512 12.689 c 170.332 12.854 170.047 12.979 169.652
+ 13.064 c 169.168 13.158 l 168.574 13.271 168.145 13.455 167.887 13.705 
+c 167.625 13.955 167.496 14.303 167.496 14.752 c 167.496 15.26 167.676 15.662
+ 168.043 15.955 c 168.406 16.256 168.906 16.408 169.543 16.408 c 169.812
+ 16.408 170.09 16.381 170.371 16.33 c 170.66 16.287 170.953 16.213 171.246
+ 16.111 c h
+f
+174.496 14.346 m 174.109 14.346 173.801 14.193 173.574 13.893 c 173.355
+ 13.588 173.246 13.178 173.246 12.658 c 173.246 12.135 173.355 11.725 173.574
+ 11.424 c 173.801 11.119 174.109 10.971 174.496 10.971 c 174.879 10.971 
+175.184 11.119 175.402 11.424 c 175.629 11.725 175.746 12.135 175.746 12.658
+ c 175.746 13.178 175.629 13.588 175.402 13.893 c 175.184 14.193 174.879
+ 14.346 174.496 14.346 c h
+174.496 14.955 m 175.121 14.955 175.609 14.752 175.965 14.346 c 176.316
+ 13.939 176.496 13.377 176.496 12.658 c 176.496 11.939 176.316 11.377 175.965
+ 10.971 c 175.609 10.564 175.121 10.361 174.496 10.361 c 173.871 10.361 
+173.375 10.564 173.012 10.971 c 172.656 11.377 172.48 11.939 172.48 12.658
+ c 172.48 13.377 172.656 13.939 173.012 14.346 c 173.375 14.752 173.871 
+14.955 174.496 14.955 c h
+f
+177.625 12.205 m 177.625 14.846 l 178.344 14.846 l 178.344 12.221 l 178.344
+ 11.814 178.422 11.506 178.578 11.299 c 178.742 11.088 178.988 10.986 179.312
+ 10.986 c 179.695 10.986 180 11.104 180.219 11.346 c 180.445 11.596 180.562
+ 11.932 180.562 12.361 c 180.562 14.846 l 181.281 14.846 l 181.281 10.471
+ l 180.562 10.471 l 180.562 11.143 l 180.383 10.881 180.18 10.682 179.953
+ 10.549 c 179.723 10.424 179.457 10.361 179.156 10.361 c 178.656 10.361 
+178.273 10.518 178.016 10.83 c 177.754 11.143 177.625 11.6 177.625 12.205
+ c h
+f
+185.305 14.174 m 185.219 14.225 185.133 14.26 185.039 14.283 c 184.945 
+14.303 184.84 14.314 184.727 14.314 c 184.32 14.314 184.008 14.178 183.789
+ 13.908 c 183.57 13.646 183.461 13.271 183.461 12.783 c 183.461 10.471 l
+ 182.742 10.471 l 182.742 14.846 l 183.461 14.846 l 183.461 14.174 l 183.605
+ 14.432 183.797 14.627 184.039 14.752 c 184.289 14.885 184.586 14.955 184.93
+ 14.955 c 184.98 14.955 185.031 14.947 185.086 14.939 c 185.148 14.939 185.215
+ 14.928 185.289 14.908 c h
+f
+189.027 14.674 m 189.027 14.002 l 188.816 14.115 188.609 14.197 188.402
+ 14.252 c 188.203 14.314 188 14.346 187.793 14.346 c 187.324 14.346 186.957
+ 14.193 186.699 13.893 c 186.449 13.6 186.324 13.189 186.324 12.658 c 186.324
+ 12.127 186.449 11.709 186.699 11.408 c 186.957 11.115 187.324 10.971 187.793
+ 10.971 c 188 10.971 188.203 10.994 188.402 11.049 c 188.609 11.111 188.816
+ 11.193 189.027 11.299 c 189.027 10.643 l 188.828 10.549 188.621 10.479 
+188.402 10.439 c 188.184 10.389 187.953 10.361 187.715 10.361 c 187.059 
+10.361 186.531 10.564 186.137 10.971 c 185.75 11.385 185.559 11.947 185.559
+ 12.658 c 185.559 13.365 185.754 13.924 186.152 14.33 c 186.547 14.744 187.082
+ 14.955 187.762 14.955 c 187.98 14.955 188.191 14.928 188.402 14.877 c 188.621
+ 14.834 188.828 14.768 189.027 14.674 c h
+f
+194.02 12.846 m 194.02 12.486 l 190.707 12.486 l 190.738 11.994 190.887
+ 11.619 191.16 11.361 c 191.43 11.1 191.801 10.971 192.27 10.971 c 192.551
+ 10.971 192.82 11.002 193.082 11.064 c 193.34 11.135 193.598 11.24 193.848
+ 11.377 c 193.848 10.689 l 193.586 10.584 193.32 10.506 193.051 10.455 c
+ 192.777 10.393 192.508 10.361 192.238 10.361 c 191.539 10.361 190.98 10.564
+ 190.566 10.971 c 190.16 11.377 189.957 11.924 189.957 12.611 c 189.957 
+13.33 190.148 13.896 190.535 14.314 c 190.93 14.74 191.457 14.955 192.113
+ 14.955 c 192.695 14.955 193.16 14.76 193.504 14.377 c 193.848 14.002 194.02
+ 13.49 194.02 12.846 c h
+193.301 13.049 m 193.289 13.443 193.176 13.756 192.957 13.986 c 192.746
+ 14.225 192.465 14.346 192.113 14.346 c 191.715 14.346 191.395 14.229 191.145
+ 14.002 c 190.902 13.771 190.77 13.455 190.738 13.049 c h
+f
+202.141 15.861 m 202.141 15.018 l 201.867 15.268 201.582 15.455 201.281
+ 15.58 c 200.988 15.705 200.672 15.768 200.328 15.768 c 199.66 15.768 199.148
+ 15.557 198.797 15.143 c 198.441 14.736 198.266 14.146 198.266 13.377 c 
+198.266 12.615 198.441 12.025 198.797 11.611 c 199.148 11.205 199.66 11.002
+ 200.328 11.002 c 200.672 11.002 200.988 11.064 201.281 11.189 c 201.582
+ 11.314 201.867 11.502 202.141 11.752 c 202.141 10.924 l 201.859 10.736 
+201.562 10.596 201.25 10.502 c 200.945 10.408 200.625 10.361 200.281 10.361
+ c 199.395 10.361 198.695 10.631 198.188 11.174 c 197.688 11.713 197.438
+ 12.447 197.438 13.377 c 197.438 14.314 197.688 15.053 198.188 15.596 c 
+198.695 16.135 199.395 16.408 200.281 16.408 c 200.633 16.408 200.961 16.361
+ 201.266 16.268 c 201.578 16.174 201.867 16.037 202.141 15.861 c h
+f
+207.07 12.846 m 207.07 12.486 l 203.758 12.486 l 203.789 11.994 203.938
+ 11.619 204.211 11.361 c 204.48 11.1 204.852 10.971 205.32 10.971 c 205.602
+ 10.971 205.871 11.002 206.133 11.064 c 206.391 11.135 206.648 11.24 206.898
+ 11.377 c 206.898 10.689 l 206.637 10.584 206.371 10.506 206.102 10.455 
+c 205.828 10.393 205.559 10.361 205.289 10.361 c 204.59 10.361 204.031 10.564
+ 203.617 10.971 c 203.211 11.377 203.008 11.924 203.008 12.611 c 203.008
+ 13.33 203.199 13.896 203.586 14.314 c 203.98 14.74 204.508 14.955 205.164
+ 14.955 c 205.746 14.955 206.211 14.76 206.555 14.377 c 206.898 14.002 207.07
+ 13.49 207.07 12.846 c h
+206.352 13.049 m 206.34 13.443 206.227 13.756 206.008 13.986 c 205.797 
+14.225 205.516 14.346 205.164 14.346 c 204.766 14.346 204.445 14.229 204.195
+ 14.002 c 203.953 13.771 203.82 13.455 203.789 13.049 c h
+f
+208.242 16.549 0.719 -6.078 re f
+210.465 16.549 0.719 -6.078 re f
+218.027 13.205 m 218.203 13.15 218.371 13.033 218.527 12.846 c 218.684 
+12.658 218.844 12.396 219.012 12.064 c 219.809 10.471 l 218.965 10.471 l
+ 218.215 11.971 l 218.027 12.354 217.84 12.611 217.652 12.736 c 217.473 
+12.869 217.23 12.939 216.918 12.939 c 216.059 12.939 l 216.059 10.471 l 
+215.262 10.471 l 215.262 16.299 l 217.043 16.299 l 217.707 16.299 218.203
+ 16.158 218.527 15.877 c 218.859 15.604 219.027 15.189 219.027 14.627 c 
+219.027 14.26 218.941 13.955 218.777 13.705 c 218.609 13.463 218.359 13.299
+ 218.027 13.205 c h
+216.059 15.658 m 216.059 13.58 l 217.043 13.58 l 217.426 13.58 217.715 
+13.666 217.902 13.846 c 218.098 14.021 218.199 14.283 218.199 14.627 c 218.199
+ 14.971 218.098 15.225 217.902 15.393 c 217.715 15.568 217.426 15.658 217.043
+ 15.658 c h
+f
+224.32 16.111 m 224.32 15.346 l 224.016 15.49 223.73 15.596 223.461 15.658
+ c 223.199 15.729 222.949 15.768 222.711 15.768 c 222.273 15.768 221.938
+ 15.682 221.711 15.518 c 221.48 15.35 221.367 15.115 221.367 14.814 c 221.367
+ 14.553 221.438 14.354 221.586 14.221 c 221.742 14.096 222.039 13.99 222.477
+ 13.908 c 222.945 13.814 l 223.539 13.697 223.977 13.502 224.258 13.221 
+c 224.539 12.939 224.68 12.557 224.68 12.08 c 224.68 11.518 224.484 11.088
+ 224.102 10.799 c 223.727 10.506 223.172 10.361 222.445 10.361 c 222.164
+ 10.361 221.867 10.393 221.555 10.455 c 221.242 10.518 220.918 10.611 220.586
+ 10.736 c 220.586 11.549 l 220.906 11.361 221.219 11.221 221.523 11.127 
+c 221.836 11.041 222.141 11.002 222.445 11.002 c 222.891 11.002 223.234 
+11.088 223.477 11.268 c 223.727 11.443 223.852 11.693 223.852 12.018 c 223.852
+ 12.307 223.762 12.533 223.586 12.689 c 223.406 12.854 223.121 12.979 222.727
+ 13.064 c 222.242 13.158 l 221.648 13.271 221.219 13.455 220.961 13.705 
+c 220.699 13.955 220.57 14.303 220.57 14.752 c 220.57 15.26 220.75 15.662
+ 221.117 15.955 c 221.48 16.256 221.98 16.408 222.617 16.408 c 222.887 16.408
+ 223.164 16.381 223.445 16.33 c 223.734 16.287 224.027 16.213 224.32 16.111
+ c h
+f
+228.664 13.205 m 228.84 13.15 229.008 13.033 229.164 12.846 c 229.32 12.658
+ 229.48 12.396 229.648 12.064 c 230.445 10.471 l 229.602 10.471 l 228.852
+ 11.971 l 228.664 12.354 228.477 12.611 228.289 12.736 c 228.109 12.869 
+227.867 12.939 227.555 12.939 c 226.695 12.939 l 226.695 10.471 l 225.898
+ 10.471 l 225.898 16.299 l 227.68 16.299 l 228.344 16.299 228.84 16.158 
+229.164 15.877 c 229.496 15.604 229.664 15.189 229.664 14.627 c 229.664 
+14.26 229.578 13.955 229.414 13.705 c 229.246 13.463 228.996 13.299 228.664
+ 13.205 c h
+226.695 15.658 m 226.695 13.58 l 227.68 13.58 l 228.062 13.58 228.352 13.666
+ 228.539 13.846 c 228.734 14.021 228.836 14.283 228.836 14.627 c 228.836
+ 14.971 228.734 15.225 228.539 15.393 c 228.352 15.568 228.062 15.658 227.68
+ 15.658 c h
+f
+232.254 15.658 m 232.254 13.471 l 233.238 13.471 l 233.613 13.471 233.898
+ 13.564 234.098 13.752 c 234.293 13.939 234.395 14.209 234.395 14.564 c 
+234.395 14.908 234.293 15.174 234.098 15.361 c 233.898 15.557 233.613 15.658
+ 233.238 15.658 c h
+231.457 16.299 m 233.238 16.299 l 233.895 16.299 234.387 16.15 234.723 
+15.861 c 235.055 15.568 235.223 15.135 235.223 14.564 c 235.223 13.99 235.055
+ 13.553 234.723 13.252 c 234.387 12.959 233.895 12.814 233.238 12.814 c 
+232.254 12.814 l 232.254 10.471 l 231.457 10.471 l h
+f
+0 0 1 rg
+1 w
+1 J
+1 j
+[] 0.0 d
+10 M q 1 0 0 -1 0 360.001953 cm
+244.5 347.012 m 275.5 347.012 l S Q
+Q q
+279 17.002 67 -8.918 re W n
+q
+279 17.002 67 -9 re W n
+[ 1 0 0 1 0 -0.998047 ] concat
+  q
+0 g
+279.969 17.297 m 284.906 17.297 l 284.906 16.641 l 282.844 16.641 l 282.844
+ 11.469 l 282.047 11.469 l 282.047 16.641 l 279.969 16.641 l h
+f
+286.312 13.672 m 285.727 13.672 285.32 13.602 285.094 13.469 c 284.875 
+13.332 284.766 13.109 284.766 12.797 c 284.766 12.535 284.848 12.328 285.016
+ 12.172 c 285.18 12.023 285.41 11.953 285.703 11.953 c 286.098 11.953 286.414
+ 12.094 286.656 12.375 c 286.895 12.664 287.016 13.047 287.016 13.516 c 
+287.016 13.672 l h
+287.734 13.969 m 287.734 11.469 l 287.016 11.469 l 287.016 12.141 l 286.859
+ 11.867 286.656 11.672 286.406 11.547 c 286.164 11.422 285.867 11.359 285.516
+ 11.359 c 285.066 11.359 284.707 11.484 284.438 11.734 c 284.176 11.984 
+284.047 12.32 284.047 12.75 c 284.047 13.238 284.207 13.609 284.531 13.859
+ c 284.863 14.109 285.359 14.234 286.016 14.234 c 287.016 14.234 l 287.016
+ 14.297 l 287.016 14.629 286.906 14.883 286.688 15.062 c 286.477 15.25 286.176
+ 15.344 285.781 15.344 c 285.531 15.344 285.285 15.312 285.047 15.25 c 284.805
+ 15.188 284.578 15.098 284.359 14.984 c 284.359 15.641 l 284.629 15.742 
+284.883 15.82 285.125 15.875 c 285.375 15.926 285.617 15.953 285.859 15.953
+ c 286.484 15.953 286.953 15.785 287.266 15.453 c 287.578 15.129 287.734
+ 14.633 287.734 13.969 c h
+f
+291.762 15.172 m 291.676 15.223 291.59 15.258 291.496 15.281 c 291.402 
+15.301 291.297 15.312 291.184 15.312 c 290.777 15.312 290.465 15.176 290.246
+ 14.906 c 290.027 14.645 289.918 14.27 289.918 13.781 c 289.918 11.469 l
+ 289.199 11.469 l 289.199 15.844 l 289.918 15.844 l 289.918 15.172 l 290.062
+ 15.43 290.254 15.625 290.496 15.75 c 290.746 15.883 291.043 15.953 291.387
+ 15.953 c 291.438 15.953 291.488 15.945 291.543 15.938 c 291.605 15.938 
+291.672 15.926 291.746 15.906 c h
+f
+295.254 13.703 m 295.254 14.223 295.145 14.625 294.926 14.906 c 294.707
+ 15.195 294.402 15.344 294.02 15.344 c 293.633 15.344 293.332 15.195 293.113
+ 14.906 c 292.902 14.625 292.801 14.223 292.801 13.703 c 292.801 13.191 
+292.902 12.789 293.113 12.5 c 293.332 12.219 293.633 12.078 294.02 12.078
+ c 294.402 12.078 294.707 12.219 294.926 12.5 c 295.145 12.789 295.254 13.191
+ 295.254 13.703 c h
+295.973 12.016 m 295.973 11.266 295.805 10.711 295.473 10.344 c 295.137
+ 9.98 294.633 9.797 293.957 9.797 c 293.695 9.797 293.449 9.82 293.223 9.859
+ c 293.004 9.902 292.789 9.961 292.582 10.031 c 292.582 10.734 l 292.789
+ 10.621 292.996 10.539 293.207 10.484 c 293.414 10.422 293.621 10.391 293.832
+ 10.391 c 294.309 10.391 294.664 10.516 294.895 10.766 c 295.133 11.016 
+295.254 11.391 295.254 11.891 c 295.254 12.234 l 295.098 11.984 294.902 
+11.789 294.676 11.656 c 294.445 11.531 294.168 11.469 293.848 11.469 c 293.305
+ 11.469 292.867 11.672 292.535 12.078 c 292.211 12.492 292.051 13.035 292.051
+ 13.703 c 292.051 14.379 292.211 14.922 292.535 15.328 c 292.867 15.742 
+293.305 15.953 293.848 15.953 c 294.168 15.953 294.445 15.883 294.676 15.75
+ c 294.902 15.625 295.098 15.438 295.254 15.188 c 295.254 15.844 l 295.973
+ 15.844 l h
+f
+301.191 13.844 m 301.191 13.484 l 297.879 13.484 l 297.91 12.992 298.059
+ 12.617 298.332 12.359 c 298.602 12.098 298.973 11.969 299.441 11.969 c 
+299.723 11.969 299.992 12 300.254 12.062 c 300.512 12.133 300.77 12.238 
+301.02 12.375 c 301.02 11.688 l 300.758 11.582 300.492 11.504 300.223 11.453
+ c 299.949 11.391 299.68 11.359 299.41 11.359 c 298.711 11.359 298.152 11.562
+ 297.738 11.969 c 297.332 12.375 297.129 12.922 297.129 13.609 c 297.129
+ 14.328 297.32 14.895 297.707 15.312 c 298.102 15.738 298.629 15.953 299.285
+ 15.953 c 299.867 15.953 300.332 15.758 300.676 15.375 c 301.02 15 301.191
+ 14.488 301.191 13.844 c h
+300.473 14.047 m 300.461 14.441 300.348 14.754 300.129 14.984 c 299.918
+ 15.223 299.637 15.344 299.285 15.344 c 298.887 15.344 298.566 15.227 298.316
+ 15 c 298.074 14.77 297.941 14.453 297.91 14.047 c h
+f
+303.082 17.094 m 303.082 15.844 l 304.566 15.844 l 304.566 15.281 l 303.082
+ 15.281 l 303.082 12.906 l 303.082 12.551 303.129 12.32 303.223 12.219 c
+ 303.324 12.125 303.523 12.078 303.816 12.078 c 304.566 12.078 l 304.566
+ 11.469 l 303.816 11.469 l 303.262 11.469 302.883 11.57 302.676 11.781 c
+ 302.465 11.988 302.363 12.363 302.363 12.906 c 302.363 15.281 l 301.832
+ 15.281 l 301.832 15.844 l 302.363 15.844 l 302.363 17.094 l h
+f
+312.449 16.859 m 312.449 16.016 l 312.176 16.266 311.891 16.453 311.59 
+16.578 c 311.297 16.703 310.98 16.766 310.637 16.766 c 309.969 16.766 309.457
+ 16.555 309.105 16.141 c 308.75 15.734 308.574 15.145 308.574 14.375 c 308.574
+ 13.613 308.75 13.023 309.105 12.609 c 309.457 12.203 309.969 12 310.637
+ 12 c 310.98 12 311.297 12.062 311.59 12.188 c 311.891 12.312 312.176 12.5
+ 312.449 12.75 c 312.449 11.922 l 312.168 11.734 311.871 11.594 311.559 
+11.5 c 311.254 11.406 310.934 11.359 310.59 11.359 c 309.703 11.359 309.004
+ 11.629 308.496 12.172 c 307.996 12.711 307.746 13.445 307.746 14.375 c 
+307.746 15.312 307.996 16.051 308.496 16.594 c 309.004 17.133 309.703 17.406
+ 310.59 17.406 c 310.941 17.406 311.27 17.359 311.574 17.266 c 311.887 17.172
+ 312.176 17.035 312.449 16.859 c h
+f
+317.379 13.844 m 317.379 13.484 l 314.066 13.484 l 314.098 12.992 314.246
+ 12.617 314.52 12.359 c 314.789 12.098 315.16 11.969 315.629 11.969 c 315.91
+ 11.969 316.18 12 316.441 12.062 c 316.699 12.133 316.957 12.238 317.207
+ 12.375 c 317.207 11.688 l 316.945 11.582 316.68 11.504 316.41 11.453 c 
+316.137 11.391 315.867 11.359 315.598 11.359 c 314.898 11.359 314.34 11.562
+ 313.926 11.969 c 313.52 12.375 313.316 12.922 313.316 13.609 c 313.316 
+14.328 313.508 14.895 313.895 15.312 c 314.289 15.738 314.816 15.953 315.473
+ 15.953 c 316.055 15.953 316.52 15.758 316.863 15.375 c 317.207 15 317.379
+ 14.488 317.379 13.844 c h
+316.66 14.047 m 316.648 14.441 316.535 14.754 316.316 14.984 c 316.105 
+15.223 315.824 15.344 315.473 15.344 c 315.074 15.344 314.754 15.227 314.504
+ 15 c 314.262 14.77 314.129 14.453 314.098 14.047 c h
+f
+318.551 17.547 0.719 -6.078 re f
+320.773 17.547 0.719 -6.078 re f
+328.336 14.203 m 328.512 14.148 328.68 14.031 328.836 13.844 c 328.992 
+13.656 329.152 13.395 329.32 13.062 c 330.117 11.469 l 329.273 11.469 l 
+328.523 12.969 l 328.336 13.352 328.148 13.609 327.961 13.734 c 327.781 
+13.867 327.539 13.938 327.227 13.938 c 326.367 13.938 l 326.367 11.469 l
+ 325.57 11.469 l 325.57 17.297 l 327.352 17.297 l 328.016 17.297 328.512
+ 17.156 328.836 16.875 c 329.168 16.602 329.336 16.188 329.336 15.625 c 
+329.336 15.258 329.25 14.953 329.086 14.703 c 328.918 14.461 328.668 14.297
+ 328.336 14.203 c h
+326.367 16.656 m 326.367 14.578 l 327.352 14.578 l 327.734 14.578 328.023
+ 14.664 328.211 14.844 c 328.406 15.02 328.508 15.281 328.508 15.625 c 328.508
+ 15.969 328.406 16.223 328.211 16.391 c 328.023 16.566 327.734 16.656 327.352
+ 16.656 c h
+f
+334.629 17.109 m 334.629 16.344 l 334.324 16.488 334.039 16.594 333.77 
+16.656 c 333.508 16.727 333.258 16.766 333.02 16.766 c 332.582 16.766 332.246
+ 16.68 332.02 16.516 c 331.789 16.348 331.676 16.113 331.676 15.812 c 331.676
+ 15.551 331.746 15.352 331.895 15.219 c 332.051 15.094 332.348 14.988 332.785
+ 14.906 c 333.254 14.812 l 333.848 14.695 334.285 14.5 334.566 14.219 c 
+334.848 13.938 334.988 13.555 334.988 13.078 c 334.988 12.516 334.793 12.086
+ 334.41 11.797 c 334.035 11.504 333.48 11.359 332.754 11.359 c 332.473 11.359
+ 332.176 11.391 331.863 11.453 c 331.551 11.516 331.227 11.609 330.895 11.734
+ c 330.895 12.547 l 331.215 12.359 331.527 12.219 331.832 12.125 c 332.145
+ 12.039 332.449 12 332.754 12 c 333.199 12 333.543 12.086 333.785 12.266
+ c 334.035 12.441 334.16 12.691 334.16 13.016 c 334.16 13.305 334.07 13.531
+ 333.895 13.688 c 333.715 13.852 333.43 13.977 333.035 14.062 c 332.551 
+14.156 l 331.957 14.27 331.527 14.453 331.27 14.703 c 331.008 14.953 330.879
+ 15.301 330.879 15.75 c 330.879 16.258 331.059 16.66 331.426 16.953 c 331.789
+ 17.254 332.289 17.406 332.926 17.406 c 333.195 17.406 333.473 17.379 333.754
+ 17.328 c 334.043 17.285 334.336 17.211 334.629 17.109 c h
+f
+338.973 14.203 m 339.148 14.148 339.316 14.031 339.473 13.844 c 339.629
+ 13.656 339.789 13.395 339.957 13.062 c 340.754 11.469 l 339.91 11.469 l
+ 339.16 12.969 l 338.973 13.352 338.785 13.609 338.598 13.734 c 338.418 
+13.867 338.176 13.938 337.863 13.938 c 337.004 13.938 l 337.004 11.469 l
+ 336.207 11.469 l 336.207 17.297 l 337.988 17.297 l 338.652 17.297 339.148
+ 17.156 339.473 16.875 c 339.805 16.602 339.973 16.188 339.973 15.625 c 
+339.973 15.258 339.887 14.953 339.723 14.703 c 339.555 14.461 339.305 14.297
+ 338.973 14.203 c h
+337.004 16.656 m 337.004 14.578 l 337.988 14.578 l 338.371 14.578 338.66
+ 14.664 338.848 14.844 c 339.043 15.02 339.145 15.281 339.145 15.625 c 339.145
+ 15.969 339.043 16.223 338.848 16.391 c 338.66 16.566 338.371 16.656 337.988
+ 16.656 c h
+f
+342.562 16.656 m 342.562 14.469 l 343.547 14.469 l 343.922 14.469 344.207
+ 14.562 344.406 14.75 c 344.602 14.938 344.703 15.207 344.703 15.562 c 344.703
+ 15.906 344.602 16.172 344.406 16.359 c 344.207 16.555 343.922 16.656 343.547
+ 16.656 c h
+341.766 17.297 m 343.547 17.297 l 344.203 17.297 344.695 17.148 345.031
+ 16.859 c 345.363 16.566 345.531 16.133 345.531 15.562 c 345.531 14.988 
+345.363 14.551 345.031 14.25 c 344.695 13.957 344.203 13.812 343.547 13.812
+ c 342.562 13.812 l 342.562 11.469 l 341.766 11.469 l h
+f
+  Q
+Q
+Q q
+0.501961 g
+1.6 w
+0 J
+0 j
+[ 3.2 1.6] 0 d
+4 M q 1 0 0 -1 0 360.001953 cm
+328.664 302.305 m 328.664 82.254 l S Q
+[ 3.2 1.6] 0 d
+q 1 0 0 -1 0 360.001953 cm
+347.898 302.305 m 347.898 26.25 l S Q
+0 g
+BT
+8 0 0 8 306.585565 328.614361 Tm
+/f-0-0 1 Tf
+[(event A3)]TJ
+-5.111328 -1.25 Td
+[(and h)-3(andover s)-3(tart)]TJ
+11.11322 -3.050597 Td
+[(time-to)-20(-trigger)]TJ
+-30.005711 -7.313533 Td
+[(neighbour)-3( cell becomes)]TJ
+0.269531 -1.25 Td
+[(better t)-3(han )-3(serving c)-3(ell)]TJ
+20.977718 -9.785889 Td
+[(hyster)19(esis)]TJ
+ET
+[] 0.0 d
+q 1 0 0 -1 0 360.001953 cm
+328.664 63.586 m 347.898 63.586 l S Q
+0.8 w
+q 1 0 0 -1 0 360.001953 cm
+328.664 67.203 m 328.664 59.969 l S Q
+339.527 300.287 m 350.016 296.432 l 339.527 292.576 l 341.203 294.854 341.191
+ 297.967 339.527 300.287 c h
+f*
+0.501961 g
+1.6 w
+[ 3.2 1.6] 0 d
+q 1 0 0 -1 0 360.001953 cm
+215.527 302.305 m 215.527 119.023 l S Q
+0 g
+BT
+8 0 0 8 224.653041 272.470881 Tm
+/f-0-0 1 Tf
+[(hyster)19(esis condition )-3(met)]TJ
+ET
+[] 0.0 d
+q 1 0 0 -1 0 360.001953 cm
+328.664 155.227 m 328.664 265.535 l S Q
+324.789 196.404 m 328.648 206.896 l 332.504 196.404 l 330.227 198.08 327.113
+ 198.072 324.789 196.404 c h
+f*
+332.535 102.838 m 328.68 92.35 l 324.82 102.838 l 327.098 101.162 330.215
+ 101.17 332.535 102.838 c h
+f*
+Q q
+412 281.002 7 -7 re W n
+q
+412 281.002 7 -7 re W n
+% Fallback Image: x=412 y=79 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 412 273.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gau`R=\)Oi'K(ZqdPRFe_9)tfqQRh5.ap6GUH[*10o$+1dKW.6E2X216IaM*kX2F*og?]MU)
+ =B)k"p^dXhYoIZGF]:e_2G?4tiYE8'k]E]R0BUDkFGh?KVCi@1<^@Y7H-^TW8GbION%)I+[
+ 1($2Ud]^X:nuGOP&!3NB*DGkMPahkI4^^OGF(r:;:"IDX0o\9AHBD^oc$/mc3+LCa1Z>u0O
+ b?Vt0kqtG*t)R?]3P;<gT"Ti"3LQ2j-O\*O@V^O"1q=BE!;'J"<2f>;")D*Oe,(KTNLC^68
+ j2V`OX@.:m1,FV.Ei%[ipeb-f9Z6ATnFT[h`t"V"K<d6h2!BHJ0HbD1.bMHoDfGY9U8+u)$
+ _3cQ+F$9Wo(/]=9OfieE9$_oV[)+nM5&Z!#7loYJV+3dk(]^*Q#L`Zrr#A\P<La]akY>#4T
+ R=9TX@e\9$nCjj6TpB@aus\fdYn@"Fkp>a%IM0[EVaXq!f1#]r=RKEVhXH?cIp9nFabp7Bj
+ '9$#=<935EQ>a,]-,-/?$Ui/N`[m$n(Ob88[ZatY>K(*!s=p$6%%$SsRU)e7#)(`5q)</XB
+ /r:63hm?&XG^0Oo#CR2b2*ck"cG(`3D0r\TE\T+COCrQn>WZ;b@m3jPT63;>t_M/NJ4*u<J
+ S#/!C2DR-]jh,mc$ra;M*a#[6RUot2'9c9tN/Zg3oB&VWaVDc.(Pf%mA_q3;V#/Y%6aLGZc
+ -8RDH9)NU&CGMCHUeW6Bd8g_91qQW\.G]B9:&RT6mUP_!RSW;L=?XHIOuK#jR1eP"V[1*:S
+ /+a6ZpZ7BBDlZ=LLnXSM_3!b4bSuAT1ViI*R>C@J5_%,nEs.@80JH"S.WKOKY%e/pM[#kYY
+ l%M;RlaTXIkAQ'EOOqTlm(U1#+/Hd0eiFfH@GC_3#<QnWlqbWZ=nG7I&1if+o_eLa7bEcVg
+ 3.qtJ2NK?8HY4/NDV=qt@jZR7:]OJa0"`SZU:ltH1[oZPM8?.b#[L3l_)2Z%RiU&4CUQUrp
+ O`AqpZVLLpUE^O-Q<-a^\ItAj,;;sT`!_05oB[saULCId_hSg8+C=$lMD]/pG[q9Sr:qN@`
+ pg%:CU%at[Vj'U4ZINhVbSBg:R\+H^2cY9L*SR76d;q$_`XploF7:rG-HDL[Y^eI6P1(\ep
+ ?YJ)O]3t`J\1A<8GZ[E]T)rcYleOkTkPS*Ag,1T0A71,c%<[V+KE=+k&P6J=IaBdZZ&'r"t
+ J9M8O+jQS4[QWaHa%,oS`5qgfh:oP0ZV``s4d#!"/JiquBNrdIsO.*1N3rsY<uU9.s3^K^[
+ =$"hr)~>
+Q
+Q q
+421 281.002 7 -7 re W n
+q
+421 281.002 7 -7 re W n
+% Fallback Image: x=421 y=79 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 421 273.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$D(Lu])"j$;2'K?\=:/R9#d)\/ArT6eWQ>Z/bf@l-ej>=-@q@i=1M3D0e`KX`+_3JEZ"
+ 0jL9oNU7_L+eH7&P+N]0.h#S),69Fm]*PhrfI6I6Z>+cFJMnY*B`Ls,M$T0L(W/3<]cu=B`
+ T414K2MP*mSf5,#G%c_'7N1Bjsh@qZ.3PPFZ89BPJQ$k/f8'9=61[T8*n3jc8eV["Fk=Bs@
+ =q=A73HA23A'G[=7!/6+V4EuCb2VI`g="ThqLZNdTmNFG&f<6^Gbsb>9hRp[k03U.*pZ'XG
+ gq&3<."m=)84o'4f^Pjh/Xa5_;-o:$7/6T:`!HV+iQ0,,;\LK)rdjJ":Ji$Q7:EEgq>%OF&
+ P%oAcliSUc:NL8.ks"3Xl^V&^suFZ[+$JR91a*jI&jgs2fBlg#]=O!FB%2cNN6,X>V'Xfpe
+ ad]_38+kESoGP=o@tF3]^)8K"*e15)oO<Z#?69IR6F*ZEluNeFre66;Hu_.%603hRu:']4u
+ MOOZ7e0f%/K]9*KBX\@Nk,!6N?mIilq[6I*KQJU`uGc@9X8?G=@9(Et#KR1U#Q%tB)=\A6B
+ bB")h/o^p_:2_ou=Ko![`60:h2A7ji[6]i&BX/el!f<AkKYqZP&/kAXQq=AQKr]B_fKCJHK
+ V+\=>8'F.X.Xp7dJFm,ST1[#+YrI"A[^NEF&Xf&SCh,FXOR75[(@o@u,tYDJ7,)h"LC`AMp
+ #8H:V1tt!Ibh8=YdB(O),*b5BF%o"Fj)pj^t;c1H#eAffs?i=e95W."Q9(M3bI*\T`J_9UA
+ r"o#m\18=u)2-<;QFuG\/je:Uu5Ro^P4@N+>mfPus!J;(q'-7>1jtm7cXe8$I1jp?[or=BW
+ cAe\OGRs*VsH*42n&/mOKkiNX=@`U)m/k*21k`XNdja2a#u3D'!bqAdt8"0f79^n:Og:V"K
+ _"/emcY-K3rH#d`H9>-^2r;YJ.$$e9^bre/N/]-=l'<F@V)P5p3)2*\$nmsg>o:2e_?G)(M
+ 1(YIcYV>;Go1_C521R19"G;=Q]6Hj$]dm0^HLXJbG.2B74WPt#84^O].pE)<_P,E['HV1$W
+ f))V#!Fb)ksUtrRXb/J:S)A/<#YEps3c5["33>VZUp\d0@k&.I_C+~>
+Q
+Q q
+429 281.002 7 -7 re W n
+q
+429 281.002 7 -7 re W n
+% Fallback Image: x=429 y=79 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 429 273.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$CFGc_(foB2ef5nC.s(P1j]lQ"-#$ROX!s0q-pg[Y#`5rY7QF.7[#HVcQq>[pb[E;bU&
+ @f/(_bYm3Qud#Y.LgMp\if>hiFnjm]KpCo=XgEh=l=\f)trY3&n_A0"/7Zq6LE4>I)Q1Y?u
+ EDHZXp:T<PPMW@85bWA$>h\N,'8.*6Uf_aCN-iUptXe^:),j2VuR_"9Ha<j9'294ma?q\Ch
+ kTY2@'27S!7K=3]6h4$@Ug!M,;r]Xq,dF3`Z3ooA#:fW4p:<^pQ_fZ5capsVAEA:p3<638#
+ K*QYs&fVe$AENO[D1+RqdW##f$4.#*S)*4_:Dd%CgWT#ibgf]UH%N=W`5][C;hZ/LE:]rcP
+ 02`TSnIAL=!3dJPOIDPlo=s!&#JcO#e7CCE9.G4ZZ5FT`lG?o-kb7hr/Ccg99iDUY?mp+:L
+ oQMJtO6V5Hhr#9@AoZ$?UK%@R<IL1<1o,]C4S_g\uZ/[S"Z3QbPaY9n0t&9YcBN7\ZOUc-8
+ S*1mXHsjbkIHT&+tp$&jjX0KP*M@CaRHPt4Ua?+IN)_?F%Fip9h8%h/tV@0(_%;'7Me@Nt6
+ q&[Pr$kKbH>Q7D*(]ZqL@DD"7CiT^aTLZ:/Efh(>a?t<f@Yu*,)F[a^Kng]:c:5>NrWiM8P
+ /5/UVapKIB0JLl!XKN.EA,.R;#6Z/5*p)LXD9@!M?>b`Xf%9HYR:s+/#gq&hobCO*grKb6c
+ =giSI9P44CMjUm&%V'&q.OLU-XkQ$Xc*c4`!:$mOdV'qE4EO?gc=U$$R`hjVc;Th\B\BO@7
+ .2(("_Gq*^,ZeZ`D6As00D;V/i,pg"RH(2R'WUL9PF`=+Vr-kH:qhE5$K)8P-F7$hs,Mku7
+ *lALoKm_m:a$R[Mhl:69jnS`/W47n4:H?BfU#nr035N16s3gc6T/KWS8Z/W5@OSrU<?0fMk
+ Sa%)L1?=#k4pFVsC$q+3b3%_O1g+=oI&h/J4<`ga[`pm?L/pc)hqd1Kl7$pA2$#Mk:%1VkV
+ .t_^%@S)DiK6:a:$&=^p'5'Y;\p[fZg!qCpJMLp6<$Tr=9>l%B0&#',,4O[O+@\i]>M:O>>
+ .;QB+-(8(lb,%~>
+Q
+Q q
+438 281.002 7 -7 re W n
+q
+438 281.002 7 -7 re W n
+% Fallback Image: x=438 y=79 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 438 273.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%>qFNG(eu4rq3Kt@'sbB,[VTETAQi\Z12Fek@r,>GW0itjRokCQMT4e9=_V:s1.b>,+r
+ <Ei'P\$O<_;lS]OUo$dj@-mFlV;!F3a5uT&9ElhrfE:#P\h7[YC%^I/AYp--X[c=BNA*03D
+ Q#lDfT_hnNZ9$H'dFmRBj-JsS.<gPbTA3CU8^[N@]+V[$"iipgL^F`hs%$A4!+r)lC!(?+X
+ b4F;g?$5=8MW+Z:P`Mfn-B.#lle<$)bIIdZ(*[*`iaiOlf;c-SM`^YoG81ufUR2NB?$;",.
+ _S[*n\:E>Cji%.I%@Pn`L'H`$$J!7^$;R3_@Nrt<j[S!;rqTKWp@TpO(GRb"#7on`B@#SY&
+ I$48iUUOo'M&Voju*qKj2YMo8^$["9]5kr;--<qio8nV"",H"Y-&$>7=%"pX/3f%j7K_JDk
+ 0+X7U#50r>ION;U<ETG^.$T<e5l*r;:O$)XcLL7SqiLA!igPqed!Fg?9rr]("d;o^:9^.0Y
+ nl1"h)V.JE4c[l5pG6r&c`S$U"5:/7gMjK;cMp_Vl`YG8d:)ZB.KZEe!t]Y*1d-qZ0L_qr(
+ rI^4;Z$k9%oG'7hE5sTtajR-<AG7(a[%36HUpcI]NF>f<>]8%n<E8h!1*>2tA@;G"HkE(uV
+ 1I_'8oL\,A-5+IgL.Mh1kD0B`4Y!fS(>-),3]`at[BuU)-OR5d&onJ/I/J`-#6lG:)S9asH
+ RIF=L2Yp:?m#q$Q>B,c&oDK.AmJ[Z(r4d+NqW*5<"uXE7GFmJaZ47=dFX/R.bqReQl$]RH[
+ E</^:oh`3UbXrJ-V4)-ZXj%&_u.Q&gHbdXQo+_GWG#g6/sFH'fWXE$,4,O5\k/G0C-`ubfr
+ )_dScC@_8\rVT;B8N?#6%A]m(]<VAef8?CmC57WIQ!gtfqs-kH%Ai'A>BTR\-[-'u-Xfi]Y
+ mbd"F9'm$-%:^jAOgal)t79CE)rGhbF1m.\=n,"K`Qal5..0Km6N?fc?g8m37<AeI\2f?]k
+ oB-]",R%%fq^k(jA'TI;U8*j=M98G9N)YG`jtfWO;4N$*./p8K[fsK!.4N?Z&F8@D6\24:@
+ pREN6n7BqF#5brT'_%]$]UDN'0(:P(qj*IcTAu<"mt]jF8~>
+Q
+Q q
+447 281.002 7 -7 re W n
+q
+447 281.002 7 -7 re W n
+% Fallback Image: x=447 y=79 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 447 273.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%>qD:M(iK/KfMY8g<rQ8i2Ir6#9_*De^mMDS17M:Bk.jceg121:=B`&QcfB"S0q7a_JV
+ 9cNC*U#TbEu:oYgM!Dmk\n>CW4!i8+'Y1n+YV`p"]"a?dJCo^fJLu$C7"IlPG$J_!J-(54V
+ 2r0gW;Dq%JsU(`L8l=6SpId+='Imq%@R\cp:Spec:-5"/tVK%<uppLA"JF)sAtcck>7><I7
+ edS^boiPC.H<)a/!]6F&H<Cc1)?dRVgW[cf;MmP;E3B=%@7SaPlVK?>i+.([g$P=JAa@HJ9
+ YN#P0['elaB-!C)HpC%$DVmos-r-C8&0?inGOX[M9O[Ot]I\)lT9ne]9TL7RqK;T0_Snrp^
+ H[mE:f`=%!D2%A!Z)XAm@/3BFAsNJQ\UqFS2u@6`tWcE+uU54q.O]5Z73QWhm']$!AeM!pB
+ ClMgPa+5EV$'7_U/rr<XP@fV'3<cTsb`??]2?q$,urETTDW4AF@^e1:r2BH1rOR?t-F!IJ[
+ DfMkD1t]-[l$Bb>C"+Q%9hm+AS&XT1M>i'i+j''84G:WM.pE-6ko%1XGthS%:ff?-$+O<6&
+ +AX%(MLkn;c"tD-74%UhM%3_F%l"PPA,dYe@79#LfZ*rM>R7Fm$j5NLi4ag^I6:g=%Wo.03
+ o1"bSE<@@-3.>-+mb\O",O"B+1%QMtA!i_EclkA.+=mqhRAd*I.nL@[SDV)hQo.'4:k6`UE
+ TRZ>*u=O4_9``TGA8l(TO#0?M;"iV!s4RO.,(Ogd1E6n'lum#'MSP#S+6KHRnL0$G7-3b,h
+ j748EN'^KUhH#nreaSBka[pTl7!!S!q:P;c@]84M8@IoVh,^Y`L*RbiIU3^rHN^A4b6b+!4
+ at+EN&-:e:BL.V:Rg4'V,(B2*GgEY@uK[tgNFBRgM,i$3a4&ee$1J=iGJ6hfX)q3cKt6LB+
+ G,tLTn>b">;0G#9H+qK:r>7]!,achlW%lnhDQS-DCVRTa>X^^F*ilW!(7uNE3#Km\YG5Hc?
+ BhW+ngrN8%Xd)qa@]lmN=_;6%m$!X0/Y)Tj?lG6.3_o2$4k/$(APk224K04T+TA/"m)8MY1
+ ?]1`1a_hfE?hq'%uXMi-Fb(bp]J<Y]qP~>
+Q
+Q q
+456 281.002 7 -7 re W n
+q
+456 281.002 7 -7 re W n
+% Fallback Image: x=456 y=79 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 456 273.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%CFkc[(bS7A;A-n"*1N?jC!8,4QAF5<iJ/N;Znr_"bn.<UQD&Hj,>"bKAl_Ib:IiW;AJ
+ U/GTThfAOsguL?2(_>he-NsIeZk9XrlQq^<_#:p\S4II6A[VU@nIHAnE_[NR+6I0K"Q&h_7
+ -M+$VTUjf^!XnE(1O4@)UJR[Y$SIZ48TI/"iFRPBk_iRp#\]la^j[D0N'%j%CU)ad!`7N0e
+ S49c&\kRh^h`2-,:GYpb<-(::lntg/e"uS>p^-:>cMrJ2VB&_Gt"W&d^o3GXhSCEY2V[$4%
+ 3.2]B;$[\65k8^Bd+3qIT/9uR0fh?l>)FOpi9cLeHPFE:i;@lU]-eg%'d7^nYP>0qpMoU@U
+ 8+u/(S%$2":*uJ8Q8cL6b[qNQ34*)73UjK\*34up$4Sd*$HJEE.FLMJpmN8oI*=(nF.S*#4
+ VW*CcGX&U:@\mj*:N+e7i_59-beiO/4/HbS7S!bD,*@UV:'I9qb.mZig-ZGOP%nWR0M3+kf
+ @S$I@;*0JF&ShCNVd6>.dqdns-m]A;-h"8+#HY$1K?.fnc7PNU43M1rj&iU;ipgVjf[[UK,
+ \BPFFtf%#JJTpUKCo^p(Q"3A_U9oUiG0PSN"Fp3!,aG>d2dtT:`)#0$Ba9W_C@.ig(bZhL]
+ Z`Pgl]Q!'G/mfC>iF.-3Lp(19]YQTPm=L*,'<ua7/1b1F/5@G9,%_i9CtpEL2)g;[S"rY_S
+ p6_rrp#cE\nZ5T)<hMMNei4dX1[nu:!h@A[e=1m[;4lD,\Q;#N\]tF.!iM!5t5[4</m;Y:g
+ G*!MNF!QTHKX+I=9dW19a,DX]_ELcW[eQmW+;H%=ER9+"nMN,[l$n#1[0(<`J#$)&['B1P/
+ :p@:CDfnu^T[.X6[!H'`=!oD\\JGS&Q]'!8W]92)<#GFg9<J)]I@fu!pcp*)XW@TV.3Yd.0
+ BYIqrg>f.Ur,j&N=)@?hi+jZd]0f)_QSs:_d)DY62(DlGn.G1oc2d!T/27n&W+@(s>KEQ#$
+ ]NfPX/I'V%;i$Eu2,qN?:G(juJ<,an1b;>K0/XJGY"8Dg(;ob/<AAl%(,@Y,S1NN$%euJL`
+ ebAMa['@/f\j`,`I;EDEY<)2l:_.2*g[!.6f9u]g+&l<32M"k*KL.jr<1D3]k.~>
+Q
+Q q
+464 281.002 7 -7 re W n
+q
+464 281.002 7 -7 re W n
+% Fallback Image: x=464 y=79 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 464 273.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$=\+cc'GX<K0UF=ocj+X62f4+lLa")Ve1@@GQa/:sQVtlO;KIK3NSI-#n0(.uW5q;ie0
+ n%T$>i^o^a(E=,nLMe4IsXurr5B=$pO=1E1ZJ\kKNnnGJF"UbP<Y>.*TuXf"h?'@0(FjR%D
+ =Y,f[l)@"`N3aYCYXINC_&?t]gahkIGU"\'>AQ5h->=jk@sqYS[fJHl]$naN5?qYDI1NY0R
+ CZVjnL2t#Kh=W,B*(NK1%]"0.K1LlA"48Ih;R[[/OJWpi`pd\%Q(`:'<PVLH_p%G,o*nf3P
+ %94Pr"1>Q#l+t]<`]-oir&H5W&JKeFqc#P!:3sdPjH(q?=Z:&rQBH1DU_S0##RQ';LC2(_,
+ :>u"o(B%;ak'7[!G>0T_urP"nbFut]Ko8OFS3EM\@AKql\gZ;,tlPQYjeWdepoR>@;H@)K-
+ G#H7;43FU?(o)D,Og2?>0\OD/I/foLW#P'*HOM#C[dK_NQ@GX$]o'JqL=<#HY%W_o>0MD&\
+ (YjCEPM:S6Y&4&N718nSeN/3BTOhYciDkPXT[FEm=B<WP^t\6.n0b6tJUE,^>u*EK;jf</A
+ 82/?T<0-!b`i>36&Yn7d]CEp]sdSd4tB7j.!X7?$DDVmo]&q#'p74k(pA&-dP)d4hnX6$X"
+ V,ptqb"kgFU3,Or^OIp.=]0jm8F5"S_KG0PAHd-rI:l"dB9o(D]7j$\9+-oj[kr*DH8Tc'\
+ $sNhB4g/U0l5YQ>?e18/`iCgkrZ(N+`V*s3A3JiS:#']U[)Eab#=JpPg81$US.]IDBM,L0!
+ C``/1j<9o&sn)WWFC\(=I\Q[VUMe*tf2s[>(;k@%WXj"\NDcR<p&8(X^XIA0i0Q@/YEIjL&
+ d"2C02KSCrl@iU/=GmR(_VK:>W,XO_-h.@n#$\D])J`gJWgJp-OEdrBPcP7oimL81LNN%i6
+ $7*a)K_N0L<=rND@D@6cNe\i7QS[hbko+;doYV>kLbKeeT?1nB:T)T+&MB"CnVi"YBT8p]3
+ GN(9?.%NSOPa?t*Es2^Ma=QRmqnI^+6\e&E*Y,CPh#RcLa2M@d3e-sWW[d6J2csfE&ef9ar
+ 0!`##bNS]"-5W,&Q4gkmY5VN?bVa@lIduHNK5/7$"T2p't$VieHqc/90%aa5pLhOHt!%Xk?
+ m?d2.$~>
+Q
+Q q
+351 244.002 7 -7 re W n
+q
+351 244.002 7 -7 re W n
+% Fallback Image: x=351 y=116 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 351 236.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gatm9HVBK/(fe+';N&DLZrIsDAr80<bt?[Cg03SnRhX&s`aTcZl`s^!/f)TOg";CK<6NE6A7
+ gYZP$;-LA_g3uP2e[*omM6okVphZ^ZtQbn%@gDcZt)@lK:t8oqA8gmHnS&;nA_+hnGf!+2<
+ 8!H%,>Dn`FGrIZ6jYE<#o.5Bq]+:[mcm>$LOWLQ9G]?241,O!!E-*Se:fd^O,QmThr%LAH4
+ Ds/mU;QS5;?7U[Gq1Qe!#FA<<<9C_/(Hs4!oCm=8Kk2Ol>*''a8Hp"Q<'htX;DY<6-MMlK:
+ $pm8l'Vohq36n'^Gr\'<ee.`F>?ndpj2^-G%2ThWrV[<I/)iKE9ET-N:aSq=FEXCY$5j^@D
+ u^h9_SJNP0/(`6nn#IYJaREDj1rIf*Cp:]Y#Le&.O[PK!d<s_UEaSkPU>erqf2<\mbJPqW!
+ Vu#5':iu#lEnP&C/S@dA-4('so8[PU:7I*?C.*f4BuM[:j8?Dsq%p\Sh?,_hZ=Z7oBunmDJ
+ )2Ji8+m[#ks_c,6huE-"Bc0OeMPlZ@A_-!n;R?(KE4qYaWamcdZtiPGaA*"[XCl`aatk0/C
+ J*bNXkf,g!scd>Kj=br$TSiuT8`9Pl,2MSsF1gh\!VUKG?7UdS8m_uVOE-?uD2%0ql#<NuP
+ BLq3qE^b*>nIaCg/$N^7ZjEdqad+jaqGj8KqaFG#fH@DaQ81GE.;Ea8MPWu-#Hk4=GTNi_O
+ ;TbQ\ao#JU!IFGRZgXf`F8XeXB>WU/!uf9k"IAtXBD:qil*+kqXq/k.4HYqPOr@@EQckNOC
+ r_k0KD5_(DZ']_N$"fk-sKu("rfRI-I9%.*7&'cgh"J2Q!uMN-@b-l-fnIPrfJnN[N%/0G$
+ N`CbfA3**]o3i'Ekt0@<D42DpI[VT:&0'"g'UcCK!rKaVHF1k;oF9@GBObl8<DC:h(c)+H,
+ je$49OeA\r-E<E2>+pCElZq8?;OgufNB&]$5k#PYfaF%'l`0N"7Hr=F$nX6&Ml=+'SiOQ)7
+ ?=neE#?IrF@l=u6f\2@mSXm9BR/G4_[A(\/h2$lK1a$W>TXm,0oQ2':/GJ-lR$51[R]sIgS
+ =ISUh9KWJEnia"+=mpK:>jPHaX@TR+1O[n`5s:_k9nh!7HVR7I)9J."pTr'6p>cf?;)82UG
+ F-Q[$-\"PPL$5B?*a0b;*Lu4=M1(%;>!a(K"/-eX;oD%H:K(aI4#%l6n2^P^f+&RH0$1n:(
+ -TBuZh.,#;7h8kiE/4.V;jq1>OOs0'Sg)ag"Yo3[B3a2`99QEQ.jo`l)ue1L~>
+Q
+Q q
+360 244.002 7 -7 re W n
+q
+360 244.002 7 -7 re W n
+% Fallback Image: x=360 y=116 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 360 236.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\)Oi'_N\+a4)fN!YJ?U6\5``O;.U(EC@Yf6un1+,"0@I'1t\b_#_Lc&Zi>`8h!_9ck
+ 6d$b-;4naAau2a.s\VC\+@rm^)9MTYB3_YB0D?GFuS#hWFsT[uChJ0B:eGbg,56=%lAh0f+
+ I$7Juq3p%:NhhUZq/$q!DGm)5r+C,@m0h)c#R@!W`lX84NRX^PZ?]tJ[d&l5."na%,3)q!K
+ $Yq`eR*l`FgJ&^g+Gk)"5q$K61,a%iqj84%KQrd>XnKVda;,i4%"9h?qr&K(LYdC2:1N1DE
+ 5CA9o1k^Q3E:YFEh*ZNN()HONB'J((:f;ngQf6ns5\),I$7,XmF1SZVPf>fU#RaU5L[8h^\
+ ,\HH"jW^YSNEdQ`o*M7d\!GG=!70$Ti/QRYs!>^)`J<>!(TN_I!m<qAS%#9H;[*$o7'U[GH
+ "JTQ&9ElO=N+%B?n<D<e8_t&JKfP>cBA>.2''"Z_qBqq#uY,197CjrVO[Z_mO:LpP5e"N/_
+ 7TU;i<?nFOP_/',gEcPJ7]g5>Xn'i]j;_%-GL37*J\.1n87nG"_9;\:".A&mNc!,H@!RFVr
+ p,?_Lba3gY[il"6LQfII;@2L(&Ff@?#7^\;9TVFkh9i%)Sn6m;!#V.Fad:1t=#F:Z8E'Uet
+ j+H[L;-Ji9DhMQ"r&EQF\jXH+2O?&4do-bEgBTMj(`I-Fn(nLP;q\Rb_l6SEGS,/gMRLVlZ
+ 15*G2"k3Re)pQgG7MZS_nna#1V@#*[$eJAFmd\58IGtrEjAr9%.%6$@59m$W[\mRnaQknPj
+ U4aQa?#jOt]F$E/!VjcJH7(?,N7C_ig^i7ImNoCk$mj.gp?:#R\G*'9ZlQK_MmZ_>aB?E/!
+ W54`j54a!,O0A7S4Olg&,@B\K@[-n[t]$=[L6(`\eL`l/,,c>[feC2/>N>j!_fQtMG\W$n'
+ >KnV8^W=Vf$n3I7*0,5'Bbhh29GuESgrd1Se#qmsR??eH4?Bq`F/+M_Z2KNK-lpaLg5Rn*_
+ m-+S+EW3V`"WU@JDbE]XLDA$\9IhTg$63FNoW;=g9%"#^X7UL2*TbEkN4Pk01l\'CD_]udU
+ l:p1"+9ic!Bo\n;gj',*m;$8;"*%$[@_]']o2~>
+Q
+Q q
+369 244.002 7 -7 re W n
+q
+369 244.002 7 -7 re W n
+% Fallback Image: x=369 y=116 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 369 236.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%>qD:M(oBd!PZG`NRf>?$;.aZKUWkW-k,7?#9l6sXBkA2b1.8FlMIp^rA4EtHTXBTq.+
+ [r2>+-/e5:+_-FcUf4ZI3sDOaG^%pV"n"4nj$Tf6oe8YX6RZinHCc9ON)^6UM2EIDXVRVPZ
+ %'ZdNWiM!8U^%c[.s4F`Bh:DH!=L6`UfH\_-224;4.Q.MLpn`UQW9,0R:.--qiq#"8hk/g2
+ ?rQ,`.]o1ZN"o7t=n,SH-GlM)Ek0[$_2+`s4YN"P1"nD+2.)=l`Gk4C!AfeCh(:S3,-3hMO
+ .gQHtPq+756Uup#bTB'DZ4`Rn#RnYF6OI('E;hufgqh1#s1gNO-^+8q77ttaNdLM^O8r'Pf
+ \.f7GS$cJ8\qI-7$*WZHi7"LIfD$j!s@cO5u!=qlg.ao3<Cum"ZA:.o0Z--[%OHmoL"=2hE
+ QMhM4(u*p`P`5BTPi`VBRu:%Lt0L<3UR"gtWG]/UaGm?G451[uq9Jqg7u//qD-FX$ouV7FJ
+ (&E4EKre.ar)fXuJ1gUC\mIe`a`2AS5i9#]EmMNBX%aKl-]NA^VEN/Yh_o_5,`:--Zd3-l;
+ 9p0l8gm+?ju)jW$][gp!\fX4?d89pge+VMA9?TL`gP(t5/iB.tT8b(.QoC<G)!G?&4R#&cS
+ oN#@s6?_d]I4[&0m>[nePa'7"dA+dh9R[]R]`26NN.:o\fa0567M7;TjieZ&@d@(YlXT[,3
+ F,SuDV^JtC2HCH++F,i_G#<M&$lrd0#5@,()HHnBpnJeoh1Z02.`scS"qCdg;sXK:Ehr--B
+ !Moba2$b'.tmQs#G-idU4NF]Od#F#W'u]<kuC>b>$*kD&_j/iU8GN8lr*m^l'#g4K?6S'c%
+ uR=knbL969#_NJsY[CmKXg'(?u,iW<V"adG'(P?tjJo17p'mAV#:40l33fL&$bmZ%AS6lT0
+ -dN_f4gfsl0nkVI/!c)Qk4tMm=)2V"Q,]/j3k+`hW#SZ>%\hWMED9sj@DQtDJT/o#*l$Rm>
+ V"CUU*4[B[H`BqLNl4=o%LWr,H?nK%YuQ@^5s[JY)X#Bh.nbOiHWQ4'HL\K1f9)1=_W*7gE
+ N9.:R[,:c]Q$:qn9^^Olg`!U*7:;2g>n0DNk--*_c.PXJF;iZ>C`>2C[n%W(Hq`1mJ~>
+Q
+Q q
+377 244.002 7 -7 re W n
+q
+377 244.002 7 -7 re W n
+% Fallback Image: x=377 y=116 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 377 236.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\)Oi'FiNc1/6+"*)Oi[#n^-q6pLTG.J1e4<"p]P&4Ar=+f-.c.Oe9;^_&/;5TI(+Z3
+ Z@b;Db:,!c9\[/PS[_e_1^Dhkd\$e5qFuF3h)I5'sKHc3#sC?b^&Y!M;R7j%"LlTO;dQ1Ge
+ gs"j>(.T)\JNT?"Qf(`p\\-[>,G_4sL;(r5o+5(D.HH$0t,?D4D-GOD-,:-hel*^@[9kEq^
+ dP'M?lc^s+`?'LZ7aqY*3YG8WG:S6YFHS(YR:ZgWu:#tF\,t5Y<1FOckrVIENdup+j^3:(k
+ "\;0LE3OrXBO&1u3>ijfP*mIN2WELP"9dZ(&I#n_85D`u2$O<cJF0ts=?BQ][hfboEd]#O3
+ '&O.G=R$CMMfd6.GLd4*naMDMi4n:okV3bJbF8d=)=s7=^*CqE^Elq,bI#i67>&*SeBk(bg
+ #+k)n@;<FmBeu1D(<HEUM_fi8?orq]dsul:>bj5Kk&cCAiDQ;@R62UB@p3\8_UR=bqlaV^K
+ ^5Z#_:9mJ;CIHf=+AO:[pG/IJSY6!G;>]/=iAD#'-A!=EWPlo=9c4aZQ7:7d,o#Ae6cAd0J
+ )Cu;C88llg`L,a-;'^4m7<PEDQ[r70khS'^\;*!1FKK'pOI/,OlU>Y;D92"X+#6P(ll"Mhi
+ h$SRYR$b\+!f%8B8@#SLcleJo1MKol24/(Z1e_YOL;S1XE"L_dHUMc\E]pah%X.3#YUMde.
+ i^VtI9KMmp,+ZP(LL=m@.*8FC[2N2nb/8n(bKI2D3H)Bbad`,2isP]B:iMAKU*D<YE9DSo>
+ ??^W^9I@Uk5(19sK&SoEE-BSk6<oIWCTEA2Z?ciPPp1Q(-34B]b88k-KMUZEOlX),_&"0.A
+ !b=XLR5"&jc7>iGt=K!ddk>akWV<I&T:mj`Nj$-o/5;NeO!ZU*?N[tgNFr.L&hGf:Tra[n+
+ )""VGHB\LZRrO0@D/7$4g^SMI23$A;B4Y$G#Gn;S\5KELuVLfj.(l4Or,UZ6QR-g^r%Hbf*
+ Unrp2,9t1br;;4t;c";F;Kt1\ifKNUY04:D`Cr3C/k1<(aStO/8N7fP9l]H_=CPU.F9,UI^
+ 0]loWZXBW;Q#^WPPdMihiGLchZ>b.#fXg(JklSX!EH&q++J3V"%=0Bli~>
+Q
+Q q
+386 244.002 7 -7 re W n
+q
+386 244.002 7 -7 re W n
+% Fallback Image: x=386 y=116 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 386 236.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$CFn(G(p.%@DQ?SgVHdkQ[4rTN:g;,Kq1Qu7>ZP'=@kG5e@n`aG9W#%*ZSJUcCglDu`T
+ 9`i,"@_^DCJ$?FIq%\rdT!gs+`f2m!SV7hX`r"o:5!V^m_O<LsM\J1P:MjN/oLap^qRg=BN
+ B5mqXR_2eH^mjpdnH7r'WDRXV$B)''`Boa:0F$b9lcgrRjnL5-::=ns":<N*#g<u6UHj[>Q
+ V]6EK*`1oi4FUL-H._'gAp%<S"64Thp$k8o(!C]FJ9Z6&9$EdZ%H+DFXLXI_U$J'bj_8/*P
+ 7R9uf$4?:p.6`.+OI<d4/Oab<:7d-.Rt?.jUo0ub#,@rC_7$_(04.+H4=QPWRu7Xji8T>57
+ hhIWNL1QIQ(bf/e'j\Va4IL6/!0.qH7?;Z?BINgWapAL0PkP>\@^e\7HEQ%6!h<l7[*l,\+
+ OEar/cE\\7a.7dXp5_ETrWs\8NJ_lqu^)Lql:/PTjp^QQ4#b<`.ejJ-%(55G('S]mIiHa-A
+ 1EonASCG4($t^&i(c*']If0VkP=U]_2L8FfGDQ&=5$ks,.NVPXJq0?#_,-n`=b3-uDN%O*S
+ V_8lmc>&$^=DO$es>2m<uG^(>T6:R,eq"ChGKJr^cF*U#1:`O*Tl0;:Dq;L6t=_hIJ"+ul_
+ ]"0RRQ;+>J='(nVO.71H2N%BOhDmQq6(N(i\8PfLfYXUd6>L<c$1$hab8)sID/I\WNZCI3+
+ ek0rUnFGKXL55BPETb*oPi5VR2HkJ#n_72[0q_DfX;5M3nV)JNL<:E5tK;Fp[=GGi]o5p\i
+ Oh:emu`r='(;g`lH!S?`&H)OdXBa:**GD)*Gn3m8>7%aN=i;:5HAiB&`f<W<o&j)P948q\q
+ J)G;:se<l<]4HhV"DDO?ikJT"WqI^QDAG0gO_6]mliBg7'*QS6mVGrl]V9CKa8V1"r,3-7\
+ pDf7;5Z\,B^!^?0$^QOm(ioPle+Lr)iZK+L5R&^EEB_Ic!dgbLU9]P>63'.LMR8reCl`jsh
+ p(i:Tq^!O[H7ZI=d,J/ba@N;_\T:*_s4NhMiSu0:i2&g'\2`9S,G)?<cBJbip\K$#'UFHf`
+ PueSKERDWDm\kIEF$_;VQ(Q)P`ZRMpWKeF"k5HRodA[Wf$bj:W+;o[K?X5VJ,ILb$0c-;"9
+ ~>
+Q
+Q q
+395 244.002 7 -7 re W n
+q
+395 244.002 7 -7 re W n
+% Fallback Image: x=395 y=116 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 395 236.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%8M$E@'X\KLF#7J:8R%(*BNQB&<Y@d)BSZg">)=@7daloJ%1+28FU^br+VI0pN%ljtN?
+ SY1U7m<r,)2!(F8HU=r@]hkb=gQSS$P0Mh"uNgIeV_!!BTT4$KpS33l:X[q">.Y4)0j;4r,
+ e/#2&#`p@n+A'4ti14KQQDLbRoSV8`MI\A6Z25(:H.+PPT#kifh/ORVm?@t=*iIf>;R;7*a
+ )\lsZoDhY*U)?]?u'FP<4m`);/aN[_XV?T1HihaWp4#t.L1n'n2=GZ`s"iue'QPosb>qn6l
+ \iMs&N1_9saH3<d)EggFBtVR(!PWrD;O!Cg+TXbj$BQFWJl$N5./L]%i6S%jnH7P#dT#\mU
+ TkD,T->H\GO?jj)2W"Pd+!`J.BKXC[km<q*QY""GHnFt+hbRfWksrI#RQ'WUB7-_85#-nl0
+ FOJYHCK^c9@pp"[4lGf@;1VXf+KSL0W'R'4ti12cmo?$W0dBb*&OW]TKLYO%\h^Snf/\h;E
+ d5>EP!Dod`4R5YDLUndlfNDf<.r_9PfI:J4K<4MB6,I#.]JGt5k0"4u&ZSg789^Lqh?*Ku\
+ cY=D=t_S`3g?!LcQMd*Zt1QrtXn(kUMj<f0N>5E_Y6V%#.57_<9=&pM&<CYW_$+FijdLmlR
+ g6p'EVq9T>_8.nnN-b4.Za6q;[?_-^DI>`LWi-2a*m"[l>Jn;ZVPZ%*f$6sD4M<X2nF`%e`
+ @1.&mVO<6]PAEY_3N<"R@Pp._!/)/P$"$78U*g$OQ!kAg,tp)_br:j[MGF)R$`tRNM^\m1c
+ 1l8)!U;UI"$NB7fHN8Z@`8Gm1gb]>1)[$M?aY''-gANV=KiIqrL2EBhM*>.(b("jrFL*EW8
+ 3b4Q,XfHhZTt1dQjY^!om#bUdm&JZMmi#.B;ac-OS,R@-T@7VjWm_@R8$nFtNDQ'\/,qP5B
+ >,@tHWC"qEBA=f:.bEoMd;GrUDLq#EIT)*t0l5@QCAnZ%HhU=<)$bMr_=C*V3(GG:U\R(ql
+ H:BWT);&>#Flkn%mdT=L/2#(/jA01`kQ<<6B,"iU?\,O>*K0d6ri,htj`8&]~>
+Q
+Q q
+403 244.002 7 -7 re W n
+q
+403 244.002 7 -7 re W n
+% Fallback Image: x=403 y=116 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 403 236.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\+fd&2eMXF3,+H%3O@t_$k%/&98pq=qEts,8-8\5s\'K'PTiBdn5cs>b526TaXmsab
+ >Zb_b<^--pb']F"]?:F9^j`hb2)Yg1/#_rV,o2B?m$8:LLS4>f>D;VPitG$U0$XVb`K;jj;
+ I\:,=[W/?B3KLR=\MW&JYAdt@AfjU;Mq,Q%>sk>,BF8U+bK]tJ)n_4<[2l/84(cHOcMH$0t
+ ,?D4J1e^_0U<AH3<qYFsf\iN\^LR=OIZY-dl%u#^.:R>$Q@:4WKcZR`_@KMT4UTtLM)$gb>
+ FE:A*]=@'b4>qrF<YQ;-j@L=R-u!+`7Lf\hG;k!Kck^K?BeqP3q"8E:=\]Gn6a:tsgtc%fI
+ -ME7S&LANPPFuSN3mmiH%;9WUNlYO?!Sj/6Y\(\+,6O8m-N6+ldd42%CNV-n&Oq%R$2&]n)
+ h)tq!\;O6W.WH]pOB+%NN9mD))nWj@u,*S;`UDE=Qj]m[ZnHe==H6P"k3)_#=/Y35W\U_qu
+ P2:,"C71T6CPCiJA:/mQ2o>6<*b@[X<!'rmIIRlbfOkYVrWg,7["/\7)<p[A+^g"md*%O!;
+ o$qX/3)Y!<o.(MfX[a3M?HhN7ldEuEpRMn;:.Pn\+A9r1;(0McOT!FRn'63%:*^,[gW!][t
+ <RR;j5I:Q?7n3^e_UVYd[^O2qNLHC%'=rmg-1f2KjQE;;8X`3(*!Zp_e*qH+Y:_Cq;A+A)K
+ [oe`fXr*A`gXuUMNsJ!dFfC-No98,fiiJ'\UFIY3LI0.[A)Q!F2_"'pBiEOD/'DF6VV+JAS
+ s-^E.#=37?HienaN6&^OIoDQ,,-/_\EnGEsB[F@Fm-b&tB5ZXC&/fbe#8826jM&%dYFR:&B
+ 'V@UMHU>oC!YD1D@:&e^M.K<.V2Kl>TD,9q@%0#I0W,4fsg%p:IEF7U_"4M[...pC'Q.cq[
+ omMt6G&/6DeLR$:ne7@lG)*2@"$X:CKP^;4N5u(!;6%PuZO^uY"6!%=%,0oAG#RS?Hr?B>.
+ S[+%(-C1;uIcO9e5lZ(S$1d?0aNg+>2`>,mHj)92EW3WCJtfO+*&3Ub;T@VVd]XqSk9n@3_
+ dOq[]6@gJ.>-W$RYVpsK89dQ5E=Z0Xcfn.o@R0uIP`sPV1IFRLT2hL7PA$[nl],d1i&9hiS
+ m:7>?i^hcMnmZJ1?0ZTDOM,p#$s!]F\`H/o?cpTBEc5q$&Fa!nokIs'q&Y$iNK<'E~>
+Q
+Q q
+39 208.002 7 -7 re W n
+q
+39 208.002 7 -7 re W n
+% Fallback Image: x=39 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 39 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\Ma['U8qlUBi&91u^tu"Os@nY&T"'UC]YS%n%QqLgksm@RU/E<%+lN:^OKQ.Nm/iJt
+ ]7\<,+k',-0&jALVKLb0jHDALXQJ)]t+b65i(ZS<(sdHVa+c3HOA3s8ILA%YJ)kOi^Q3%D?
+ n,4Z,+Q<E5S)'lucEAS$(.2$-eNp$28EOY:(_bb(0Cg..3W<9fA\2kFBe;L%_@hYHcR5s_j
+ ;gpr#u&4'uCan=tr'M<Lgnj%7PR<c$E[>_rC3HHOra!]]t44VgO_;;js]6;GVqg8%P3Shjd
+ J^=8m78Zq7ns#[+nrJWa`F33Q^qe/--fCN)@g?Z<jodV%Ngj7)X/cP7`%#ECQFkn\Vg*Gs*
+ ']HKCpnr5;+W$DAmKWTVi6SD9IBIujlZm2GS_1iqXs2tle$")`]?-!XBnU$;])c]B>]K!9q
+ ,#j*QgEg;K2FeG5[9<_tM3r?i0\'"G3),'OaB4C4\9-b?V=3Q@f:WhO\Ut8%5msKUj-BbiR
+ $9NfN$&1I;Y/,"miOZq;X4H!$h=MT*gD"n1+1]\q^I%hI76Pu3GT74q[RBl-S85<m$%JcMZ
+ ,Xf\?6/r[6D!I=7PKDE@"@Q%Fo=9t(n.M\@s<2]&G878Vm9eEo!NHaaA*G9$)Z=VEVQ@KrS
+ iUc1D^_B6h@7SrgceH&W/.DDE3(W[V248_`YQ(\#oJ\Wbo(d3;[-U_h\6HG:Ukkj!?;.c6S
+ AK)V#pYboJ0TO.lRRjOCs:!e3(T,VR<a0r$jAr)4%,eR#mpDD/jOQ!)`QV[[0fp1>$6uUDd
+ $:4gY-*C%S8a+6Ik)*313U!E0-$>Ngf0W5UlqV"Rff/T`9fEpZ(%=S=CEhQ_MtVbkO7F%#=
+ _lG=-:e=fgc`Hm=9T[8l&67XuHa:k$;m8f4K+Qm4"XInYooaZaqJko_XI:&@Enb+J\*00Bf
+ >&K6@t\%Z0T?7lru5&e'BZ]Df4igcS(p@aTW&Wh=mOX!;]/lcl$E.]r51ibTB63^TF6iHtP
+ NXk^HVS'Q#FS`=o!-G-k2/?[K5^q\[[VZSgLdl1(c,J40b@JuSf[.tR]mir4OS[>>J@;MZU
+ T=l,'o%Ae+#ncT75VR\qt?]c5kZsq#]=TNLl%(gO)G[F'*a(tA-C"!m5c:!Do(J/8+4"#'1
+ b34\G5@>g9`]L,B/8k64ip9B(A2]T`:Vf3IMf^"OJr3j#Zf-\-R.g,7eX(B7"?,APs-r`'q
+ j4He&JpE)`h(j\'\%o9do9nUO6;ZZ4lViSap^=fd?*:R(>*l[!m$@tnUboX);XKk_iR!d3b
+ l8/S7t*um+u)=KXZN>E[!GSCEkMU)KS7>tofjtYoOFhPJ@/M17.<=5uJ5Qq/7U8MF6<XmA3
+ ^5\0mL52I&PQdd=!YrKb7P)Bl4Q_,KIK9?Y&-W~>
+Q
+Q q
+47 208.002 7 -7 re W n
+q
+47 208.002 7 -7 re W n
+% Fallback Image: x=47 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 47 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\Mb.(faOe)AGW!7M.@);(s>3`%;lPpn5X:5H$:dC5a&GA(8"b.RdMX-l*YRU*sFS(^
+ 9<28APHrV*N]`dpf!P?"dBqb1b9eS28X9osTD$cKkBg&%=LlSpUJ:45]l1jid[>Pbmj9eU7
+ 5Cro&L@Y"htqdoKJFXK;=@Zj?l8l=tHYD7`Ws.2$?!>)\)dAEGM$UcLO3c(-qMf<;pr%aI4
+ eSoa`bkL:rmq#/F)]F,M_Y$<EeEMGKEX=cC'ZU-ri<n5d8UJd^+5+Jlr?eUM\.9j9ef<8!@
+ pU?(AN>nL+gQo9hBBFaI02J/jAM>r=WKh)#\=CNaFntTdj2]XCm!66TbKh\?-M[DUqt_Z7q
+ Sk0qD@>7oo1N2jio01Q:BLY`$iQ/=85.OTA7XgDW>$:##nP@sGk&71LE:BjbZ_TBl0Z`#\1
+ hO2Jf%;0kkXfVi$[!s/(WH:G0qN'KDG>*,M]>$bG(d3aNX!fCEkY$jRS?l3Rqs>S(kEYNZN
+ VUBiDC:BB8F4N*3LN1M>.lg`iUkrsC\DL:]Ob_]rpASGPsFU]q#iE!_L.D,N!q^U'-Jgu$L
+ &j7,<R35!='**;]c%H%Ye3]5.#jmJp9<%"Tjn`'pP-VV&9lqEm(-/@#c!hKT#U50QSnP'/j
+ b)2'"Xd70nW6rD$ZI2Xl/dMq^h7anb!4DQ+?"koDTh\@IET7=TR5T=G`(,,uY^CiHp[3HXo
+ ;42n%CD[8Z(\@^b`&1JelEVco^(6m$703^rjZO_I[W2+]7t?&OdWH^HkE7W_%0VLb!(!MPY
+ RS+k&sBCYhZIjT1oLlAG<(Rd\<JAQl%e.EQssLM\en.SU5;/2!W#9<m8k7&Mn$lPc-?P%J*
+ XbGT_M9I\<`W8>e6Q%tbFApFi>jm`%`g9*:3C:597d^HZlKfr3LnAfML)JpkJ-3G6\/@q/@
+ t0_@1Z=U<-qgE>Q!&/R5IStV*dD&4@*4<J&2h&g+4X-R5>r'Q&bA$Cs*3@`ql)o-f8Tb,50
+ jQ5o7XP@m[Scf23gC`X;GBXGSI!gD!]c6?D`F_&K\M?@`6R:)/'P*et6#GiS7mCaWS(m8p7
+ 9Nb!5f<rFiU?F.o!0BPmFi@(:@P!P)Y<RJ)HrPFTY&r<1c.\qIl0-]!1`jfWGI%\(3Y!A'Z
+ ==e%L+/0%N12_W_,mHoD-'LeR2/`oN5r-NV04&N+\)q]jY:K_ke\+"jr217cP'TA_4*:[r0
+ `/A99[cT]707Cc%U*k&3&>(S!.uJV8bi*^#6(+b2aCE8`3]`lIg,<)Zt&=<89FJ*@RIO:r=
+ =6/f4e(i?B$,tJ-YR$$@uZEj?!F<6'cQm0=Y1<%r"R)18,A'B00d0a5(dSVY!pf:%-0b,)s
+ itsRYK`.,:!QYk9"Q10qH,(8K,ogF7M_GlD(E8.G!(D/nJ:AB&S$9S3&!+-V-+jV4USlHH(
+ ;RVN8!ju;^#!Q\3QCu(emE"I&+0~>
+Q
+Q q
+56 208.002 7 -7 re W n
+q
+56 208.002 7 -7 re W n
+% Fallback Image: x=56 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 56 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$BhX^n'\*=DJ4^LY9oSBk73k_D[hod.\:d8F`')L9N7!`#>iQIOTie,u\C(F^6tI03&H
+ QOe-;;U)Kd)c`Z?9Y-V%sE&[`k_1jRFrY(&dC?8^k?@^%:[(pR^u2L40Zu0X\?4f%.:Pjgp
+ <VX]2;4Mq(.f/'s)?)Mpj4PNaPI4)/Mh.[Ah%,FKKq]^c:<Gh9*H\9Kb&baE[Q:;&f>g_II
+ `Gr#-dkmnR_n?-*r4#4*&1NTe(O(A6SOn%V29.peq8D1E:q6k,HRlABk?0_j-Rl3Fe\i"'^
+ cA_`!EJ0Fu[e09VbdG!lV%F;"TqRm0%jqSc4k[>"-6OFC`JR1brf<?urt"o%j"&\C?FT@Ap
+ ?aLD*lKpo)2u_6,YH:?`Ppj3pd,lNqnrdDJ7.ds=`S`Viol((UDGJ;RQmDIB'q9TKWk-9/r
+ a/M3[lK@9h5OFq+j[X9m65<Im;&6Os*7bFoJpmBm]P]rG=b`esn`ODsrKbZYk&6OhaYD\+a
+ `HhoL*7fIL#I''+Tc*W7EM]r@gG3\WfSGC9DF=B$PA:+j&*4ald*:1,2c`f(iX*oYSFKt4b
+ m0mPM\L79.ER@^!/B?kn7Cg#K[h7P7>.\8e=-n*HaA@B<?P.A38)9l3KQcG/E_UY5ofRT%p
+ gC6qS`mh![8Wu\!VG%"B^>ADOMd*M7lc9[f#^Och,l5)5]@BM/pU%DRIJKTe0:-^iq.J$Jg
+ rSQI\T8ePmd:d$"FS\A$X^.C?1^<;<5d`PIJg%IYQ(WQ;Yk[3VoPmj6S+*rY6sOd[,>=k*u
+ beP_PT*#]<cm4:g>g`b4jNLbOUm^euGb,cH^m6EQE$AE["H_[fA#0KXO1mV[!I5!s;DHe<)
+ b>3gJC9KB;EWhI$QkTLC";$(%^Po>(DJ-Qtb.7JhheIn7pVr_<H'D5Wp!PFT"bD_ZfnBd4.
+ _O.mPbf%ee5$r^@L8tZrX)[ZrraV#pVlfca:ldt$_4WAq>*:WKT?*u0Rd%R2<0R7C_e=dY7
+ 3gIjk3ZUcqOM,;5>1#5tNQ/df'M=u]KrMf=YldJS!'K<]'";\.S4.F;c"1H,8u5Ce2B*'*M
+ e-`%+$u/qbiZY-mN)L<?a"_Q\i;f7A)BI@(`5.l(^9gB0%$gui5t1=(pM1A;L5)C(>s9o@B
+ WuJ-P>.K&$\L=,`mm=(99>H%uS7s=:fZ/^C0+P#L!_cPU.[=T0EjkPCT0W*"Gm*:u%*B6it
+ 1SZEiCHDiPh?hM-\CiN+'tB>A&H#d_L%3hl8pKESpn7<JA[7'X"973n;l0Y'0)3]t>O#j`/
+ L%1-9-,nLn3)_'*gMZ\A/CW/Zu_WNFjE_&$RQF9jrRrl734)GsLZsS#M$V4G(!W_ZU6sEZV
+ TrA?%TKF=!1>D1SMZoM:"2K/:!?9(9R!62e/pH$Q*WH1W6Oq-~>
+Q
+Q q
+65 208.002 7 -7 re W n
+q
+65 208.002 7 -7 re W n
+% Fallback Image: x=65 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 65 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$GtaB0*%j<qV+j[bA[[W$dT13jlWCQ;X];EE[oHXfQ*"Q(C3C1u6?o;[;0J%gk*:Xh#&
+ -\?MOLK3Qmc8`QD-p%2te*C(LV!_rp8J4#NP]qkP`*?n+f+bGPD.1CNXcCW[]O6'c#9]k:8
+ rpRZAQPg"E[4X?V7u-`8:M=-8hN>>UuW8=I;B2.UUVC-P-T#\^S(*ZhN2SU5MMADGS-SAU-
+ ^":=Ma8S??</mLrXE[@3sPbt;r1:K,"B*JR[+$UgW@n51K9d-Q=5?bKHGgW5dnR1lrf#j8O
+ ldnXCh&<t>:\*VjiYO6VR6.cZd?>q,=0KWS\OGo@a^2UQrdk;>Y-%cB`J$$^Q3i.J>kCgEB
+ $Yq5I!PMLc*@0?-_<AamcPtVEfHGj>)Hd!1BIVsW7V1Wf^%,ESMMX$b*6+o-f8rfp2b9FRl
+ HO\^QXl]Ue,fa(BUI/ICOB5`3sO0,gFe:`*u`CV].C8[^A\*;@::XhGL9Ba,],#G@o'l4$(
+ g1NkK.>7iaC?C1C`ZR]YsOH[?i)8"]>3+\;7nh7SX^Z^AsG%L9*m@W$+>)+qHpm!JJ5T0<'
+ n_ZnV3A(2n[92!Ui_oY9#>TZ(q!856+F4`1haH:_`gVtRbiBg)Op[\/#'2p=ke<cC:\ZV^&
+ Y.,;a.ZB6W,EnmHm=Kke$KZP9=cnIL,n1b\!9B@V,J6O-7ccho`j&RH8iUfWaC%Qr^4g:O1
+ 7<ukRq+9j=3BPhD0QA"KU?id#B+BnP\n?T@=df2lT8MVFG?-F4Zr:%6SSk+jlMs-HD=?bku
+ q%99jJcUT?C\0&/YpUUNb'&#<-'\_5J-,iFjrmpS'`Vio;b/g4k?*NQ.'iTr\[_K::!4dNE
+ \ll-nuVCLA_2K4]$tZ*Z?![^JZo!iJb&cC9U_V38rSOcc"s0RsCE":RN-f'E(<?6C-`pa__
+ ZgRFn?rs.U1))IJ8X6o4dB%0$f@6`!"W?*P"r0pen/JLg%4AeX?ntf!H>_]:0e^g$uB;\7\
+ LKCS8\@JI5qMO=mb5$G/S[,=*INs(Cr!JP:<fL"VWi?+bS=b*(2W>Fm!,qVIfbk'c55j0#/
+ ]c.fn8LgF4q-qo[^K2<eoc-62Z/D?KH[VPGD-+DcXX;lkKin@aNU'&53SATk<@e4mld4JP*
+ jm$?&^:HD/)C/3h<DqAip5W!Xa-;@mu*=_a/lCDVonmrd4bXQRkFc_tJmD"?SRT48ft3Z;?
+ Kd&C-C_88J?9)`QdAJJ:Y3rp/od6'LTX9F(\k?QM<8E"3li&@3JVrP'U'+N2K6L3a\="9NT
+ pPsch3VbjU'"eUkR0om1j.SEDb"9Lu,:2hn<grGK'47lT[;e$#KpWk?`/XN5K`"^Kl5a%?W
+ '+0ja>,BY0AiKqUDidRG#ZV`[!+Z=R6.Cb1fG#AbNu:E=US(1O@jAG/"*FZ^C,Kf6Z^Jl3:
+ Y$%^F:Vd~>
+Q
+Q q
+73 208.002 7 -7 re W n
+q
+73 208.002 7 -7 re W n
+% Fallback Image: x=73 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 73 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\Mau'QleQ.Yo!P'J[U`A,O\eN5cGe->K(1LDhPi%l#PKU+sea.23=s2+Rlg'SM!eJ[
+ Q8\$O*4hO]!V38thK8;MJ4U7c,t\pKboin+WBSO7iutmrQe.leGj^rbl;R_7i*MA#!3QC(g
+ r>'c!hPJYKNYjkI8D5Z(S5>$eA5XDFr;dam%EC:.U7hMr(S9MD%eGNRAPS;.X(n)""`qf_8
+ LS!2m`X`S2g[YkOfacl'-0*FtG66IC,le:';rr/9&J,]Ad'.4t7++C\3:Y;gUPCg>lp\TRJ
+ @u_Z2FS9P1`JZbEm]sL<&NOV`ART"<fL-eBkSUmZqs,h<IUi!3=.;+9!M('RZZYT'D;-9.m
+ uKPY3r.Jep4EVJOH>ck&i-eeZa2\V^*k[soB9'2V+Y49_Vhh;?`mQ'db[1/c7X(d.K]C':(
+ 1P4h8(7DhnFaO(KgG"jn\[N7Rnt_68GmP]3C_d;%XP.lfFDkj94V,FmE_L[XQDc;/L,sXf[
+ #RX9_Y)XjQCJI(@"oD4mG*pti\UQS2u7IpU-*eu#9X,SDkRT3gD[>V'<g8f3LDBBSJ'8$Kq
+ ddaEKY!`'13O4gkqB?pDkZY"Jc=CB3_iBi4;NMJTq("-dTe5U^%@@(4oAf`WCe29*+(Ol/K
+ p"?[]1M<pdXJ.7P$jJDtc'UfT2tQtC(nrWg)ROg5bctXt(Dj$EM8rPCs/oG&bk-irRbCq:H
+ 90Bun+2ep\3ZpM/Q3E:nshe.b`"eNQBn2_R56a;piPq/Ngj6q63><'X/X4feO='k)B?[AlI
+ BWp;,M%@..iIFTs%ga[D#;"i'9acc^BE=Be*6B/s*m3X&j<6opM4/V%P'+4pY"@"?Pi5E;9
+ *2/sMQCkK`r,#G<]j!12e-Dk:+W'J$57Pq*G-D!+Q00V:ZDVkg91@PDJl;Qu;HPMu?CAq,Y
+ 4f9)9;iu+&+bRbF5n5oN$PIQYLnQ0Fc?8]<D9NjEI)*47V<?dQqc^/T1W2Y`rO$B3ua`)4g
+ [BY;,9F.r5O*#J361O43=r'b3:]UO^Pf_!/UQ$1\q5Mb,Q7/7a2Od43-""Cs!MCW%BEB^g7
+ Zl`i;3R6?Wijo22!@mg<:Ms)s/0E(qi*WWm(0+&'d\^Z@bnd@H0>fLj$poL@%Qj'IW06n<`
+ Y8JTl4j.p@P$/->";?*Zc4:(bcm*H[FLsr'4i0C19u0HFmYl!<ba!nq[Q64d^uGaCfa2BOY
+ RolY^F!Yh=^2!N<<fUIPWXb#ssrLsT(5,<%_AZM])9GW9$(PT)O]GT$Q4/uI+`3#nIXoU'W
+ `fWR7p)+TQ0#o$48<O&e_9PeHib]#0#[kThN.P;3L)$)i>GUB(?38!kj+XC/?T)49/CciI9
+ Ug,Od)/p:%L,no2D*t6B;CT=F:ceZ!#iGde:(CE%Wo<Id9RG-"m*k4W\i=aE+E`<;$NVJ)o
+ Jo(ss3glIH=[WI~>
+Q
+Q q
+82 208.002 7 -7 re W n
+q
+82 208.002 7 -7 re W n
+% Fallback Image: x=82 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 82 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/eBhVH.(ku=Kd3&Y?(aC6@(!r>HEK(1_R[C$Nrtm\"@U)`d;56u"V,bIB<47?,<)c*kX!
+ "6-LO_]1Q;SQ6J[U0,/_![k[&$S+c:^3>kI(d/l27*9pW$!LmrQ5)4l>Lb+9+"725&ReA?s
+ L8L(9>:/JP4"C6V^u'9T<+>$Y@e;-2@P?a"0[ltL7Ao_4Qkho4TDUnj(GmdY2N.Llb6]Q>V
+ &gpr9?i512Bi*bu4)^"M'.AK]XdaJ!AC,-Z2Q\L3**BTR,kg6AYqq-IN^M_hoZsgkeMR@"g
+ lHYr7qtF_E3KemkHj,M\e(RD@UCR4ckb;kEE_i5u5B%`VgU?n-X5a6_@f?8cr;C.(r#CFJ!
+ s7I_X\)j-/p5dKbbI[ZrG_M60KE:nhG,DA2)gFk;p-@/hI!gFh35<cAM.-&nF9p<?;+_5M!
+ j@n>Ia0@H$RfN]q^"'R(g9?i8sC_3@@UCDr0P2(l_[$L<`OL)3o,dpT>ht&`l>R=IV66>Hm
+ &M]QoX2Skn.t+1o):C!N5>&!+fBF/.mDJ%g=+b<:2Km;a\arq1&08VsFIMbH$NFF<uX8Xtu
+ s(NN<D7Zm4$A_*qQ1M/b>5!=;9PR!C"'+1?mooY/*`6=V`='$[?C@>KSp$5WJnM2^5rIW;8
+ jF3X0V/@e6X%l26\p>)c6-P.NlKS]^aC18Z&IP-g%9TX")o>(h;8(jR6\!G'J-iVX9bsMOc
+ HgoekUGF!l07\D`kd;OV+YZE5T\RAOTfn$Ct&eD86inn2^kVf7[%jP>qIXSV/jXn-BkP6"9
+ %'3I4>t<W/->R5&hcTc'i<Q?W7XLUe`<^$g`\XU<"th"-I(FMq'EkR'^%<Dt!2BOH%pFQ]F
+ `c_i@p*(sOY1:pQ-(s(1TOkKB/7Ch2ouId#dC%O,;Fil-ouKpOGo`Q$%n8jL`pV1/R.Eq1S
+ gL&NCh1\hiBQcJ-F`J3&US`BVni3?]Pbo@\oGU<4,FNB%[#aoeGm]U!J,#MQiGuI!p-%f'6
+ nKPQ*5!F.6J)]EA.SnA-5<fQ/hX0(7PS>R-V[s-J9-h2C,oHlK]f.]%12&B"i9THEGl,\=[
+ hsX6%Ng^6Z!qg$G^J2`g9_1X'DkD4gejq8JV.R>\+/*.1b`=gletN^*_*0*e+80Ci4t_F.u
+ ?QI'?UUf6,5I%(^gUfctF\@4Pgto*k#6'i*/l%$iq?!pVFZpgUCZr'#L$TE>E2"_n`cJXFl
+ /@,2]#Va\+.HTHG?FhoB0GW$I%YKaBEmnan<]`+e:dF4A(cn<lt?ZFhu+o$<o8$'VfXbuRe
+ C(c3/oaLE8)IK#2+%AOZ?,U?bQ-$adG<REeha@;-n2mTg#=NG+7r[%1_1DB?q7<TNe'49mn
+ *rK#g!<@$j/0r_K>)F>_&\@<K);`@JO'rO.K$T3+.O"^;5muUE=NEKX]ED0l;F!Bb]@hjMj
+ FW9lfO:i23V%Z)IfT*3&-)~>
+Q
+Q q
+91 208.002 7 -7 re W n
+q
+91 208.002 7 -7 re W n
+% Fallback Image: x=91 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 91 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/d=\Mb>'ZN!bBP^pMg_-B6:PtU&\A\\[1_LI])BMT%7-!j2&#)Og&Z%;4!Wk]XN.a(K+@
+ 0O8klaG:G",q,.90a_V(=ZD;V!$b.Aa0<A&pKn>D?k54O-/uReH[*q0L>sh`:Gc\,Xd=1Xt
+ +2CGM;nC-&Dq^3o_&Y1'd[<-SS;Y!]B?MV+NsqLQ(5Qd[BoDCd=i;^g.(@Dt0C'S_>X>eI!
+ rJ)2.&q==+<U?gE(DVm()O0<p(bV;"&A?O%uI!+g[cLKqUNuWFei4r-8pSR<2jUL^tT."/U
+ ?+m728oiR#6KYlWr6gCWJkMI$:7TBbGVF!\SqO4M'=M_&&/b1MoB'`u(s"9mGiDL5Z#A^oh
+ m9UV3Iar-.hWLQGOPNOiBl\#6chE5-j'O8rr2HRf>k(!(UnRi&6KVc2CSM%PoD[Aq=sGfU5
+ 7>G-CP8KS9DN+\aA376V^Ce;H\8+9%MCb8O5WsX&_Zm=:r5oq)r*BW$P)i^_6%t(UJ-nm$]
+ eg5sb8Z7;QgYmN8:%cLGltF*DIQBieqXn.;on6Du_]d3AD'KsLOG^RmIR]=E!:^`m!e+@79
+ />eHGY4:)<C#n&!OP=C0q>RlONg%+t1(VQDDhT!Jr5BA/opMNld>.Tr;R?*DNc5\!VnF;W6
+ ,Z2:ie:f:Lg=Y&4(GCkc?W3.ZFi.Kj(gG2+.T95A;>U:jF>A%4C</tB`/Fj]\$Z"pIJ`Nc,
+ q$0:[Je@pb_:l+2Dd8=gY63pdV\ZJ41#Iu5Ye@O>Js4%Y]G^hcl9)@A7p,<e\PW4*-A_rDH
+ d%?YHb@ATn/W38l'qbldh80`tGgtj3^f/glkkb_6+%L^^'#]Rl<PqI+\Gt4Ughqk(Y8qK`D
+ !"r":Wd8>gnCpL'@(6:0pY;)@,//%O.S_eFVGNnLa@ci2/4A*r`W`1YdGnJl\_B!iP>r$IU
+ j4aAeokK^#;bJ6:'&bu01H$\`i\+hWt*L2mX%@PIY*]Mju@5(1V"pR.Mn8'[0f;GIM^)dF_
+ ZR@09%f$JM_82'd\+h'Mr.u$q[HJ`R]@ArWYqS.#-<"bfSjk2@G^nMU$+Lcl(/9%`+ZG`fO
+ /LN;+\FR6T#^)7YQi-<7u+^gRnHA\EH)D*o(MH;4?n6tHiJOnEA=hFNfT/3,oi#7O*tOAnP
+ _2sZeL1Y)&gX1BIb_X)]n^99mB4K>[>T`/<,V45C40EcCLHCRtq?A*G^W]b_Fe_j./ibUeO
+ p?PtKlZVku?e("$RkI2:$:]A:o`6:6\]'t"EHY>Xnf(hdUq]pQGpW+\L@7O.5]]e'@&2B0+
+ ]/+"FH*=h.#g0Fmb\cq.T#qR@GX`Ndn_qX3l;(N'ZIJq=JSV4DS%q*4;d0d(Bp7IsA!C9Nm
+ !!~>
+Q
+Q q
+99 208.002 7 -7 re W n
+q
+99 208.002 7 -7 re W n
+% Fallback Image: x=99 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 99 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%BhVH>'W&(/+;$mOG=3)X7?"ju82MZ2BT0s@7/Wh-\8,PAK-l:Mg=fRC=c.B!(s=f=!`
+ L@36-:AqKaIudMA-UQ`Bl)r;Kb1"bff#M3p?%C\NegB^3@<_SU9dQDfkXOQoI-qRWR*1>,A
+ O$ZrEesBSq__aQ6>l9h@q"LC`+EZI\U;p=e6h)@[R-A7VJk+lTOgOELSP`go3U2fD;@?V\:
+ R@4E_:E[C\8XUJ"OX9T9mLP4/J,bsCnj^DT$DqoS_nmq*L,Cf.;qom;ZZu+QIjr`?e5Mrm7
+ `W#gU7uo!e4tXHlY;A"t_HA<'bC"\&'aq5Y:C1<4_q(t"F`@^nZ\FWO\EMq(]4%kFcZ\`83
+ IEgNm+L"BYJ92j.h`RFa>Krr3(oR(=7WnCie%KR2f&b'Yp.9B3P``c@+d=8,tj%&=Lo2J!g
+ bS?\R=Mkd#L>6%$X"N&J7m,O[29NONB!3iim.N[;40F%Y58Md?3nU^mdF[Tq*4Ues;ggH[F
+ V^GlgK+_8:n%[qtm+`!KD@-oA<reZ5QkmjQ7/$ACMs':VV_hM'IqX&cKBCfj_=^6Y)!FLi!
+ B7S_k*doeJ>qTYJJZ*f"cEF\!r1HA-@7=9JmDXQ,6$B"0'<@Ts;S*%!/8KJpLKBM1.SMS=4
+ g);s-()B=;7(0J@^(9Vu"Uc*=eph&<<#?<K-^DPqLAH3'146&#oEguE:_<$)Rp2PL'@)NBZ
+ Y%FS+T#;EEUE*6/Qr:V;&$"--S,:-JF.)gV',MTG4r;N@8g`Z1^(YkOO^C/.Hh'X$8Mls;o
+ $6k&36)rW_Q=?f@BQZp&/0%5Vo@h7"R*RW%gLY;ZCh8[b0CV:B`d@6PGcn2&Y):7cV^a%?k
+ 18dFPGhdeh(Gla*pE%>Ni8Ton;B+HKb,D_ajJ(o/6`Iq^_dS^*il+0]]>C5i=]7R__S.Pe7
+ d`Iu<Ep)6k^:<-K]G3k#LIN70@i9t$DP(KA^d*jccAB*]p1Mn&c*prBeG4fT6O/IqnJ_;1:
+ JC-?!cJs!hnUIiY;kf&&N6*W3NE*`=K*_j"%1N^WaO$H?hmM/rQ)[t>=(c*0M8e-V`lh;YK
+ ^77-@q8<\*>id`#'H?%(nl8`\u35iG]7VDnegZ\2h(YTdG3MX;q$hl,8U^7m#eo(_g^ecJj
+ 7D5Z%fC.\^7$CX#5'D_AHmHE>O</Go.Sk_-o.5]J.J."knVPrehTUEB#G)"Kg(Re"IQ^NCJ
+ j41W['6E%o>TcK=9Co^k6u(N]96k0<)t64J$J@;p0q?60T4_EhW%KIHraTC_Xt#UFi'D]^;
+ g\[XY92A@K>D<c[.iZ/7i0R-OAT1<p<C^=QF+^J*5q5R.)kUBeK,m5Y,&!qQg,DGI7&]dgr
+ p0]6F*qDR70+.?^TV+%hWC/!uifunSUVYpJ?]pb3_7i+cl0HBNW0Ab`%9XqjP,61mK5(>_C
+ 7mVTMM?iifWV9Yd$/d3&BG3@aLotK$h/`GqRaA!*?AfJ;i2)*(n4/6(9&*'rZ:W`JQFPA);
+ bX^/c,QPM]$^~>
+Q
+Q q
+238 208.002 7 -7 re W n
+q
+238 208.002 7 -7 re W n
+% Fallback Image: x=238 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 238 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%CFkc[(m_&_TM/cs72B?EKInK+UX5HuEZ.Sf)?"NC[[OQudb:WoMG@VMdUXqf&^_-0c&
+ .`$*LDq`PJbi!FYDLM=)4G3^HK4.I*_Q"f5oj$IGOYp!rnUaCO@*H,P^m;!s<fB:-j@o"pa
+ \k/&oT9A1$]u[s7ffc-<2f'AU8OBP>26#C,c*ppF>`^>\m/['cU5&uDE3DVW%@H[,0RK%Fm
+ ;LTW7/=!K@/R@+DfZ;=RKM7e/2-1f0<'(E;E3,o!k8IG1Y_tio&WBj=@QH\gTMkmno84^Pi
+ m0Y$]OHq5%1F)9f?QX1C7X@*^6Ek']!\Z4;lcKsL[nhYDqf`GZj7?o2pjgXb'GX4-!<I.Y:
+ uLVr?+Y(P2"'.]]S;.tEo?/[aSYfkSidU;AS35G(@0R^`<q0]Q,([?1c]qcHpWV85;^KK0D
+ P(tDp5lmbo78!Yn>Tkj60?nLVqd_VPXDN1VrYDfXOc]@0p%lqtKXIRH2H7qTGV^=E-Ceeh,
+ tD+>FIt2IY]>baUPB\T>#pU"g@sK]H[64cA</0g$QBm`*_R':?A`a;l;"Wl!l@P&F;64?]r
+ c)>*TqWs]pg9egdqSXZ&nN8qrIiQ[jsHF;rjF65;ms2`Em@`=aF>TC1i`O^2rZ%8#LB$C$O
+ k2'G"]SU.=&0)+&GHl_0\S+&V=qrjV%rKNW(D^KK?>S6oH[E#KYq]k8qX#^=5(C;6KFXfk6
+ UN.4[Npi)]@'mTM+V3FVm]V1:38>DY(`^K4MG3S>%BBEMa`Q.F=F;n7C7[P;,STE,r7]W>4
+ bL(X3@1\7jJL57k#Dm-Afk[r(3q+)Ii5GdE9L"MK8-TGalEVj/?/Df,WoRHJ%+^1?Gi`k$[
+ n![>(c[SfS:K6k`nO8[;i]G_q#kDEiNIAnE^FCn*`%GJi/S()Fd2emN`dBrO,]+t`iS!Hno
+ ha`;I8>eGlM$FI1=RCUG:923CNSac<CE5dtdU@Vn99M>T=T7?A2V.Rpk,Kqth"';\#^0](.
+ .<4pS%/.b5q"_bF"fk\?f(M%7`lUtgeS'"&`<-O!9tG22Zk_nOiIXV#)B]1e&o^O'N$-CQ%
+ hH1\ahXFJ1Y\EY'&4jZJ7&O@6^T<8e>Z@p039smk9D8VHhPMuH6Y+?`\I^i/2FEhV@!a!Bs
+ KeinKJ8)W++m'\o^O+3Aodb4E(;tpLDA^KpKQ]9\`V+clk+J3R=3-e']9eSb[0_r8cH5%F;
+ Ki^F7`q@:9L!H\X[]5nDFYHj-_Z?bY%^;o-RI@:g^PYFhshoEk~>
+Q
+Q q
+247 208.002 7 -7 re W n
+q
+247 208.002 7 -7 re W n
+% Fallback Image: x=247 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 247 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%>:e?F(iG$Oac05e294E]@l_eUd?pnA2A7m'XW5?XdTWT.CtbCkR^<qb0H2fg87@n86>
+ `H!%NEQ\8m,o64[&8JDna+Xl+?/ZGL+P6cgU\En,%IgkP]r2Z)cO2_WE2ZI)5(tQBtV0j4C
+ L0rZ0bJ3\kVi?ss)ritrb(D_Lt`P^)^"n)!$`7st32,P1*EGlJi2TB"<D1c-W.fSK6E]R5R
+ ()9H-m@,\:qTsYWsjX;TVU:;$T($OkskU>$5FC\u6qYO,qNB;?'m@"B+n"Q[KC0=`gOdYmN
+ [@sf9QS'FD>_St!Pa(+j;u*e<0fb*eHDIJ!lreR[Wt61!<AZRAG4mTAe<NKp4EuD;AGH#\j
+ @L*ar/dA)b"@VOi7"U[.Zh$uS=@F7KLd:?&(/dDF+^Ts^s5^5jb:3(l-bbC+s-H2r$;;j0O
+ )u>H%UYK<)qns%>9DMd1I-0!_Z1;ZSTJ8E9e;)l9sBFhr;NY&\h@?:MYIa1)%*_ICOP9&J=
+ O)'M]kt_81a*CMW1\KaYuE&d;1l4["&g>+99QT)\R%TO8$TNV?(G4FW7eHsF;iGB_]o_o`=
+ A%ms]2j+r6e9MKO!-la5bj+GOAAL+n"0g@;qaH9PCmL0AhH(cfAaN[.a,[=S^@fnMC*'+3c
+ 4Ul"PaM^ILF6j`=SO-#/,h(Eq,It=_/\`Al`.od::=f+(3-S-[K!\5(ck-*JBe]-G<$9X:q
+ 2#b?m$X9?Xi8YKbh(!p"uAF?feXMWJcbJ7e#2:AZR%2=hn)sBR?)_eEb<V.3:(a;dSf<TI@
+ IXF#>:`OdP,Us7T>VrYIV1tF"YOQhuNK>=+QE[Bl#?Elo*=KNKkP?mB/']8G-(lQ[Q].?n9
+ l?NYoCE;nPDV1\9dbG+]]D,=c8]3V[74a?4'FTWARHc-d0ri*rERjQ%F0"m=4T5L\)A*u?m
+ sa`5I2#CPT*reX?mFbRTFP^2AJfG?IJGE$ofn(b[=Zo"W$#6]hn;g8XG!*W43p[AaE"U9jt
+ `5de^4FDtD@1?i6R9+A#.M<@^73iBN&r$5q_80"ooq.U"`^h2H6F=t#4+`IO%_[&sg"Fe4D
+ Nd;:H=IJ2KU\;7;dERTrqTJ$Htl83'Rrc7NCga*#n@#tn/qsqP106)_X?G#.i,gu~>
+Q
+Q q
+256 208.002 7 -7 re W n
+q
+256 208.002 7 -7 re W n
+% Fallback Image: x=256 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 256 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%Bh4LT'K&]B;iDDp'EiWr"[Z-BL^Z!e&eROMa9<=+;DBpA/-uW(/OVl.'br$[U(E2-%$
+ q+)dPB6+20UR;1c1OokG%aCO$J%VqUO]spm?!^I!>"KHfbA/A*6rs_;ZYNB/)Q_%5TeB=MX
+ J_f%8HGrUifC#7'eq24d$&;j7,sTW8GB5N9j&q6V'VI&<dfgFH6GFUHXMUTmZ[2``F&WtB,
+ _q"u"HD5aR*?64-.2o4[W.bV[o&,>Z^*TkmPo_7D9@h]X8aqZ0I.$0XF#7o21KC@^J@:fu+
+ ]YV:.84u<8!;ud1\9\mdV.aefgmgFL5C]E&"3&68NeY/-gtWURGYuWSll!NcgFXB;5XHr[a
+ c)5<aV/2sikbjY3l9`[!FK2=^Fi$uE`#&k^S:l+Q9qDn.(8P]<*(:j"[5,SY^i,Zbfr**l&
+ #1[Pa(+F$[hf(M$_DPn";q;g=NMF(r4=],-Ccj.><N^%Ni]a6NTF_Y-&$:OmP8WK[*=)$'S
+ Lqq?%n?2UL&'12CPgAYl=U/e7'jbP(]!LQ7CF%tpc*]Y"djL"j(6?7u.-/U7.n_6X:SNW8b
+ iTI\G0kqM`O2BB3jk6F(1;4<W0*8-oHgZE9e_pAslVQdJIR5<:gAS':jA=s"'/eW&P6+)c4
+ LkA],i7^&Y4!tq)0nFn,84&#Ump6tnJ0RSFe#,t"nmrLMTs[l?N#AqQP_4D,ep.$*GOC9W:
+ 7fDOUQV"9T(&[4CM?(9(C(HX\[/V!HU\2\5/aL'inGpe3'Jt7aJQRh"+c"_Fq"6DZCDlce5
+ U#A#X??ZE=NAnAku$^K$[([Y$uoK6Xl!29U[5>3]P21-HtTKp'Hd835T[LjW#d$G^JK!-1N
+ BE8TXK8H+/AGb.co5@Ub"YHXr7A&FPnPb]?_fgRR<D`\N<0S3;eO8DLj,ek-V9/Z'NVhP%/
+ Mr$N[TQqs66D;*XXg01dk4"Gq.*9UPOEH.-$%Lkj9U):cGqj<o/`m!J<_o0P=3*;PDT>pE]
+ P5,<PS@2jAS9&r+oG0J>]o-Ur,,>)d#PH)7:d<pt#RV2-F-!p6e)6(<Kh3/-qbXXLbk.a#)
+ R7QRCtuTJ$;""L'iItmSrTm'gq>5P8):ILP_4]T4=o[jrk6gOQH0GU2rIu`cK-P40>&r?AG
+ ,pOr,)?9m^Tqm~>
+Q
+Q q
+264 208.002 7 -7 re W n
+q
+264 208.002 7 -7 re W n
+% Fallback Image: x=264 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 264 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%8P#.E'Q#!'%@W#Pl9`]t"@Eic5h_$.%O<G8-tjA>$=YD5l6<,pik-!`%0Zi&'+0LM'J
+ p%o*'g#l*&Gj51l'Pjn>$$`[HQd\[.86<pUfn.qsHQ?]FQt\D=-Be#7&o;`V8h'>LUCMVYK
+ tP0fmt7&\`\2oJ?aWnaWC4djGlbL+kE9N=C`l_1)F(dLo#=d*[E!L,6JjMp>(VNad8OLPNH
+ OhVXZO]=Lg?LVgna'G[=U*hPYifkcHSp?NO7`mEM"OqK#dBqVgI/M.e]Qeceg]fl#^j7R2`
+ V^!`d!uVuTWPQ@MIf@hCo?N@9RH;E-ipL(]4FN+XEccNKmTS?7Z&38Vea+iURdfko_Sb?pV
+ LaO/jQ&k,^4+&PQ<"FT?2s[CQd4@]ncb;DGjtk7riidFgq'?!_hUcX7Wl*MOp.qi@XIto%-
+ 5tZKW-EbE,-s2$Lm*_mbPeRl[g'7<:KFoZY)Uf%j*&W.C?fA/3Pk:']=,?HTYn?'jeR?>T=
+ eIJ?q$a?<#n3-%Us^!WioT0-oUY^3bX,*_]7tjgf?h*<-,*a&B(@?u]%3N'iqpK"sX^-6!n
+ kS'/c"(=GQ7^Uh!#3#JWoW3+&.Y[ekdWIa>()UHa)Y7D?_85+]?YOL,k&uMN[1/__]a34rm
+ <j8o_T:[M<REo;K=:k<X"H[u8?uhWFMiO)8^3NYC?bQqsI:[!m"'iBgCY**4ZCU#OqRqA3A
+ cF?4*2W@P)(XuJBW-loM2>&q8bDY>RHZF_PYJ>fKtFs1<+[K6]TLfsHEN>Yc3P`0\/5MY1'
+ O0X@q-sHaa&'l<sLn\o.,#tX+Q#"J^gX<7N!)dLq9i+lkO[*q/_[PgUCU./Vdn537eo])W6
+ .pcTX/)_a?&=e!cm^7rE)U%8jUk?;Yt(E_MGA^co)@-RUl7_SH9Hp)9TZIXYje\$om[X4,K
+ n<[PsSoi!eAEGhpM6"HcZhS0RS0AO+5Ju>LN:Ap,[A4R!#U83coH1I&Z_s589/j!8m;qrEY
+ `hQ&PD/I)SAis.7/XsjP;j!K$Tka*$+mW6X<gK7N)_dHF>fF+@(I%JK5-m7jF/$mBPJRtsq
+ W*\q?mOdCMJJW2YCLN*$<l.*597EG~>
+Q
+Q q
+273 208.002 7 -7 re W n
+q
+273 208.002 7 -7 re W n
+% Fallback Image: x=273 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 273 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$=\)P$(bDejbXA4[b#0HA9G4<u&jhB[%"(q\6P;gV6_kpE,tL]]+0rlI60gs-0dF/j:b
+ :"gP\=(OCt"Ou;)+7AV\sAo]r)+s69Xur0B\l*bk[S#joGEk7e,LD^4+&b-pE.#a,ag@%Us
+ Z"j5]q6h+D;-%Lf#.#C#Uo`XUnh9qeZuO!!E<4+5Vi(`UBYfBDS>[;39okngA#;,`,@G!(2
+ Q>-&*tr8\0e?cU-D3.9M>_EsCVM]Y,bao(B:3]^)?M4>P*5&<\l)G3ZMdXjDrXCPq,g"W5F
+ ,UFTbb_uW/E:P8hC[q>5Q-=Z)BP>2<'*o%95_'_6GN-[UPa,sC1QSM-Hgj;(+$GM;]A_d[`
+ jT`?NQ(_bBPgbi7Rj2hDr7F#Ss[=?&Gl9(Blc)USO6X%!X%EL0!&8)OF5qLA7a`B'l!7+>O
+ d4=1(?%)7bY!tgqKoD*C#RtHa.8uQ7j%TX:X1B&0.d+>dtnn5C0,&;Fm"8(/uqo>2]C.%@s
+ 4F.1pDr'R&hnM[L:Q'^Y4@,tkIR$c9fDP(M\&,sZ$>KJ-Y6:sGI%+9)DlQjN6=bJ%Y$"U.F
+ jeDNGOY^/0sSRH/DnVXG#(,(tEW'F]s6pt_elfujO.p[.99n^96p@@J`R[W:t0eli:='$iq
+ d1Q!4)4;9m_U>8_ZN_@,BL=R3EVVA]4VRFZ#"Vgks&;tUfJ/f3`f6^8Eg#);bctQaZ,-A6q
+ P&h:)g^_0<(^r&2f`mHEVD(()s*1R+!,%2/=Ek=Qq:%aSin$6k@27/3&jI`gUACg)L6W!W*
+ ?a<Q%n3LQ^8pY>K;>IPRNs_29D70><N_6a[\J/.;[h?A^AGZNUn63n",Z0,N(nbVop@MAmS
+ eG[0eEcC/SlkZ=RX8esqeG@-q.Z9F'L]kNAV?8j+o13BKpdA]ON5=#^'T1`c.6H:fIKf:0T
+ LhW,n&nFfn6SBJa$EW\?/2.0hS9dUi%YL7)DoJ`(-IipXf2SsR.#Q4P*CR=*J3AIS@B2N#S
+ AEIi0;j!.a(LhM1+l]+0HhN7R1/__RS?.ILWs7^e=%.T#$r3@VpMqJUcqM5%jQ:1b\7.9dg
+ 96'qS&-JGWk5kh9=jQ/LGK#3=nHdLaI`XFR"'\%*BsT&lFf.~>
+Q
+Q q
+282 208.002 7 -7 re W n
+q
+282 208.002 7 -7 re W n
+% Fallback Image: x=282 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 282 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%>=auU(_ej==p.m'-)$\u73H;GO?cJFksa&dnHss_KiY"GA9fV21e],k++2EJdk$b:,Y
+ @eS"c;=e9hNA5bqua>'rDjR>'C:[IH\ej]^3C[k'UgUq;u$lEQu7qVt'@+`l9\pN1hC>7Rf
+ 'qNaKOT1LhRa\+fXWbo8JsiRp"D2B'rtN6Y0,%dI<Bf%7+hl4WL_ql$SQi9jl5I#(k-nDOJ
+ `J%(O8o4Kf-eDTI`jQ%/>Ru<FB4FW6uD_X:f+`h"_6m,8t$5+#3aNVTigX:cO>IND'a+FW<
+ c:2n4NZL(;j@L%"i9=0fqICajHTTBmE:+\U*Q$[H7K`l<4^I(=;@?i1;sO.eDtrl,c^uFH+
+ 30FPh`gDZ@0@*%HPWHSBPC>1fuJe+nAc'=f@qf_h7JH$$lh?`SNGfi,.P2kqtKEdldmEg'c
+ Ru$s5`6'ba]'h[^N3oiaSE<K>WJ`[UFgHi#qN^cqmuYKSg-0Z(j[<:JC\?Xf'2>(@^l@*^*
+ Eel*U'FeLtiZf\9oT$=W$g@In++qB@[-QS6NBe^^r:Q2/>h#?Fl`p`H/Ak['^5+]DHtCY'+
+ =%PKJ<@cKqZ?4C+CPM\$!MR@6)BbRpm<@d+hE8u\AaC(f8(pbKX`U&,:RE<H<ZfAF2[V]u,
+ `k$:p[0efM-Ho,KkW##Mb80I$NS%>ZeWVBUpe`2HAj6b;Z\sB;<.oo-"9`BSC"KH&Z=U8K2
+ IY__kWkG.EYcGG;H%SuNe6fW41uHm/fsZEKnbW`',.,i,H[LWQ7l<nB$@mh"X,lVB)sRDe1
+ (3cdE6G_M^\j!ID'HHnY4%Va%+TEB$LS%aYOaG"_jqKDa_PS*g@dM=dlOK#&,i:;/M=Cjl/
+ 7TKW&Juj5d!GEh%F@p$7Uq7m;-=<"hDWi9."`A;9!QV#]lM2IWIA=>6Km5$kh*N:#B-bM?H
+ s#Me*ni(#ul\"91s&Ch$o;g50NGraU49UKOZ]KCVcHNaYlh]I4=-o#>=CR7%nT2W*!#8C;T
+ nAGW<\0(l-5g5U`MPj89#8%Ol%h-sRH#_o$E\An7Y"hSU@3Jsl2IYa[ZDpMW:T:O(79Z,e8
+ 5>`uPkW<8l+k/<E,D_fcC>SD&0K>^HqD`?N9GtGs$eCf,FTPhS$\^)Ihhrsr<@R_]t+~>
+Q
+Q q
+291 208.002 7 -7 re W n
+q
+291 208.002 7 -7 re W n
+% Fallback Image: x=291 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 291 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$8Oulj'QkR&WE=nS'e#qjK-6ta)'n2cEs`?m)?sqQPc6(lO:"PhTIH_a7WQ:2.!*6:d8
+ [?(V,jJTPT#]g3D^ob_s(G&Z2ZsZj<n,V3NN&FGIZQ/c92]jN:gY&(#Qc9@0(Fjq"R^;fic
+ Gg.r06_PnhNei8$KeoUrTld+5'[G;hu\nG+l+Q?6PA?H2%O?GFLD-[>.=2]b.N9+,(>_M8Z
+ snO"+)Sf/V<7gCLoOe;Xm"U2D[:HE.ChnJ?lbV?hWK8'RE(*YqK!Ku'cb&nI9F^\lHSFHLS
+ 84u<@L]U.>-nE3ABC_'D"T*K@'R0!'_?IH].hE;D>IVu9N\=`tb,2;Jp[:sdO6g\9L;M>8J
+ MUqXrApsZjWRb%97bU@3^Gp5NN"?=)l:M(-RQ^f+1AV0IJYi\GuCMfpT=pXQ)s/JobC"\I/
+ 8NT@<?XcYu+hbUH!5p()@fj=pdAS&/Bng2t?[J<3i+]_m]R^PRp,8E4-`QH+=p-Hl7B^3-5
+ G\[V9,[,]I_<WDg<K$$geo=][!1m-iPfW1^&tM>r.kBhV3Vcd3>';K2Ih%NgFb%F!)Ya]-5
+ `[n>N2=ru;I(K[et5,hF8d)>.![+R<ar@4j6$'gf#+TXbjYd;6=4YSZ**Yn:4/_I<1]6B1A
+ ]tG!oLZ2cbFp\?5V_UN[pr*Wg0\u*nGoT$Y.kBuA#nmsh)QK27$t*m&?WlFO-Hi!M/)E]!b
+ "QAF]EiqqU&q<ni]0b/0K#+UYW[D_2)@&4PC37N*'#4dIdNR0Rg^rWb4Sc(o&u2QAo+QM1P
+ \Y92GA-dK5GCV)<Ua[2;B*f;bRU;haUV2XN^UTJskB6=3/OIbmF`ldA,@+=!l&dEh.FA;Li
+ Q.4C<Xs]H')EGS-@3-n.G\PPjIJK;p=L6?9@?3A;#bNoAn^l0#h_m,&>#HNfdFSmPX<3O=p
+ j824sbCJBdNR<DCA3B=Ti"m=0fjLi.`l3\=D%@it(=Ne%jdo/:6%nC^uDVU=<"g(Q^Sj/Q=
+ OI88(4cA6+&aDgs'SN\EYs'pUA;CFhbQ@sQ,CB[K(FPN?/sFro=NOUC3hE01R[[kM["Hpm5
+ )u<[]R;;ZaM0)M^Cg,3U9@?f%1Zi`9H*o";?-7_$,4j$2u~>
+Q
+Q q
+299 208.002 7 -7 re W n
+q
+299 208.002 7 -7 re W n
+% Fallback Image: x=299 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 299 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$>qD:M(iEgrP,oh\9L>lCT_[D;bLXlm7[jKE,7>C+Wj-0$/;kbe1U@KAKUS<N@[>`,2+
+ jhc8VTS-YE?T#lQ3,$HOni>n":p"Y+t0.hWq_EqnDLa!Ob@rf\"!C?W^RObRCAG1b_"L+$\
+ heDR$d1Dr:'S,J(MWr4/K6I1'uM@!GdK>[Q*:R44,V$V>+a)B/V7nRE_lruMge=Bj7.H"dS
+ ;K9GN;LU_^*0+&%_?]U3WI/Y\kdNO)=`7qb7Cd`_9/md$mEA=%J6[q=$<chbV=?oq(.OpOG
+ L6)rU>e>aE=t,\R9q7]:;Xj*O;=O5-5^Y[d9@;FLj^i;^fP>B]<#Sd,j9_tr7rU/B*Rd8U(
+ ij]FdNU8T!j!?)Vb6t$XP<Y8^4+&JOJI!u5#P=!l4a^L'\M/Y+YXI/Y"32PH_ld&30X0I:7
+ 1P3,R+JBl4obWEVhZ>SqVq)/1h$+<a.P/&d\lSG>AA;qDCHb_Y<M6SM2uKqYK^P-(:9uEP1
+ c9oC2F,K*.'k"NJGc?pU0'8dYn5;-bbbTa3(^-.S"rg\;k`DDsk.)&j5\<*&#LAbc)[a:[(
+ Y@c'B9g84e,9sh-TSK3_3't%D^.O3(';r1L?oX#2/$!Qc<LpX[n$l:P3a%$9FIm<YpKqY3/
+ R:hqW_o;n9%cR%oUo37h!u^g[;))CBr4[PE:QO]k-O5crE-2oOnok`\(`93>GOEE;h/XNOC
+ Nt3LYZ$##2B@ajXYLR81-_%j9*.CF;MmVajOPU(do/'glcV_AW0nN`+%Kum1,JIa&RN,c]6
+ @`!b2<V4Q\Loq-q/<$KW1sKb5iamq3>>FGUV#fZa6uKEp43/9'".e"PSYep`qTQ)`J<E-`,
+ l&!sdnm/2cUZrDJ6$i]?DL4ffTjPEKHgkp1+_njFs[]q]#aMPHs*mgjVd.ELJcE,q->3T*M
+ KL$SZZ4^MI3*#jfp$q^?\;_`H,n>r]BnX51="9dZ$$+RN;5(niP)Op$qpJ=:hVM?NH9A1pG
+ I9"81;R"7*c:LO9R5N@rB?hV^*&01BeQ]LZ=/TZ-)-0aoGk1EEo;7>9%]g-71h:7Zc5dT6T
+ r(;N+]Y'n.J.R?1X2"75,CScC'0LQLC`ql+*u3Nm9R1+?2OC+"6mJj~>
+Q
+Q q
+308 208.002 7 -7 re W n
+q
+308 208.002 7 -7 re W n
+% Fallback Image: x=308 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 308 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\)Oi'FcpT*;`R]67au%oL$\tEWAD%6A!,e%7LhL"=)>!#B6>49JLNT'L;gu1l?<?o0
+ Ws1KlTGr^aTN<cp0f.=)7CKn*t:WnilnjZ[V>QkH;;?hJ9=dJE&UOp@ki$LRfH%Cg_Zs$U/
+ HH@s8a(J*Y5#Dh%]#oJAa[_T.^h_*Pp,0IA0P["Mf$oOMRBhnNZC'^sqSX\FfKG.`6]OV*!
+ <L7^^'ADZ%Wf<=E'6@D!h9@YF@6ZoeuO,[Rb9i#AeP]_6L)MNlipeZm=*&KKC=V_hHA6rS3
+ ?QUaIOHP4-GI<6f7r^9?]u/WqT$6ftGk2,bH+7o#^:me+\:Mjt3=D='o[#"'F&ORAfI4cN%
+ YgmZ(4L^'8jZMmL5'6n&J[i?2NEZ`SOH>8[#AX1Sej!b>[.D<?AOW]oB4QBR2Mt^'i+=L#:
+ 2uGb*A]<BgHo#+sPt(!IK10R54n'2hZlV6$OTN4Y_MA"j-]2?m@KF+%LgqkdIW(\[dNQ5sP
+ FqS\qF*!crD`J)]0>6q62#;q0<i[2$Bgq#"9M7thU(Nq#>!R1Ze`lA+bRoh+<1muNACEV:q
+ YT8'VUc@-u_=BWJV!NrT8E^dQE<.kc(A?nb3\uI)&<3`_QcIUg2OqP^P_:opSc6<@RS33dg
+ ChO(^$eX1Ma[l\l,,)8\=t'Y2CC!p[E$1oJ_k`$nZ4J(;bElXM#9+To)j=5TS!h+H=uL>ID
+ V`1)8)dCQYGitI9p(k0oO4%02-%Yaq,gf-/PBM[TYnuD/s;_DGUNn_+TX6'MFZ('3L'q`Wk
+ Gq\"U.e]^d+kQlbHG_gsd#b-<fo$MgWJQ9\[Smp[6.*2)Rr[3GSuac;%>>b#knn5saf03BG
+ ;B1GLXuTGhmcieI'fV:SRAaN-Vl\I:.?<\Q=<RS8%=\4oMMfFCQ&kn;e-j]CX\)XrlII)QQ
+ ]+Oa^3e'c0Qkp-?59'4i24F)PUpLW+(S%*nf=0IKJ#YI_jeN,Xn'VV5cl[XH-CP)+U0[j5I
+ 5=T\!e=#C,DbJOi"\k&bZ*?hn`.J:m&B[8Sbg+YoG_&cdq>$aJf)/?,HR;1+nNrb9D<g<rN
+ @BIg*i2WV:tYDQhV)>N*!u7MI_lWk5Cq\:>NS/g+$_!_H2~>
+Q
+Q q
+317 208.002 7 -7 re W n
+q
+317 208.002 7 -7 re W n
+% Fallback Image: x=317 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 317 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$=\+fd'PoM3<>05Ua9?Vk$WD\0$<ndB#Ji8"'pTt3-q'.B[+2D*2Q4\("OUK>_$CVuZ^
+ 9)]['VBLXDHcQ9<2c]0&6]R\dprLR$[^MpHRR2k004q%*&o63/EV;n`C:P5KC*C7_F,*GOP
+ %s1VS:D1@s80\:5SZDP3s8QS+u:d=?#ad+O8R:XS'<AS0M:q_kT^_>3]$W\U6Y)Kg24IN?,
+ 8\rh.*kRj8QEUFg,*5R1."r%m6bSep^USC2CZ7bS$6ULrNT#Bd9aNc\QpMQKaMj>,ab.8^`
+ jIrdh8P+_r1LfB6*'5La8[W]WhNaD,a;$50BTWnsnN-*t7J-9O6ahOHUXH)r6\gbpNeIl"m
+ r(U=3-'(;<i2X!]u'[@;W-01InKV:4$J$g:A4Y;/_&9XgGW>emTb!]#bIX)d\Y%+^sSo<\u
+ SJ`If10l^'p-l26_)&XeP@($#J=KeZ1EO2Ps4aVG.^*!jHi"G3k:rWGO-Vn`/LVYe+,LHP]
+ be9!5fU9?P@B9FM[fJ>4@/N>'<m(YmfMI(<A5\J(l:X33'.Xj)sG![C/Cj+$"+$d"tQ@QSc
+ #;X<MlQb]PQM%_Ui[+V)=m,6rX=gR&RNK=]^A`<E(q;Hr2&d_!"Jc,Z#q!at6>Zlo8!^oQE
+ .t6gN/2<)%AX;$#((Lg8eD2.'(Lu8^*'Pp/Tj43PZ'=.D:E$1TQXpH0L!WZ?S-]uJ9UZ*2H
+ csVk2EGaHA1;o_4<u1[qf\5mCV=dZFd`MY"L#_:,8DXV1'`7f@04H/`L&@s3RTH7aWVg$cH
+ =727"i4,K[<njS7S/oa0W3TL.Obj3!TY&3lj!>B6*,h"`M5ViEKpVe>uo3p$5ISKSg+r%+g
+ STY_2'!fXFZ:bfm/V,eLWsqK26fAVq?r!h[f++iaHX6sWt7o(1rI(G9Ch9S7\U"nV,9%>^"
+ _Z=WmNa%(QJ1Ips*14hadS8Wh(Fh=k3,U\M3]mI.!BHsB?[;ZS[i7(_O`MupYcJW(4Jq>QD
+ o/ZiWA-jG)OdN)1[VV(c:^Io*\`9Uq1<'d?ZMB!YAk5<Y@Ef_@PF79?4IeGYCGH?:1g2+%D
+ ?#'e\ZK)Dqu-f$PBONM%h9XK8Vn3W:QJXj:'rA)/kVG>P],F.d=28T]tI\r`hgeIg]H7Os!
+ N6q0`8VY~>
+Q
+Q q
+325 208.002 7 -7 re W n
+q
+325 208.002 7 -7 re W n
+% Fallback Image: x=325 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 325 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!TT>=auU'SVTt2Btd";%4,%OFi)2K1-;K8q@H!8/=K[Pa8,n'tSuO@n,Hg(F^Rs.]oM81;
+ sesYQVQSh*W_N;R).FRX**(e_4RmUZIH`>Dr+B_jp>C55S]6rIA\FkN=3'P21#"j61t]rq6
+ e.^Z+V55EMA(m@Bg3l1"o2gP_pU]RGk#a8<qiZal]5=_VejPeZpNr;Jic]YLd^IH9neE/V^
+ +oD.?4H[S%Z[KkedCMRqU(:(76mbMY7Rr`^5I9^#4TD.f`?,,7nng3#D4<a;2na)MkX;Td$
+ _._%i8qhr"hQd:i&#,]sO!!E*(D"X6T###+8d^k9K>B7.jH1\-/7.,?I612o_!TliDYAb=h
+ 2V=+Oe%L)lS2m=X\tVaTtnIV<NC)s!(ooSl'&_9^9t*rE>ja\q\E8:,!?qs=(:1-<:rnZ7i
+ S4u@5d0*7;3S:e(P.q%cjhK7SD*E:S6(W84iqD3aJud/T(4JqG!I?3c%?0[FEROikg95mDk
+ 9nq9^FtCh>$FX^`mL.;)ACOrb9hIJ\!Z1*/Q>b#qD.LD,OVa&Q7kAJ>q*0+WgKA+O;#7:FW
+ ?3<R@:^1/B4]+Ye[SstY4,*\GSq/[pJ;D)%KVKo4.d^2)RS/lnj%)u1O?5rp4]]bDeV8b%9
+ r=@OMV0%21;oM+orVX3E0t<T)'c"5t!>Z'//3uf4`f3(VGH;]?C2%W@k04"krT$Nf.h_&2U
+ 'U*eHTUNXnDoG9@cpLR9F(osNFr_ep@@eEpMYqFO<Mlk_TeQpo1&(*+94ED`6uOnNZ^%ggc
+ o46`=U[oo(1%r5$`n"/PWmu.B'80=`Y:\:f`>BkHT@mQ7kaA..m?]QXk%'=[>>U\59>rP9Y
+ bnmaqlHT`Kk$&sun4auE1detZrC?'<kRJ,_!n;&XK=O<b-&k/.EO1.2&b)4@H5)h]1FFNk8
+ raC%Q159KFcfX")BQ$LY!*E?#_"n1.kHUp%3@b`6pohuYXk`(S@NZD$kV+]eN7kn!\QqT2'
+ NQK[2@YCqSA1B.s`ekLo?2R1]iljta0oN,6+g510YcuUEA#Y!/pbci_eJs6@Vr[]7iYBb0P
+ M"s:+tt]k=C`Kq^XUbVAg;B#UdTsV;4J?sr7*<DY>3QR@?IOJ$lf)c5.l5$0W=k[[9A?DV+
+ _k4B71"ZVC$c~>
+Q
+Q q
+334 208.002 7 -7 re W n
+q
+334 208.002 7 -7 re W n
+% Fallback Image: x=334 y=152 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 334 200.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gatm:=\)Oi'K&Ud*"X'[,0cg[W5oB3e0IUR;KDVQTH]8lBW_l@EhJYe+N..t&0YjJqM:$kM.
+ S?!as8?4S;/)h<bq<&Hf$^?4`dsDmQ5XKFnSsbSHhim*^>C9M1WU]M%YfKO:[+hrd9Z`9Fg
+ HZ2gU(^Z]05(k>)KqTs"utSS2lj6WY(uU(l>7ZdIZK"S;,eOOVe<okQ[7+F*ZXnE:I%gjkf
+ \_OR-4gjTJ5dFa8!mr7G"/mhXuodW9q'j>Bgfp#A,is3;G_7b1D/X86n!>V&m/'NbY)+Vm8
+ ks7al.*TcJ_1N*-]bT78e'Qld1c+n$r&KXlE;2,]UW3o]L8e)dk3^o_VId0CiU0u^Ag0D[5
+ !EIqG#i:%LhrE/V0:Rj:UkKQa,Z#%A]k3LQKVHq+93uFkjB50ED1i[qA1q(E96i_q"b_$Sf
+ g6>HhLk'3k2a.B$JbnNq@Em<M@-5bXjNgooGir.-'o3]R5S,EhoO?dj@)\\T9K<Nh5/4$ZP
+ ejmba@0rq6dA*>fgIZIRMUq!^QRiVI[2(ZX!o3M=/Q\@H%f$s6Wq#n@<Zacj5Z;'q+Al&bG
+ GTjDX[/1m^oqtK-p)4@%.cU9[(pA^QJmBLgd@UjE=#]b!+o-QYMPYV3*o9:\CFMs%O=MJ1`
+ PEJaCL:;+$&k^/!S!q4>%PBA9\Pe[\g4d1%4FJ^QckNTTck=Qp(GB=_%NH$CM\\mUdqKe1N
+ Fo'7]QnP'bEn.Re#0#coI=En*&PZIjOVl'"a'/PG411#^DN@:['eGqK$:UEbaEEjK"JYUhU
+ /)XIie(9UT"Rem99DW+g6`<f8uFNj1K,lW8aso"*Lp6R/&<Q)qg7(K1mI.P*7,i8CLJ.`dU
+ S]k&<V;*&hGRHHNjq-&Hq5FNj[6o]ad;mV)9.;3I(d;8=bb=%bp1<EUcZB41/_.9!HiTeK\
+ Rai<"HnuG&[IZt5]9Tqk6MB54fmhu\>`dU$3$;O:5[VZ9[`mU\m/T-lVer@*VC_WL_!MaSX
+ )FQu$mp:h_G+7*O`dSomX=T4fc(!h+B3$Qi/G<IU4?V]#eDM!(kHA.NlRU1@G"=+2IP_?a,
+ B_hV/Y6T*io71N"8r(MS38.1]X6$Kk5p6,(`n\h>Hi%<KK8LohHiA->ISS2K_TEM<lDpaj$
+ lm`#hW[Z+L=_mO=OD>bcb?HUdPiM^G<`f+%JYL6/^/;W)QFM?+;"_*>m-u,4g]Kj&JG/d$]
+ !i+^fsYNqaCiR5?bA/MKAe-bXs2iI%nN~>
+Q
+Q q
+108 171.002 7 -7 re W n
+q
+108 171.002 7 -7 re W n
+% Fallback Image: x=108 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 108 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!$EGt_.>'ZN]P.RZ_@"fr*]6r[Ec#uMArQ5JYJ(q7G;7)^"i(eos9UbDrZ(+@'1%0BI!=_
+ +b`Z79A-Lb+7RQ3#-)ACq6#LR+c5SZd;pSOZ2;R:cGcS+!Q4F+<Z8F1u^%^O2Gjaj\]V()D
+ RTm-Hq%olJ1Q]/A<mAL'XVEk*&!SQ;ekX8DPWS[,&eV5Qp.&h3DB)?k^/NfH:=(5-_A]^Wj
+ -9t@gZ,1/&tL"P$]>2!7d44_kJ->V.H.@9qol-k62p[Yu1?[I*2H[*37I$m@")p)O6c?Nfm
+ lml.D?b\5cp<LF"\+nq"lI]4SB3i0^q`UE#\8`bb_M,@\-^,&_k3h%En*\J@FsaH7#'7V4"
+ F#&<Stq%q]+LQZi^Cf^o/TmU8cf+LbKJ"<9lFqZQWs%A8aaim)<]9g3-OK1W%D5j2f)n"6&
+ *+Mdj&.(,@"M!2f4H-]K+]j/S<%`UdKpcc^_hN8fg.ll^>cu#(Fk?qS;&(4a;K=+rG[Eeuo
+ Ti]@N<80c#nZCfuRX;on7STki54X]pQ"7;UbHFRW\h`J]HEn!Afa_G9BN"u:I5GdsT[=N9B
+ XrVZnkSfi)Z>_8:q&$i\E`lcFpp9V%3=M-V4aV)61fYJ_U`<u*A*]S[4r8?anmAU"\CFbf8
+ V9sBc<M@?r;,P3b[ulX])@[8?U.'N1W\;J@#!R`mSGQMpitZB#8";TcbNhN?34=$3<ha,8o
+ (9jg?Xk>=+4JZr&H:qC81'?2BPYdr\<(,cVG[k*>?_6'&8A%;_%h)A.G,,d[_JG.f'@GAMh
+ .1[k5>._i*]Y>DV$MroYnt<31/ru/M6LS84CbrmB8-JOotnE#mAmEdb-W<2E$IU1G_$PME8
+ U1eT#TG>IRr,hiD9B;CjmkEY0I*hG?f_%HZX<f`O<97RjhC`Rm@71,:XCp!mZmF[#Bl-''.
+ G*^:.piNbG409o-Vqc[/-/7",ALXYLDJP2+7Bm`%sO=V(9TMgVaI30('J+AU?1Gk#J$e*,8
+ LZE3BfchB,//.SF8&m!^\2Ge8PefW>IWtEtoX8TfH[@N3@29a*LaH"*L!kX-2p\(h3bWTCP
+ ESS<IHI3I6_5,56A[cR.PU;KD:+n9.7]Dk)?"Dg%,%LSn-XDmBl/i/#<=adgM@c;XbqQqg;
+ u)n__\M=3YZNnT3qHmH,eOD(a-'?mom++Q@RpKAEnD%KHV1EK=/F.$0+@q_!8i)m<q]'bln
+ 88ZJ"GH@d'MMK]%XS4Zju@(1oPC&<&3PnaZFsqWV^A"csBC*9Y-<6p`RsU>4Ou[r*LV\8NG
+ t?PO7GCKVOl`Wl`'*+j<(q8o86oQp!=frn6%B4dluk[2PBUL4oI9Nc+FO'I]!"Chi5btfZ>
+ >SGA"8BA2Sp`(-)0jDY,&afMBC#h.K;RK(A22R0W;4(rb@>;[`b-u<ZC@fO#^:pb=RYI?&M
+ MMP^D56TOBZSK=A/eOJbTl.hJ5kR]oiYE^,pu%sPu)lu#/9X^)b,p7A5jQCm?,N+JHIXZ$/
+ t32^CWbLD1Cm1\JDi[;6'qd8sN*$=^=b#9.C)\K+!-\5KtFj9/+o?j<P!lNTO#N[<RM"rkn
+ bGs-**pO_75E~>
+Q
+Q q
+117 171.002 7 -7 re W n
+q
+117 171.002 7 -7 re W n
+% Fallback Image: x=117 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 117 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!;bCIjXd)"-O?bfh8*:!G*7N.`eh8bsg/+u6)>kpcrbAlKHVOgfGU]VX**ZtO3W<G#acD(
+ __E9Pp2penXfB3d':phD\Ms%1]"7QMJkEo0^96c?#TK^<c\JrVSZ'a.Q&$PY)n6iqe7YH@\
+ ?,j2j9NRG]T^/'lPF(CD*f^]#RBW+p+g"p_-O*S&\OM2B*mQh/OqkFOi+kO8HKfWgk&`Q==
+ 6J,inP&HCb/U9LlebY3.L#F2j-]H#gM:RlZMkYUueI1LaRd^F'A\3C_XWJhiZR(IOHI!qV-
+ 4j#j1Xun.ITXE<PZf'9.][Nd"I!m+'gmRNsT"K%f_p+2"lC,(g"+pq^f46g!b[O<#[V_GEG
+ Cu2#)#-VGh(m[(X=O[Kc3k+o+$L)Z$#A,14#t8A3lX3?`7itdg=[(V3B5qYB!LLdk07%Up)
+ n[8f<88OUjV-?L:Y!rb^GJ1?XLLH9MZI1]Ct%+n%P^_D&\sK.ot$!Xm&ke1eZ#j,teMW9:+
+ M@[`0lL5_%AA]ng`D9M?Irh,IWAdbdi3rmBTZ;HbQnbCf-tVbX(8H=D5cKuHc-oC,2,_WK/
+ TSMuTPI,Vr3AnI0`(Lp2!\oj).mk;1kV(s9jZ*:I-WbP50VD8\ToY<0*,pgudpL"LW--"4?
+ WhM$r6"7VL@:FgUELkjm[WaksT)&2I6q2XNc#*LMTi[p)+!.:7j.Lsh(0+XG%>uOHEJ&E'+
+ N24#?9Lkt@1fqU_%^K[;jrtObc4YL/hR[I]XVV"<%o/f"b[TSduKDbRITae^q^JW;ShN@@^
+ $rmJ/l^OAHQOt#U^rY42W*n#-+>Rab8U2^-3spBsiW&5pXk\V,trMn1S%f3H+tY6L&PtUs+
+ qRbRC1qB+ih"cg^Kl?A]sO5%\F@*WkUZJe0.D:PDRBr_J4FM8>Qu(<jer`XE(Le)AU+[<a(
+ ucH^F.4*u<BR(dtDV!H7L&a.84rs&H.2_g/Bl]s,\?F^[t7_n&5f-B5t+K<jb9V@"6S!uKT
+ C76F]Bj)F\M<r-/.(;e#g&e6X[cAJore<n+]mQf,s1UuU=*Jg+f[sTqFLk>W>-1]q2)TN)q
+ GbXMMaKkZrQpZL$1?@(TsluW&%Vln$`*m-6B?\WN<^67PJb)In@V(9HlF/gm[(M-CW`MK"D
+ ALDX&i^c>]$^G$\\Ss',2B]-Q?hJ1`@@]p?is4!P0@@U.5g"NuUGGJ)PEF[bC7kX[[ps@cQ
+ @6W<:+Gp[kFE,Qn-6gEFA-K7[hf.Y?THZV^s:.-L3l9^&*&!d&[?U91-kjZGV:>SaHLQGo"
+ T8)sFKdaV7/Wp#G;hnRKt).#Xil9umFXEsLEW+IdcR'!ctXLFn>i0g24^h'bkNl=ctKg7nR
+ f,pU&A"abXR2n*ML[?JmAS#GB<2p056=s(hE99AJ4PbOS?n)H"XiICX)UaS)_O:Gc[(.r@!
+ CA@Obl~>
+Q
+Q q
+125 171.002 7 -7 re W n
+q
+125 171.002 7 -7 re W n
+% Fallback Image: x=125 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 125 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!;bCIjXd(bQ->PfbQ%d`hPrAjli.PR7bTU4P#iUO*P]APj..p;<0-jD%GrflErM=.,cDRW
+ I=@0.G/6c:V`uH#):!?0>d:Xr\7j5!Pfs^Zt;B50eAtF5HA6TD(ACrr)j<]hM4)\Qnb"D/E
+ <SND0%'/PRN,>Cs$k$.d^=Anl@,RYm$X.k?T(,@os5r;7`K-fb&Gl/g)$J,e,5cR,8D@0p8
+ 23@"7h9+)$H\99Hrao(f/q++j7R9;,*AHrC8S36W,n6s_94`T5c7rR0R5VO):=0Yu=-LBT[
+ Gjo,3n`(`FiU_i9];NY"]6a/#l-muPmsj]ibObGiX^99Dnp7NTeH8Un8\g:OfD&QgDo(S\L
+ ]k*59:#ufXJmp5.hlQ7EHuYPg;SsU5d4s$q"!P%A]qT$DIH2)Ea2kj^^TACh;';<4<A@ln9
+ !R%2h$5EBXCZg5V86>"pW/m]#mWFC8um3cO().ET@DVZPP2#F`\%7E4@]B*n/u;%+a4EQtJ
+ 'WGh:%dC@0_f#7dP:\an_YrMl*H`koU?_*Kht:ORXY6,AnS0AkU"SUBc@J,O\0B?Zc2\$67
+ -2=&i;RC!hf#[dl.9KP<UMOYq53g=^WAq`cTT9n/1;.1Fc-8Q1>[UKllq%+G>`ns!ugU;He
+ (PaVFJ-\G-@A[75@ifQn#'kh`$JB5$[8j3menE&m8'/um4[$K<N@e^Qb(PGl^d-<(]b)brE
+ gA8mG.Oe-Q$N(>AE08>9>l]&nN1rhG,<U69gqK6%1NDVD.?$[R2MVNgtRaW5l@Qjda=g#f<
+ )s1]?\\-O2?i,TaE2&["0JI'qZ*P;(702d-JqdA")b#$ED))+tcq8&-*k>Dd7L10JMk[BU"
+ m$D:sr0@;]tFSt8`$lps9`Y)pX!S<QG2O;Ch,Cr)&VYPrhNnJhD<k@o"#aXKMNI5M$>Lk9R
+ V&*,XmeJ33smHuqn0^S0oCi!cc<k#03BKq''&8Q&,T/D*^gW9aP3NfOK<pV,WVKsZo1Xst*
+ ?!#WU?=&tf/*HHLm&1Lk6+`*Y&'iHT5!Gn`Hq'Zu%\\'rf'7B=MKr*f9r='PIV?#[UB.o',
+ g*i@"1jrr*!3u_]AQs:@q&ieT^?Z3JRV?;)h]ujAi#GOq-[h_)@(*_qgsmF*2;#c+b4a]%1
+ \+-kYs$[7gI6Im/S%(JU'@o%$Ltu^p4m9^FtG$6F4^Kf`JW.OE0V#;Ls0_hqjBY=T;H+o"Z
+ %%&3c9k'SM.TZjFP$@$kV?,f+N<?bm\@\uI5:HSLj;\SsiTr]C4W#cYVMaP1g(9dYZ!`eZ\
+ 8K$.d\-;_KgQGpl',48:,-rt0C5jJ37Rh8as7Rjpb=<8Op."stfpU.H*"O9KA@`t15OA<4[
+ Rp6GD1*AIX$uq^EL?UC]c&bkr<ngJWX]6bT1maLPs7h(q4.9WtQB-%])%?<$;8&P0j3SA"6
+ &X3ia8?I.+3VqCCB~>
+Q
+Q q
+134 171.002 7 -7 re W n
+q
+134 171.002 7 -7 re W n
+% Fallback Image: x=134 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 134 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<KIlPr'*l(#3_dEmeQk7X_CK8H>?*`.*8XURK>.[Lp'@$@#q(6>lB5NEWZQW,_[Sc$tkP
+ Rk*go@LE.+[h?7o;[.OA*PG@qOTlR@Ru'20[C7hOjOf?I/A,muQ)`rI'1Pml/&^m8>>Zqt`
+ d"h0RT%2V?G5d+nPlZ*BAIcr8EcY=mJbS8W+'-YP`rWo>+3Xg]d_G?o+c[]ZmM^4,#*e\Q%
+ Q*k&L@C2\UUeb*BjE4K('PC6Y<g%"=)fAbh[%NfTHE4u_j^<@'9o8bBj:!22_1!_Y>kF&"f
+ IE,]8GB8]:`a&l.e--'I%j#Nm%r[JbBh:q.PFmn'dP,k\(#c'uCj+@#4VtcDb-l+8Ed#dak
+ f6sN*,QX=Lj9uX@A[MNR7@qX,'`f'juVl\F`I64_kWC6WqQ2%&erieQM1:=b8TO"M@(>E;c
+ H``rr&+oG*T`=G+RMoWRa7_[L<O#j6g@:lt)\bZ#<Xn61al)[HnQFCbOMHU"nJ;b0Q+j&op
+ ,YiBLgQaQ5Bk?,ad"WN#[]._WNR*??re3$amf";sYr2TTpj.p(as.s]GpQ,<meRX=u*GLks
+ 4gi1&1USDa>B&`<74$#4BpeG0jc0a:k*;7A-]*n#mGXf.##!Vp_EUQ_]f970'30:=gC1d^u
+ %OS?#cSdL0F`k[<fuE.1.kSHlf_Fgi4cS/4lff:%Dso,.^RfQ.U9EHe2RZ-KR)'J$0+ulf:
+ i24ReQAQL?&?OI[3DBE>;H\I93aB)q8\Sd=]t]Nroib(;toaq/lkXV%#f=QIp^67jdiLNJ<
+ OLCqZQcH&#k=HZuTsh<uIr4N>_#$,$e[B*"Q6c^b^*ooBr2#&P70R98:1GGi%%"*$*Q`MoN
+ eML5#m82[%g1?N_CmE'A6nPeG\!lUiU19DmKT%BD3M&(Zj][d3((6pI2Nl#V0kTBbFA3mZE
+ <omSh]3\$_mf'!j*80jdp)=IDtE4WJ//=3h+50P4BAXMYV?+69t%2DU;cpQ+gcr2:UX"Dil
+ !!Y*:GpnHeX[t^'[mi(CprUD>XE8nt-%$sL/E`Xtf2a13AcL^WXSpNW<q3WHcIlp>(_Ht[d
+ /6\`l(FC*`9rVL\fJ/*2WI?H3o2U;e%$XPjls6)ZFeZV&6_g9=rE/:!g0rF$M-OI)png>FC
+ PIm+e_=[>#7LN,%K,`n(T#",H=k,raq,m%.jW>M%KeH)Wi9#E<s,OU]&pZf,9k+U.-rg9gd
+ r/,fPk,"G7/.0,)iNJaQX6%_TbqFOq'e_Roi"3>%Y_U[:5ndKLAuM<aW?pq1^r$NcKj_/_[
+ qM3!g["u+'\#CNAA0td1"o4QY*bMfRK-^54c1,ugAVr!$\_]THQ'?2J7%O$NE/D!?XI$un/
+ 3/oUX-P!7&4tn,j0XQRo[78]FCI9A!QS5&1CU(6c2OZG^i?i)=]J;2Ul>)=!"Ng4B#Y;*c(
+ 9aM@/Jpf9k1i/O94#cbheVCE*m94'po-+"oaK0<_8D&Tf".*4/Iq_mc?5?'ggku=5HdQhP6
+ b%qZSlMp?WXmt/mc.ZipAau(d%adq8,'RnrXNORaO%epHrR@e5XUU4t[<6QTAqb18Z_h;^L
+ .$q!=;Q2_27+92obbTn1_C7)!f%1kHr(3%YdL'YV164KN8:g?)uq/r&!q"cK3b=tB7;'KQp
+ GR=n@1Y$iXhjV5"ZW[g"^!9[&`2Hu<8Y,JK-4QlS;?8Kddd,#74<H.LSKSRIjSR>q0L5$%`
+ ]d4\VWn8):/EoS1Bb@70QQi-f8lt6"k]GIa#m(/N,mDScKn]fAHWS[T#BiZFUnp@j.!U)kK
+ */3[OKUR)i-\GL.r@,$Tb;#&e60ASOKh,_C:mrZHHF;:gt^idpE;F1:7Zu0Qf."#9lj#<jQ
+ &Qm!X&a\Nt8b3_YSEG2f0<>F@<X0WG!2[7%Lbs9Ns6KXj)Q<XIZi,Q.juFLBmVO6UV'QVCK
+ K$BmIrSPJR(db(+I]%NGIU?eDdr2S7,&SJH@(,$d%#)FmK-8Oqp=UWo%P\li[dH'c"93++B
+ mV)]e(U8+!Ye^nT*nW.3k5[kp*74AneAqU,1nnme&5;pJ;DK$M_f\naIrN6bTcP\rcd69c$
+ c9kD>E&\CB"3JY]:]O3as8<(?WXB1X0+Tfo+oN(B\#3=5c/QjEO.KOXI!R&)8TNmuA$JtQP
+ @&a$-96&IZEk]=+3pC-Z81A0Pr5GDE;SR]4YZutj"NBgCn/mM"`)_QC'<Mk)9eZoI\:3W?Q
+ Uma*aZ]XpZ.2%:&I3SnG.-MnNtpP^UeBH)]Sf^`YU<-qBs$tiN?GB+LlLmVtFs>`_d*~>
+Q
+Q q
+143 171.002 7 -7 re W n
+q
+143 171.002 7 -7 re W n
+% Fallback Image: x=143 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 143 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<MHVdX2'ZTm1"NUZJH%]-F#R*Xe!O^IGU4?DOK/5!c5mtC4=95O[8>mp\O""NiTN+HXYc
+ )u$U81*V>I?.e/$2XEJnRFr#'l#],ihBh:RYu+[F>/foD@_;Ic#?FG5'i"_#JGR7n9DbDY7
+ 8Fnt<8XIXQXrV+[@:27Lni>JIc!Ek:[2=i9@L`pZP>N*qL+\:fGdYo(Gn6"BB6X8QmPUB:V
+ \aY0I<f&Odi7&&E&gVr^Q(PT_IdEuSNKu[83q_VQB':Q=I8Zmo?d/=-k74#"CSrJ[pf`e&\
+ /SJro95?+.l#1K!:R4.mgm".,]kPqS!l<ROb>0]r>e4</_48KtZQ`:qA)lH;M=oST`-J1($
+ /R,1^;B6i&VY9m:kiGdTFi9nS=e^5o?[HjF%oop=0#DhLP-Z=o?3U=.%2'Zfeq_ODUo/mK.
+ EM`N<m%^+1NVmGt&d@(0KqlO3)(G(`.DlUQ;YBVn`1BSu`bK]^tgJ/VahdVkd;*s*f64n6m
+ E29\6`dS_oF6:L:me$=obcZ.,XiNW"lSgsqg1o8cS;Nlb9u;%:-\>q[ViW2q!(l7u-V)]?I
+ jBWJ)AR[$mdEFW-Jclk?W[)i?<C]o.O4`_L=B@(Efb[Z#Ac:j;('qh58_ZQ)U`5Gp(a_<t\
+ #1)i8_h[Br._34\`f9Dt\t=k;C:;'I"c")Unoh88,8j@:/FpHQ\gc]p$#che&M7q'<R_M%^
+ qnW-bEjap-R@P.EWg`Qgq<HW^Y_.VX&KSc]o1jOj_)Ln1J5O8Ap_`t[,\?#-I&G1GGgn"a;
+ kr^e;k"$`=]3=M>$iecNP]6UFrBR[%9=:Z%JU<A'^a7-gT8s=^U'*GB[7kXa!XhYnc$fqQ(
+ ;j`@PM3qpW<%U"\j(NsQm#CB3B&4sql33G+n%6qKep[sO%ecdrW`^FtpEnC93g*nTXU17<0
+ -\Dt2eMqO^EIQ)&ob_.C2Zk1M[?UgRge]f9?7bHe$,LnZ8na-sY,LJW9BNG%DOkJaLMN7Q!
+ BZFDt-;C`[#C\C)QuF4$?bFoR2k$'KAp[pWeQEDdZOM2s+H!oO[3ZG]g9nDk.epFoYCA.s6
+ iW[8nD^0q$g'H=#QYV6@p^TJ:+,4;PLI7AC+?d<-1+A]6mF0B))Hl8F%MiKBp_19;2/PefT
+ ADBF'ch?8@[`H)ej=?=5?D'O8NH_mTU9k"jnGLU.26+aCN`D,HW@Jb0Ya[s%[0h!K;%E^H7
+ NP#L[0Z*cQoL2h</6'=]2*ncY:UJ2.h6Kh2JU9lji-1>tpAa/.U7[('aA8N;qKcO2h1&Ifn
+ 0'?7J##mIb:T;+ia1T_=MjuGm>[n[0K3T*X0TjD^eG@\DFfpnING8H[BNJtgnV,:Ff:9\7b
+ 7WHP@-_E=j^2_C'>-9\3dJi,/BJ^C:cRKYlILQ"kT<D4,VCP]N;#'mcG`GBX[_eIsAjP\*P
+ HeXR`c-dt1cBEd9!CpmIug>89&8;4I=6k>$""q]gqF6Bc#BCVQ^jiX$e9L3lR#EUYcZHA1l
+ VYr4u%?<P-3ateIHa@c`+MF0[7l`R^/-gldqi*",;OW,g0`Fe-+=POIr_;($ZS>lCFL</EX
+ GW6V"W4;3]p"),$L,ZIH-^j";qq'VsV+VuPfk]iY[p/Kg0L8B*6]X+Tt`fXDCBXb4+?"s+:
+ %foC,U>,J.MR]`rl]`^uoQ.gtp[@9!:AI9tn#TG\;rr#Yj!VQ-4gH-R(E"FKLTs,)+;^!Ut
+ JqLno)dK<)>b"d=G,#NefjrZT'3I<M.sT>h'_qGg8-hURK1H-#&&Yr!J@fY^Sj%j,V[Uo-\
+ eWetJYc#Uh]I6DBmlj.4^I.jgu6kUL.l">jX-V^226^5!!j$f[;04*2TX0%[#J:,5+XlfUI
+ QIf)2(<f#[l=@#RlC^DeeJ3.0F2'ApY'5nesc*s+R*>&5LOB;ka8'I(mE0)[e`O_QdUtei"
+ Zh^Xf6XY^8;S-,Gm!L4)F/`(KD(^1-n"c^+eEKEXuc(A8]`&gqZ*"d+oO0j;qkSdm,C)"-$
+ @:9_/Bb0$Be(lF4/i'GH+J]nPIhR(\daj3A3dTp)RN24HdYf'+<6:#Ll6&ZR9iW[,5d*jco
+ =f[7=&]"DhfXt0u\2efs+$CV4mEtVk;"raDp2h`iE_hOU\:apJTbo@p6p$.]9D?1BIfeJ(I
+ +/~>
+Q
+Q q
+152 171.002 7 -7 re W n
+q
+152 171.002 7 -7 re W n
+% Fallback Image: x=152 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 152 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<LGu0^V)M_*(G/B](83mE5WZY,lMZn3aCKXP'Y[UlL7AFN&<s5M(Jk?VPdAoMuB[Hl6\O
+ )4+_DMUa[TA^4%b)\1#`=/R&jl<R]dM7E5b7o31XCH4be2j)rQ]c8R02sQ)uP8<QVC1;Cj(
+ #>D:b=?c`4":rpW8olW-qeFlVSqFbR6i9CMY\\E8:;G?V0,DQg#*]QNOCF`gb[:!^M"gr@@
+ -p3*E#TPj1Ir:oH]B5:sdX-h,RIJYL;m:'qeIX0E!gq\PFre[WS9L%h@Ng%1+rsji6g:71:
+ QE]p#4";,,gL#>J-T\j<fWceM-'PN>X./u))qdeS2a]s9D;87QkP*5i2.*u*Ai]Z,[K$/d>
+ m/%l@?4+q_^9A\.,1\RV4ece!>ehI(V74c?FR'g0T`\R96F4`_jm6R=0MUn)1T+X/?CZNTZ
+ G%2_D;#KMnPl%CtiM5*CMt,8B]^P4#P!#o6@-4Gd7eWm#mV;Y-(iRI'=C,IW&iRT@W#]L@f
+ RmE&B'-P+14Z"kN58ehCc!JrLC+oa3hRMPd'dHkg63&S"S^Yd2SrEr+)-n,(qQfu_?so($b
+ SKd.i-k)o(L]O[)po4u,=njZ/@^5GYHS@Jla4LaU0HY[1PONWuR/#RC=bR)i`\DNC>7^Ke<
+ Cfq(8?Hm$?.<i!u]aYE[*`(TSna\"#_1UW_hJ>/k!jCG3.p\2TR-rT"$mZp6-0AC)7LSj-R
+ cT4.:WSAS[FZd&CsLce.1=p-HR'Y.R</E-5[0_"E`1^E(`jarp"/ALpE,pK@keI!oN7_Ba#
+ Vot`)eJBM,ZMP[F%hJ1j6glCG`?*kjOA)Y!27:?*]l<moWU\7HHdM/"X@H,Z6RZGeA#KpJp
+ OC?]&`+B;T<gmu=X^fP2DjV3ATGFNXf0)'R9^$],=1>(seI7j?2:J*"9?E``D?9MlW'_&.s
+ F*upM<,jK">=#<*)_WcDl[J"?OhC7>MVY.Z2C>(/n@N/3."hi>QY;(?:#\-/:G1O7`DfgkF
+ )3so8oJ_+lZZC$X5&(mnNCinmKj:cu^670..8'L%e;e>7?K_'2R'rE/A?F^6#L2gb`"jrCd
+ m/Mo9OarR:-8#P&"S:pj-8@-'4T`P:Mfkcmr6O9A/5FOL5^dBe7"@9]+j(?5UCU;HRn``.J
+ b(>a@J.I+l_L(>`>]L;&R@hh4BCjFOAI"jLpY:fGO;>1+Uj.+#SFrIPsPh$rJ+T&Wr<2,ZE
+ p%5q;^?bOKf>UO$1"o4Xn]^G$=`KS'%p;(&Nb:D<BE#kd3N@P%W&VpRtD#3Z4s<a8!\:JK5
+ 86e&/nGjfcQ2>T!`%F,r6k8`LM-H$sR_>m%A%HAcKO9-Te1q;L*BET]\&-e(!>T0lrN:`?(
+ m[fTc!q-hNFL]$Tnn\/f_kTMH@s6Fe(0$lfmY!JinCILiL'CLKdGgW5nSBcPCYa85N7"A)?
+ JAu[pc.2113760[(X0"d]E6;OsiA3dV#[iJYe$3/>VJ8[7FbY.dB)OR4-V7'UfpG4tmeVEY
+ 4"\:1e,FlgDl@H=1+\Ao;5u)M47jW2WX+T98LIQ[4*325A8&.8h0\M$?O0b=j,&[5B36H4m
+ 67bgA`Mq'KfjMY'+a`M5rMfa1"($o=4XCc7ND6:qT<KIB'*<`1?=UTMlgb=P+@/2NE]clgG
+ Q[,h)[b/K:'rr1'-6csu^\9f$rSBmg9mcoC]$HUJGfN8Ch#%qR&2?lO+>[Ku9)`L/`%3/JO
+ >>!;,)&k)CD8F6t%NL#JVr@JpW36H]D=u<(!EZG>acjMNWm#?u0Rl8gR*4Vi75RBGM=.l7<
+ 6Bl^M-upC`6)!:kQlWd^gKEB.cArZ<A6Hp_q`tG$Cm1XHhXPaX&jqe4a^on?+`F1D8EQQ]h
+ rF9q:HlA^>1"'ZD@nuJPLuk4&qK`YurUp*hHeXC4aZ'Ll@"k0U6q>3`rcs>ZOBs//L8t).1
+ *kfYQ]-B),XNm7'=GkHAtC]DY+UjTPYcY\b=I6pPcJ'Gmf.KDK8!L3)N#/e4VM<)X/6L!Mr
+ 8T_4K@^3mNdW3>BW3rWH(!^>R[pf+UT=L!!!KSQW)*"rG=ktkCb1U"VZ<j8e>EcN9a>F#6`
+ EB'C4:5YNss4;5Frr0eI0;lV#O"c>%A&hL\KP@FVN!q[e"tj/2r-Xd<Y&<q?id1Z4N-HP!K
+ 7In5rdK+^6?OQ#T1_3#iocj6N]LGi:61(OOnJArE@%d.#6_g:k)JZEbrUK,a74YNO*l!~>
+Q
+Q q
+160 171.002 7 -7 re W n
+q
+160 171.002 7 -7 re W n
+% Fallback Image: x=160 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 160 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<LCK+5F(5>$TJOI@D+Bi_XVB\dh!0pE':n^p0MW/TU<`_utXeK&=:q9"2-qHc<>n.4L*E
+ +Vf!htua6r6;5>0rClTLC%^+:J;]EX<mJ_V)7?X/lug2?00=r5a3Y]AMt]cT,>4I`J(CB?t
+ mmRcLqqrENLY;,QkZXK:g3p]%s,G-A-_mbIIbl-3G\b%X[<*NMD1.7GW\Z0Q+(<DR,bIigo
+ +CUNeFq<cr0g"G!;j3(qA8pBXsmc0?]D@rGq(m,UKQb>!teb;n?DoOVhf;@U4`gtp&=hH&f
+ ,V0B&f>Q\7EH-,(=V$FK2$sLM=]SR(.?RjN$B%5;o)8J]qtPQtl':Y@DP-6\?#PP:(Si2.(
+ F2e-8rB\=Y_W8AT$,N<rhA?/DhZ%I#mp@&;U*;(Y@fJKN@ba!$J)DI/mEL(i0!1"hCcMjbU
+ G9&HNXZ;Aks$(PSD:O969h(LL?7obNlgU5E9h;-K[7"`[*Qnoi:[9"'6]l$NgM2l03JHs+\
+ J>GFQM$+If_QQ=mi^:JVX3PQ$D+G`pO&L]8bfB0eeueVK#CBk]QrPDT^L;Fs[PDf'>A.;?r
+ L]b)?I$i.ZWj.O<f(n4Np/L+;"*#"^)dWrkWk6&ok(u)eGSF`YB$Q!+T$)uRjqeg:(-?M1'
+ kYs$Xo$Gj`>r=LAKnX_K;i<SOc?!@&TB!GP[H?pi],!-HbTh>rr.X[K^KLImQJ[.,*]bs%Y
+ j(kqI4YU+Qn\%!iIjZf:KBT-hY5rZXPu_:OV8PJ`&UKBmG\%%Pd=q\H+FsT&sk_T,@Hc2RN
+ E5HKhAkuEgEdY$N9Tl<fX9ZH@JT2OBes?l0-6hTqUGJY-,coeX\6>N&ZpdrQ4JQmr,YjmDI
+ (f0s.f/STLA>2n`?A2qc4<R^_7sMQjr<WAV6^SIKct5rgVal1O]0$+3r"4P\Q^F8`Xbho+S
+ fXHH!AUP%nD/S1R;Rl8P90;bs!!sjt8["MEjBQkk^s67@b$2NT@[F4Mj>@j1P[uZuJ`5);g
+ c#c],=(_ic-bXRPgh$LTqrF$.T=Zk^c8Bmg,icY47-9m7,[artl:/DHmER.P5"@Cnbl;_P/
+ UA*S5f\J8c6Wu:O:#&elp_?]9M4K3L=tXe.FFLpoe`V?N`C:$i'rTo8\$'[As8o+BlqS@Ql
+ UI(GFqZGGbk$DUi?liA4:e^7#.-Bm1cLl5*%Pj8.D1jitm'jN`5nKA0t/VOWLkiO>_G0_dB
+ Ylce)dTK]q[)a\1.N8-aHI3SUZ-2suPEjhU4@VK8nS4."?4a,jMnoPmS$As#Bl&4.d+\8'M
+ RU`Vb+9fffnRA#NfVajHG)eq7g6.5aWU?HBHAET'Sl<tM.R$7KI%9m7LWh-aXL>%BYE3pQQ
+ O5IPo$0%Xs:+P$>kqE.qCl0u/T3o;8\K$'3d!qI]'(8Z2l`K/,BcLqh*0uK(d*>l76d)`2@
+ <K;JB'"&5o_.g=-e.g3qT_k"mg%mn)1$Verd?1HV6Vj(_F1u3SeG?6]er=#2V4BP->"NuJi
+ Zr[ZXiTZ8>s_UR)%S@B'AFYj&Ze&18q:-ZY*_8*\&Fg&dTm9%`N$S1<oG"PK=]aW1_GEcuV
+ 12i%9S2O+bC,RlB<H+2Ra)JC[c2Hl6sF@-:8j$j8LJQu.c?H:sQac.&,M)M*bl>A%fL\!p+
+ &\jAX^`5W^A0ql<&N/p$0GL%u4B:hIhPTb>B@c5M/S6j[XB!66Z*j_=n63iddp+!07GSE3d
+ *uSeV`<<jCnSt>b\iMfj![JE2[LIh?@)WJgKtQZEFl=iXG8fF[#O/nh3:+jj@b'"o>/&eMh
+ n%@bHi,j.\H68N7`eY1OHBRkd3'&fE%q(`JsR:]A<D&?]@,`a@J9pYVKhtQW%;sj@MM&,<u
+ _&ZI:VQ\YmUqJFOV_L\f-SMKu?@jM]k2&KL4=qJI2_1"SaFsYC=%5]5OfIs"pYWqC.!u1`P
+ ;D6ml:fFsSD!FuEU:"NGqDd*cCU^JkPcH#W*eA7\&Q3gH/8:.ZG])uCg6nitSK7J3C,3`a]
+ ?9P.lTr7H/W'O89V[C%gZ+Kc_lQ@T)#l\"BHTsrYCKKneNGKFuu*U6DQ\.K`re?R``9q`7!
+ fS."kK8+qa*RDLDci4!$Rs],~>
+Q
+Q q
+169 171.002 7 -7 re W n
+q
+169 171.002 7 -7 re W n
+% Fallback Image: x=169 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 169 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<LHT9ON*ll$:0f!5o9S8MP,*,-YD:tbMI9[+&.["Q"<M>Fnfpm'8CbFl^:KZ/Y[)jPX`$
+ 8ep\f=n]ANMB!itCI>lX7`f5Nh?WG*[FI3WJR:Gs/o,Ie3BKIdcb"oD/=hi%KAsA[:9]0Dc
+ Y,]BedpC25p"h<V#@HsLpi[p)kW75^./f%0$_glPUH_#=2BVF'^W)qD'eQ#A-%3if<n\D46
+ u\t8fn#G+)JkjDbnQAWX7$47ima4Guu<J?**"9t/43HF/1J%euTVVAT%43sM+:HiQd[(n]B
+ `&&:UjZTLK]oSKUq3;0f<!EN^$Os4tN,6e``(sNPQANTU@b$;K[gsH,G'C^`i/hkePI4tKn
+ cj;uRK(C:VZVof0h7440ZT1Q*bfpOhV:2@ZX^/'eQ"]C+r?SMqtAu&3*TU$l(;Rj$k=o[n[
+ [fGpu@YlBr4qYL2Oj(7h=n)Gd,K^@APU7V4I7<?>'Jr-dh"uMrs/'Ci,(n4E,=Y7)Y:j/EP
+ (g8UGaYe*QFn3Lk,>s$A*2M\[(bqAW5r\fK3[Z&>3ZNHRaASbhH]R[bL;^DK,g$q%r1X]o`
+ 2hd:Hi<)ZC]CJiKk`l9;FPY1KF^Ue]s.5_iY)E)5rR%.`V*i$>mW'sfeEm2UK'l6j[mBeG7
+ OSW%@=uPPdFn;]:9+N([LlMB#Vk7oe#@G,?RZ5.L(-EG[F)u-6,79uI/f5Ksd7b$K4RG_tX
+ XDoT6VeH$d6h\YVAJ@h$0p)P9kL!if!9h0E?mYArP/7cf%I$5``KDBA]Ys1Csk2EJ5iiq@9
+ R#a;ibiqaY5&\=m38F<Tr,6U]T.ZS>.!/nLHP(ZLb^BEi/Y1IU?%&a0mn_LC[#_>!>)/376
+ 4HQM[?C+$!DMcQmE%%G(&jVoMt=$4I27%+M>.L"aenjUTf38!q+4[VP$NTX'B<?OP%Hg=gi
+ @ht+n/Q\snAl"RuP7+^H8[22GU^.OBm4;FM*^/O(/7S9($Tp:L!/jMcK)Q7R+\UGJLhjY>s
+ ^,@[i2<HeE\)kn`hS>57a--c3$>j3DMh6jq2<R**S@8?n^Ho4G,N0$<X2^q>9gXmJir@<*)
+ B.3T52AUUEMTN0Yp)Qda%&4%VLMlLOS!(g$A/m<:e-/=;6pS?CQ=;(URO`/]+R9)UB(u?P0
+ r%dWee\^D/Aj['U<N#Kk@:E'@afcDhprs=JZ-8NG>6?qWP0bHFO/:iaspm>C7%?KcqTO"t.
+ I'Xb6WOHeH1'dl#K6,*MjGZRVE^GHF-t(aeOp6s\!`#98nWU^D'i)B*4\*\Glu_3Odh6UUV
+ r-//clIKeHds6,R$ZA9M066DaPUlL3"Y*+nI+h7ZE%6oc*5-!WE_QXf\>FYCgS(t88V/NUG
+ o=rt/R2MB^KO:4&5A!Rmq+oXHnNP?if%/cY;eB!bU;]][8?,/ACXT(]ZZtepBD:eb4;Tf!p
+ Wh"0OIX@D\N-L+L4KBhl2pB:EG?-dLbJe79lkVAF..1OPqkiV/85Ooa]-C!j]$ekQGCj4jQ
+ a[E$Ki42'>Ac=n*c%:YpF"M%,0IpaV20j,`ReLG^>1j9I3A,$(WPD<=tE#;C+,Q,c7T!(sB
+ lKF_,aN`PKU6fiaJn&#$BGqYHMFV:'X+<>GH$KD]X8jc5@A[Xjr<P:r\%<Cg"36+58o-P9o
+ ('e*-W`aF=^V>S[`Gs[*&J!_<@Ji@V4c1UaKrAl2O6XV%hgOl1C0Gngk9nK]',7>rr5>WX4
+ eL2Va26d?kb%-+#-2@68LBDgI:g")V/PF;##ujm>ji\2S$NU:dj94W-TYF[=8k5\Za_0&"[
+ A[#R5i]*dZaq[L<j.[jfjJ:lhVJeZ#&.dJ>RZZ8/":J4J<Z;oK#<A[fm,c<RAn]S88,YJL9
+ 3PBL,GiYXZ^9pa'6aLY;6bp=Fcq_m,&>i_%7Cf\[g)6Yf&(.6[h5;`5&Wfi9Lc_GJfF]nAX
+ QG4<^3G:N&'-[kRZg^]obfkiR"d>;kt8s%I6G4hneGHfnHK)@G`n:gL2n\ZcVX&g0:V6:0h
+ XYi!W&]#Rh/k/;>G)r7o=BUA,U!m]OjFurC/43umu_J/NYE?;3@MLt22W3-$i%d)h;<n@2/
+ iDtCL0E$pKO,fTd3][+Tcj'_e63a4&`oEe*io<Ed%,Sm\%(LCnIatr2c^u`&.8s/!3XWdB0
+ JiobK7Nt>hY54jH6p8\U>AX2D[0W8%mG1Dht9V<qdd2F^LF\oh`*@m',*&]$\.F$^RZ$b^A
+ ~>
+Q
+Q q
+178 171.002 7 -7 re W n
+q
+178 171.002 7 -7 re W n
+% Fallback Image: x=178 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 178 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<KI5KI<*l+C&1Do.h_Mi8RC`+g>,H5fcXKIcs]dPOF_q(!;8lddS`<pf*X0aHN_CE"^U!
+ O?sEGF7`?F7mM+d'D`#/cCF1Z/)RcIk36pN5j'qjc".Sb)c.ch$s\^Ye5OqZ6WfL3R<B\?5
+ /KmG#>!brn"'FE=uGC2;S)l5irGn,LmVVmtu';=goa-7(5[)Lj>WG]K5,;-hdR=4bFQ^2.W
+ ()uEfB7Xk5/nEujYR6NP#W1]e<+e_(Xp3K]f[68l:56&8X?uP#4K=Tj/':rne*Z6F_2Pcr8
+ 8Nc1Fs&.bk<P*H^gUm3+FEGEo6ar5BT:A,1p?\3YH*Y3bDJ!L'B]s#Ws,5aj-0s-QF*>iOo
+ LN2p,JbupdQ6nkp=J9iA0oW]j,_i@O`%ocDoJVC/hWtA*g_8&Y65'\KSSI2aVef.qk'5tk3
+ (clE<&6#q3AJ%kM+a(IcQg)BLb$<Ad:J9McoaSZRdCgjscFoa<[gg=gk@=*$):%a&<ohEV"
+ T5cb=h^?<MP<41cXgmU&7G(Ymg:XK@O>ruOlF#bW4;L].g"WPp>L%<?YELcri3G(SgtB#t[
+ %`\hI&9Phtsl`@*)n**\.$R[:4)]G<6QJP2)W=B4`G'2&<1)"@P6Oe3fVL.*\>d8r]X(%?;
+ W=O^SV;_,Y;hn:P<b:UKj#Z+-[T?H#hRklIk)HrT1d1f7[C*W\rn$VRYDLnUhUV!t;u/f&8
+ q1m&>-2U!To"X*Xhofhk>"_.V%[s<qJd#2_m0^j\HcVa0l_OK4ar@==#WbTK!ETr/:Uc$>'
+ h[nXCjd:CLs<(mq1CZ<Y:6lke7r2O,?AZ4"d<bg\(7^TPaJeimf?EGLpoaSsEGem<D^aguP
+ 9B=Xk%Y%h;A,oK9+OWCb7WpH<KFH>Am^`("L=4m<<+cu+g=<%nW>SB0eU#,r4,OOU,]chYW
+ 5Vu>7Fe&:S>jUVl[B4oc>o.h19LgYW.pUY_';G0d\I1pN<\W`0BY$Yj0\j7RRdR.M:W9C?$
+ U%;d]>#3&K:lE4_b@C*eA^l3Rl1qH:668q@kKcdHlK4_QH_TS37+Kmqq(_U-_$nTnK:EZ;Q
+ 'PSaY`4SEIkkem#-<V4cFTi97d6Tg*/Rs`T"=aa&,U-B&p4`e,n!PqLT&0%<@pT"pppaeU8
+ &2*ifVTX$7ZrO7r<(l\.nnS$sg5+='=`',Lio[]GEplJ9P.jHe=Aic5]!DTjAbXf0U)Y&W&
+ 4V1pI%'rs_-jF4i2ToXd:*rr6T#3"F[W4YoB0(h<21+,uAEOFUjk[*ag5)PWplJ#mp5MOkc
+ ^?4%U#YL&LrTS,VrVA#SkB_<2TL(+D5pdMc-P)(@ha]4Fa#iER]n,btoTW(s&KD:$nl;:.&
+ Oi`."LPZ=NiX3!>-A/f!*:.8g):Kr/ds>PU(."f=#*C%%C<r=d:+s!4J$PTZ2gFn8p=.pQ6
+ JTX<1SED>+;2N+!-EA"PmYnnNaS?;^kOEr2\?s*Kt='?/],/t=\9j`dI[SXoJufFU7`NYN)
+ W+1<AFJ]$k7c"4"I2qm;VM8'Gec!%nJfG,aKOnBSI/"Y#q/A+Wq4MIZZN[U/)Ajd%o6/RBO
+ )QP9;;)OgVVaB.*1n)Wn"J\9f$lX!'8t*Yp)0ZW_6]$@7q^*O:X",pNu^l=N/t2g)N><5!R
+ SKm_];H$#;Kj@T1?lgWg5N/VG;a2`bSL#QQ4:57\7E,bm_",mZOp%>*pD6XQW7kR]59+pLR
+ L^g:\A#";b$f'QHcQ5&c!m8][\QMd0on!-=QS1^D0#YfJcCNnU#&H1O/S+!U+uA7^I#\U,V
+ GuJ&SVE%R@PMH&[c$*F+X)r3"D?#qeZ7'OX's!s>dsb_.1d-pJUr]t%LulZ,@.rQBZ6KJaI
+ '1g)cs;kS7g++gT]l-Ch6@:Y]6E^c.H.>aFK0biPc06oACa]5-9'eoCDV\0/$G6#+SadSK*
+ <C9;_(mO"Y"(@I4$0iM-_"V>QV%kF=c!\[oYT9b8!AiSfl[!/6-Rd@k!gh/`3?E&\4#^3pP
+ 2$3:1c[mdT6PJCi0jC`@K^"/3g\W//mjSmHFF)$WBcu5s!-Q!U';,Il@#KMiR'$'D0h@hFg
+ J@n"cb(B8-83JRc`gJt.2j"q?S.I]Z,Va&taSsS^?h'.($,/uniX04//+U[,QBaaG,J8K-@
+ ?sLdImNiL7n4:Oa!osC%(r2#n!!IY'YWcEoVp:km-b\(mZZW6GhMSj@LM$P2PuSoO7'28rX
+ 8$)I+e~>
+Q
+Q q
+186 171.002 7 -7 re W n
+q
+186 171.002 7 -7 re W n
+% Fallback Image: x=186 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 186 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<LHW\bI+32]FN%kNXY^o,GKFl'U`?=r0=E5&e6necd&<+,%>Qbc]+Jbr@/0uU=;$%UJO<
+ Q0@LPo_S65_9O?j'/"mP6\.m(Ur:50s.94oO8`?@R?HpA)GKqn18<qu&kV+!-=r1S\5]6Z$
+ ZBc-6?MNVteSp=@bWW2]6c]_PKO@iM>Voui^"n9*25QQ,?oh<;CqSQfIYJ*YZN;q#,IbOD&
+ a'+Z0WKL2d21G8Fifs=DPWOEKQl=4>-7Rktqfi.nLLL4jn/G)[:`:NcOc++`fH=mt09BGMr
+ YM:/gI<^!B<7Hp&pkIkjp?_/'03t#pr"uJnejAu,X=?4))dhL+gtbVnS5-9Zb[0miMJZ%G<
+ EbVe`eRU](OU%_PeMJ4#m^JSa,M'?f.mktDuKX8GON9Ad7;:7bb'CaKBJJ`CQXb:"pC1%\X
+ g(95Ap(1MT+uo9G2QR:'<6Y[PRM^&8KGGD\g=#nh7@k^:7T=RA]4l]6;`F`?B0UAS&&iT&o
+ J`<)hX5FUFsrCa1="=^#F)\A^/r"OY]RFYCBp/_.'o0/(OWJ!0?1>dHAI*?<58]oepf2Z)A
+ ,o=`bYc&I`mQ-iCqN>oWP3%[X\e:`L>3'6:B)5Ss,fg?5Ce3:U4<5"`F?%\'d`U,]8d<bd^
+ %IH?g[B8rg5rj-''_G@)n_2_6VP^T?U?Up)NfLib3b5jGDa]Gg9<S9"r=mjK;Y8`=+q&AE"
+ PhI6O/qssAqc@kUsX#)=PHekokR5aLg1Cs[Z91Y0:n`R.SBnra[_Cgg\cH%Uc.XKZ$YD+j#
+ <b*G5.6Lf+Z;-J1`24dI93"@3b$c?.>6PKD4s(h91ED2.rJ-<;etC7E6dHT>rG)6mBIgaCN
+ U=SRo4:#P-/d`h]%"Ke_RF;[VlJf*jqu*UknQj*l%".LjbJfP_au]0>;VcpQ'U9)=uoo7r(
+ _a2d:N0ihF+PDKGEiTU'?2/UlX,m@L/PH:O'16;Eq>&$cJdg%*Y?j]1'PDJ>q#A_Gh55M0A
+ 0MTi5:+V7CCHh@Gi6U5;Hp0<ePfo1sH/<IA0'3(1\?@sLUF:#&:'gHqL[Jej[;&D*?.sg)!
+ i"j/+;hTh)a^k]L#YtTM)8"(Id?("5Ygj##-8L=&.9Q#$p_!BBO)(I*C,<1\7uLk)hS*RJW
+ L/U)JJ'n$IEJr)XKcO)rR2ci496)WscpR;-U%Of*AtMi)_`(UH/,.2:,b7]'8--Ef1\Z!9j
+ kf/1>chrk.U+.Hk/j*ZZs50?Q8ITRnm&k\#K3$ih)LT^tLd&qC,`V1B$XHJln#0S!ob&nmc
+ U&":F/)3RIT1<^q_=nk/_qu@0bY)=6sJghB;g'[m1%7IEk!IQAa5W*Z=#SZ+A,4r-r"'DOh
+ >pk9gjYo)pWiqunj9S!&Dq<3[_3?BR7\-:c;%sA=*thmP,L<^gKe#m[gmj&&&c<#*_Tob+o
+ SB/HIbktra2.lt*ek1IW[]Vm%ONe&HAYal93I3B4c5%h6r>A;b!_an7n_(!M+ilHDlj]A%2
+ BVJ>\n;B%h9e%E+qC$4s+rl_mVJuq,quZZttqqCq6g6Xs_[A91]9^/'8!bJkV?TFJOX"\\4
+ Or-r?5OQ=$UjG':a:4ubL17!W5C[^X/S.[ZEp$4U!PE)c)f6]/<MMl7cVPrNp!QkmOf8Haa
+ UQ9pq<['WYTH)VDi<9MT.)B.PIHZ3S/M=T,nYc\IB]Ef#iL-'TG7n76#!;1%5?&FT8,pa3M
+ =r=W''!rGn<DKHmXK8(M#E4[tH$QX";SDCmY<'bb_980RIQgG!<%GSl6?@3]Z<V9`-t^mD(
+ fVYG8"d\K2J9r>XY>pPAu]+B#'tX6IJ[Da-G49uf%6st`X_Wp6&%0N?u.A&%YgH26$/$UNU
+ 1cqd7P(G"m_Qoo-K^BHu$(a<E<RU4,&k3gp.*<LVj3!eAeXrJPVjg;=<h*Vbb3`";h^OK7]
+ b_(NaYJ:6%)"#LPRoJV3Xf)cflCLZbaE`F$AlI`"4ggWiE8GNe2p6UG0S$tQ\QBrQFUfYQ[
+ dF6D$r,B4E$=I;.5^]9f&QA)H1q*#`FIG?/+phlPWjsAfsFYP:@JM\Sr@=5`Ao<Df0]Nj:+
+ Im64/#8S,n1M>4XJ]b8SV&>'NdZ^7CMAn\qqt('U3pks!G04W%\gSq1ET.*P/;-G\l7gUW[
+ C!`kaX,)-WOeqR,\fPc"R%(eef#E,53Bt4"-Oh1LkhgVOZ+[/k/j6SW)+A3+!4SA3'@]S!q
+ kUO+!#h3me(t2~>
+Q
+Q q
+195 171.002 7 -7 re W n
+q
+195 171.002 7 -7 re W n
+% Fallback Image: x=195 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 195 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<MCJ[r"'ZZPn5Ti=F"B6(&#H>k`$=ZF/=pqd3LdAk;"[O"o6pVN4BYgR#+qLf-TXGsY&J
+ 7kS.Is?6:r$6d<Qe$-Gc3#*Go6+t4l&Yu\M0S'GN\_ZcIr6sp[%=YHS<1Hg-u3sJ`c)ZCMU
+ P_X.N?jFHr-i;,[6p;;'c`jc-g9[FmE[g!shVjHkJhhl`3OQ/'/IXN.)^lKSRW>5i8T=3>&
+ akO+e-`oQ4'aN0iZ@AQ&/>hcj_Z>[Mh5!(RP8#Ef:o3@@G>SGY`Y)1Kc7fM<Z;WR.nIG6Z]
+ 0+SSsgqWl4C?jh0=/8/+ft$MHor=shX1l<7]Y*gjgiApU:H>LMq-\'P[9plL@G<Bn0u4WFP
+ O)SZqiLIeWCtg4EH&igXM;,N_c8q9lIa_okKZZ=a2uVVf$lN%-/At?a+=\7empj'SlfODS*
+ qE7g$1d`L22/Nj(4`Aa]?lh#`epnbKnV=Q=R1$Omh7+m-e9n&b2JR%l?0BR[*OZO*;g.pu8
+ l-hq?b^E#(mgr[a-GjN6IE0lk?SR9p3("(P&,+#RF#rN]u<>jdZHU%Ng4rLBDGW[bPM7!9V
+ fD/CdUDFmX-fXhqM:G6%E^bu^5I_(B@b?6@?9!ac+.dc8g1ICfZE(MnFS?]CNo_-9dq9,a9
+ m3O(W9hbtOK^AW:X%Q8rs*K3D?!Q/2Dk@GRgI$:.K='IcC@8R[aIRtOP-LpT>=[Ea9OH%#Q
+ uhNp];!PWe/pmPW3EM8U#G+n`sSf1lob:>.8ILMXSc,IM$!_5a-XBVYZLTS!aN,GXXMe[d:
+ 4piPUiA@o)nX`%[nqE>JBfOi1>[5)-rNX0-3<qeZ4qXaj-X>iK;u'6"<Q9qYC%s?HUE-&Z.
+ `UbU=k+dh\2%)+[$TI;7;&oSh%Lq]b3@4R*o2.?o>Zbf.;^?Ut"iKL8+!KnAYB'8aXP,L7E
+ Srg[8_].6&'j-UBQpc?<'#C:q=jfU3SRY65u@Q;l7jZ43j=PrI#%mAnbF"nm!cM@%I[VkX!
+ W2_NW@a[%cjh@2P&(VcSHm.5.gE;EX2B!TVf)9IumA>_0)\#O>M\%[;j.QqL`[XHt-J"O"Q
+ LV4%J",GaT,h97[_a-iC37hg=m5j4<+1anD,>d0.[u?bnFEPLU5?g'N)6u$]"J+"YXS@iBn
+ 7aHU/l+f7^e`imU`)P3N.XaI\)<5n,kj-4nP7rA/HeZ:83f@R\3/l;)=MHYfmAqBq[Kcj,@
+ '^7/^rO_+&8me7jT-0N"GP)V..\1:lZa'D5fnXEgl5^iRnbBUTm0f!!)\eh`ND@8,o>dLbV
+ X%-jN&]'(e!,XdG2K@@_X4cMb/0r,(K.%M]RSSXaFCk_\_l9m<e$@b1$>rXn](&$?ueYjeW
+ c"s.0-@K-W,+cM_<&%<agls[.BeEZV3Z8t-\hJ'8ZU6o7"qq[8deNPWHj)Yrd+G#49G?e%&
+ j!3-R@-ZL9TbpTLdmM%h_^3iO"Onf&96i'5&h?ln!qH[/T,H,p@cAHQS>h;Tt_];h1Lk'+u
+ )Bt`E2200/mJn$lDmRQ;!JdTB;(W3a,FYT%(\\Z$_se>Cc'RMS-$LGjk^E]4(!D&+/a\<<[
+ $]6;05PjV!Ie&e"t1f2g=u$AsRYRPU5'UhM<#kXkr*_T%?"p*Se5,kCN![ME%N@Ht6$Ge0U
+ n3.;ja_SF%kXK93V#,/5ud&"qL1oV6j63\g]d#f40.uXlC>?g$+@Ga7.GnR8cK0+9B/=tkV
+ e-%cl^un'U#^CZI]fhaN&Z2mF1Kbp1_&FWT;)1*dM^?6RS9]d?"*f+-mbNtl#e@KB;Zft%B
+ =N'ldaB6b"p+m8rH_SV&uSGT[$8l!#iD+71=,_1RJ0BpjTok0[5Hq(UiP>+*=a'>N!q*d<L
+ !g"<E)4M!ec<FQ7],e\[[0b,I,I!C2YV-Z>db5@VCqDDo%R4[_`QA9!QCd<TP23n5%blKeW
+ 10V:tjs</?E0m;l)8q"]L87\uHL`7&SY_e%KVC!b]3Kc1q6n,?pOVZ`V4<oSf&W9@nSFps7
+ dV`R\G?re%RAua-2.1,d)Q+T(rI.Z'B4[[UYT;m_SI<KSU&<?AA-%%n=S?10!;;'WAodVdV
+ :-V$,&Uml%SIZ4IoB5W0)6RqQ:E],nOU7V8"e?<*GTt/t^0\doJ4b[kGSD2\4:M"G5cKE\\
+ ,?aDZ$^]~>
+Q
+Q q
+204 171.002 7 -7 re W n
+q
+204 171.002 7 -7 re W n
+% Fallback Image: x=204 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 204 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!<LBi%c1)MV&:$VRh7cmgkE5Tp\Y'V#14La!$J16;p6`F^M`5m<4?/:oDS#).R28jirZ&4
+ r*p$2`_J#T4qIW%dQBOA0;#BV;tUpG]#;Ul36lRB!7aaf4ITX`L*2hL"+#0>JZJ#RFnPUZ9
+ >lqu)M6I<BZqe^`K@Q-W&Qg.J@d?E^o/?e:\"d$.`fk"]7]%u%EP^8ZF!X7BU4'g5PsIC6J
+ 2p%8F3c(f,m;hK_GbljC1F+/R:9MA/okk@A/jaMZf]tB6Y5Kj#t8B1YuA@o?-]9=Kclq'mW
+ O3DSN^@(91bJU+!f=1>?iTf@Z](#3=A7lE02D-r[(Dg;ir";g#f$1><_4b92mT^-XMl,&sS
+ "1a^5!-(?\=_VlN5&[Uk4"+h@IO*6)nVna[Cp$]p@YRo2tlVhEHWu-p:d#`fMu8WDW^)K(m
+ 3V(opW""Netl'"1(O(a$B$B")D?c29n9tUl+seo;nS8d4cT-,^nupA)hrPlYi;`E:UTE0V#
+ [\3jX@WlRXW)ainRWLqpL>jt%aP7.%*"WuX>?a6]&9>LN*glr)&N;*,Z:FH9j5Ao?7_^LP<
+ .DJll&O8k<1g/2*;eC#OPk48hHRdg"I.4Gu4!SEp9Vg"S<jKIY.+Fhh0G1DCH+^kcOVO^u)
+ \"ZAP_u,+P<h?.!WL$\-Ci"Ga6#TKB6q>:<Z]H;95(8IbpJF[\F\(`(O6k<Gl%ILp4_`2"j
+ EO$iW>>>%JhCg9:aY"djr7"'32b'7C2$]1kPm4f%@:V8[Im7$hhp!umd>Q"kg>URDegO1o,
+ W6WoIWEI[a#4G+&Xle8.?L$R04:?h+#]-cZ2S,.=l&nA*[$9/E3S2^)h0+RI':1)]b3d/.f
+ $U8#Q4\T7>a#PB\P.2(WX/b9<a\K2Sd"[8<@BU5B.$0M0TM.CVL8TCYoE'W(,WD1CX8iTJs
+ QbAjuDOcb?s.4MT"\AW">M`peUf3Gh2g%/I58[+7ffH0,_@p8\CdSg<+.>Ej0YhXb,Dlrf"
+ 4#8qA^d#a$bjEk\gWT$19h[1acJemY2]$qj-717=3mKH=A6Xp%.ses&P*oR+*r1gGklhfAI
+ Uet0-J+Aa:$##3An:\<NsW/8r8QZ%CT7?8X!JZ&?j-i7MD?)^TcX_?q'K)5!@lJaF_f@MMJ
+ .s-Q7-EDN#\9uU1`qg-:;m%1Fb4L[rbI<.b%0Z!f?)Gk\-KC3jd:qld=O2keUHp(b\`OY@S
+ 7U6Uk;h%F(lH!IVrFVVPU;g/QEPs4o5]VUWtC3pK[7?.c-2qNT?_/7OeS+T]X'!O/)FHLMn
+ :=Uk&`.gQI='rk2f`%WWg9QHJS9TKNp8;T1#LrSQ('NVnQod`#7*,/GNk*7]5;MFgj%=N==
+ A*gn:e%3+W?!UQ`:^D,`JG[dc?nj0K`ntRS_IQ\;PHCN@9;g$58DN;]E,9gj4@>75c(*U#0
+ Rr#El/^L]lLOaPYCOk%l"Y`6!$``8gC%#H]T`PZLWfU]9oGIa75[Mo4EZc[iib&Zat0J>E)
+ s/GfVlu9grG6YkM3_TeC=^i6h'5tPaNZPq/a@/OrK*Cj@Pr<"&FCkYtC"Z.*n_eG[qF1D&,
+ r>96<1sRL5+P8_DbdNX##+BCd3-J>Z1OGZ`,4kJP2m:g")B)8`%3ToG%nV'Vof#\9n;7>;q
+ I<c!bWN-I0/Tcc!r0YkP1ki3m]:)9.]!g\%S9::&fW3;!BfAZ(!nF_L+4(8)6:f.uVdJ4-T
+ >WKq>N@[D:??#H(j/=F@9I?-r_gqn$*=[:>:fRZpSuac8PsJFd6q)Zf&(oTfTcn*U"DaE1V
+ Aa*4&t>RKK6c4;;%0V%L=-K'PE0qFapQqZi5>pm:PY)GBPj"iF1G+H"Neas)@E(-Y]hafRY
+ 'MqKYHm6#&UfoR]1EJY;*(hERh\X[_7m$1h::8hn0hCCr"R9Jq>+'<YYGf4Xp!N&mVsKVbT
+ NC!4]Xn]fk`7!G6g)[V]1&q>pIhqJV>c-8GA^]e%YW7RsW;m*GUsgVM/FS=N+;0I-d>'@bR
+ 7bZmsEEH1LDk7AI9#7l^iT70*dg+VgM1UD#_X1ag/H`b;)[e(K3mj.i(j*;FWnFdXZ_:j\N
+ \9o0_Rf:27()B53%U?XP(G7sN'#^F$a$asB:J@BA3Z``p";>rlfTmGj$_8&Sbj?k9n^LN8e
+ 4Z,rY6)26]j8d>cf!"Ui'T=b%V'"!Igc&0$kEYo)<AQrk772:%!H^1Ui1H?N`]bJ!YY"0QS
+ 1d#nA:"gd4+3si;Xa?io86+,UO<Dme7[q(G@Kj:oV,-(%L2$Q<C!~>
+Q
+Q q
+212 171.002 7 -7 re W n
+q
+212 171.002 7 -7 re W n
+% Fallback Image: x=212 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 212 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\)Oi'NH]c9JisVViSb]KeiQs782t=;$MVU:.:7BJM2hTEe&1"&4N9Y0JoIFBlX1gr@
+ r?n6,<R^.YKfi<bQ)[)S'#j+apNrY9!gp[+R\4T!d.]GOMs6]mteR*$!3%-'V;nGa@AC.Bf
+ qM[o]?[eYPHW^us#FYV)6-nEQ9.q;k7,4H/N=I/.6Jo"kH3>;aP\26*\b@q5<+a\([hn'Td
+ d;(a@tp%@P;(P$W_1P;T$29L.2W2_=hF9o[nR$b[Q-Q6Qk;&'nBWC[)>'H8!ShnNZC'U=q%
+ jeO/eOb)4i!>)\r[hpq743l^-c%0^]/(5oe`2M0b<)fO&>@7Re03`TB1$f8iPJ1dF5XBrj3
+ AOL'5EDN_p(nqu!iEY4<\,XP0&l8&$k1M)W3/TjQ:C\g#o+2/oQ8U4i:Um2.4-Er\38R"bk
+ (XOYj\Eb\9f$Y0B;EP\bPsne#1q0L9:+<q0:s+cCD`$X2rRu`J!gAKo(hLc2ZSAK*TZM_ZL
+ ,R^tBTPp;#N+4*SQe%^rem/H4^!*YGW'[t%$nEP'NBT]*ErkNA\np[:aj6:,YT&DZ)q8<N;
+ ^r5jjZ+s89>=0;h*ZW$'%=^*[:agZ2URZd?_<Du_E`'gj,St=TL++*`k`srboro?Kh&TINL
+ J-ub(r8ZhC>0ZF.odbcOAE`6LRlA;`hVN3k5sW5ad<I<%eKhiAhlmA]:*Rsg-hu7E4FSh+a
+ n^8Wc:"'6`5ejX"'82h$Gs[<l3[b$"9rTf`Re1r+M2g=SJ-2E\2_7!6uJLgB""SH/"2r=kV
+ s\$/g)tbDJi@rA&gFK!<L?j;=8_e5(O;nnKN!oA0bA_UnlatQ%/K9jlQ&<8P+_oOR@@=+Zs
+ #)*"o!u4r0Od+!1N)NSM6"FH/$_@^[oaO1DeT)A+'PP:(AB./a$`lBFck?r2<$?kP^A_$LF
+ XG"q07l0C-&jsGKF!,6.<:<'hc'U35=%RtQI7QDqjd;2JX#U>]NG3?jSZ!U:fM)*tRNui;I
+ iVI[O1[>emLY,_g29M7<.3<=Q2$kU``6:oh.JP'[n)2*=;D("`Y0P5N")='AEts`o1I#6^U
+ l\-fneGd1RDTnQ6+HON`n=L?FjflOSb@7*QOJp5P;%S[+d$l(XKLQ,iZJ*$qZ0cmHmA~>
+Q
+Q q
+221 171.002 7 -7 re W n
+q
+221 171.002 7 -7 re W n
+% Fallback Image: x=221 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 221 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%Bh26$(fX]sQSR$sboJBo(.\T`#p^c@;@sXBO[Lq1,Rb,M;2fN]cr<o"5V5Yq$+)BC&V
+ ;2UUsMLC.lAQ\;VZD`O.uO./'QkbU;Qo?pUiNDSSu5&&,<'RoJFS.0f4QmDpd17?sisZ,FG
+ ">_La\Q91p*@6Z4WL5KBNhBPLH7oI7A_jM[H(/X\hP`2csQDFRV@DVrI)45\H4J@7?bIVMJ
+ Jk'-:`pp&3.k2P)PA7^20c'rtQ&02dYR*^S5E=q$_\:5UPY9P1kkKYNdEWp[U9%fG%4(_+$
+ Jl>S[(l2+g'V%CK)`Q-tMW*MYj.m0\SX[O'B.,@NfsC2;^u<0<Jq@t7WdN*I&$hDrM;N?Zh
+ ,KH4lL2cG#KY31l-hV2!.4DfnF]4jZLmeN976Shc_%&!b<(dhI/+tOo^q(\$WL0dnn"=R#m
+ U];>:V[R"L55+InP^PO#;lV@WloTAtDZ[8B^EX2PQj0(lfYkPng`D&X]$q%NRlL-o*PS;hH
+ Gnd+O8l_-]0`rqQSD5$Q%pct!"1YV;bnFMrnC=LV&0I_B.dG.>(++9331+>ZrR0/(AZHYQN
+ 5Nm<,&YdIJ=@jB5R1P;s;kdbjg<j.7LT&rgjFg5ZreuTJFf`G)NCu'u>44U9cDi8[&>J>S?
+ Bu;A*%`[A=o%(YZ7Rij-4EU1,TlP=rZ"(:c8NPM\/s6$PZuS3p?1`))"d5$Z(@:C`Ib&":T
+ ZPDU9haVEHCNq4'-mKed_9uOZbTOA>oYoRd_knVZBMW1%jW_7-4`=JQ'j[0KT-qig\^^i,R
+ !AribbOn#DZlk/m=g.cCmm('.FD4'M_\%>"Yp59Te!0I=9dYDi`r!,n)d;*!_XB"<d0.\iL
+ N?+YaT.rXop72G$nbV4jS&TaDQ/:("j$*.1B'cXan3auJi`'%KF-fELt$5$jU:@_6el`sru
+ rD;/H4W<VY6kBtH9qt@kH#A;=QfTqbp^0Y\3eb/brMMid1U8*Fqdh=>d&o5+'MZK?<eA*GZ
+ cF;Thl7-P%LZ@A_jQ)uF>4,bJ`B<3='GlO\#l+53gDfSK;YfnA*\T1:3$D"l+=SbLF\D-^e
+ \t1@Y+RSM7T>U_1';/8@(RX.,na?:dtsdCU!W"2D(WoQ:frOd4NTX=j@[3LOnUO-9Q-#Y(V
+ N9CRG5)*rru;L3fmP8k`pZ[\Xru@+#;S2aRf#uHe2?t28;H~>
+Q
+Q q
+230 171.002 7 -7 re W n
+q
+230 171.002 7 -7 re W n
+% Fallback Image: x=230 y=189 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 230 163.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!#ZHVD^n(mWHQU0>e>[T0nTg+4OdN'D>cX%eoqC*Y9&/&W^&.1@r?9l$LMeYIpo(Mm4-W+
+ ];^Qq$-tfA&C3=gm5^rNptLr8ZW)fC+(Do/uJ%kBYnpY]W*Y%L372kj^b"lYSi][oH:6^cF
+ R;qfdBPGcIM@Y?p20'0LMielG4KU4GFB(4Q7i#Pm[e4F;gK(0nJ+oB1,PK#69s5gIHdO!"'
+ <J,YC^&(/aSb"<?_.?5I'USEBfnt_htUuLfJeOdOs40WcRQ7k1)HhU!NZ^j4nIubO-:f\pq
+ <N?gbJHiEHQ]St1ZNp<N)dL(6r-Y<:+Zs!aA;Ge!D]WfQPSU\\b0;&[04.>]h7Kq*&LL:C5
+ _'Tk.on(eVbc#\MaPQ)2nsd!(GBm`OqM;;+tO/:^)0)kJ7WQNKX5;;0l?aSS`K2[T=91G)J
+ s?>mdap/5)e$mjkI%MiT=b&,O<sVTE't2\9AJNm/l`_9btriXL>8AVbSBs)iGMjMSXr(jCB
+ AD+"fJFm6c$()P#`uA!^r]eGP=_B2D]d!sc&I)cBTH&V8kJN#jQQbAk?K6q8IP$ce<$$VL6
+ iES"r/&njp_G[Sf:,U^dr"M]%MAb3Y9Ls4l!NPj8FLlB9@2;#MWVbc@(/ToXZ,7be%5<mA^
+ .CqETPa'e'X0_e1FAun3)5C-;_12RGQ7^mm(OGd3,J1IAI"G:NV+\(C^PkRaG.BecPi(oa_
+ 2/iXYQ=@Y_oG9(gtgAeY8NaRfoP3Ii%06@<Y<1d95no\1,^54qtHBPclkt:@tkE-qH9Ddh`
+ ?mfbLKVLj#&:Ig9in`9N.)3*5&-LaH)k/oJ$4Z)iI:O<#&j=pD52(AEI@S,`Se$:"+0FRu=
+ 9r9e_lG1A:+iR_qXUB`=)#:J[NmD127_NJgPBP#$$D*B4TD-R(#IRlAN>(GDM^a_YdNb:0]
+ 3Q`(/rd?*F;#7XQU';8btX'eh7njY1"a;fisl(YGq>g<0-M\YfJ/',oOQ7Z4I%!1UKhd>Z0
+ )MO:u`TOI6<\\':^2jB&B($D$dsLt8foIciVj$4OC[]rOeFE'<A',M12[1;>[r9+dX5FeCk
+ HFNto]\[heMR!9K,T9;Au'9GE)Mk[$Op)P&3MA>]ANn5m+F^cMo3]&aN6_^W=3URcCNF,=E
+ @(AQ7P<q$l1Cu.2FO(6A!il[naCZeL"fV=BmCqYbCiP0K]5O9<]I@N]^,b5+8meAd(DHd.9
+ YtF$B3!$`E!Z7lCNpErXUd3nsJEf_>.&s&m):Hr8M6~>
+Q
+Q q
+39 134.002 7 -7 re W n
+q
+39 134.002 7 -7 re W n
+% Fallback Image: x=39 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 39 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$=\+iE'G]4N91olFbe7u985RO+:iX;fThqN$6mDjY/?tO<9F8fM(C1b@$;n&n9FS2U*f
+ EQcdm2/0;quDo83<B#iqNC'9)h7S?I$a<giI,jhE,A#s(YoU@Vu\9itrUuDm'3Pa2Tep.h:
+ :ddLo#>dG9eB%^`YOSimb"G_*>B0f"@"74fb1c_J5s?!V,W5Y[5iqKgi\h)i00FuDLCf<=`
+ *$&XUZkDk/268UU[eLQ%DUh/VD#ru4$-.:7^or<VN1u,j,kKbI/g=_5lBPp:W/hUErGdr>5
+ (Qai5VBu]\rBmq65HqSNn)*[&Rq/h5(:S0)/.<n%.L6?sc'rtQ&3W297V>Uigtq8:QC+)&<
+ 4mU8Z8*[O+Wpb;/dhOTOdLrf&p/;S)kBPDEI1nm_:0/'#Gp*U]Bj@E]=0_Z*`_.[L$32\A`
+ </hEMG<=,]7N.$Q'r)Rl>#!7sR*m;\9lRB4mU$.r]TpCibFCX<X9-+n:W5>&PNJ*uPs58k;
+ 3HP[+.=0pnBF^]9+DRkQ^b]spH8]$Zq1]K@Kr)EKpk:_4>J#sUYa]>N28LCV/="NJHE@9m.
+ JB+?r4B9,"l4=K%Fjp#1"-&<K+G3TTlJh:/2/5MX;3'"gtC9r<Qa;hLALC];qNt:7179Csg
+ Ubg(FNP2nQDjf>&(1j8\`5'7mf%/8Z4IEjs7V!#'m?8hW\@U\T3Fl`Z7eQFG&AB'j;/+_T4
+ E*`CFAYF/*#p4IqtJ:9p%1'bF3$p*0f\b?)N*k4V73G5%)O)PD&b;^pUtni=0BVc[^;8E)]
+ ?a(J'Tnu\[6Q6/1dU%8Kj4<#+;"2Ls5&8dNX9gq_g'5`9G`K(ESD:@\+)MO:uM_6Vd2A%"%
+ %@:7W")M53@a.c6?A5(8`WUS'k?N'_OXX=0.#SQqIbf[r`J/TAd&0%o">pi2faK@j;]\0:=
+ MY"iLqD:J(?C3cVsa\k=f,h:>l;sMFN,hQ1&fU1V1*DW+iE3KT^M&XLts/S'/['Wd>_2OpL
+ 0,4m(PQ^C[k)JXo8mE?6;Pa7>g1o["s58J+ER]9R^NN=6043QRFJCW@,dR/hnb;K0,#c0(S
+ ,>RPW^NMYl:fpFHTQima-T4%M2r^OX\B;)[e4cjq',+;]I^21p*MtQhAI9(Ul\,$#_0!_qj
+ [Ne5%;8H~>
+Q
+Q q
+47 134.002 7 -7 re W n
+q
+47 134.002 7 -7 re W n
+% Fallback Image: x=47 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 47 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\)Oi'Woll9QBn72+o/KLHn`g)TW+S.AWUlEE:FS--OXT6cC`O6c1?$"d'KeZ4E3U`0
+ >otacN_\ZS]Rn//t[te_1ksq]=.CpX;p-p%.T5BAYkR^%MX/NICVSa[s-mM1G^"pFCL^%&9
+ SBpC=O9H?t&?*\UjXiBuD6Mq1op>FV:l'9=6qeLQ%FW2F84bR!J,`XUGI-tmEb<u7GlPum9
+ aY@"'&#7V-PF:%d=$EdW"F0jrE=6jM:_mjamjlJIM)R6OSdaN473pthARl>Y>AuD)dOI(`q
+ +9VfqLl@QL>$@`OIr@Q#?u?J3^>\BZ4F/8Q9hr^"4n/#?E:=u*1Sm\p2331cNqmt2ph/X/%
+ j*J[JWUPO\)[$j6q>/8#9,TOfX2)Y8Z8`/rVP$$W@?'882,NOSf&K23qW,<<&lruEWg8tE,
+ \XhYf"@U=GU1jKRQ9U(a$f]cT42'I>bp-4EuD2[o$0QZ2+3(m93Ur.r]LETgM@D6Zk7I3i$
+ HU2)A5O1Xa.ZMoa20g;_&R0G%Hs^rZmpAhZ!Wo&[VoBdq>OmZ_hQic+#gEcY)_XPmg6P5e@
+ _GHV4l>8#01'l2Ak0itK/M2>2Vku*LFbEg8f'eA>F)nKo-4?TijX+i,^NQDN&.k/=1,,mJ=
+ `qo@1]c-%q0Jq;KbU-Lq^s3E/2IQE*`5dc;FEbnB9M]F;Rl#Tn*.<5ZCKXe"Hs!suCC;XCR
+ $tn-5f5A[-<k;&?uHQO:P=DZr-?\g-VoDE>/]PC/a+lKS<t_hYTS$\&&uVP^=kAM`)89*QG
+ V<XaI/JHgnqH!E3tGG+f3riH4e9G:oQA=bj.rmV>+nufn,J>,qiV4&O=q:k"Tj@+P"I_Qjt
+ !_p+24GQZhj*6_]'rPi4@l7IVZH1*[RQd1O!7Mu%Eq-stakS92/YU?h)`iIX`F23[XNm]br
+ GCC172W<NaLL]!'J.4P/f+Y6<A]qe'I%F\AtGNdSXaN2/R'0(;;kf;7jg*Cc\G8JWD+r6d>
+ 0-9WV`r>oB%[QNZaVhOQBQN'Nn.QE[0<0T<5BcD/[V`TA76PSia,Z#/VPFIu\<PN5%DR&qk
+ KZXs-VoWF6pq<]FWr;-pjD@kXK[9XeCKM]X,Z!I>k`V@rtQ7s/X9X@pN3..8/?)CQ#&q8!X
+ Zkl;&_G.^K^L35]CJZ8V0TB-PfJJ$86l),Ykk[rgT5P"A93="9~>
+Q
+Q q
+56 134.002 7 -7 re W n
+q
+56 134.002 7 -7 re W n
+% Fallback Image: x=56 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 56 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$8OulZ(_'/3,rGp,a@ag`S4sP,`Q1kTb$)/+F$M1mBi-i(B&Gq2O<PQW#eGg'9,u;X"=
+ $moTYM-i78#DDUm)is:ZpaSr8/aAr^A=jBCjunpMdk<%2\fsCL[H>9:29h_utgL'Gqq4bRD
+ 48a83B-b]@iMq\Chlin:Xi['^3dHSIR=c_%JNV@,3Q9Ma^ACE]d^<hQu@rV`+R`6*ribWgU
+ :rHiX/Tr&$>GmZZ]M"Z"SrSrYcb`%dP2Dh)*#Zn2ZOIqTf=p]t@cs\ZW=0G#2H9+A['hD%f
+ 70U97na5'q&2J6IR"BVLq/_dd+s@!Dh?lY?U9IH&d3Ojgn^_&]C#-XX>^?&Rp%?DN`Pm`pI
+ U%H1B6!Mi*^:FP=FNBY>CWe@mdf"c&!@s!(,L+#)F?c0pojgt:*DV8ARuM(a9\Z?nFc*S.Z
+ h8AbJQJ+P.S>M&K_NJ5F@qX_I=H@,UuFWpuI:A4Zn[!T<Pu0Ah,Ol`r5eEEsFXA+=.3=d0L
+ 5:QPU,PK"et7^gIO.2K3l\R5;^PP_?+h'GO)-[&JjEHZlZRTV--)#3+]8*'4@/>F:ena9_\
+ :@IIOq'g4^"S%An8^tK\:%e0*Y5_+HDcn+nTQS00p6X:^QEcBt=:7T+^,I"J*Z*BbNcql3F
+ jlb\M/X`#`7uo>`M"u<6Xdbf;$=U2Z@'\G;[V9H=GLEc$bfm;@^RCRAR$rn9T(2PF@\OPOB
+ ,?8Mr2B$R%eICu1c@r8a2Z!J=4ED!Jf2(UR2&7C\B?ZZb=e14!4'$nak:->G3q.@+EP&m$5
+ j^@Iicn\_F_/2V5qB(RCbTAk_S_IBiPAlg+%/JeVk3d_0GF?=E3aK4?R"c.BRg`TENP6BnL
+ p1T2nlHdh*?Bc-Bb@8O?3R<u&q4?AN"7+.>Z2+!9.ij60?[d`tVA:`K>Ms4l]R\j=SBY2K"
+ jOknH[IV:c':f8L4R"HS,6;#>D%Bci8(Deer)uQJaiYbK+NkW"_0nci8>,hVOe0G]^JhLIH
+ T33,GZ4i`l/MT#;Hu!WUP#kQSKQVH1j`$-`q.)1jR$\nFmfH4tIN@+pP,>-QeS`$F,I7,'E
+ @*np+O2[JSY3Jp#'FLRW9$[gTrP+%IPM7Rio6\_Xi/h+-f@S@(#C5="flrgGA5V]KX8BT~>
+ 
+Q
+Q q
+65 134.002 7 -7 re W n
+q
+65 134.002 7 -7 re W n
+% Fallback Image: x=65 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 65 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$=\)Oi'[90A/[\JCe5@_h1';M?5=/8+;@9cf."e77+ql?Re3IlDY^m!)U;7$?585h/O]
+ 7i)#8"kJ'K&`Z9.`dU=)4RUT.d4bqrl5@qK_h,\*cFqYItG8?e;c*(a$fF&73+@>FU6<G4b
+ H9A-AMgBurJ#NPRoSWiAC*nLR:):g/a2#'>(LrHg,a=]/$+C28s(O8JYd4FAR</M.e\eroj
+ H#ILr!fe[/M+[',Iq=Ak/=:RYlZs.$MW3=7:7lYPo-Vc(GLqqQAo#8mLr;<N'oB7UFbAmJA
+ 6:.nlQ\)ntEV_M4F%$YbRCVq0%roRT06m'mKnXRFJ,hPj/(hEJ@:@7&7U7%3VXX7/^461W-
+ ce;.M0JF,CsC4Ln,P0tfWbPPp'S6E_81c6DuiBrkjQRH\!WNo,Q41')^n$kYOq8YF'Q8-A&
+ kCd[;-MY?]R?sOH>!_*&KOHX%U[YG4Vqf=Y+f*5Qn0e&-J`(@/k[83b%bs"m4t:oL*AkoTA
+ irq%Bl;al$!Zh\S_N!B6pQ+YHO$()SG.Rl8+4'Y:jW4["A151ZigX"/RGET@C#SO.A&Li_m
+ J_D?s9M\_u$bA.k7*b$U'>F:ge`<mG!Lp2dRceGOrK-a0pF=@V-@:TKK$Z+T((Dgf.*7#U<
+ 7=(-qAVf0UMl8%?h[V_0=B]1a.P+d^O-q(n^)Uq>^r?Qg%L<EYfs<G4N"MqZ>-u^3oR'/aj
+ CDl"FPP+M<`W*YX('asbd>F5Q!ut@n(s'!Gfdb@7`e+0NnW]:1odT&IqU!co8M@]NJ3$u=&
+ X`LY\]K/nnm."U7<ZYRtIIOJ4tfg)AEmAT,D3(52o\%9Es5G:HJ*BjEGX]JHIZ+XK&?qDB-
+ 'XAsbA#1,<hH34ur0@>!''O\JM;&9`+)r5l:L@*U"Y@dc:SZ*Cfa;sjpgNTst`Z/?Q[OI.F
+ ?n(]?*9at5cK7\]]Q)`b0^9Y0_(XZ"Tp>P((\Ik2S]Rs28kKeDD"R"(PW#duF9lY@no$*Z#
+ qZLJ3"eY9!2\7ebqneOPUKI5J(\=#.Prj3N'pFWOq>&-](8D2'Z2X_.%[PIRHI,r4C-6p%M
+ \hM?K]m*&LZ@Sq*'UG9G^i.OMXaSC-%ZtsC>Pnj6s^r&h8AX7,5C9C\9(:e>e;=3a!4Mn?B
+ .]ee\rE%4fA\Yq;XsGPFPRN$+Q2rq+"oVnlf.F>/((+otGk~>
+Q
+Q q
+73 134.002 7 -7 re W n
+q
+73 134.002 7 -7 re W n
+% Fallback Image: x=73 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 73 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%CJ9as(oE*ce):Pncs`2[fN;mUjufui=r+Fne#:VkZXk"c0l)p%)R5RFC<<cir5^&([.
+ 6^d@m^kBE_+9F`9"S]f),0ob.^+>FRT(t^$kjRci%,CF^NH"r1E3@`lF-RCVu>`GjrMaUIT
+ S!!q5%,qfaPHJ,P7k0@A:&>ISS5MK&6gE:YFAlga<Z5(0^l1D`6(N1(Yi\qG.f$s^<8j=Hm
+ 6>8JAFi8-V]QQnF*LCP1]Fpo0?im&RWH=^[Mp3%0up+5q)6VNGiUa2HiJa:oVLipPjOk$Na
+ Cu't+CCG%3J:e(q&R5)"nbY7orPHmQ&dBXZ>)ECeY]_T"!t?ecL>BIa(37C?pi15U((MBK4
+ o"S:%$ST?3h/BnKENi3$@dO-5s[QNn`.-!6g&di%\Gt$Mo"H.2nXQsQ52;8ippYkA73Rrbb
+ 'r1dgXHjM=p1sR]8P01n_AsDr.Fa_1T?aIuaF#;,r<+B98XBYV=:g!>cOSe#-^+.\5\^8Q8
+ aMmThr'MN3\tKUb)7$(d:8fs=0e#S4u8`CfIWK[HOu4$19p!FB)7YQ4"?@G<[c-E@'?8!0-
+ Nj;B[](^=$BYf+D4QouC[T'FgY$*^lTYr4KB<fJ(JcGtsaq!j_2&Q>SO+@&h0^>-fY+-_(a
+ Vt="oX%)I2WS[IG^ti;`@rcYQ;5<(5Le3fgm>ZD_&/hJ@?+YjCYN<>2ek2LB[c675q9P0Jf
+ Xt?[VG)QAX-CC,c'`Ec0l@u$S`/]85<m81s*bh.rK^3qj;%j7dC=U/1J80U:;4FdKXHpRVD
+ ;d23Fg'B7jdEe4F;Ig[*93@]Q7i3_$OT)Z8.tdqf[rTlX=5G^k2UKR=t&E59O%D_'7t0@?"
+ f?[E`Y"RX@PXL5oc\EG"@I-F,,pLm><`Ide^,neJ^(4BWo8BbOBBA25tE?5DZG3HW7,Cf*K
+ ]=0@cJG^*n`Bb]nt:Mg:XneH@]QU=*DEMH2h1D@aH@bVkZ\+AdFShA#b_!9HjTfI1i^fduH
+ DUa`]-[`lDk0B7E+sIR7V[J)fdmhPI-Y*Tu(X^Vcp<ZVe=b9)#L'GW=12)*sE7Z^J'D,UPd
+ &Dn[Uc6`@F7%U'#EFZ[)GCteX,CBS?DOD@5@<uccj$]6OqOaS-fUE6h5QS]_:pjq8&J>'JA
+ OY/DKJj!crtqscl\4L0'tul-7G6)dJ"rRE$<$ujQ/6=(@_WZ\\@V~>
+Q
+Q q
+82 134.002 7 -7 re W n
+q
+82 134.002 7 -7 re W n
+% Fallback Image: x=82 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 82 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$=\+fd'Pu/4D:=A?9J+5;X<*UZ$47G<0f!rL:de..bRgLB.EEX5/4)0D,[2Pr7EVn>N(
+ >-h1(qK@U!0_r>Keq3Ba2KThA`9GQX2_sMnf!;h`5c?!<9k2qXEGG?G/[@.p?*b4FN+4:42
+ nkJH78Ge+^fh1cF@E/R6%CeC=kLn)EkI]Qp:%f%KrpMK&GN/mLY1Kn66Rgq/@8G's*pA`Sj
+ ]1c1l2&dJrATYNfa$*IN!F#-"/Znh4DkB_Jp0t(pd>+1$?I%33lV!m/C)>VAf>eZ01HP%9X
+ YV60YWAo3'c0$(eDa/_\BF$hOB^SSh-ne(k(=oWW5_+EA#jg6>DEiKFT+)9>GZ]uU\,Li(r
+ iBbHIZ5:*E;2,MPMts@?XEp$f44]$-%57_Dr7;$)niqBs7_+*DSEBX9a+n:LqGi<7`*n!Y-
+ %s1"-Jb@Up[TScc_YadJ**>7-86G:+U!fG+"a(%YflLk0>igF=ErYPk=<Fgpr&-O7^5k?S/
+ %<Po2Q1>Qj*NZa3Z^`f2HdnRC/*_q#T%VYgXNZR>(i+Z:,#l.E6CqtB!i&[P<PKF.ZeJ--\
+ nl*PK-HH;5nSuq]]S#-ZkS7q%?Bp-%jI6(uc`4U@6`:E"l[E:$70hPr5!9NP#2&$fM0bGp:
+ @*'$4>U]?gPKb:ISI,T,AbYcD&oHH^P:(AM^:6[YZlh99K+%AA+jQWGDD!haJu9udS`/c<4
+ $+0k)O[d:](ts&BT\T/.7oK0H<"]F0t/8`dntm=hSc[/aN-VC&=f7ifSg]Jcm#cTNES&PQ<
+ N8-K?]mjHagLZC$">V&=\83U;PKQKER,6*U1ju1<uM?B%\.)#Jm]+SLn'A;)L3D^n)URaLi
+ PDeL3!amGm35+:Aru,?QioaXhi=./;tq3GK7Dp@-G5W.*658h6`m>AS%:D=$bC"-R,2es\I
+ :EHd2-RtQC21'R")8,ejV=LJV]+]>FJ];,W^YH,ht1@HRaOgCgea2Fq&j9E._7mB3EKdleN
+ h[0:4/.E%'QWV]8rA];`;RC^qW*Po6#>LcHYX)j(?9L3F*oZ(6O&n^$8X;kh1,[qe;l;IdS
+ NA,fe/:H3=iLSuMrW"&d<jP?$ElnCj<9RJR6s-8ifSSC%ZLib7;D:J'0(CYQS+uG?AH>GGb
+ N2tSd'e"V#D$4T.r(k9=iL?gGeLT0@t^Nds_<Fp:fq~>
+Q
+Q q
+91 134.002 7 -7 re W n
+q
+91 134.002 7 -7 re W n
+% Fallback Image: x=91 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 91 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/d91YCH&B+aVe?IGe*gl'+Kieq\+[cNs#!jTE<>7`@d0"\\W')Dh+=eaa?p8R=fY]U]OJ
+ /$g;2^+/9\b;sU4k%ap,N!T7Jf9em([44Qa8_oB("HbF6?/FFaa:mOV.9\X/AH@?TJ29f4S
+ ,@*is;;1bbR]Dq*XHL5%->G[Q&Qa85J0-]oc'o^89A4k'B,WiU:B"s,95&(^NchS*!"UFIa
+ 8k)9E(ja-\u?![<t`KSAQA*W:)mFs[G:0C^0^tcMt(GGFVZR:n*HMUTPANG3@]662Rk`B];
+ Y\K5Zr]rfPRsUiZ+$So9,@.s\oQ3Ml4-5c*_Eod&i1MO0leaT,!`K!ld@,sIkK##HC@>It7
+ QQX$X:ls\>H?AZXY%r\20X#F7E21=HDSZCFoAl]*`RO"_SR:C3H2d8BF'V>YIQ`VIX(m!SX
+ jM4e_Rhe.'S?E`[WB-bEgBQ"s.PcSXqsK1cXNsIDYE9\9qFlcg(:FmG"P''I>#<j$p.S-#[
+ _>_M(p=J`"":WN"Udht20P3uqrP$PrZ\%!M!)_R==8Zq1iA>.IO(QH7BJM\aFXbH6PNa,4K
+ J$Ie#M(H3"?)D"?%D9jfk]W'[kmFbut]4R%SK.V[*1(69G1l7(3aY>GrLPGHcPCEFKZj1Hc
+ KP>/J[;4>1gUE[4o&X&d<'EM6a>!*cd@`mWor@gC_0UIa:StbYjo@P<s3OE.2_-.A!<JK-r
+ T8tGZZr`Xd@`llg"X^g?7q<;f>ZZWlB[[ukYXDaa2F>"#Vp1dl"XR4e"ELYa,[.+e@l.L[d
+ ,Z2E(u>:)*39ADQR8aQ/q05#26olr>gE>k:r,U9(Y7>$Q#nuc->[t9hgrCl-hP>aZ1\;iSd
+ tPeu$CNeHub.!/:hj7=u5$G.-u5D7#J7l_CG_[nVo';+?;2DX1>?fO4N*FmB_VjT#]O!e:n
+ H?BgQXGOF,Qq/p\$,g=huMkhV6`@Y<V"dJ6@_Y;P/<EHe&'0gMWZ1@I%CJ(.cC"$l^5`$O8
+ I#El`6X2W9J$+.m<)mM;\oPbHkKhH^QS+[I074)\f&j\42WA*%?fNjBT$m,t]RY%N"^`Hup
+ 7)(,lR-T)^+]~>
+Q
+Q q
+99 134.002 7 -7 re W n
+q
+99 134.002 7 -7 re W n
+% Fallback Image: x=99 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 99 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$>tg;f*3J<Inkl+#8ErOUOu+tsC!2Cb\nJLjB":0*B):(.)l#:.OJH"uTiIT9<#[>(f#
+ NqWf#SQRN6JM(Lrs__1@N!P,5L-+l.NUn5L+>Ao/j_E"8ncK14oLSo_.:`$Tr]DTVDUm?K(
+ j0$kD:[:MZ?4J&f0FGkr*`%CgKB2t#N;*^7O6kP4faUSHBoJ,:R0%j'[&D-X\bTVtEBNumO
+ FehQd#'MOZ?=)d/PJWhI$rAsB(7sDE^ZXV>CelJ$"Lb1O9^juSIF%-Dn^;Ik>0RrqPqKcD\
+ N.V?I)JUBG$qH=KG$>o7r:gL`>"9n:jm?9;/11ZaGJ_\P^nsiY[h!b0WpINO^8*-+24WQOq
+ '*5J:4#'[MijS`OfMM#=L/4Zd;k_2]R6^Rp%><>'.8l5A!VFePhUQZE:KZ-h7=>=D?enPj[
+ i&OY$OP<1S-bIRl;O`\=-d>lEeNl;-0[L*C#Qi]<G]G(+_/DBFt:IAB<H1W30/P4$0:oZC1
+ q#AmDj=A#?(G/l)*E"_$4J\@Q/GFCE/t@HL67>:.7eI*WiR3eY^NQ%RB^iN]YUJq7dnb[>.
+ 4I,O5q(Dk;dMqPFJXIYpXa(a#`[Y"\Ec,5\j=Lf%`2^0s&i3?PRjUWFiB5ZKiC+?Z1LR4>W
+ `A#N)23-8=<h.s6nQW[FOcbMt7>6IJ)hG\4>-D9`RC0G[#D[rH^S8p/WJ^7?bhUC`$&]UX4
+ <t&$8LQ,hr(,*K1G-oD`^Z2Yin,unf_Y8C\.J8pb7Ng\`(Z*ObRlkEVM;d2EVd&Jh9pnXY&
+ Ugbbbc^d<[s;g%qEWi=\VY<HdS:0-8V9USBAtBm>\%mA7T@kf@4J-R@)[N2fC28ChGNPA86
+ :2L81N.Z^R3<'+,fH7pfUk6m+2r\[f4m94Q,_>ZIVOR?aVDZ+8N7.op'REk0FU/mULJI)8r
+ Afu!o]2iB[[?HpYb_Fg5`bK=eh'G;#i';ONpAW)SjegAtNeU4\+TC=j*+?6RG9KemPPYFeF
+ bhS51p[?]>$4kb,?tgs?i*\;.hCT\QZ]tP)1G.VQibV1]eg3Wl'L*I3%#5I"i94$C\tk"HR
+ !CEOQg8DKIEI554/X2q#3X;W5@8\J2HVM*Css:@dW">sbpFVuIo]WG#5iN.(]I&3hAoP<[!
+ i%MpqA?~>
+Q
+Q q
+108 134.002 7 -7 re W n
+q
+108 134.002 7 -7 re W n
+% Fallback Image: x=108 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 108 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$8P#.E'[>=ZdaWt<Q3/FnJLI7i;OBl366R7=;_/Up/R9Wq-"7FOTgf`a7YEQILh'=WXc
+ u3U`?[1G*%Eh$cmDQOU@eD5J^V;Ij5k*kp[1-#I<RX]p^ag?K^!3`Iuf-]o_'bZo*1tbR$t
+ nOU6a"2$Q'aI:CgW4nFW]QWCbIlN:(Ql%qBKP9BIm7,eUQD<*/,-,6a?tnuobk$!TLgoEh^
+ -Tsb^?"j"e_OIqT&)K^(/HsB>,YqZQp\/:Pcj2(s'Bkb)$&'pk@Y-]u+Ci%%L)i0NodA%%D
+ SO.3HlK[m4m6@g,0B;4kr:kh]hpC8AM@'YL4<-OK$4\.IH9**3`p;797V<e$_=d3mGKeCno
+ 4NIGJ<qp/pF['l&J>.H<sAU&3.G7tcR,>)S_5:d`VT<$.jcVu3%3$P?SAlPI2^u!fY(L?V^
+ G605^'TcO`#94R#i(hhe$NkmN&mMUd2"%D]KF@IJ[DdWPHVIZCRGAqtKX?KfBSP@:hu'`@>
+ Z_eh(.?MG'9I+-3?K*&o(Jk2n?OJ>(pOG3m$$]a+m/A>H`_3@bJ_H"s?2>;i/t1is2Z;'$e
+ 2ZUZKVC5T,t-,[=*CQ@WBaJ,rE3:,ELh;[Q$5<h$UMQt]7glEQ)hMs[AA;").QH@]Yb/^Mr
+ 1@+8DbR?BfE-?u>0B1tZ8_?Zu:(ii!;Ms.De6_DN2<X$lm,&=84'5WW@&24]f$f8.M-PoJN
+ :tmYl&D\m;*U5JDcHnVSo8J2*i@k7S/Dj`DVm(U-C#o6PJ]h,d=HR)EWdg?dUn^sl8AlAdl
+ <qpj\/O$Ge9Uk=BeF]NJo,j<M'$.7;cts-C5&J6qe#l?^Kdu;$eB:6Wmp7][tiC#S(/mU4n
+ <^RA7S(s+$_Hj;)HRm?20EEs>^KaROuh[/fc?@%pa/N\fK$*>7IRE"IJahVMQUrd^VGjHcP
+ c>[27;T]dkHaS@D@QY^FUT9%DuRHpXo.:62EW25iIL_#u:E-GBfZGJ1S:ol(Fa,c-(AnL&=
+ "0%Wa;68Dd'UdTUEFT0OS4qjq@,@hWCl`Z#OIV9a\'`m.NgWMbI`ogJ`J[8XOC.K+faoF)1
+ IL.(EU=Z:9&r!/M'lN@XA$(T5=J#(1s4F)\9SaAKlZ856TfXGB?rtC2=9!KR2pH."e9K<Ru
+ lRs2T1J#O748X&jBWkp:'u)m_QXB~>
+Q
+Q q
+117 134.002 7 -7 re W n
+q
+117 134.002 7 -7 re W n
+% Fallback Image: x=117 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 117 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$=\+fD(elHGe8cua>Zrg4;@>2c'gr?C1I>7nTcukI+qt_H/HqE6&3"X]0IfJD.*WNe+O
+ NU$^f80E.@!dEGL861SW>E&f8GI@LRoL2e,Raaq<!';c2dlk9MXU1:ON%o:S6"bVVoW6r:k
+ i*&^8I4aZMD5c;)$%O6UJmHms=58l/_Br858!C._.]rdK7m.'sL,ir4?0:S+5n*aN'=R*_#
+ ,],Pm8-n3""gIP(?OIM0N9!ks5FAtoqNXi^HJ]pem\Uk2*'I4sF.2j*m0'u,D.nWHSis(*e
+ &.kLbjP91J)[m/Q"5E`9IfG_2s8"$A'boTsAU&O<eQ'H5UI\'HH+D#8RBs5eS!/QLe$@e/O
+ 2^b`i;%HL\V&A/Z#:_-moJB4Ms+hgjbF@U5AEN7P(.ahdaCm_5GP1a%iuiO(.XD#hB$i`$J
+ aGL)N+0/<)neRB_]D09M[=^bX:o8Y]80DmcE0lE-Q_>b8+2^-ua4DM%b]+(YdHhLe2o>QZc
+ bCSdIJ<@^,1M&J9S8kA]Vrp@$&QXY;TM\olBK;dn-%m+EUFSihj&QZ2UIP*1ohU$sU@c'hW
+ \3-\7'+!2)<f.L00A&AKf)8X)gCY(mCB@2*4>u@*NS![UTB'e0$]mJ_sU$sU`K:\bgl252?
+ E9e9kKAl$MmFu&\--JlVcE+2[F*$!d^qi<oM2]BdHY@40n'SK\`b*jY0^3$BT=k^C'O$sMb
+ REghCGN5(SqtqNg;;)D+X'BN'plA<bPfjC2?T.'bj;0]04'<u(G%.lf%=(Se51eo:l:5O<V
+ ALt9X<d-,J8@N(IuBq]LRHmQuhIh(Dd[Ob?<\b3n)r%!U%hs]^-%oAlM3QjL.Obnc=(7(jG
+ F@+<3TuI:PLRDCh9bna'5%!W6DA.T1?5cCMfl(5A;;V6JRT25?Ei*E.R'j6f#M)blm4D3L,
+ 2-C^hAIURQl0BY;V_r"gsNf-8J2P**tHr(p0c1:he2;+PE]X_960Ht0CMQ%)7iHKke%NLQA
+ 3-.P/_SVZcI=7$@km@VAU\O1YM-iJ3.=3@K%>PJSe1!u(Ql$MQ8lVf$k#HlE4@?Iqj+slC[
+ o`s^T9jkuU-oIA`]&]3;]fA]b*,>pMi-QrAYW1%<eRh:A7\>4`Pj5U_qVX;*aZe/Mo4/"<[
+ >]*0fCB@=U@'Oo*I&1bJJ&3OC'#$N^)=%^<c~>
+Q
+Q q
+125 134.002 7 -7 re W n
+q
+125 134.002 7 -7 re W n
+% Fallback Image: x=125 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 125 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%=\)Oi'J7NaV)$)MX:u"]7LbP4JdeA/[?&1-aZ1)-d?(:L"0nReRO;#gZ()AFJ5C2C0G
+ $sb%$?F1XL)fHe_2Fcq_"$-qX(N%c8g*^^"6S+T*NSce^n<f]W!S=^m?]qLB)f%_T.]S)8X
+ Z2H@)P65$ilSE?fr1cis7.:V:t*-Vr+BM7Patek3H^BTNl@nb&rCa=go[iBmXYI9Y^N%4kb
+ _6,%ILT0MXnbY"Kj6Xq>J$?5P]ZEb#XVh(C'?YZ!rcis7BG<C2)b"A0a,FGa@6L6Q"lIG+`
+ _YCVnaPX_R\,#j@aM@6"fXVZ]Q5\hd>LD5bp[@8F8:&A[@@9ni'68.+*K:LIi8K4j$T,pj6
+ ,NZ&=)sMTnZ*O9fbA&hqDAH^;,MlX-a8(bm-S4sX+=h--f`Jmo^iFa]6?U:h\F42_ENI0rd
+ M5`M\o>jKnhO$?t,kl&PDK."mKr4+,5R@p?`7qA808RYcY%+Wkt`63,elShCpb'U.#u2;cA
+ @&83-G4Tqt0t7"$O"GiafDQpu6W1,G&WKWm/sfE!oiXBHo*VTbp"=003/4ZINhQS1u5XH*.
+ Q@AfHT[lFVAMqSFIa3gZlIN::'6F]o@3[:h5$$UU[g4cIREDTLE3]\rUqQIu9L#$"K?Aq7B
+ PIHGddEj!FRU/0Al<oTFL0n(d@HgZ,)+ikQ17epBPNm;VU^R(nM>+'On`%N[<C&pVS>T.[<
+ efYTZ$3BbGjS\%RgY7^I>l.'734:qSXjFL4WT61kjFbi8:RUD1H@/Dg8#rB.G2@?@%!CeZ/
+ DRB=idm[Ycn].c'r:Ed&J@%?pM@i9.Cb.cIkVmjl@O>&men-/Rb'O8ob>gI2EmF.IW@[^q_
+ C9Z]?r'atf#"b8fH]4a^A1E,Z@^HB#.TH>7!YE1a&@6aeEVC7BC>r0Z?=:KkhMWMB[[c3Y6
+ brbuuphiZ.EbGF\S9=0:4gug,-AiiQV_1Q4LiaUk727+Gf^s/?H<'l0ZH[<QK7]>IfYdP<_
+ ."aV:k:,k]%Hbl[GjH9M?58TMpn3>b@=/!dFI@b*+95WS^tBT#:(iSI6B3h21O6o#Rl8+7(
+ D.67]2#!<h7FLCdmCcu?Y%9V3Aa]sW==;3S(P.YIXVP47SJc.4YKV0*)LPn7m(87S@uSTYq
+ VZ?_)YBAdW"7QcCRI=WVQq]P=NabD;n7'F@hj.BsS+(SLIjV-BEM!\Zi+!+=Atq_F[;t)>m
+ dg24NOKa\V[`&brPdIt@SPjn]Gcq8Y)~>
+Q
+Q q
+212 134.002 7 -7 re W n
+q
+212 134.002 7 -7 re W n
+% Fallback Image: x=212 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 212 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!$D>>.t0'SYMb#IQ%MW"EqYJlE%+&0k&H25\3W-;)d$1`-\l'%H]L`i*ShRG&E)N9*qucq
+ qWV+<j0c8sKJ'#ZXKJ%L'5H+CHjuQ3#.A1<!B0AkpWj$:LItB>=)Cp;_[V^\0iu^WmXeW@@
+ 9+jW#A7R5?B-o?+beQa*g`f<<r#4_r0cDjJM6EcQ8)=UeiF-n'o=j"llpR7o`2Q&n:j&eqb
+ i(BZG>eO:f\$kCjdV5\@g;I$s6ikgD41M;T>UZKOWVZd59BBHC(N@2((`!M5sK#3D72sWo,
+ ?B'\5*Zl5D.hjJ9>U_[[[Xc>[*BsD]hS!'#@8?q,#r9QQ=1im(<bU\])&@s[$t>Ho&9(?aE
+ mL46s#K\t:pX,)rUAdl=0EC34IOB#A;5cq^eY"5fY5'f6^%BGJ(V2('G)Ao$l!R9Skc1N#'
+ '14;^b$o3b-Y'aQ1J%iV01FGaHRbGFtKh-Y"jG'Q2XC5BnlR')[QAj:*&])`OX1h@(:CV<?
+ 1*n(g>k+HEn==Z?,\]%S9ns2O1"FQl]kTgL4rA%DL1;99-VG!2_MGcOm8f;uf<LU]H)[[+s
+ L/LpU!;tELl-^d(S0k"j6lr'mll05t$`B?A),h_(I9;<edLJu=bFS_aY9=W02nQ)fG$tA=X
+ )\&4'>uanuVC%Y[8gaT&G5%J"G]"oXW4II#2i^W[Y$LAdbhqg?nbpn4Hp>BAp$3cR(`dLZb
+ O*R!J;cO[A28mKUp"^@]A$:^;(E3jLl&t8Vf(>5Mi@9phRW7JMA;!6ej1G8ZNoL$`'gq(2;
+ $@[#d0+[T([EUl:I>co'TeY7&%>C>oFTK7]-V2$nD'ME%oVa%ipBiHJj<//e00U6ocAgDR\
+ 5+FL8O;^!Ml=A&fkRiCQ_?pG:93kZ-o6/K)C@Gu7Frf[uYfGjpQcP&[fTV=JIq$Dn%,(I^h
+ maddhcP>)Gt-)ot!:S0=/^ZX_WRZN&f'$%q8nHN]qbQXo-7i`)O?>i`@R\\@M2HtLpRb'?Z
+ Z!QBg10,'SPuX_<^Np'Ak2!T.jT\(=0I%E"gn6V`'WWHks*i0"N(kR_llI$afkaEYdFurtO
+ Y#L2W8nX>'>"EdKXHXmoQPBcg[11L,@2rf"GRM8DqJ[f2k/&F?^;$%<3h>!._Bq&,8B.NE8
+ qM)"GQH20f!+Ua5P7IrdILg]ga3f^O83(o]al#7u>HHMS^i\bg*Y3[?1?(j7.+'c;-o',<R
+ $CZ_O:tU]clcaC8^N6kBY`<^1hZ%hJl*+],EdQ5l8m1^)[T.`3Wg8GpD\`u]chRt*o"J\AJ
+ !HC52^`\p2Y#tY!DkN9YT&1ii(qY>3)?B7mj2Br<>$>X9$iPlDijk+A\/<1-W@k79(eU8hr
+ 1DCT;M4]$K5=)M51;#b\Z1JnBGk"P:H7#oRd3;(rX34sl0BD*&!Z'=#1fQ\T.k>U`@nu3=*
+ hFn?V3[D_.f"L>45;prm:ISu_-iq!NCMs&JcBBR?h=AHO8~>
+Q
+Q q
+221 134.002 7 -7 re W n
+q
+221 134.002 7 -7 re W n
+% Fallback Image: x=221 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 221 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!kqBhVH.(fes3@U&u5F\>Os8R18,$cXb:A(7Hea']J=%hhC]`5K>C$FCL:TF/%06nFQkV\
+ %8`;p$Am'cbA*5t.J<5q#B>Te(oGQ8r&mo)u1kM8+EuC"dc<cTU00cZe7(i30h9NK#g+\I'
+ BR_<$t/-C/U1s2N!9"XRu.BgP.3;UV&qjJo;_HC7I1d?'cc'ab8,-Fe:TlhpPpB?m<F35I\
+ (GUuBIG3o%hdsPN[ljFX#DV`/^*@_el=^>A5:I%1BYA`.bj4o(['"2Y8?+95Peug#&f'mFE
+ Ve=GL4ZkC$(Z+"/f<,k/`bI_d+u?^BHWLmrp%S.FRHMkl*'>(IAIHuCS[j,.F4miI2n(2:f
+ >sd]s+dX*D@We[]<g(lJ$sPSA.(%t/dMrii:/imIjQsePfbpiY*;\2l0k6joI+A$VEYkK$=
+ C"[Cu2fY$AC3Ic8V+P(\b1lB;/J06B11P9#g+C'FMHV>0+q?#WGE9j7@0Gc8]qR8na6FZrs
+ _eVb[hl2D&V-e-G^@"G.U5E$)-&-RU<<5&^LR$R6nRoD(A^hY)+JF*DD86XesNbY4Pe?Tp[
+ ?%3%WGc33>/.9$551aui1Gj;eY"9RuWE$)-*#0^bdkiPUlUTU6i:?_$1,W"aJ3m_Uma]U/#
+ 8DLU'D#X?/B4kl[aTuMF"^8L4,C4t,pc^mgo-$17[$o]P6Ve5\)*cN1QHI@m[']bCG@;kh;
+ >A"^W#)iH9UJ(W^-?lu=om?5,tjirfHIbH$-$";V&f7%W86+`:M)Ko%.nadl'e'@F*"/d"t
+ Ue$Adpl<TMQbX,dY0Ih:Xg*`?fil9()]WYd#AuV=j615+U!GgM8P_/Y"5]^hY8qFQ:A^Df7
+ %Te"E,kjRg7(JI6!GA/N[P%V*tD`J[k?*p>Cj95-4<'gNOE_7ef'1;<Y0GJF%i,A9U=>M8a
+ @KVOfnAtrPce:OU1G8#M[O;Js5cWC^=kgc_RJhTIZN#@2N[%/3K3,p-mcA0]:rQrOFnVS';
+ %Ld1OeuacjGESqUD]E4ClEsft8d5+.7</kckNZ%M%ZV/84TnG>Ku2]V&b.&T0KoaFLb^4Xb
+ Vl-Gs"L2Q#L+SoIs6*4>8s)h_5YZ"aJVoJ,8`7>f)d318e_'ubLu7Y=0I^%?-UW]4/9W"NS
+ /-&cTr'&3jlOg,a*k:o?X!sa[dHS]L.ImGOAk9Y^<QCK0_3Ton8=,o0YVs1s4o+EH+<0^P)
+ "/3L_r@5\<VU6`Y9K]$tIWC&W/OPa:*mTj^_m7m*Z@4ILNV#_A=DY+QLZM.B#UNLdVn\f/F
+ l5C/!LKtu"F5Ze&MO:^c7MND>V0Up<H8!Qc&I\PR03ZT6F!&$F18;&=b_mV;[mEf*8TbND8
+ ;H&]<"RqFb/2#N)eKKEY@tm@4[nW]q[JBX@]K?R:`SuWHU:.'OQu/M"cN[ud-l.;NYGo>tW
+ 6<<hJ@;eX!W-'pY]\c@.AGR-0YllHZiGbkUXA'[)ju2jlT_Yj'>s~>
+Q
+Q q
+230 134.002 7 -7 re W n
+q
+230 134.002 7 -7 re W n
+% Fallback Image: x=230 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 230 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!kqGt\ls(mTn9MFnR5&nA<.X\hsF@#S1:83CBKe9Ju$NFIkG@FPWd.8\.gQ)d_HXs+7sO`
+ Hhc(_/ib6H]rh";R/tCq2&mg.pJUSTPoBE)Erkm?a1=0f+7Lk54$0INLfRLS\$$)_s4M',)
+ +cZ'A0`'dD&+d*T$_*YD6e*Nb9YX-Q9pZa8C9.ZD9_FQS=:%,(UVd`\!+c_!unH1L4ij-%<
+ 8a+E@c-W3a29##=2HK@a"QWoZ<U`UGH1Y8J!4M-#'p%7LEUIShgmZ$#1/Sr</+<8/^f8fq&
+ m`(5qBBQf'qk5;&lre"SGQr5!:/6q4:UZ`3"N9]^([gK8>dc3)_'*LVdQf]PE6/_RE)GiWJ
+ -UbNQUbrLRc*1gG4+.l>IR3,!p\7`on.m=k18O$H">uW&!+q-Qf8Mq#[Oo7?uI]#YeY2VI/
+ ^d(Hs9f9r)bM$SK/d@?arq>BbNZdle8`jDf5o1SY'iMl0-@Y<E49LR8B8lj$po%K9'*8n?K
+ 7Wc(+#UA&b9Xe$r>Rd.,3"MJ$en4aXW`S2od>>5e>h4-a9[.P%R%]UU^mcGml5Kn[\Epq44
+ _Tcn[B8hXsqE'BdKaj\]/_74J!gat'>-VQ5c:S5q%2%-P+F:,^olI40b91h&6on:.HBC:-H
+ ?<phGgUuJ90alCkc$U97WZ]W/i^="B_o\,4/J*ka7ISkP]mB?O8BBP;Jj8SdH<XTJ7O+ILY
+ e(hjhj'MET@qi"a6_LpY]qmk$ru4o0QX-eosV-q\$sC+'4"ki$7l736/Fk>VhlP[bQaV5fA
+ GJb;Um*AbO41Z4EMurp$,m"/b5Go(H`+<oDrHU8MK@8?!Rh`4EMFI_cj0NBZO^>;7%(si?X
+ <Vr#@Z)UgqG5:/90[s')fW1g='YTJWDY0P$ESF,I"KG2["?+N6^!/r9YmdkBmbl_E8S$TMM
+ aE.48F_<?Q22h(^>,P!tM]phF^cCN%-#U_"p5Bt^.o)roI\Q2c!j2V6CQBie(FkA$kbmmmg
+ 2U'Q'@`t(9mFu%sMMD8h+TiWWGB7i;6ID$eqa)FH\9JV-?s[db/=)p!h31!Ki6:brYa2"-F
+ \PSK9++EdHtd([@=<6GI9O%ikKTK?AS#ne3;;Q06m$eC_OO/5[cGLA3"pkr;-Sr1J=,:+*u
+ HnJ'^e:GC^CR'G=:b<GBYTbaI4t#i*i^.Z*,h?Z+mDXW2Bm-a9oM<7j]UA+L"SbH$L_8rkG
+ !aK2,<0EtInU"W#\%(Bj93S;]d=n6_\j#[YTLJ<8+?E3RWTKi,&R/l&_!'E#<l2&.3npa(L
+ -@7af1"f\:q9g]"-f#CfOF:]\A10IUN%#u:rP<]uE0SM#2j_t$)[)+4GpHR_Z9M1_7JBoT?
+ ,E]X)acL>mp@`G%@C/?3[2g8+Pm[6&-n0Z^YCl!C]=NHM)*Ju)m6rq-T/b"X6_W^YC4]ihm
+ e=;E.^Pn/7Ylh*!CF!i#6ogk_`pcj^TG6N/7]E.~>
+Q
+Q q
+238 134.002 7 -7 re W n
+q
+238 134.002 7 -7 re W n
+% Fallback Image: x=238 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 238 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!kq=\P#^(_okDLhj)L`[*71d29iNMu+-HdAYG@C>9Fr&D+ET=@#R4$4%-j,#B[dKV9)"L,
+ +I_ciLt7"fgpr.Eb8;;O1`>952S>g>oa@W$?_XQao*eD?$g&T)ZFc4*PZ5^K=3aKiMi$Z@m
+ m/%S%ENo.Df(LroQ9]ShXsNJi/0jaK`mP%SDdQ]qmsNL%dd2Ht;'Ier0LC$3g?S2upWoP!7
+ C_r$+-'.6](T)Id!V$mlqr4p*?52U$-=>C\t=IIdEVms@63.CViW!s\JX&bYHk4WA6H5a>?
+ 21+XimXYJ^a,e!FE$<iR#KfW^*tf7+1n*@f<Ski]nU'uf^J>Y!%X3%)GB!prZm]bL63?psq
+ U*h."](I9M:o0<@U<<P.(XUu&eS!)O[3HZ'aT\"XOdt)@dEg&H[f//1jJ_1`iN=%R59J-bQ
+ sY$h%C-/B08LHaP=>RRl3R:nE.tS$jPeCMo?t(LA^t,Pa",C_._Frqt<=Fs-+s]P:"\tO8!
+ d;U5^*^^t6sG5LLoS6pUg,'"*0Os7GR-<,*;+,L=LNIY'&;9UV)C_IdH<]pj!1+IMC,-I<_
+ QI2j6>mHbmR)F_Hb`ocfY0mJ?QO@(ga%ta?&In1iRRMt3_ju.o[<E9=aM1'gJmdA:6/'nFs
+ &V@i/am<k[lSE]81^?dFL5)@D_HXLFdF!pW"g(d)Il0*GR'g[OB1%;,2n(1Zin#\^@Q&.R1
+ 4MLaM2".$[i_?tes>IZ'M+pNbaF*)r;#!M*&"L9*j;u_\uWBPVlbq8.6=T>YH-tbR7tW^U*
+ 42m`3NsJoB$3MSI1&rB(Q*O$\uMaC$3bVKS7E8U2IBM^Unic[hiit1_P88dfgd6M2)SWW6c
+ Mpf'M>aaN!?u5&&#sBLS;H9AGOJQk[r##I#2aA#[BZ</V::Y7sfg<fRI80B$[M,GP.gm=r@
+ u;9%:sMhKaMgYn$&lddfHgb=J[';SH4>q\9$^jG]e'C>,b-;VViiWPZ"=%9>q'>8B1dY"lI
+ -c%T$96EB\h(:4I]"3r#Bm"`JT"dMibS_[eBu%u4G/e^\rVNqhgqd)M]mZraXFu@U4$-#$9
+ j7DmIan:t;IOP0oC<I-(j>+gZ=&5$Qqb4$OqY*$R@:.TXTbh-UOd,N"%$/q]cMo]Z!mEnno
+ >uam"CJuEVXVVcdo6fZ5&+J.:0^9[^JL/B_=FB2e^IZBO1lF#-'R;1XFAX$5(km@^g4OmDb
+ -Kf[sf8'P/V=;sj&X4\Dsr%2!i2-65*5!!-tP"eUhcO,/m"4mhVYMi2RFQu3%&:GXc0>nc)
+ /?-Hj=b%m3aX^ai0eJ/gA66UA#0-C7=S/I$STbT[2>_05fNZ%$.Ti<pA,e/B]5CZG$4?49N
+ N_L*OehI^-otc*5>Qh7ij\#ZJ<L&kneCXG<FBHQl,GEYYNK#nH:_>t@[OW%/-tK2tb\$;]o
+ m1G*#r:^dT.r#"k7<U"D#`8_%oI0W?N~>
+Q
+Q q
+247 134.002 7 -7 re W n
+q
+247 134.002 7 -7 re W n
+% Fallback Image: x=247 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 247 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!l]I8%k)*641Va-87a.J&WT:MhsEZAbp-4:Ut=A7uj8bsm3<\PB:4GGXJ#WMK1%Pq./Y;5
+ 2O'So=7o;X*gmFa%tpPP=li^]!S`S(ml&]D#KWn%Q!_kPKOLs-fJU[n@m,[(UiiT:5U".B+
+ XX^+(JlI:T,r,!r=[US@8>lM,TDCs'h40.@e(kb+*8hnHc5$Hfo$.I5bLSsrs\ace0/&#UC
+ .UfEJ:*(b?oH0XPcm/6\7CY(%&6b=fteArh2WLmPKfs>'M3cO#nSitK0[ZNI+.W*ou<Dg\)
+ 2E&s+FpX1haTi>g\@V5o4j1CkcLQ!*=Z.s1)'*#Hjb62h5'f&'p[58F)ai2Y$aHuE?Fr+?c
+ 'j![=-LLnW_G"E:i#BQ/R(J84+9<h_M'0<UH1$1\#+mP*ZH/<84u<:nulE@mG`<V$<jipCM
+ qF#[d:/b=b*KNR[,M8]6#K7q/Yn\'mMd\:J[N2\9V!a(=p^iM40p5AGPG&CI(6lEq1^rMg,
+ #>m*;.]b;M(`)]R\&2t-I13O`]Z;Ef0b@Zrs)^@/pmJX2TEj/,?o@V[VL*boVkOsaeGDLp_
+ EIf?t;i+u38#7_4LbQgf[NFcM5S2H3Z@g4BZSfZ)%:rP@Ok#tk4mbe'(aqZa)>>\6nFnJ:$
+ NuE:k>h%3mV6[Bb0sTZVNCV:>aJ]'t`<ZlkT[_&hBB'c;&Y:&TIXULdA&Si\3YiSSq"PFIU
+ QUlU'6k9F,38>gfk_?`I.Lsg"#qnC'UA$eYCFU6#hZqX/($\Omd>!Q*8D@$4PJC7QUn(9+%
+ di&`l6r`AS$J_n7Nd`0fsQO3[g2qM$[!nA-2qk"Ue-j"H<>-IebaR"j%`+),Wr$h\?KMM>U
+ 1M7&O[h3Kpsk?eC)B7*Ih_bVNmp@d<:V(`E.=RW9u3EOCQs:8hQW\$lR!)@T$+niL.U$e0V
+ $mnRR3ob:DUbF&i8T4WlX]2(;KY]ha#R-PT9HW3+:lW24_a4qZRnhr>;V5FPAi=Lo:o38Rm
+ 21X9/.M&ejMm^%7#\]kflkK+-GB[O`@9G9R3!i7hO$Jc*KLn*Y$fA<?mDOij-F4jY]r.l&,
+ SZ:4p1cG=e>88Kd-?.VkCkoVQs#e+!eZID_?A]P^)a?^PA)U"*,KK2+H-a=@FkEO`lQ5t;A
+ bWd,_@,Ts)Tf!KL$bV;RgH/eZ5o3bUgUJ'8mG5%fVltRMm`R''aCMW_Z3;M'Y/B+\kohI'e
+ =^P:$W<p!$i:/!daNgY.>6fjt0b4El"^4%Sm)4N[a.5NV!`]=RtK81kn#H`\bU(3RQR%)O,
+ Sn=SEf"S_t%68pY0,*U9>RI<I/:s(PCImQ\T$_Q<\>DotgDIhGY+KVuGZkOt.97^&8<YgRN
+ k(/0L7Rh;,GBW]1eTJNRN<UV\Iia],Y71s)9K8MZAFu%\^E9?/='lJ>-e7,,#V/@o[.a!2M
+ eG=3W`#Pc/skTG+ZM/6M13p5r#`)6hd$pM~>
+Q
+Q q
+256 134.002 7 -7 re W n
+q
+256 134.002 7 -7 re W n
+% Fallback Image: x=256 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 256 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$CIjXd(bV!>8Q')&oY[tt=@O+oJeAqe7+(sgAOltn=1SYLWECgDe%DTJf/0%a>%ZNR]O
+ 5NDV,Oi=DPGUZgXK,Bk%/G:-W_D1<ORMYFa+a9h`9Tc4m.6cpH>:Hs)<@#D/J5&`>hWY>+-
+ j"\N2qR9l-mWW+*)%8P-=hWT&kqqIe,X.k1aMH:VY585r'V5<j5Ol%p'6?=&[&+6MqGCC.9
+ V*m?fgjQZ3pq57")hmcOIP4GTSNFZq1W[dQ1HfFFPSS:00-G$b,X]tN/CY/OghcCK"Ce<Hf
+ ,BNm6kUF/j'h@If.S8b4M52=X*(qDMhn;*[oB%GKVl5k2,F:'EE-.%@[VQp'*MZZ:^af&^2
+ Jdo,S>/T"(GEL30]$APor1n9o*;fG&UkT7a?=a-ZYpr?`T>s>-)$55LY1@:f\%urD9$)D69
+ N:<p;F+:o5N<ar)9Lc!s1lIM/kf[F'$u'$n@N_/f0@kEU?r\TgLeXd(FWi2E#c]Xm*0)hjH
+ 3O"F\iP4:eg(@Eb>c]kUQeSj!!EQR\c*lgs\3jlL(le7pg4U%!JJmRoT(f?9)[IXU/0\_t+
+ `I<pF/e]l4"r?k=6E6HB2c`r?j?q+m'I!ruukq)r;U,pfU7ktTsGBZZUMUKp30eq##Sk\(Q
+ ($C8rBY-EERQ9uhWH[OL_4e)gmHP$g#X^r>4<A0_'FN[3!6I@Yh[d20lK[m'U?gEn7&1-O`
+ 9VVZc89$c@"]_Gd3<,mJVOJN=.PEQ-_i($AGu!OafO+YL:(29+khO@TPRD"U]rIrI?8*]N,
+ JkQ=:joY&4<39a9[Lln`-eKH8%Ugd9rV\X&pnd?:RBtqY5S!akbdKR5(Sl+3Xk*NG3"YgP7
+ Ff)Xls[H/JZEQ4"2"GUSZ"9^j9UaU.XlDuA[Wn1-D3:?%=JJ,6;ccYkfcCu9+sMMF]r]6jI
+ Q:%34_ZSOAX6jBcq^KPs+'EAdH:(F_?%<HKEVU<aOfGcar\[a#)gIC^0TMfLNlXB.Ok%6SO
+ ;-*BK/rk/7!^6j<<:j7"@V:J!P'?J-H!"096%QVU[_&LFAfDU+qK7uCKjf_CgA]CChNeq:6
+ mBas6t8WcKQu,L0QeWt[t;eid?`N:/%ZORrf.K<SRH&>,%dS^5"F.rpA<Ru+\BacU-7@WG.
+ t_;2$NWr&q>CF:/7-LL,6]d&5:f&!e+s<k99(AMhUHsa%,VJj;pB0$k7&).`1GSdl97791o
+ ^nV&I=ui=u1cU)'Dc6K+1[BUD"j9GS,Vm=S(Zj)SKs7O!oKoB--J!-EI"FuFARf%)B`f'?b
+ -Aq9rf;7Q`4"2?2@Z>1pB`cmQ-^L0M2dBkc?1#e%:R07DQ<HU1e]90qG^LKai5;kEO"QU8i
+ (7BkaUsH,N>0:Y<_G4:BqI;mFWhr6[!"BUdI'C)(@Ll8YNbIHqK2)Yspb`)\1$\Ft)#4+R`
+ u"I7':A~>
+Q
+Q q
+264 134.002 7 -7 re W n
+q
+264 134.002 7 -7 re W n
+% Fallback Image: x=264 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 264 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!kq=\Mau'\,`RJq-c$'o,1VoKt<)@N("iA"o)&NB"kpB]9SY6k^j`p#A=e/OF0V<5FGi8h
+ #AqV6BB[$pIi,Znf!';.q%=KqaO&#R+B=Ddc@]E^:c;iK#?:9lod[lgD+*g?X]WrJK.-e*6
+ GohPI,c;H)*i;,pNBgVh%p!0N)h8gH83)7obD(7!$'0L.BP.24)eiUTX.EmL8t3I*CGkg>>
+ VLSb/A,$oHd/94B#N-A1!V7W4-DC@+i\p<o3WDf5$_5VeU52O$P_3Q['&AO\n:P*M'J]Biq
+ 8G;F<f$i*GMf.@N(5W7,\k(sZjlN[*SA275"*rW"r=?AT's(aan)kM%DB45o>5jsJ,k+Xgk
+ D'&RL(04-oX(86cp#3n]q!:EOHVJ616KdtC3=Z>Z8+15Ids0)^]@ER>Ifp/I!P(aAK5W,Ng
+ CQ==;m1bj25*+K"#K[0JG3Zi5*(LQX@&OlBINfU8"?q5*EI_Y-(MHH^g,d4<t'c9CV\jZXc
+ YW_M)e:&!i\hUoQ!Peq+'&St:-A090AM1i_!AXPi$R)`K7"_E,6?<M^W%mjFMt#(rVVZmIU
+ #T<POIa,VGM"L($P,Mh.BoB/WR\:i+q7=sLX!e.SiHdncYfNn3-'8hU%g?e0%ARumi[C3n;
+ P.A?@]tL<*hnm7^EH/:*k8nKpL-D8HUdrY"94;GXS&]Pn8&;Go505m1rd!J>S+ucu(GFM"^
+ Ge#/NslP_bX6!K\Y[8I=UB'`KS2T33%6+^b:&Fom-9Jk3!C9SNk6u%<%Slp<EGYo>9OEebs
+ jJK6c39Gp,"URI.g7M?t:9<Jl_JkI;rTW$&'7FNq)\Olg(#O&:i=\R7s-5WMp14BZ6q+?7?
+ Rd:sS)eGR-btOGJXaPGg0Op1tA%R^"+($^$7c2Nd=dTi=@p*u"X8YFLuKA5Z/XG9RRZm8*7
+ J/:Q$n9q!9_Z\O-sh7MVJ8Taf]^qfgd2o_t+*TQMrJVDF<irG;PYWP$-1`?k`^:umEn0+>4
+ m31*'1XSicXB*E>Vm5cM<XXt7c0%Hpa;Q.>#A>qZZtgJt=`s1>;b7:m!#gU,+nnJBNFa1L_
+ :2t0&8\GJJk?D;6`!(7.*hpL,JdJiN7tYGcPfN]_9h)e!PKY#$>)iV2Dg(@92?)j$'d!-bU
+ :Gl6e`k?c:SkQ?7lI7S..r=E>T]:SUu-Wgp-5>_;=$\V%O6RYbUe8AEV:R&I@;NfH;C<Q]n
+ ^oknkp#1h&0tSpC)bM;m:!EN-b]X;8uTEIMQ/=E$;CF*#O7h#&[(*;Jjb<<01U7_sT$\f!1
+ HX%TY:l"_Q-dcfmr0elG]ZGX?^PG-X_1`'*omt-2V$OX7=.B[e@E,g8+X8@iFMQKTo+`!aW
+ ZV.2`\"RXdi5=bt[pD::Qr>L%LWn,Rfo3d/lg%Ck$%/nZXUT1lN#==1I?QVb;*=[]fWE`nY
+ hAMn`jEM8q@BMR'7p~>
+Q
+Q q
+273 134.002 7 -7 re W n
+q
+273 134.002 7 -7 re W n
+% Fallback Image: x=273 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 273 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!kqGt=--*6ns[43XGC::`9HU?jMs+H%Wl8\rKH.*>*IO2;/0b@<>NRIaU'RF@[?F66>&RX
+ (6(/$Cf"=<![2k']>Slrf7McYp+*csOIK%(>odo02(#p\^V$FS)1YBi.a85Z#S_Q,U_UO,4
+ ITfch2I+qSfTAR'+A6:+[M;F=3>]V:"pr/T$Nl/e2hmf);>l'15KPFS0c3B9e:O'Q$i:S(6
+ EGODGc7gXh<.4n8r<g/r*iSi*F4U#_@M+<TE3BD2hDS<MfK*M&Cj5];THfN,uh7F=1*<L`E
+ R59P=qF<`A_H\-(TC;+CbejNq^s#us5(*%g0H6K8C[83)X-bD='#7SnO#AmU&7K5G@->h2U
+ IV"<kLqd-V_0KX_YbiG>ne$=Hi89UWDdg6p-mWfhH@LYZ#Cjr_1LV@o7JVHa^A4R@1*>./m
+ B+Oi4qR#m)>5?DaHcS-7?uoM^cluJq@`$^Ebcuo>64VrVJsK0>BYsG/11^oGKGue#)r1RM)
+ 9]RGgYPiBWL$A^$/TW,nPk&";.4S_[1M:?c.Z=de@Dlh;CEMp%G#%N^9?qTPB,AnJb(-9fG
+ h2^_<DE6H>Dcborj3"S&n/uk&umf#+$Zp$"@8L/&OYGX(`2)Kir3[Fs=j67c>XFZrC$O[76
+ R5/=^oAn"i%a@<2k(P?l$5qN'?8,]L:oL=pm:pC10_`ZM*E&j^2n,$nbW(*DZY^XlUV[&ok
+ )`;L`Zrj-:PW-#U)eV_f6feIQjmfBS"'<0gF:@h^:qGOmcG$%E')dIBqh.=rd0";*8d_oa(
+ R@hVOO'MK<PT-e#'LYBAYJ4TC_[OgY.C.H\Vh2[=jo)1(%_PFHC_A0[&<ZX-p-@Ch,p6ebG
+ tdaV#GOlf\U9jkdN;%eE5c,)[V^S+N\ljfNTE,4O/,+_0;3`nf&fannkXl.:k[-6m][T)0!
+ -d9F%%)8^6-d6Z7qej\0jfFL7#iC:h]7Hbj\JA$7"rU&?LGO=CMV:'Jlm+5EBpJicI8PLe0
+ d8JcT=R4OP"rskQ!^]ti5`:a;Lmft`iV/cZG^-HnM_`eHV&C6jkidOKgD_(XH$Q.*86?&;!
+ &cEj85X0S,%_F&[2Bk/!*].lg#&ug(2H=7)BK`GZ#LTeJ1/LQHM-6J"(3@(JAioC,9iq;Kt
+ Ri45\DI9<2ERZB?!hbf>pL\9NIXN=lAb@m,EVZ,f&6J(ScX]a=Ac\9EVtNcs8dd/]]>RH[>
+ 3+&t"4-`!MY0j,?n6'd9jY'FKLe"coR,,C"M9cS&Q*:`kWuj/Z8&)8hih8pODOZ;DS^>ne,
+ X*#,1P!jb?=^nk_O@E_)%4m`m(QdScVTJA6a!+$4]9u(RnXf[=4_amT-#$FM(St,jj%CSQP
+ iF0WkiGEhC6RDmq?4$gC#s:lL[r3si@E_pDWDtEm't9,MQ+o%9%-N]NV:kk2o`K!9'9`~>
+Q
+Q q
+282 134.002 7 -7 re W n
+q
+282 134.002 7 -7 re W n
+% Fallback Image: x=282 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 282 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!kq=%nfT(j-u6#H1Kf^o]#`;2>f!*!pAS(tXBj)E#%aGYj5D)PjG9((+"lUKEBf;(2Pr$I
+ SpK;NRa]$4%@!:eDT/$C"RS[H>eB&^VjgH#qDUr&sedk<%S3hnK',eL-]A1GXjJj$1K%MP?
+ jR+sZ!#L#k+Y,GH;C>Sn2%ic'dbg_([s96PJKD(V0d>9\>3&FfV7L#c11&s"&[FPsre]mCj
+ ffeXi3p[*<Tkg5ORa&C9R8\9<A4d4PI'U"lrR[S8qe>/9U_9$hCAoHNG^1L*,SXftn[Y#0p
+ rQ3>;db^SUj:o(MGJ`=V-qk0l>b@WaB'tdREVrniYG5]oEGsmW4#T!UV+V\,<Zt,%KIgFL]
+ P%lXI+3OXA]7c[N4F6lQr229oB.nYPX5kX\Yt>.XCuDHq!]F08\9$)n\KiT%Ltc4('IfE#+
+ 1n/bfjsoRd+;3/DBID!>ZH%F6;8_[cVD^$8jSVgjg)MaiVuWT?5=UEd;5BqM4tBZR?OEdA*
+ f9lg]2ae>ZDWA+*!Q]T%l_-;5Q?4`R4BPUTQF'Ar''K,-(ufs^;4fs>U2Zqgu7e`^C8N=L#
+ RGC<e(`JYPCFF)*odnu-cIPYU29V)Y6%g)pVQnc'>N?UV*44_m-:r@3fN2(B:m_h\N/Cp03
+ bU/GXAfrl?o_(o#b!6H[V7X=Ymasgt5MptQ9`,^fm_:H:)[BR(C"%%(ckS((*Y_)[9ne;,b
+ ";q4Al^@Go#=.%77Cog;RVo.3YK#O3FkP>:]j.LR6AQNLJ"5YmdLFLSf8AC`TKUDY3'=9T?
+ R45Xi<<P%RT83(s+B_&Sp!mq_WA8P`6l0QjjLu0R`@op]nf`H24b%c%_34DT\OlotUPnM`K
+ 2ec/miqR<7EkSqj(sRb^j4kg9M]"pX:a^SrZ1hE8<.]5&3DR-!R(n.6_o"1[U0GLQN`[u]b
+ _2\Ll&DKq>\KYK[eT54X1[>9!H@W0tR0gTJ<5]dQiL3\=f+>n[M!hMkNcp&'^['jT#g7m1M
+ #7'sg/HcRbSN-$'m&[C/.4M50#RY'Nd]ZqDK9-i;Qj/q"1Ge0n<=)0U^ml^-M%)cp]F)!]'
+ gj8=c_XShH<ON7lfqZsbKEd]?MjL?`'B#*ecNH+<F?#u'14,\Mij3\p@a'O^>YJ71>':LUB
+ Ba^PEV1P)N*HaD:ifOj[oS/gUF)k\g$Mrb6jXG2T?$'<N>#G2,f.(<WeNE@U(Y/F(A&,\oe
+ /8p[?H!nA)E>=''1/r38_e,qfO[<.%E:ig)lD'6nikS:JGkm=mn$.md\g#K2"=5stinK]a.
+ )!i_M=!QZ@QV(O^9];7q\B!_bDcR0c0&/(/dkP*!R?OQ4#SskPKj-NmFo7cU'91s7F,9`!)
+ iX!=Un78"jN8Eg>$u\KEUb2][WbR*lXF9gQL6jhU^nUZ[_gYl(8R#10%M"+'!%iB4M+7.,O
+ :1JTWK=T(V,Gk$O&mpkq6)95eo,jis-N%5lT,_6~>
+Q
+Q q
+291 134.002 7 -7 re W n
+q
+291 134.002 7 -7 re W n
+% Fallback Image: x=291 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 291 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$BhX^n'\-kr'L]o..P?Q]d3%@;iYG6F)RgRXi"h;F6I9E*()&R@:aese6;]3Te,m$50\
+ E'>L*DP.b`oM3Q9hsr:g0`I!i7GR@1Le$5!AudPPI-r-XYU%mQ9mOHdB<BAE:M2T%;JIbfj
+ fc?^?pU_;UX!`Kd[\p7Nrp<go+HR@%+Lp2.K>W$j.DCUHRmp6(T"1n*Xj9u6Mg5@(jbEqV'
+ a`!LdPEop'L`J]=`f7Z=OH+q#F6J'UNA6)5H\PJip?b,aqo]`/=LZ3OHI^O;K&;0G;/JDN.
+ (3mN.=5q&K=I"@2EqZ7udeJ'X8k!:YW2TJ94?Vrd4ch$54W:eXHdoWL/9c<hg9m&BC?1g@j
+ $9G1\\#a&CAn"]D;157*!,H1GOPOV@+;'NlI9PmF(\ca-'qh$V^!A_j2YXl4i:@&Gd_E+F6
+ QRLKu-rtKF!N!F)q^r^-$f)9#T%;G"guWo35TF'&FlL%r*r].bN2?=XYhZM%Mt"q!QW\p81
+ P-/hXsJ(=;6jV`QpD3]I\%O^Mhbi.VP+(GC6J@0<eeIdj"pc2O5qd3b!;.bLXsrDcsUZ[</
+ e83;<m]m2Eiff@.$OZ$jt%l7kp9q+TT7PKj*O@OYBUj@=Jqto!@Ujta:;e,%[-Sj]f(mO4G
+ (9psZhVJQcp)jkO.EKVf2L@?=3FLDh\s!e>R;QoGGOGD)`XU&]k=sX_lKW,_f/,<PA2`Xn>
+ (o9hPsRB"#`=3h@:?*m$dHM=`/K46(+mBSMb<(P3.SRb_ogD*0FW&H>)YopZe9!p3Hdfn:l
+ ?F/]V7?&N**c^iTc;!PF.!bbsNKr<in\<pa8i]'n<*YCRU^-?lU.+[TJ@0W#^CUM=9=t4a.
+ B^L:Rp2l52L)Y2Am96m-)P)!SogEBA@%>)c.7ag@4m5`,p<*J<7a?d]YYa4Cf"_fn5\KRZS
+ Rh^%jkMIaTkVEU=Uh#7,$2uE;7Db/\7:X>@K*hsIG:iKS8B?[R]8d6EW0NV?"_?Z\%7pW@M
+ 8j\-;NY[fb_X;;Uq7EY!SsNOVie?UI/^E4d:rjI2VGeo$J`\8@Oj,mH*ASN#mm's@a^CLK8
+ WQutAgdm9"nLuXXHY"Yk<+3P[XdkKY]ch<_hXr]$8,C_?4P;1[9DJ>LT%(X*Zc@\)[q%`DQ
+ 'J2\#lc=,l/2fP'5dcF@ua_17CJ!5gV*L%sE.A(mA9%P4<)\E.^CO5Y6()d+]M-,XQJCW[&
+ cTStD&Di&No3hk[XtY!3D#`T-&DH%PHS"B$E)E"p:1f\M!CRisBKg0-UU#k+,7\#m`aEsF+
+ (0^@N08!T&9"5h"41hrJK>71dK4Pm!_d)*"@)pl!c*)0ofWNFifW3o[*KL2+lHiQ0uAfDYp
+ ZHs>omHs$bPr:(tfaO.?K.5!dTN`A^_su)t2)L7MbUJf8RA&h3=tSSLOPp'`U8u#B:T5?!m
+ D\MN_/(F<=p0RY")-q+?nu0G*Wc:Z,l7h.fb8<~>
+Q
+Q q
+299 134.002 7 -7 re W n
+q
+299 134.002 7 -7 re W n
+% Fallback Image: x=299 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 299 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!kqBhX^n'\/!i-n7NaBM9,Z,q`%le6n4R'4XjKN!W@V;%r[]RV3l[YZRQ0ZQcH7@;0@D2R
+ S''$NV6UJku_H$PnI4Ba7fiPbiJQ3RC@hm+>JhR9t#V_@OB4o?OuB]^s.`s79-G7%uVY)E=
+ 8`eC7:9aYaA2eZlCQTJeOp':URI95EI+>OqAI"TmNL0ZbmAn:C&scb"3Dp\aj2;l>()EIrQ
+ (Qp(6;jN4LPVfOLri*F$"6DHDY\QZD0A8WhE.(k$olcbchNuq.\GVEk+m^TB'JU%+KZK3#Z
+ IGM@!V2nF+TgMY>F7($TiQ*6lI3`l\8P*&uB`>,<&:g&9?=']jCS#ft5$P]]HI]$/%hB<J-
+ d0sP$Wq2r-LKNPiTgm*_L)#,U8")tEjYfD,kI@kRbFR5ikW@=QS,*V4rh1[F83%PiCfLmQR
+ lPr?HdA0,Jg0P_VO%Q+Cb0;K^IN6be38nb<ePBm5@.82`O>`G;hJ\Ssrs'@_KBpLNDOto6'
+ @c?!QUbk<GLr0A+[72L@?=?md>5ZZF4)KqYZPkQtGkrkS[B'BeJ"<``L!Yckb=O4$p7H?t^
+ g5FN@oIf32XB:>UUPF44Z*#p"qR6i*2qXb*n\T@!C(803F:2+ZdF*>"!]Gq7f=tRiY+I=Ss
+ )IT&lQqZ-W@E/i^K`]qh(GoWV"Z*U)=i+ELRI9M0]mG%VY#WN\ZkjO&2`7Qr3fH*?aZQ:uX
+ //]s70O0$E;Oh$rr#\E=/*f5ojlW)$YJ+_3?^"-Qi]b!nb%>1n0&:B&.8:r4,9%mUVT2N)b
+ *?*!s;0#\1'5?Le?bK4o/XJ`i'V&_A4^)Ns.<LK!E0<)"]=C^J[*ubi;"AW(*O()&XM8"(=
+ oO4Gf+-"pC^I$/XOcba?m""O0lCOt^[++d7>%1B%,EQ6W@[`;C:u8UP`MSY0/A[8$&GSbfI
+ \5Q5s:W_N&V%NHV-hR=#D9D%q4s.=5^&;^_)\^?q;!iAZo!Z`7SJCS(t-kD@TRl862GpVn6
+ q/Xe&fSQE0aAT]P44M`SP"=[,orWq%'p4W^04%%%9O)NM-klYGbeJE:&W3qm1cE4g_nE`Q^
+ #"'+O5hb'Vbnj]-,0]gF_pc`]6=j8n;.IK6pc.h+$DqurWuc-'OnEfc'ZmlK,J#>)n(D(e`
+ Y8gYf-VD#TS)Y"S2%l=;WYAXp-Y&FDqfC@;OB3[`D0S1_-QcD+-nT&J<]/c_?UKhHmoILl4
+ Vmk_=hro"1D-Kso&P/+IZ=(-jbaZi]]b]WM`BIu)QQ3$Y/j.4Yc2cb"27":Pd=N/ko#Sqse
+ X_oL%hbUQh#,^b&H8d_./n='Hp*G&fqD/H`[@')-*I[R:<[MDZ70I$[9B&G[=j:69S=i?c"
+ Kp*!iGP?p4ZDoBNR=Y)<g\"/a(pRqU=Y&]%BZ!n7+q]Pu6IjeiOioK=+*E:J-6-SN5Wh./i
+ 3E%rH9M!#GCojeobU04'6F~>
+Q
+Q q
+308 134.002 7 -7 re W n
+q
+308 134.002 7 -7 re W n
+% Fallback Image: x=308 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 308 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb!krB2"Ld'NKklNMpO+`drspNbAuV7#?LTiX[`'B[fGF+c6n6@PDPkV1Ota;CnT-<JEqsLe
+ r'k>1qU2AZ/EnUr]tZb,1H`WPm-R$'^PHbEqgqIH/!;mQL<O6UUlmW7C1Em-KeTalPXV3'+
+ Vr,,0n2&[L(N+USN)%M'@G7?p#\:_=dVqs%0s70SNO(``J5nn#P9CW_JI8OnfZn)+.amp=i
+ &[kI"8iQ'!"Vk,r7IdUGaP:>J^8^%?3k#44J7n8W[mF`/\I=%opD9.G@)H^4)NaJh,)]S4R
+ D*00nn3:o4an>A19M$B^Mn.Wp<%@q7fu-75^s'6m$<Xj%ASK7iZ%BB2q0`VY!r/d`['[c+T
+ XAP[mHrpE*(W/>3qM&_&Vos<1R#b9]7`I9=N/b)N)THd0>>&;TeD,Z]3p2nRFqjB-s6%EZ3
+ 1t4DV^2:^3"QPo_3j-Qmg5*-WTYo5_/Ym"p5_F1NVeYD\Ef\m+M#6ZYn*Zl"+Dt#;]t"o$3
+ acN-Y$1+0fAb8sAZ(<?;tN3@h/,XGk*Q<*YC)U=RXC?B!^RgX"ZFDJT`E>LTHpkiksB9Hc[
+ Me&.u9hq/d^Euc6^_m_0t9h%UI80kC<+ULqF?/8IX;N[%`TMcF5*Xl;eg;hF]HgY,mcjU=P
+ 0^J$LEl<nGrl^VtS=MI>?7h.nBe1`s8L0jdN?mYhQBq6U3o!rtkEkJn'"W'-&q[Fqm$=@(#
+ \F/@AAcI;'^lB8[gl!TU!k0nn$TQ/c-:\(m3H:T:J\_ld3''q9qG_'']nP7YYcWUgN345&i
+ 0U'[qHAR*4BPp<:MRp:n!m.f?l>"h6#u2-TKLk"Q"BLVRa9)T26O?1CZ'7SOrn+[suF<\7S
+ IZY$FguSpYtH#&9r."_bqDi9!RlQ:N)EJl-ea=54e_QAP33a,'P0no55S@g<$j1W%Ft@r'8
+ r[LQEI$5I*qTC6K)jIraf+N"0dHH3r,*Jt&6Y?qeTL"k:Sa0g2ITrek?(WuP#O[,H*PEH&*
+ )QX.kdPNq6:8^oR#a``GIN=a/+;D7a<^O_&SXi..%VQ&ultgE'/"osO"V=]/k0<+G@DF:!F
+ NMR`jY@\'l05KLT+h_D4`\*=[s*5^6'Ve(q@nf.R10%#_WAYAUNc,ofE>RrBP.pH?([aMD<
+ M$@_85Z0LOON)Adf0DVdP$nBJe@'3e@?:-0*.51*3Xd_Zt#,5crU/X$,rG1cqdnJ*%/g@L0
+ d&i:'`\Bn)Vu"@mZO/'PFY2HJbpOad9lnEe!q!$5G\('`CXW3;g5F0Aj*>[!"?Tl!Z14<L2
+ (]F,!1Q=-(6Z,n_qNd1$E_SXIF<4Fsir5@4KjF"#._UXi[LAO98.$HJ@%gjQ^g6V;MUdCu6
+ `u<;_7+EHGK"P5;-@gR[OA0q'RnaER228LDU&Ik<Igc_o.[>LV;GBJos7uEr$\8uY~>
+Q
+Q q
+317 134.002 7 -7 re W n
+q
+317 134.002 7 -7 re W n
+% Fallback Image: x=317 y=226 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 317 126.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gau0BG>+3I'X\cJMolST\2>J)`Xm-!*"er86_[sF8ts.m\;b/YZ>>p\PfJM6AJCP$5`m?j"U
+ (V8/Pr&.(hJcK/5h4ob4FX\GW[%nGB;4t^@08@SU9h9kLZnEs0(YPkkI:ej^U]30Jl`?'ND
+ m,jEZ#F,n#*J55>!_JqJbc@3r1`<IB7^6paB2Y-3>uA0tWp(4Yj`m+J_-VbV5m*LfYj(`Pu
+ ;3Q!X1I=C9Mb5M2@^:oRn+W7gh,'h(6nBRYe4F&^Skg=poH[W>=n^c0QkN:%Ldq@a,SfVP-
+ cJSd0E(%'iabuWIhn-MP(D`%igt8"Wl'_D+!Uml/I-/1j\!rD<gU_NFg=i]Ff=G^2rO-=_B
+ PM8?U&;$Q%Sh:qn6jc1dn//pB@?$XB!Y#r7db,1rQ+*7A$K@s^(&eFqYJJf<]D[:lEk(.92
+ h%bB[N3scsSG3N47*UQ[<Q(q"2oV'UrNKT'u%u:.T'qr0`NA"VXR)/d`(`2`F64S/j[2eCE
+ qc<:#j6D!'!KU!X]V.ZlWHMREm.fW1t'03ee^+bpS\E43)o8PDf8TANdU91J@<m]OgZ'dk?
+ B@kuFCE!EE2r;"-R12E0jKjm&P#*IImB@>te_23?Xb%OP;Tcn#L(_H1,AgYOLe(dVdQ:[o)
+ V56'&fcU.iP4.6rJPOCSa_<7SdHAf_<_sn`j",qZU:mQV;cD.<=#\.;jGf-nBj;WcgFFaM4
+ rJXM^V?hPY#R"g77Uuo><b2h!Wtb.*S&[@@eCE*m+GbS=I7R=rH@R#\9\mQ!9&t'lCOk"=`
+ 5r2H"_0$^Se!=V55@f/]YgVcI<PcJcIJjcpmhAA5qN\VT)rQdXB";<;4PZX=,?iTr@0J<u5
+ Tn)AjSAA!N/E4Zq.64c2CH0$(iD<Ei\a&2gl132>"gP!Pjo0T,GW^)b`iCo-[lm?NqMDE!s
+ rdc/<N`RsAEUeoEHS.!S3(`C#sFUO+(R?>lWG,bKOflA(0"mI-k<E5Zn>Ihe86YpZ]*But^
+ 9(MQ"iW$c?j9`gB["!T'V+Xt"[TL,`o^q:/&nu^iKZMeoGo@O80f]%+T]E)QM[?[C6"OWKb
+ Yg`X3/(,&_#[FU5(kG\&"$Wm9as!i6KF7G*Zg',@Yq>d2*![NJUo7^At__T5R,lNd4-OYBU
+ E^VO28Y^Yg.9o8YqUq6]LRHE+fiA96iYD*KCJLYue%OGDU*G"EU`gb(:nM)]HKs)_hXS@Se
+ BR351'S+oY_J=#dYW[V_V*2USL'U>^\#p(`@<2\m3&gY*e1J\F<a`8nuab_Lt.OD#b!lK+Q
+ uQkt,e)CB&'eWhL.Tl9KT^W/RUP,"kT$l9Im"PaoW0(rar%B3=N%^,f7!/WrO.oK=)]!(PX
+ 9=f*F*_=j-\q,]3%iHDlC]+q^Q-Eq4*?;9t0Ot5FrUJp^Z*lR`^^uu'U<;)kZ"7=!%+qnAB
+ LoY,+\Z]uaIr0<<E6^t!-!0*&oAeR=W/3?`:T-W#qH!3D\*6p"9N*OO%3OMf(/Cr+[^`U.K
+ "?[-Gq%c(PrM9Qr`+,nHWZpa:lNK@q1,^o?3JM+`\'^9d%'O?iLLrlgjYh\%kcup%\:dM=)
+ a9~>
+Q
+Q q
+325 98.002 7 -7 re W n
+q
+325 98.002 7 -7 re W n
+% Fallback Image: x=325 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 325 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gat=jGtc\"(rq!-E&_.2&7ZG"THqIKW'La[^]ob;3"a!FTHZo\+t?=[%n'T?-KSEba]VdaG,
+ 8FWckUMM)jJ6\9.<:>"^6It'tF[Ye30Ku;d(`+-Z>I2ePDh3q0nt!f5KPI$!UV<`&`Oi@]`
+ ,J%LRoq/h@3ZOi_-gOMtZ`)N?YFm-jC]#Z_\CY-*MCX/`2lTVdL"]1YckCj%=mfohI0iTFh
+ rG*dnO,G!\SRJDEQl7=D'W3)U2*RuEr$AFbkT"V[UVpNaChqS%)]=Wo^OWe7241i/+<srp&
+ I!tm8q;]N?l0/kp]pe#ENfJ<oEe1E4NgCRRgq!'@-_7Ko26f[TJo^YUb;3e:4Zm',\FK<g7
+ u]@Z=Eh5$H+^'<I=+04!]]M_"hM$]OJV'-A8>+BR\M,!m+FV,>q63kk!hi2Za6KVI@B6=rr
+ *F%Ap%&ekMAAqV+\1*a*ujX)mbht]XDZM3d?a/rqu)4J:F1TD5,KFXJs%P'abE[F`BCc$q=
+ Aj8FD`n.7]Cd@^.O4-@2m\+H[7<ljGm:fOH@]^e74#<Pc69EO[DJ/EB\W:bg\OUD++`fZ[#
+ "g"sf+Z?9sBrr"jKT'sP5g9S$\\QfH50:SK],gT7\N<fZ8Q'Dg#adf#shspKoSNEUjc$+TN
+ +?l8Ra5V'"6_U]%F\GJ1EA:jtT0G!Sb\3.UkN9L9`Gc29%HbdDGk!^s>H4O]c^QhpMZ"-@M
+ T4W7p[69cICf4QrMHqY;-i!ZOU+Q&T:a^\0?N;`1G_s:^46?Z,A<WqkYV2kI1b5C,?H*OS!
+ q?">:1FN!(F&8nt\E-GI4\t@<rhI>Z)tl3t^EL2)S3l^B+Md:RqRCTC:J)'+1R/%c"?9#)A
+ ,CYlPYP?bQq_=%>b>VP^A[(3snCG-JNfNQqGM+p-2I(.`Ufn2c#'$Ys0Z5t7Wk#Qu^,nu(p
+ (,0OQ'&YZG0Unf.["mcK`$l>7;Y$X+lBbE?`2\I$'>/hIO<\,de#7]25FVGP>-RG#jM/7D1
+ aBQ+n*?E[4'FI8S&lgrU^7VhL)0DC2874JE[=q%<d&f!:U&kC(!isF$2E'OQiR'`14L_aoY
+ d]CZ8oo#^S2cX^a(MupWg>VHTpV=:J52H<\+amQ%B6<L:!DG*J20&B=-5X.4Q*T^hnPILm4
+ Kt2C2KO:oL[YN>+o2)!dh^mP61n"JUjAV;\9d7III55GW[%O`l?#lTqQF/9HZ/H(a:"3WX%
+ :37YC[),:f$UC4OW%V(bJehS+^+ML5+0:]ph#M*sBa3.rqT"c4MGcQDK<Jj"^F+^rGa%p@.
+ YrIgQYK6d><,Xb)-ZEj&knPL<J@q0l.b$]FnLY$(>W4?.sgsu]$2Mk+.dCd0+8L0Ja\03F5
+ -C@IV>o3*^Z9g;>nKZ6q)MJg,'E#MUTp?HBmfpj02c-Ee\sbp]lB8d&b$\%2cYe[M06AU5A
+ n%Je=]A`=rfJ/n#=b2a<.aPu]tJpBl+1D^:^CY8PrD/:4+[-Z4C/JPUUf6JQVWK,nF"Zl@J
+ t;p&\\acBeHoi<%.AXpcfJn2iI~>
+Q
+Q q
+334 98.002 7 -7 re W n
+q
+334 98.002 7 -7 re W n
+% Fallback Image: x=334 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 334 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$BhX^n'\+<l6pqG9C`9(!->He\U(WI*2(ha91`3^?(_[WA`ZJYlA1:?t$uHQu@`;NDJ0
+ Is+B7LHo(7:dlTLC7r@0"t1:j+7oAI`nGbNGdFcl_jp?;C?lhg=PBHg\H=9ht]&rk$^W:t0
+ &g<q1F?`5M5"KJGHt/38)(ON,8]31NSn=.Yr;+;2)KQVWR#P*tWWEq187b.;R;j3!Xo$Pu]
+ 9T2%Fe@OC$*4e(m(q<$Bg_9JIa"pHGR;mc]0AEGq(i26ej?=18Hc5-]r`k/k'Cu/troVP=s
+ &>*F?CjG1%nabnke8se<?Jt9ZSWkt^hbRj%'T3?5[%'4%&-2Io@J89SX>Od\DJi-L=/LmKj
+ Qb9f_8V,ik(X>H[;4fHm7KEb'!skfI/"Y=V%a3BK7d^sf$[GEp5>PMk4S&q,=e>CfYDHL%X
+ 3#jgY:2D/IPdgKE-GbdVsP[L8/73ZZF'B'lc<Y5S/V@/hF)ma(m.Q(`seG1TM7Jg5LuRa@N
+ "kf?7[E&5UBA7C7aVK<;8.XK2IT/]e9e5G)OtK+4MtG3j)#da"K2p\%&sl\32//(gUprE36
+ )`T:P>Udgfh2E$+e<WNsOraocVZXsg=Rm$Y*\U!,GH,0k(J/g;Y\U*pSBP:[P()$(:.WnoH
+ R<bI=]sG:Rq=ZD'H@>TEFG:8bM"&2I@1JYd(GS8pL6GQqJHM"./1.7)W9@`.D1??%IU[oQ4
+ JL6q[C!;3,gt>tm+]"An([TsW`A!f%O&9h:Fn%Fbg6SU6nD]*&gs;4Q2gWa4=(.O1!nK0da
+ OuCl,_'^@q2I:qYbb$T:b<6br^A:CAmuN<iuj:]K!^TP0E8#Anu0m"GadDY:a-LRSXi(CPR
+ YA6oGm@S5M87!9?I]coH:HG/R'uE1kn<6>E_:5g0d"`6JkTM0*n%m+qQ]dhA#tAMVA,^h<2
+ !i%rXX`)kD,9V80NI$Nu$q0g!PV8W2[%2?T9"CR(>4aUR6%"tR%lVKlL$a01Z1B[R<baF'n
+ 3@kEiTRoruDFCD@\[s56GWaluT1fDb*&=<jpSq3[179mZ>7r!;JUhL0_5DfY7pe><]f:+)G
+ jesaHotZ6Y,QtX7l;3BfdKKP5)r2lf\*6<C2,=L_-,aQ]=8kF!K?%E*_n_:7dTHA85"S.d2
+ KpYh=-n"Y;a:VY=<#_o_*a8X2A)FNt6O;",[(@N$afD(olBH_2aQ'^-7LK$*DeJO,Zm()fU
+ FYW2lsB2]%(=(ZKW+,`o6WGP8.C(lW<CA\(Zj1Z9T4K\]O2$pd;Umj!5^)"JNPB[n`GS2):
+ #\0-$O9NI@K?A->jnfiUBIZKB_6R:s"Y;]apkn]-XWE"4h'c[]1"!F;dJRSgN_<8]NRc\52
+ <L[lcO,UkLD,Mf(?bC9$RZ.;!Si0,j6@9k2We7XFjI#+d]J2YNDhuC"'c"EAN@;`Sf$:d%*
+ =V?7%j.GN)Q0@9dYQ2KWh+qLGTQ#F53Bs_p,;,VBHP/g"tlIHh7qA:"aYY4C]~>
+Q
+Q q
+351 98.002 7 -7 re W n
+q
+351 98.002 7 -7 re W n
+% Fallback Image: x=351 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 351 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%BhVH>'NIGU86%LL0qqNMd(#`g2isu*(o'qA'pi<e$UbZg&reUqAM805'VR,Ga>+G8P[
+ Psb,D/OR!NI`mDJ+VhJ[/u1$F5qKF.ghMnQ9Q$0u)ko8^kEJh=L&Yn%%WSbEr7\J%GKf]/;
+ T/AP#H>naUO-@L<8?-'t[nE%HXb<=&d6.1ln;6mAa,p8PWlbhQ\^jKht7Y?af9F=Hn\q;d_
+ e'94,.3-)q]&s"&+3INs5_^#-NjVPCD]nq]tk2fI-jU;?,Yt]K<E3uYrDsLH,Za1O>c'p0W
+ H>C]iW9r>Lp?b3cU9eL)?b`aOZaFg6RCTf%6cnA"hnLhYE[BuFnRjI,:Y2^YY?oI[[49DJ0
+ l5rD1>%VI\;n2[CY!G_D2R/a+8Oj-&j#u.Ci"`%8S0l(G*XL'(PIIS\:%TBmf)8']ckRcs0
+ -%UPJrHP/6]tsYTS2iHij)"laY,A\hng%=tlj[\<-=?!D9%\:N%[8Vf].(41eH?bb`cc1r8
+ V9b_6E,mHk!fcLeTPo=).#Rm-ciCi'8f[(tA$KBCHJ!jMt?r9EC/a(1os[8JHMK;RL3SPiU
+ UPuSA6Rc3LfC*5Hb)@[t+e#(Nj9R/a7&coS/Q*6/VSd9?j`ud?qP8<`b2%iJZEH/Tc2iQF'
+ r1I)C*;[dkG7RD9#fmU9,eYYNf%0gVAd$AHK6'J_?_;`2Pf1V?+sdE"qPpR@NuuKfr?bHi@
+ j;J86HK91;V^(?'&qh'R(8b.OrVJ(F_]j9=eNa_Ta`DB&JeFGnn":kqmiO,@Mh!Q!s<4GG?
+ \:2<;Ipc!XdoTfR`Ic9h63pP*o/S<1)e*nC5PdP5FY/c(aE8SP%G]hJV]Fl8KWtVrI6f^d.
+ !DI/(n(Ma+b_+c9jVR78-+SiiD@E^j[HF'c9`g.(>FSt6R%?SW?V'*=6orHpHU?-9UrQF9X
+ W`WB_taRA"R5&(B!&`h9#_"^_;mGc"?[>VM2)[cAJKD,"&2E'Dm<i@q7D/B`E1ZlqL(W)`5
+ 36og2LLAH"B<JCJSrn3MD(leF)Etf\=9&,>EEjKR"E"=F5ei['o-$M>gaG4)7dB/<Od`:#/
+ C_FahpL3fBoR#WKRn5fFm8QAa*r/#L--k4p"VR[:?[QMKHjq!`E05m_S\77?@C783guK[f=
+ miJnX2+j+GZq*P\T<#G^G13(T8N:C`j;Pk*C/Q%SkMU<7Io!6cQ>NbhDj96UNZ:qYT5TV$R
+ IChn9tQn0!5D:'.Y&(`0(Bn!Y/2_d87kP_F_eM1RDu5C7W#SN&n8c3B'E3)e&aq\OWFPFIJ
+ S,5R[Pis#PZ%pkUq"U/k%M(tb_GX5<+V'3`@JqN$tAuMGurlWH$/hKMq-cV*1=DP$4#'HWt
+ AVl7UW5[bBK`]8MhG&qHg2<slCFUca!TH<GJ\(dWf#gUpY!ie\[1N,D[2"R9.4^%O'*'UfJ
+ .l)8n6!l8^&G`0=>!omhdA8NQqZQ+m2tT]'[6~>
+Q
+Q q
+360 98.002 7 -7 re W n
+q
+360 98.002 7 -7 re W n
+% Fallback Image: x=360 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 360 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/d=%nfT'ZW'D'bDTV<()."&UeVk`2JX5&I`E=32=J9qOg4i,n:=dMNgse"cCIZ;c'9PTk
+ +Tu&^XED&S.1jatC%tMLV]cf-6#5puK[a"O;5eIHN]TJ'X[QpqQga)JEui8ko7$(WVGkieE
+ 0#%gjfVo:(_3!s:c@L6b7tQH.!G,q&:ES7-u!,^33ej>o;t=BVm]?[dI_6N!f]Z,_mL7Scg
+ OI")&WbL5tCeZ2jHp>#0,hM)5tgg4<IG`nn7r9;\XAnE2U7fGJnqX<&;q<@3@Q0]+V"</7K
+ *]aH'$O_lOqtJtQ#PZg$PN8l"?T;@uloTES/mX>pH8K=0mRNa)q<7)=Cu"6LX39;&JJ9;lE
+ BV!*Rl:T?g(f&2E8nipYH4k`dchJQ$2mRm,T/8p7RZ=L\YWQG*bT@3?spcP]9]^6NQ:>7oM
+ qsI=0*Nu#i^*o\S`EC7jc@0Y.\gu7Y>I.m(rDh?TQif;O*Ds`b!fTi7%V4Dl7;_\1LqI\oa
+ p0WiED21+>U&Vl?^]eC8lOAP;C[j6YO0Mg^$$_58Y%'R"Wh$OT'F-K<S>+>NuKA]YSMil)F
+ mPUQ.cO[91u=#DioF`lTD>8,;Paehlaio<>gr:ES1hbTF*-gX^&POn54j('[@:_OLs[Ph$(
+ ;,a5B>,4E,>.>,G4S@(P%c4gaFlc5hV^La0!fSi`'U%P)iSjduk-hQN??C;#ND7WZ,>;BK<
+ :Z`;#$"f/JW(,5/RJu==rD$hMVc1tc,IXEi7fPe0hEE.)\W_lp@7sWG+PaM_V)7D2/IeTTd
+ C+We="$kV72Hp9(DPlM&Zj+AJBOj$GtH:aLFV^A!R<%aAp/h_KaDPSI7;5pA(:9qWP#T6CC
+ '1'QQZs@1Vi"lVS*2X4Ogu'mOtb-qGL'R2g\TFSPYnq8hOH%DO2_LK.a-n;>mTJ",)4fhU?
+ j.cTAP\\\js#Ve%?g9V#snB&+UP9&0$_P(pRYQ097+\*h)=:q+sda>lcnM`/;rX`T"nGW5U
+ 'VsXuTg/TR@R/K,k2KL>hRF0+D]^s&daF9b*#rUu]-\a)4#%V+h;&EM;cqK<EB%U0Za6j?&
+ c[HFRqZYr;$daunqe&lB#_Q3(B_"?ZkPS,4$#b3"3>4(Z;c]_Mhd$VH@')tlEmpG)@b^C^*
+ SJ)qh@_F9M4TLXi4$ICb-2BWu9!!5*f;!j;/Tkf"agH,tVO(F1f3PZEo=5H=WNFa<VRbDrY
+ k`0eo)>G*m`SddQ!Z.@Q-O:kZSmrZI8^G#_T&Y]H2U[$s!G'f$Vk/63^NLUt`]N/jRq%=*6
+ _j'-_OW.7X0$+DUc@WurPk1Eq[&d^2_Frh1F!Z]h'>SrhV'Q0b8SMo:jYAlW0C2..Yg<@dP
+ X=Unc8kLej?qs[;/nCpq%78d!ZuW\oh/]2!\D9XNqW%a"%VasQ;/gn?.7=aIUOg/\J<(CD~>
+ 
+Q
+Q q
+369 98.002 7 -7 re W n
+q
+369 98.002 7 -7 re W n
+% Fallback Image: x=369 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 369 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%BhVH>'GYRW`MfGpW'nTN)A=E31e(t[iY)!aE?QZ<9[joRdAScKZ5#u9as\8YHO!2T.A
+ 6hY;*`9#)ec'E/3?f[9.<uI^m([[3S;QF7i=*'Ia#"+3GHq8lZr5rHg^hn2YMXu8't1:=dt
+ [Valb1"]T;UQE\:E7'kImiZ*DHi`/<X:.Y46I0<[aB1_1%XR;56cGE3jGHLkb2[;5#n0"j;
+ m2Wa!kH]WRQ]^Y4:/0CMN>IT%h%97%O%/'@YRFOX_S,;r6hVNi?B6]1A`U;Fp]ks5R;-UN`
+ JG:VJb:@#Y^6cm$Vd6q`o'n.9%/c?Y3n2bOAk!r,i*c*2]1D^`_hYd/?8"3QGd2_ro6'AjH
+ [>[uG3oEWHK)!q!uj2=n(ApFI9LaQ`k+a%auGo;Z$:M$JBZdmPq$6P$E;OVldq>]*8t_jbZ
+ _9'l0cii:`.BAKt4`+?n>U+Uek1]mPkclC/s'Wh%1k+hE<<O$)ocpab\%qTn='peX;g\2EU
+ *IS`HP9O]CV>75PesgALb4F6<bPR6sI5]QkYQ/iZ+?FcG(b;g@C2;QA[F:j@>4q8hJ:RJCV
+ c_e4foR?WB!;GNd7#bVWMFq1$"bMUF`Dq[#LcQ!o+B$A'NBF>T//maL,+iO[%X"Gct[B-IA
+ ^>:t79P-2k[HV']Of4X:bOkKtG9?sm6@.Q51]'6p#0rg"k<^$lJu1ejO)]/HUscE7RW#=1U
+ E_!oAs:'XgX>Z'\@@d@aglg]@IN'/eZ0j6aMNX%HU?#<N^:t9@BQcl.p&I%YKi[ho^d^g5\
+ k1Ss4q(eN/j'h+jQb.W2lprnbFm4b@AT>7(.jU(a,mh1N["W?Ok%O)Z27"Z't7Tq`?muAFN
+ \P(4oT'j]V\cUP!LtGPcREbl"&R!-37%+CNH^^17PG!.!T'rKr37-Vql/,7,CmjHKZ0T<D5
+ B>FP^odcZf)r$/.)T_dD!G#I!=5FLD(6JfP2<^8K8/'O'.&@lLR\;(=Fbmg[:F)h?[Vb\DT
+ baB"aisCjQ6dQEI)VZM$^]B%B^g@R+RF'rsNK"dO]'O5i'WoDoiU(VmdO>kI#"+jRi'DWT6
+ >L;7^:O01<bq!f[5".F@!lq5f[4,@DZ3O3,*.c(N^=m$CXrL:FbErH/mKe3#f&@6`:[lQ"5
+ Vec6=dDsN`!,#Bk%Uhn9VKG,nLbQIEFcoio_mt#fQ)^JZU5VLhJCl"=Gr*Xj'96..D>CL4O
+ *\bq5X<Yue35$(urV?XH>)`Gj&l4m\jg@\Bb0.hUCaCL:G-0S,2+QQZOP)%-Bo66])d4`(P
+ FVmNhjO:[KeaF![nf3dRm[t^cWWA.nBFK3l!^kGu*('[;I%,_5WX\M[Db%.`pe<nW"K1=<:
+ Qe.)5Wg"4Q(KQ&eoDUoLgTT4)N>Yq.p?S`\D3;rEb*i\FXO%XriTfmZBHYpVQsh7b%jgOWC
+ >+qF>\@+$<%9<OVpj>Srq;,tHPWq*O2.A$12q$Eq."T8m10s`'X@~>
+Q
+Q q
+377 98.002 7 -7 re W n
+q
+377 98.002 7 -7 re W n
+% Fallback Image: x=377 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 377 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%BhVH.(fa`sO=5uU,YE$rJ4i9T)H#N-NJXBa`&38dpE_P/e>TX\Pbl`8RFX\tM_)0U1/
+ J/`$E+6,aC8:U"BhO6W?>d:%#[C:SB77GGn`?2@?UFD2s3]ApV$1DqnDZma1$!eYQ&os/1j
+ kuV,\lg-t6X8,a*2AYWO,H15*M:M$1:ea2cdY-asd(I'0V1N/gf(X(#R[Y@!Wf4e(EtSU0p
+ Ad\0$bSt;6fi'>HD_s&OE9$a$L\U:q5,ii6Ck32:gPo2W(Y$=O[E<6rsm+`KCmOiU&,7q,'
+ XU0f3dCOIpp$8B^Dbo#p%q7e1'H!c@:H+5D<i)\-A2<]1PTr]6*56"oJ&Mc/ZSQOqEo+*55
+ ;$56"ZC@R$Nqt]52*I4M3h;p\T@RjmoDhG2EcD!(`B#&2s08:&I8a3h>>=K)pGfB`6g;arq
+ miX*4Y_96$)4P^n98t;6Zg*f]'l2[Vef&G3o%LS+<d;aD7!]9UOR,8sCbR`BcdST0EkKd"M
+ ifG'3np[f4aRqqB]t>$I3[Za%?D^TB(?i&WhcD:ntFKktpL;GqRbrqHtH.[;S=?;ug$k[XP
+ I]cg-Gr\J/:dq@rF(6/#qdNfGV.k>Gq#g_VXRtj%;?bBL`j#-#]BdtTS9he*0J]cd>iIb1)
+ +KCEE5BM%e?(>'(^qc\nWQ\$d.jtpq3A\b5*n<g6^H_2\mAdZUcuq9'kVX7lk$L23HWjYD3
+ [e(ll-j*cpWu?e5Rq4!3(>]`L2*C>GV?n5<GBL7(]*sXB4Z4p[/?ZK%efN3NCGDhnA)i$?E
+ ^?0<('7>?FpuZ@u%kM2:T_sE;"+?C"('Ue*.D`]O1cO/DdlKI4=:L>@5,dm-Ph]miNDcqVB
+ %5OU2ACIBtP2J3RIG68PXdRPO!@jN/[_m.[F?LFt3?GONg:FfOC!IEWqX6WHGVKCXZb]i0[
+ ];i>%N@J_ukN;IJ_$@h4NZ+G1I!9TMjGT\gegt_ZW/uU%.c5a:#23UKsGl]7_NeRbjfjOl+
+ cH^*YBYt%rk0995.aRl@7<A-*D:e[Z0IO0f'q:2]6&)%t(cML%NMM13oBtC"EdfJgqbgc3&
+ &VI\iq\W=cbPY=p@dq:ArIu^$W.!t@7umd6l\K?@^Cm.BunT>`.>@(Vh8^`RMd>71,oO?"$
+ .Gl;M!3/E?fAIT((:28ORiKA7)oI(*9V20(/2n)X?VjX[rkJG8Z6K0OQ0lV:(\]<jJ'YGgd
+ uPGgQ%d[nqqlV%T+,QWp8^0%:$ANe0M>a@RN-ORV_7;I*em59_?hP2rBC%W/CsI%FZX8cf>
+ !2C]&>kZ+Z2`]VW(rOJf&+X[M%$KO)fj)T]0I"#?jL8MU'q(ja;oFVRIPKT(u22R.qFolWX
+ \u5mH6^K1?N/mXH1`\'2=sh/MSciL3mt+G>oWYk0DaP6V3pZ(b'aeeX'nMD!>'q[D"cV!MQ
+ jN5tW;-C$o]oQkpul4On=-t8Ifo["'^G~>
+Q
+Q q
+386 98.002 7 -7 re W n
+q
+386 98.002 7 -7 re W n
+% Fallback Image: x=386 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 386 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$BhX^n'Ql^h+<i9bC=K2T&XOma=/%%?0t>6Ah3b.g6t8d+/MS[sZpb<1/X."RTp/.oZ7
+ .#f/8^VGZn4&8b,SGk!Yn=3Ch_:L*P_CWJNE^r?h8<d+5_E.pV)"#4n&:Bs4;b0HM.,h_ST
+ KM:mR7g9hK^L+(*:S^>NsHU,k4+AO;!5a--f4J#0&%MoB%mR`N^![JCbnO`U&%f%ICo-Vlo
+ cI/*^?rV-'RZ\d1a#Le\SbrC.JdJ<D0=0K?rE^*T*P*p[HC,(\Pg':-.V"j^1DVN2(o]3/X
+ @f^68l2g[,bL?(NL(-7`n'hFEOAE$_De4%_qm%t-k0D7%%]AgYc0TN7E%JiK.sfl(erh=1G
+ B]pR)ftOY10AF3pl=1/V+VDS[pqq^Z"$Q^?S2cpP4JE#&dauZd,"Y(."!'WSp09'8eJg`F2
+ \"PiH+1:c(5s<lH5JS1N^VF!fU9gn/]+QoB*;@4HapVbW9gBQpO(fhEHDd7A1h[)g/agJcZ
+ g^?fLPSnAL0q)`QVnE=$W.VG3XUSMVd?i^>Q#%Lt<c8,AH!+k*=I$H]o'rH[X*=[[r@B*Zu
+ <*UN1Xq,gWsQ^`m8.*+P)0DpankQmd7j2M7]*pl1,'S4')@tX.8&J=)3(@9j]E;d?n0sOk,
+ qCIhQX&NVAPJPW>k)H[@!YWZMoAf;rNLM,/\s!fK"3-9C1F#r)K1!`0W=2k[QrU1.*^;9S;
+ WX=7TN*p-kW:iHb^Ch%VPU,aY"kRN;%a_%;PSje%s;kXDFi35H2MoUP7qUS(G:[([->tl$P
+ cN99r4\W+$O@B>E)ggeYr-5)73S#CFh(jO,Sbi@b7_LpVZ.;!D.f!F3oRHGG\19A&/6?o&X
+ O,A1UGM7`+%>)P^VW1)_a/(a9$KWM3V++F?WnMR!p!3VP>)eA#tWhO_e+WlD\Z`%V[3.Y+%
+ J"dGYK-iHqZSb[\1L;;a'TgB8W4++u_r.BQ`&kMTe^:/58g5Yf7Cmj_ZkTJ^7).Gk1"7>H*
+ !'<85%eW<sUHL_I*HCDs-Z%J!\:$H,$Et::hm]bk/uA,s>RkUDP*5C>>ncSXK2,jLd4u)=f
+ <3@XF\5?*/$cKc?G5X&YO<9s?9a*1s"Y.V:=n@ZWDp=@H`+s-&d8NXD:g@>6nVY23"kW_0i
+ Z-1oZqPfUIM)3TjcN,B8.>`+ZQH<CP2C4==b:BX>4DL8cf&9T7S"@C'9.72)R(2a;F&I2OT
+ ;4[a_+&REZ;XKZD:-o0^p`;$8SH\BEWs*7PG<E7QB!J-@;tA7f9Ri9J0HLBt\Q/(s9dOqO#
+ Rhf;m9?F5Hb:TNO8E;(`o^'*@YY>\BYNTeI)Qo1L"iDIM)=jCPA$OqO0?s%sR[k9>;[C-k<
+ (`>,u#l-?77($`C8<Ns&N/1;a@=YKYp-MAYS"!DU.7DTd<(&uS?J_PU^u6GnOYK4PkRhif]
+ "h)A['4$'c)-5N>`bQ!AFAhB)iZ!9#=]qE$CcA=!?uOujT~>
+Q
+Q q
+395 98.002 7 -7 re W n
+q
+395 98.002 7 -7 re W n
+% Fallback Image: x=395 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 395 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/d=\P#n'S\IXQW/oJ<8;?oQO>MtM&Ok\j+Tst0k`8tW/37oNCG438S'=.#SmXV=WA9O$k
+ -T5.%*p>%NQ-M&BZIP>7kgHJ?lBG0MeU159C&s%Ms1D?f!X,3U_6?rc?A/rfN?Cc[U&JR[Q
+ ENA<\DflJgi^@U]\>U'ecTm/]oU6kP>De(_?[mHpY=n"lkqH@)^=SkV@jlLFE)5C%K!*^"*
+ H@)=:K=;4@?&ippL7--'_?.OuSW@(Ig+$$(L]/P'5p5$t_,;sB?i>X_9L"->3-@DPDc+\J0
+ 3&]>i?S<n<<*&-1Q-V'g8j./<@K6>*/R(QnXpnO?-=lf7&/U[@B4hfYYX8\%\*i5+Xmh/kp
+ 6ANYq;_j9'p[NhCA9lmYA_GVo/n8n-s*KH/mj'Ol-d?n9*,k\&qL3JhOp,a8NZIh+ejGWpX
+ dC'<GOES#(rl0g"?'cXem>2?=$3Y%u78os6]a[\*)'0T/4M`-M*cc9*?$s\*)#JZZ+lU%3(
+ Hn4J$nF'h1[@_8cD#Rh#/![-2RPbEJ-2I!ehP*J9EShsB$RR5;TtE4@c:M?kaKI7HfGWAtt
+ EWZiac+YSnV%WliMb5E>$L@Xp#bfi#^_<GUXI.-LKo9,9OUSH0-kr-\A))K>On(hQuU3Gs3
+ .Yt+Hb%doSkg8XNH@&(lIWg2>gf.BHXe&n16G)IrJ^fAFCm;3[=g3E;#J7Jkm+Y#ZkY^r`G
+ EfJD[FI)n-n:^ALBkH'gM:T*daGK0"]IfT^0@up@.@]5RES]7-Gti[cD..)EtjN+:S/7]f[
+ DY3hetE@,[$"C7:&g;Zce\64?]Iqh5-VVj?.Rb#V=U[3BK=?I,sP6a:Tre8.bBTO8bB)cM#
+ h&bIE33+<R@0+"]8AbJ+Z3qcuB(2@hc"iqD`D,'N_KR%6;\DVGrcjqd+E8rpK"%%d4#Bn.o
+ Bh@:$S>bI8o?9"'bDX`K,<mm*Q[F-lgeCW8`XK24r;Smgq#n9n,4%C"](-"<Wn\_M8>j)$h
+ YhBmH$tX"O+JO\jqN;n.@$nWFK)p"6;3=VMb.N%cKgU/Og.4FL32!g*NJ6%j>\qpU\\COh_
+ `%5d@5]q)N+KcO8EO_$Xe-\&ot]*X"P9:E;l*NY!)3/UREak#PlK>7lO7lYl<h9$+DI`L;b
+ 7R'o'bJV$cbm=7nrMmh^t0X5!J</F^?%3Y`u(cG\pK7]ukbOCm_6po[ij*rI!RUKO6?<`.B
+ !_GBjhD_ZL"R%dJ(TkYuFb!-f4qBEa]JXVNR[8LQA`]Q`R'X-NF"=]1E9)NBLG-JjS,m;%L
+ Ea%C1HoVo*gJD%*McB^_LgT%=E_O6@ga[GI,R[[MGIO&utP^iqLAMEJ<ZuHV-k`ZkD.KU!$
+ HY!-ZPrKJ-~>
+Q
+Q q
+403 98.002 7 -7 re W n
+q
+403 98.002 7 -7 re W n
+% Fallback Image: x=403 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 403 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$=\P#n'X\M]W/.rl6"5e)9AFM5/dX.M8PBhn0dLKj`b;)h8UM[1!X1,lSY7h*";o_,hu
+ GQ0*MEtK2GspiUJNkJ:mM/o.>9C=3MfF@[ntNC@@lWDU_!KTHbTC5F70")VZ)YV3X2%B^D%
+ C3B4M9H;[#`a[INc/@q'8*+<a%<S6VDH-HaJGk&S(KCXl$'Onicq=\1kDiSD,\hRo8'm994
+ [9:6SKfE0@[bJ3iLkMNlDgV%rF1n#gSH`XuSaP=eqrUK7-lg*0=q=Ek"M*=+ChVPMapB!'r
+ p/o-*g]29]Un^H/c^i7iEWtO:^qb\`N%ql5a=OHrY+X7%.23JXG32KR^4!2nCgh8=bkCU:H
+ [8/!g11C`:HV.aX0#T'""FO-$EK2GCb.,:%1X#=]Be_bM2?]d"Voh'PBQY9oWDIN%hGPL44
+ DH6Z$(!&RPcEG>[<b.1<\MPV2*+7p$:WK*p!+l'gI(J&J7m4T&0JGrP\30R=Z'nQi-b"2Od
+ @5Un9l4@U?-<&\`X<R$1J4OsMqT7j:9d/e*#J7KS"g.blZ>lIF=5!9e)q:h-ZdOAu)L_Zq0
+ =*4.bAgU8eKB,W`M*.mSE!Z*CAiAl`/Ci:ETkSUaE)9ChK*.[8:,l7#4VFKFpW)9OMbf[Z6
+ Sq[G@;%YGRqSj!*1WX,)&`n]t>%GGhinsf?qWcV4FmDqQI>]./p_Xt);-r,Rq(jMMWRXE!M
+ 3/B4PZCf#aiHmLNuL$PaY-n(^gk2S>J(f$J.ReZo"hI_>H_-kdab04(mrffM9IqM4Z\J4Lc
+ ?Ab,6+P]4+>hd!Kr"ha;d_pKfV6Q7W8VQR-3pF:8^apg_#q_1SPm3T@3%@j5MV?<^:6g3T8
+ =.eBDlQ$[6Rs7a33A#r=HB>`"mo]tBMh*sXeW#PCeRAsLRAoq,UV>d(*412R0ES:kY&7^[9
+ 2mGr=$>+@\;IoB.7Zp:q#0D5C7N.hhNIChd2='$7-q8.hNOI_pCp@b^OC]aj9GOLRH^H]QT
+ -gB9gPS5E<4L972G%(Nm*c,]4YX@hN-8Y\qm=`B41#N7taT+GnHKl4=d3JEb>$20<_62f*`
+ M?7AD+,DVVpSo;7sfOrmHk`=C_H0ra5DME!96+lLLD5FPq()$0ogud/r/?VPEYSlj"8E.Z*
+ CLn9hjX&>V*mrM\i.4mPFqc`j3R+Rbth"mHu#;)UaS(C"6t3?9\tl%0(EWc*k93=34p&#7W
+ C2l,]"En)$Vc3r+0Z1ncLk`'EWBm.bV7H29APcd)_FH*dY5N'1Z*a>O5\8[hOk='hJ,0I[\
+ LhE6)#O,B)7(\]jGc**SD5khKPg.G"l.4HAE.N&YfMT%ou*>K;V*?FaPAhC5kTY!l?JGgBA
+ 1\#0;6HnEH\6b:'(A^4,W2&_HKgWTEq5kqh@%.1X-i<OMYcSB6q7#&q"6ug!MW)iUoL(#?@
+ Wm^oWNRCWBn>/LcL587R^T\3Vo/;&INia05s+D>IfkBC'Uf~>
+Q
+Q q
+412 98.002 7 -7 re W n
+q
+412 98.002 7 -7 re W n
+% Fallback Image: x=412 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 412 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$BhVH>'NL"p;*ZrM%;q"1&pN,?r8AQ(9O&3i7&.bX(bmN>1)dPPN29.G+9buB!G'h4dt
+ %i07>mol<M1lY6mrTtV(D!6ASIj7APOY!dl'I(qI>!!bt6CY]mJ*"]mJ)=ht[!Hp7Ied['W
+ "IlW[OrF`MLKQWq;b<3Y'L_;Rqp>_LV(VUk9^X[P\7;Q7cOZt-=58B;;O('Fj@IeiPMJ,bJ
+ VVpeG5ZjXBTq>9b:>nUDS-G4Io*#7"kQY.3UZXb\$ZZCbNI_0P"rlKp*`UD[.naePh]m[L%
+ -=?/m&[uOWd_UQM-Ve3C5QBmBp!SYP*s.!&1\+@1-KbO9]fpWMbV-GA@;XZ4o'q"1DV^5YC
+ MaWrIXSSa%if%;D[&#dm+L/52ai]J+Yt\l4rCDinJ,D5XS;JXj3uqF=Q]299Q0BUA]kos?K
+ "PC&ATM+,J:^X.op&EU]Uks(G?Q\]D!U4qE(<&(Q3/$r3NmM,q,Y>hZO.8),YKO:V);dD8?
+ :BX6Yspo*F8/bfu-]E8f87Mm.Qfrr%G!J58"j1c'3q$?jtN[YdI$G<p1eb0ctl%WciDip%F
+ CG:qFfM)&i^JIj1V/CN\,&+f;+a^6&KP(3@PH#,%KPnHZ,9?XieABBcFAQ>!P,6QWE4EC]e
+ %/9==lKJWG&/**BR7+n9?GQYBJ3641+$t)U=#VuG.$Z,pk+SB<^:#rQgUC`fB(hK?EBAA6Y
+ $R)iS31o=*%PW6B:>;/Z4.'4[V_s9nZuk&66X2N]=N*4I5]:RX`e5_5k4LtlC3:d%^O.Gom
+ OPp-'F+'[q*KJ-iqa2j6OnE[kI44:%Sf3%H70B@Dg1-A:qh>=lPL(&BHX"q!j\T[m$ED1X4
+ `="D=;hRfL`m$:6##X&d2Ug@X^9@q_'e'T*?bj^A/["=Vj9e)?qo9Gp9jrm>/9XoFK\ijX8
+ BW6l5k-klhPKC.iW$8PJp`J]4cEM8Od82!5NFq/Y7_'32OR;dd764dftAMZtLLP?pBF^q2@
+ U-d#_IABaq7Ue8nA1V$/5atOL4$rG2a,_Bm\A9%+UP"3JN9<d]lZ<]6VPE1tk2tgC_Qq8(S
+ :H.b4aWpSX<GRqU^k4NXN:eVi!*h2Dm)I)S!hrC0^,oJSOPE:<\)>9WtH'RmbUZ%Hl/W>!2
+ PWuY)JE[(Q75VB7qCHAnIFPCdt1'-EH>$dHhaK:*o8_9)r^Vs53ptQ`?_[DJ"+)[$K8rQcn
+ 7!__m#%6"1/]>eQ"o1^\rMXf_V\OKcRH:@r?s8kK\LJr>Qf-@Br6;VUB\ReCpFR"nY@cC11
+ D\[f5k9#AJ=)%8;T0QAC]80gRYh2X5UqYQCiH!+9;:<p?@FD/mWL@"9!,paCqOG%,fd'cE;
+ kcUrg&#MAggci5-O:&T<T$AHUL^I(iVnQJ??&d'qJ\A9IXAV?#N\R$2#GI1BojablIm^E[U
+ 02CjK`;3RHkbi~>
+Q
+Q q
+421 98.002 7 -7 re W n
+q
+421 98.002 7 -7 re W n
+% Fallback Image: x=421 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 421 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/dB1u6$*5to3C-\P&..2d-=&abPN=omR6j73W)WHPp1ldq?1r_jNJPm(G<a.I[OFeSU.N
+ i,l%&HccW_gkeKSgm`PuZPt_;b'oJ=n"^jNRu;n(n!"^#u!ersfP<+9-"&jDo6Dg5"nUd`=
+ sFBIKLl.LHHKO;Nr9i*\iqGZe!FAR_Bea(ql^-^2/H>&rHTPHS4_]Qc11m+E1&:U6$$R>>=
+ 4*K.85J*GmQFSTssSND3G;d*G-6[n@\!\EO,l0!g3L$[S4BOML_AW'"YRlBYHpm$O:bM#")
+ hnEbc]D-I1?Ji?ehVZ)QW/+.8Bl/:]l^Qks#WV_Fd@fm]T<28VZ[0%*W`@p<k2%UiP3$1kN
+ otYF3IjWdh]I()9^;<:3NfOSUoD"s9^Zb905%V:F?90Ybnha&YcOpt/7.\RE8fjQoBGl/dH
+ AgJ0Jt/0-[:Z\R,bYa6f`e#Y:a,'EcNXAYs^#iXWe@Fgu$X.ic532@9N?nF6r93QBpr.7db
+ ?[\B^Q)C2!B]`XK-o)&V;Bg[*U\K9a?fP\\kX]tHWV,Rg6:7&#s+St:\R_Q)\X4?>Xq_M'+
+ JCH#X6c33=He>^`W-Tb%k7#7k@k;%J^,==hG)MUZ7g:k+E[ko;'/ggm)F>Yq<aTHs>bo]1$
+ kN?>F0Ed/_c-f9ZYVnbF;l5Yup_L(j,9qF7T95ri2n-r*,[b1@28*jDA?orXTX1o.V6X"?i
+ FGe6a:brG\S)T"f_D.kJ[78fA_JtC!US8M.me)hOB"\8P+.@TbF=t9h;)VI>,CMNbOJi-Oc
+ ehkRGd"R:a#i63L6d7L.*.1-=0?3qQ4*8PLCNm&W*\+'f[bSW`1AP/>'c*kae=f*()JKGO5
+ H4CX'*[VhWf>B(g?BEh##Aei*?h<>6@f+[fY_85Xh,k?lAf3PU?."B%^a;+B$E['A1B.apu
+ dmmr0$h)h]$HU;ObK!oN+>$Cc@g4[%d]O1akV'=?6H;o<@aB;jlPsR8aoiefJGMP<UNbN&>
+ ]OM2,jqm3Ya9b/#,<RsLqLSdU7l6XTK*S#"=Y`t:AnDr9[r+o"J"Gi^J]dge>1tGA,?+cY]
+ jj"c6+'mU1j4BG#'`d@PqYBcRnAZ'Finpq>""_@87B,SU]6uC9ChXa[C%Eo^5`\DfL?mK!'
+ "#>^07(qRIB6kmY>KODqml3lL<akp[3HcM>8V8p;gd#0hPQE<;rJj=o$E@WMCgd,p=E[G'J
+ g,9F*5.8#(LpE]^*qc.m<,3Wkp@(`.rH!UVi.pi/X"2f?D<oH3Gc:RRXpX0*59V\]L@VVSr
+ q)BnaFMV-QN5$t5`9RLq=1c,m\<,ag9)bE;IeHcrLMqCm6BBS07OX7rL-9E.s`3i?2Pa[KQ
+ Y-"j%Vl`[@@'a^X[8MPUn=%Qp6F\8eD\4lqipXtPX8"^1r_cdOMBE$QN'cC@c1%)&d8MN7.
+ 4G)j[A6WtPtJu8gq8%?&>Krs~>
+Q
+Q q
+429 98.002 7 -7 re W n
+q
+429 98.002 7 -7 re W n
+% Fallback Image: x=429 y=262 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 429 90.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$BhVH>'GW@jW2MF!C5e$`i[u.+d24_q'%aYP%N=@Kf*%)e%TBUuBraqNU*(Qm":IoH^.
+ FGu&6Xlm$Wsi@Q<'k7Kbd:KURf'1.1F,`@t)[ho:rkb^%6-f3VU7=JcF&GICb\98P4jg-Di
+ ORZ90\>/0q$UboR2J#7#a'nY.3OU+/3-S=JA6<2=5F,r9a'2!!%tr$th]c_$7_FXm++Om)c
+ @7fr,;_so*M-G$c8?b2L#kYZVM\3_bG$aWg$6_X!S?"8p:NSLl'q:;[<%3%:mf)tA^lNY7K
+ $29*jfb1Q:2u%[]c=OMrQ%at$f@5nM<R&cW$qC*,HTW+2=8V]F3''6/^78bQcW[c9AS9%g\
+ s*V&^=Vc>T<;9.]P1</P>f>d1T@j$(&7Q'a2KLnlH%1a\K"cZl#cp4CYV:4Ji7N=?a.=qrd
+ ;J+o6bCkI-/Wr!u9=*2.5B0o`&[phHqpCIS6G%n@J8ahj^(UbZ]]e+qVQ"9K+ndN;L;#c(`
+ OOnRU?1cRDdT-;>Zd("BpuXhAAn%U?P"qS7[S]6?mL"6!YZ+:!$=<E!=79gZ^$&!)CmV]d0
+ r4f;&O9q:E2DB*fC(c"oRrJ?dSh:ao/eZ-,ha)\+XjJoJXT`*n@`/MpAn*35:R[[OPll#ig
+ eZeGqrG?E!&pg<IQsdr3oD%jK`DpRalKFU[iBgs<5]'\.>BMeYVH9h?b^DOCWhi-j;,J2GQ
+ 1a&9Ugr-35tPbL0mU&B1E,tU3Rc=*(2gkA[4CqDD(+1;;M#a!4$*4aHH=>/"p<S6pn.B[Ho
+ h6!M%f6`C[iOkJgP*RGSba</7/7tlI@To&*?chOAR0`kVX:*K'Ib\O;WqD9EYm5caRb$rTM
+ qhe?ai4)4jl08.N:"R,=Dsqp*Nk4u8C=S674l62:QQ\qL;+#&X-q*HB,\BAUCaD#j=(_[)Y
+ Z6c!lda2S>>Ji<#ASK]CZS<O//H9+-C@AXJ09c<5%8-S-NE8q-HJY?in$5KtV&=Hp\X_%jr
+ \J#<[["B><!nXM^^qmR&&\O_e/ZE7#')\]@G';/RG8J6<2WX$GCatjS\%@"Fmn\F?T2qpZ-
+ JLp4BjTY7Cc32aSk'+kLZmFIdPC(H7G(n4OWgp0`&>L=)t`u8R#V(CpetJcm@B5rX]8@F/i
+ W+T6OYVXac_0CMo`IQ&m1O,dSdHGBku1se`^a-AtosA7^-;+#"OiFMY2[37rA?:(t!N&PLC
+ m#&+\^T*Fc,!TrVUh$%<l-<ngka>fu$`Erb;&KT-NGF7^b+#9oOQr^T`S61`/1p.Y2?a&q[
+ .a2*>J*e!m,]GGq]?ZH(egtUR,(4R)*MHR$FRl>mW/hZ3aMtqa@dRJ]Da>^**5q#.U:`FZB
+ l\iCf-47H"U"F%G%0hesNeGnpA`:60INW1mAqE&"fbqehJf.m)LOZA.s&rG-nh8\LJDg9HJ
+ f1$hMN*ADBLGJ?2PTlP]Gtg<2jDK3Y9pYN2@=%04#DNHaGC3?@AJJta''PT\N^)41*<:~>
+Q
+Q q
+438 61.002 7 -7 re W n
+q
+438 61.002 7 -7 re W n
+% Fallback Image: x=438 y=299 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 438 53.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gatn$GtaEG(rq-fPThP)<=k/@#jUKt`<iI[8&jN;`/>aQS?S[a0qCoZ;%RDVTh)^[76i\-&Z
+ !4BP=lIO@giBXEld3-!L6k+LKs9%FhW.g,0?i\^1l<qrUoc/T',irTD/<]R3Kf+fUi_cas/
+ *B>l4OFbLMk%Vs`70"j,;OM%hs\rd<fM*E?+)EH,Q`Td<%a4W^fbbaJCXVkkFUIY:P7:L$j
+ qTtgVUJY;)Z\ao7Z>-[kKU8"p/5ruP&2`LX/nVi)*e!ut-G3l`IA]n(84,Bf68WdL`Xcd%e
+ 9>#,rNSV4qp[-.EF1W5"nG)kQOksD*\b5CH4E#-p(<`pGhTG-#lIA]RMrj],+[S?*oB,0O/
+ 1f(N=NKr;=L7/\VG50:\))4H\TQt(Ys@e(/T%;eO%t.,<ecKP:7d[i3,m-Y!Ioq_2ND%N/6
+ H8OC,Jdm4bCS6C$AON_Le`Jb7cgP7#fX4LC8KX.kb4FcH[JXqj("FXJr0k9J#2nIW9SHk3.
+ W<77K`j6c7hBF2/4Z+T0/akN:"s0e`kj1(%<o.,NZ=e]B8ldhB1f,;lmr_1Qr!6Zd@pe#/1
+ 'Bgk_>SR]^eA>Bp8X"2QE&SPt/aZMF<^8@cXaUH\H_#iTN\abuOP5Y8h*>XR\dT;JNNK9%F
+ aTF2&[$?m6mTgp,)nU8^Y?2C4V^IipRm1[(Qbf=5,27gfi+Zk48!&AVlpMd3WOmL[=BKW>:
+ <18-^!4e8@q0WO?X6rCF`gE&mZ`HZA0*cG[rs@7J\mNg=&i7OHr`lJ=>V:>nR<3"j69]pq=
+ ;^dMOp]B_2aPtnSpT--H*lijlI"+?2F6XdA5$Vd1CC4Ic.6,Imd=75qU.nf]\SNdGuK([lu
+ #=fV-p#8,N1]-7A%gCkVe02`AN2"[5+h.1?CkJABdb;TLkS`Bm!I#"m'\Fi?/b>#6p.dk`^
+ >$I8;91k<'3\*;%+\saVS9lP65ZF(,r2&1-k!]HOgACAU!$q>c%#+*HmZWLl5on?&)LeQ(1
+ XfS;blsh"T.G8OAU!%VMj`WEfk@Gu)/6mFQbs'.qojfgRWN5nN(t=c5s7$oj;aCba7>Lsfb
+ 6_<AL`IXc#]V*M"<kL4SG=:TpEns669GNn-"K4`:5!F2`.8JHRM9fAenVnsf5%j`RI==aEZ
+ \rYO+rBRl0<Q?ddgC8nPrSSla3,7M:jp2qWrhB(HEA&m.e`qH]'c=I:Kg%rC/h?U!M/V'!s
+ \O3]894po9\T7H_>r)`@s<0B$V\s!p'6='&pE(?;nN_>UU*a1i3%SfS]?,u2"9-)I@NAgpD
+ ;gtgf\m+JGng8=4Q$rp!*"D_f#Jd&H8r?$`73,hWqQWMFs.ijn?Yg_A#G0Gj.WMrZ(Bpn^'
+ CcjTRD/JYT'ibPH(p+X'ZJf;&,$1kFl-6ngMtm4)XK:9EQGLjA$o^.HDRN=Ep76U*DL?[G3
+ PbH5l03nNIOR@&ap4eKQRj^C[=4$k_N5!9o*71FR[BHCWt<@b2*\iT,f8jIUQX%?>?_NjlD
+ 14W2)R2Qq5M01iC.H0)M49LHmmgi"i<b'!s@j7P-4Y-jiF2!"3:fPUn-]174J8dWN,agQMg
+ ZpelLnRBHW''ZbjT5jQ,mQ84pY;`n"d7id>/@-*RXp2hlKgF`g>`*fa.$HASF@1D;F%mY1r
+ @;`QU,1A']<*7A.r#oc.UMi/`d?U'!%d+3qp.7],Tn6ahUVn)WJP:)T6E;e+T_`9EKEb'I:
+ cKIKUa6-hp-iO>7[IW8~>
+Q
+Q q
+447 61.002 7 -7 re W n
+q
+447 61.002 7 -7 re W n
+% Fallback Image: x=447 y=299 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 447 53.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/dBhVK-'ZZgiK+Yu[_P.77+=2WVLnM#G66]fHOanB&7\W1B-qd6.$F1,Yl3tiYS$E>+"j
+ -fH!`I0E&-:IXlqlAnJ08'YV14p,oeC<WiCgrXk+>6-]Q8PrhK."+G@fn9_*;,OdpI,TALp
+ l=Ve70*OamE1pC7ZPl3BgL3$Y5hc)q<\D!#d8.OnJbQ`9&4!<LLt/@];(8XD(X(`LEZlc5M
+ W\"V^aB7t6-?dGs`/GJgSc,a!n>,%01K7gM3X?_MQ[#WG,j2XO;e=[@QePK8rOJ><;IJaJJ
+ RT^Q!%_!gs]&+DDJc+<W)S9n5cK6A'5CH_R?p(p(_?-IXSdeRujr?G#;,H2lbPNA@&4"d^K
+ .u:`TV>o"M@.GH=0D[0b[f;D`qC/ao9!651FkgZo'PhLm&2^Q&C0.EQR+6^5Z6$Cp[/8cmF
+ fC?P%)PSYkRMe+6:oj2j!O/YV;lI^T*/EcTdb^2Q*@8H@)RI]GYkg1]fhZ`&pFUgir*m$4/
+ G$1fEbr[sJAgH]!],91\jGhiH8u>$@5sfe'2&]d4u>[']=bL[48Q$4A@O6aLWG@eK@)i[$2
+ e!jJh3\%3+R.>E?QN0r*f6GcMn0(/Z5gq.c;7mnI1J5#V/0!?R^GB^s]R$_"6jHO=enk_o7
+ /L0;hF!oNIe/IndD4&^`f.NjLkj[Ql.p$[Tf^D@@,9YG[,CJR?dF$(M^5h"(+'G[%F7V).F
+ W;ClN*QNS-+aHjHARJe?C^%#%1QjOgu#js5C]uR+-?;t.DD;B@=EZ6Au>UYX6R`dER6[5XN
+ ++;(<^:q$EbQ$BJ:V@W#nu9[]OC@<7F0U28TAs>Z`,:62Ce]!jo=^<RlKX'g/:fgr77g6pq
+ m)4E&pDVZ[-1`$_Fl"Phr%X%)8cBi@#S;:i]5k<FEpU4.,cCZL[#72H6HKHRuO#]kU%,RA1
+ ;pmN<F#f;EBLK,Q_h-P4[>n+?KQG\p[BA0/'2,>.;Nu9Dh\YT#"RB51\8L[k@;0s5+;*]Z]
+ 2`)Zs0ej%bkqD-^\YQ1r\]PKd]"3pa8LfLnXGe].l%r!eLrc@l:;"2/PgrhY7RhjIe3,''h
+ 1UJH8jigQP`bLfcjVciH"(9Mi8KsFH,tu$HBspljmY[?OC+o`h[^10D/UMtWG+t"/p)5))a
+ Oq+FE*Xm69G&3g9i+O':3U@[W\aYoDS/4$KLT$o:"C&SX>c_)OfmSl-.=<Tr-_Y'n5-F\eF
+ oN:D'L"U#2R`G8CtO`W80qmMuA\-SI&(_?VTH1O;]2FEEP6*I:I/SPBN9+4n%U->'3bG(+H
+ Ec3Q_oqIJk.lfc,';;gf2E:ID5Q56GfA)dV,Q_2^SE0pSfNB4;mc5/,`31S2SGECGk;cB:W
+ 5Tgf_'tV6DaHH].Dp$5fio5jNh"'mh,?=*uh@Le/VS!ldhAdF#"l0]m:N^nASfq"8,9o9jE
+ eYMOB#hnL8&c^HU@8r-AS%Q,o$kP<@P0L?nZFJahr`!>oVmCmOlg7l]Vh\6NL_H@Knj/QE,
+ `]5rho9pD@ZQ_0o`WMN\iVUHJ@!Tj6ZR9L,HWh=C*!uJ'm`Ys).`=O8Kj2~>
+Q
+Q q
+456 61.002 7 -7 re W n
+q
+456 61.002 7 -7 re W n
+% Fallback Image: x=456 y=299 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 456 53.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/%G>+9'*5*g7)+k_abL"<\9!NsN,Ud%H@7[@4.tUTLQ(l:nLOrXTar[kI!?qfj&7gEDb-
+ D^p)6uXBW5u"*]pCjSkOF4Smj4gKJ,2rZ:;4BrHbXXJ4hpO#V5=44hd^tWpf2-HR@diCVe;
+ -M97ad)riKDj_(W7*L!IuY\\"4)pf)s$2*H:EgsSN#T'5D>>Pe0e.E9@6Vbb@ul:,Q(Xp5J
+ [FQ2ucOphfKcCN.hI_@3f[(E2iNOcM7;DTq183VAY:00A@:$nObr4R^fJRCLK?s-Vj?q*nO
+ \LK6SG5-$8Q<'`o5#gXuf[N;Wo[MHt\M6'G&KI<jo4E`fq4j-$Ys2Xbh>euRIi?R=;UU'@*
+ ]@D\7`-_LKIA66G+,BZ"N->tPa)0e7On#RaN3]BGV!E5]*:4^.k,b%M0Y#:HL9MP\RUDMLk
+ mDngUCZ6X$5P&\,rbT]QC.*eb*KQ<-)C&E,-thH$4QTPI8fc"h(in,ZI(gNhE'"[V`2Fr%:
+ )o:>FXM<,C7Ib/]9;lj8oBN]V5)gVO"nDL2/do>QXXXtD3qLT.8uMMaX(Z@;Q=H>I1/VQB,
+ -/<"dYG^5i<Dg'd;_4H`g3-'#t336T8h#dnF$k*L0m-52rhNsQ%2`/<P.eET)m,6X-J!Q<u
+ LPNbY"PlR7!^=+##XBO<1Tg^]GQKgs!MLt8oki"!"mtONpTn@><9Ao1H)/JGA)j'>A-duUF
+ UHamh6dWoj5Te!bW*dO8-lSE.B-tiN>r<6k[F>7h*!nX1d<c`AR8VD^s$=r?d&'(La-AgTE
+ ji<LG2#c_o@[8Als`PctP>t*YJcOTP(L.l,3-M@r?18_4WOgBcdQ]2)P8s%t!dFo$6[Z0#G
+ KN!Wl-0]T1e&9[+82E,dl^XBW0F#RS%uM0\*(MMh%9l7<PX:aOes4K1QDY\/Hg%BX2T'Cm^
+ uqLk4Info<E$+WOH:P@@uE17CX67`DQ6ARWFVM#d!U.:$b$4-se<7HGn7oV>U.=EcqY:$[6
+ i,bk>`$I#DMcfQ?s1E'pD$m@hGch;ZR=-Ds,Y@l.>36c,3@tERA'.;D,TM&lq#nc2cZgH,-
+ mdr'U:5'BSO9oTH'"?#f,$3He;96I$%@?=6W0(roW(gKmpiG9&j3jjmKTRX`FPjAYt-kD1%
+ uNDRF0EeNXfT37p/u;6q!'3jhp-!Oa]h6B"]iB>X]t1il+e[5Ep#'?/8%uqpaOH.cR(i1c+
+ l&N6',Gc;#'K6X&3INfJs/c3281d$OV?$SgAh\Q2`a,9o9#.j8D;?smk]!YqsUoAUrP+L/0
+ bqcaF8b5D38m%K1E0q7G8d'@U7c5gY;7`/Z20iY9kbYaY]e^ZMf*b8Wk)QBk\TrP[21jOIs
+ :fC<Z/RlE;$qB-D2s@aG(o<[gTE1o,)6o9AD%/#BJ'`O,N>\'ON%.1]n?L'HEFTaI57QlAp
+ i^U5T61Y=L?N`DQe/.4Q3RV[dHR]V*>d=.=GTF$2`^[_b_qCCrV]:%[\=rK$b!:dOI?N3+W
+ 0B_['fQ__a`^%n#KOW`PiDA?<"j0=&met]6?4N.Ih,r\1Cr.Bl!%<Y=CEN!WV[C![b+A_uI
+ l?Z,DZ`PQ1=N$^*.[@/~>
+Q
+Q q
+464 61.002 7 -7 re W n
+q
+464 61.002 7 -7 re W n
+% Fallback Image: x=464 y=299 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 464 53.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+GauI4#u"<"'S`4u[53GK(e##j&I&Xh!fC@o/hdK&6o/9sMkWOg&.gB,!J)][4;a@b&LN#2Be
+ <n[?"G_k7?F@q#*h&4Pspp+&.eutl-G;3O(i*SR,7b/9^_l*p[1-;h"0[j^?)j:IY6^D&q*
+ ^Js%OP`p[1IZ@T>fa7;-@;@,N8Zs'f?mV$PApJ,ht\2UoU$4F`Lkacf?bDeXL\l^M["PA+T
+ NkOe!Q;q"-Ej/"1"q!g0s1INBELjbN61#onF80neZH<%iBh6XT:0K2c_0hF&Q\>c5*`G027
+ 91s&_['_3\2tuZi'7N@*[Bg5r5/oPYJTQ%0P(u(ZW^WXkDspq8gLO73q#1(YlKV4t<hua1U
+ l%e*cCKlhU4T3i2)TX<p%;6YS3U&9QWM6W1VVsRd`mD:*pMsi9hn0h$=$ia31RLlHc$R5_\
+ <f<>IOt$jb90_09WtqfX>YUgUCNk;M$]i_a.7I84_rIC]4JVdUQ.G8,N/^Idj!W+T^=eT(0
+ t>Rl1GlapJuE5T24^h)_Pi,ES#ohRG:.:+g/QDYT.&]k_NA$F=s;4#lfEY#<C%6UREpeP/%
+ a:BZ9NF6DP)FV,qPYQ5;Um91Ps:kb<&3dmUDA7Em<f%,Xlb0CL/m)F7[9O@CgOs`GAl?i?4
+ XgI_79MD%AdqqH>]P6Sq/_G6^qXm`sb[;JP\ZW%3lf#bNrtuj5>#H"$m6eHliVRYpjJh\>O
+ m_Y/g0/#+YD,CVmFm7ZljDL2-IZXqa!s3M3h5#aUnmGAcQdZ[+)iin8tMTAR2d1Cf\+rJT3
+ ioVA6N02U2]rg7&3e>*6;OG"@['?n>)[:K:CD]QT*RR*YBrna85BnNrImg.M;PkKYDo&L1\
+ Me*J$mrJ?1:nUL-B[=082(1OL1CX=QKMb0!$[bm6I\OV+)4e%_cl%g`8>C,6LuMtQO'<:Lb
+ (;Isjd&EI=(6'VaBE!X=N+KPmdNZahu_OVg^$0#TT\DeBMnL?Za`I<h,<W\E"P,%UlK0rTY
+ 3FH7-:X<!5kEL^uV(0Yh;9>6J]L$7M=0Lbh=gK4]3o*r!M,ap`QC3ISr.m*j?iU8q3uUBrQ
+ ^f\ihp82M0B[6@n&\_;EHd)p8UfIi$Q"qNTt39VB93P,A7V?0ghSeeX72p=KkJEF+mON"/d
+ Mdk$6U-#'M:78RAm0jJH>D)pPk/LAS"YI@gcOIIq,g)O`B&#6Cm!l1;\1R.QkD(NIr5lLmj
+ p*"G+O$JQu>\.8?D*`g%G/miUi]m&dIp920iukD-JgBg)ns3I.p_`s8Y.F`ee`^4dY+M#@[
+ +G'4X^7U_>g&*$m@;HR$E']S[U)WlXuNLp=Y2]!/.$Rbk.6L7dpe1isEqPL:XYIM)i-`:;]
+ *i/(mK*.Q-7n(D8aG<gFP/q-C?-f+mVko[Rqr::8=]SQ94lUM0"M/>_nFRHWd7N1R2'F.,2
+ FX4/<8edI-@f$dqYYUBjQVMX_7$d2Q'Ddr)1P%C;:Uc"hGITCd+SiQ$HT0]q<h<khtm+f@o
+ h04d"g"&;&-uS?'7fa2L0Upm)''E%.+XT)eq#VP6gt+Gl8Q"-E4B6P0m?NoHQL^JG1rY:^&
+ E4;/bs*JGb*S*cm84Ab*UUd`KZQ$fld;*e]?%~>
+Q
+Q q
+143 16.002 7 -7 re W n
+q
+143 16.002 7 -7 re W n
+% Fallback Image: x=143 y=344 w=7 h=7 res=300ppi size=2700
+[ 0.24 0 0 0.24 143 8.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 30 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/$D+IT6(bH"D%+E-g/+#\Z7E[+D"8sZ;5u:&D,=s:4rM+c`,.*W7S"!cQg6X-jiC\*YL!
+ rFa?%1=)l8!G(e@'BXf6"UgVH[[Np3*dMU7XRg`oXns4aZU<c[2hJr4THZ5:Rrlq6O`)f%0
+ T?c2Bt;Iq,6J&.67o0'lS]G&$mMVN"&3fIX)+DIbL+0en``U<66$i.m"$+$F?H8ranos']F
+ `p=:T;FmsX>=tQ`/?!^hX(C/[-K*Ss!GNT29hZsY'Z#,sFg]ScS0L$rkI,9DVf_[Wd<g8q0
+ 0fhoVpX[hVA[<n]UJ&J@mdAhRCWDHO?f.nJ5$'[\bjtJQg9BN@G^Ep@GJO=OmbYX='gtPNV
+ PHb?M@=!)UbZO.cHh!'ORVc3l,*Drd8IQRB=`jgg8\.e.p&UZ\WO["qWcV@S$?SMorVH700
+ aTZma<C</?Q!1l?&im?q89'ZEgp/S>u2D0p(28Roq?rb[ns7NfFMQLEq4n'$1Un9ID3bZSQ
+ CmE\K5*b-P_bZa6>Zd*uUUlUbZq9\.hBd)k=u?+a9]j@J^9:!$`G0/$RtY[@K[hE2EQ\\)T
+ QdZPou9:(65FSKf,NJ>,CJ3BbV-V<DsKjq:"*RE/uO\m/3Ogf*BHc6?aN9pppG#W$7405>>
+ 41!buDXH6Ti8i"WZo"aI!!RL`0?&(FiF,H1^V$[C>Yn7BmMoPWk5+bMmd:K2Vo6Q4.EZ<@l
+ aR<4-R;*!jpWU7^81u?@nPkTe.em@iTN.f@@=3tZkVug?>+#4^OPCWF_k.27!j9<18]^2B<
+ 5AH%Ye4YVb;o*<H$_Z_(\&j2OW'5hbrr0,\et`XLW</IV@rQ/R,B&H!r%EE;KM.,k,.l=4^
+ ,!YM=X..+cDX[r])>K<mV':.WaG@ePEI4.>Q0&\mr[s+44FrOG*\R5WYKl]5OEF3]]9FllZ
+ SWRV\rPtK[r+VqhnYCFOS2_Z*Hn8L?F`PmN6Z@[T(30I!6;?A3?_c!IWE,\jur):Fh81JRd
+ GfB:;0=b?+(BOgG"(8t`gtB"=+X"LI)u^'Ur/$OJaoS3#BmSJm0`gfaPmU_,Xn@O-3:&YSI
+ c')P&)9Bk#hdbIkGtCV*&6plH9Lt*;7;:M9^!H*kWaR:PI>"5+kU^NhbKn&4<,Mpi'd`U>5
+ 5jr--Mt1=U)b%?m*N^&ifk-"cbD#o3l.f]]71k@!nE3MGG&q+cD%O+FbqTq9KFW#bUb?etR
+ $6JAd@t!fR1H6&B&TPmrH[\Qg9joi+o'i,E9.[fBOHTJQ`QPUNuFn6X+iL/^<!pu9JsW^pO
+ 7BR&mm-gOP)<P_+C.G>j.mRDs3P&LV-_)a?8'#h:/RnOY)*!-5XJKucNf'.,iUq]b*?iR.?
+ !4dq!T)~>
+Q
+Q q
+257 16.002 6 -7 re W n
+q
+257 16.002 6 -7 re W n
+% Fallback Image: x=257 y=344 w=6 h=7 res=300ppi size=2250
+[ 0.24 0 0 0.24 257 8.801953 ] concat
+/DeviceRGB setcolorspace
+8 dict dup begin
+  /ImageType 1 def
+  /Width 25 def
+  /Height 30 def
+  /Interpolate false def
+  /BitsPerComponent 8 def
+  /Decode [ 0 1 0 1 0 1 ] def
+  /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
+  /Interpolate false def
+  /ImageMatrix [ 1 0 0 -1 0 30 ] def
+end
+image
+Gb"/ch(RB"'Z\t^U`pPQAPlM@Q`P/JA4(+\>fgMTR5#N:P&,DMFk&tC+l+u.Y,oW:9-.\^=q
+ d&,Bu[$J;5/9<1R<JSXaU5"5'pYMchj6Yk<+-PjF2RWe@0Amr)jC8qXD<)0^r2rf!`*emB!
+ I*IU3[$)B.%f-\eNp2ZNr@ou@S5TodOCBOjM:?#"9.K*RlrJ]G@-i[E=Nn!]bG:QOr$=':s
+ 6b;[huV!`,I(caW;bKG5)9'u#GWDQEN$`^9#k`J>)[C#!C'JaFOd%J6B,q$<tTKr2C)B@8Y
+ YQ'JFj6-k.s7Amr]t/>Z(G@6^_?Cep\oGW.?X,E6HG&#C,^BuTmSG=;-n3R>o*PqL5t[#lM
+ q-Bj)?p:,?>bB]f04Z5qtD!N=+A!QgeiO7io:afUn^F=EVd'4=OBrmoQ[nU#$m^fe(C$o]M
+ N7=.P!*;W$qK;)%IY=!";!@a,`)3TJpf5$fCXKp9!<HC\@A"UI4eD=jo$0;I#`P+.&n'G4+
+ ,g$kKstfqM>n/q*H;I+O!eg\)^a_<Q:>:;ataCp[VG9N5u8!X#QE]6:`CWB<:D1^OK"HIY1
+ _?XnE9r]"slnXi$I?(LQW'H=)_a)pO,p?o?^\V5Wda,1(4DQ[_ic$*pFShrNE@;0LGL!nFm
+ lBM5F[;V[\n!8`aHRK_UX9T:$j@Rh\`JfonZV<]n&E?_hUiY_cGBeC9,'[t^mN)^I`stbtg
+ Y7tVnKLKS,C>@MHhbrO.BfRE@:@m)hm1n@a7R%':Vcc#fW0CJ9pq5V2<!T)[+L&HI&X`%<E
+ a,nI--C)_sQ>YfHWm#&>6pr>lXtfQ2cXQrKSnq92_S*o!s%pHC(%6)_!i%Y2f%":)H;a>d-
+ t47=u49?E?".YY=g[K[%eC>+3a.<D8>q,<%jq[c4b2-$m5n]lqXY5HB=R94Y?Rb0ktO8kjF
+ 2Pj#)#^+=$A`F<Ou[;t*;D$@#@de2pdJ<IS7_KW][?bY.s@pGE/FsH%`(30J@kjcNV#V=O+
+ a8,N7D\FKK~>
+Q
+Q Q
+showpage
+%%Trailer
+end restore
+%%EOF
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-ue-rrc-states.dot ns-3.19/src/lte/doc/source/figures/lte-ue-rrc-states.dot
--- ns-3.18.1/src/lte/doc/source/figures/lte-ue-rrc-states.dot	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-ue-rrc-states.dot	2013-12-20 09:44:51.000000000 -0800
@@ -1,23 +1,38 @@
-digraph LteRrcStates {
+digraph LteUeRrcStates {
 
 
-IDLE_CELL_SELECTION [shape="box",width=5]
-IDLE_WAIT_SYSTEM_INFO [shape="box",width=5]
-IDLE_CAMPED_NORMALLY [shape="box",width=5]
-IDLE_RANDOM_ACCESS [shape="box",width=5]
-IDLE_CONNECTING [shape="box",width=5]
-CONNECTED_NORMALLY [shape="box",width=5]
-CONNECTED_HANDOVER [shape="box",width=5]
-
-
-IDLE_CELL_SELECTION -> IDLE_WAIT_SYSTEM_INFO  [label="eNB CellId enforced by upper layers"]
-IDLE_WAIT_SYSTEM_INFO -> IDLE_CAMPED_NORMALLY [label="rx MIB + SIB2"]
-IDLE_CAMPED_NORMALLY -> IDLE_RANDOM_ACCESS [label="connection request by upper layers"]
-IDLE_RANDOM_ACCESS -> IDLE_CONNECTING  [label="random access successful"]
-IDLE_RANDOM_ACCESS -> IDLE_CAMPED_NORMALLY  [label="random access failure"]
+IDLE_START [shape="box",width=3]
+IDLE_CELL_SEARCH [shape="box",width=3]
+IDLE_WAIT_MIB_SIB1 [shape="box",width=3]
+IDLE_WAIT_MIB [shape="box",width=3]
+IDLE_WAIT_SIB1 [shape="box",width=3]
+IDLE_CAMPED_NORMALLY [shape="box",width=3]
+IDLE_WAIT_SIB2 [shape="box",width=3]
+IDLE_RANDOM_ACCESS [shape="box",width=3]
+IDLE_CONNECTING [shape="box",width=3]
+CONNECTED_NORMALLY [shape="box",width=3]
+CONNECTED_HANDOVER [shape="box",width=3]
+
+
+// Network attachment
+IDLE_START -> IDLE_WAIT_MIB [label="manual\nattachment"]
+IDLE_START -> IDLE_CELL_SEARCH [label="automatic attachment\nby cell selection"]
+IDLE_CELL_SEARCH -> IDLE_WAIT_MIB_SIB1 [label="synchronized to a cell"]
+IDLE_WAIT_MIB_SIB1 -> IDLE_WAIT_SIB1 [label="rx MIB"]
+IDLE_WAIT_SIB1 -> IDLE_CAMPED_NORMALLY [label="rx SIB1 and\ncell selection successful"]
+IDLE_WAIT_SIB1 -> IDLE_CELL_SEARCH [label="rx SIB1 and\ncell selection failed"]
+IDLE_WAIT_MIB -> IDLE_CAMPED_NORMALLY [label="rx MIB"]
+IDLE_CAMPED_NORMALLY -> IDLE_WAIT_SIB2 [label="connection request\nby upper layer"]
+
+// Connection establishment
+IDLE_WAIT_SIB2 -> IDLE_RANDOM_ACCESS [label="rx SIB2"]
+IDLE_RANDOM_ACCESS -> IDLE_CONNECTING [label="random access\nsuccessful"]
+IDLE_RANDOM_ACCESS -> IDLE_CAMPED_NORMALLY [label="random access\nfailure"]
 IDLE_CONNECTING -> CONNECTED_NORMALLY [label="rx RRC CONN SETUP"]
-IDLE_CONNECTING -> IDLE_CAMPED_NORMALLY [label="rx RRC CONN REJECT"]
-CONNECTED_NORMALLY -> CONNECTED_HANDOVER [label="rx RRC CONN RECONF with MobilityCltrInfo"]
-CONNECTED_HANDOVER -> CONNECTED_NORMALLY [label="random access successful"]
+IDLE_CONNECTING -> IDLE_CAMPED_NORMALLY [label="rx RRC CONN\nREJECT"]
+
+// Handover
+CONNECTED_NORMALLY -> CONNECTED_HANDOVER [label="rx RRC CONN RECONF\nwith MobilityCtrlInfo"]
+CONNECTED_HANDOVER -> CONNECTED_NORMALLY [label="random access\nsuccessful"]
 
 }
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-ue-rrc-states.pdf ns-3.19/src/lte/doc/source/figures/lte-ue-rrc-states.pdf
--- ns-3.18.1/src/lte/doc/source/figures/lte-ue-rrc-states.pdf	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-ue-rrc-states.pdf	2013-12-20 09:44:51.000000000 -0800
@@ -1,206 +1,170 @@
-%PDF-1.4
-%
-
-
-
-9 0 obj <<
-/Length 82        
-/Filter /FlateDecode
+%PDF-1.5
+%
+3 0 obj
+<< /Length 4 0 R
+   /Filter /FlateDecode
 >>
 stream
-x3T0 BC]=#eUeɁT13247 Q7@fcSkҁ8i "&
+xY]|_ǙI6?bG.b0@Y;:Kp_~vp@tWWWsO xI-UѼ2o|cެwl7<}ouj<3vxuCf{0u΅ulw%Rm29+F)fʭ\:B?V"i|iU)FeO';}C\\n_Nm=?6}~`xAi%?q1̈́VmKŴ,pMKռ4&[6-onAˌq9=[m, j]tku9`$#0}s}18N]dpJփ?O9:iM)}~kukFDq
+y|wvo+' Lai0I[7[PЉ&i{M!CQse&GSf"0W^nAgSQYqR31[җ˺e@_"
+%XgŖKkvAes*Jޖԍ>g$EYTn;~C!v @.A۝)v1NRba)uk#ml<nςo@@悘1A`fK޳Ȁ	PdBd!$GipxH1䥒EvſUW!eA8;<N@Pdr8aeK)6bJj
+!LG+DIA!
+x`=QA2G$!*A)͌5d},n)*FI7aYNmצ<rϣ#lJ'DJ%Gf0ѭ'o/ /ֻA2h(2 *MD	%%'8Vd☂Tؠ;0
+B((2asL툙u&?NZMŰKM rKjGomNpݍ"*:G^
+ϪxUNp缚UH*DkKP5ۮyۋ/LA.tGiʃWZbk-KXٗnM2v5
+Ժ.N(&/mZ*GhiaF#+(YII9IQjg@W FRuyPmDt/8B௏GIe.mPH_c;A{ BuJ#RH	1!3fBʻ@R5e@L\Ae5I`͐4U^,WJnduv^ĝ4M%4}s0#N?aKEuoZ6ݡG-wow_9"VO+5%>`b RO8J	(W݉Ȼv#YKG#|;;O~Ye-}Ca}-Cd ̂%*xcBNʴ>qA'
+T_HDSnzZ!(Kz>BUG:dU1{P+7}T){=,֗ǣpͰ+f&vJϻ颠s9Ǫ91ny$!<i<?32_#HJ܂fQ#<4@tB7컄a1𨞾Vv2.hm$vxPX/3Bx[y
+gzM0Pqf`113R	D$EzA,	sQ9h_ցIh+jF,׃EY@g%l Pbv^]Pq0DІ62ף((Ej0"04uãXxfz!A.(7Xx'JO6c%4eFaLKٸ=	08gUznW@vߑy<wߘa.ٸ'}'s
+bf7eU#{ú{;ֿ<r	OwI?.e%搛iӱhm	MCY-$hǎpbU$d!v"n NF-FSIҕl)*]cBNS'f^3e{TQJj8JokAgJʲTCihmv|~v.{<7NlUg女ҵW]j+fWɟ7fjH5~)D=2f`TWvP$P 
+^n5=3j>%~Ss\A]:֦MDԨV-z?_R
 endstream
 endobj
-8 0 obj <<
-/Type /Page
-/Contents 9 0 R
-/Resources 7 0 R
-/MediaBox [0 0 198.425 177.092]
-/Parent 10 0 R
-/Group 6 0 R
->> endobj
-5 0 obj <<
-/Type /XObject
-/Subtype /Form
-/FormType 1
-/PTEX.FileName (./source/figures/lte-ue-rrc-states.pdf)
-/PTEX.PageNumber 1
-/PTEX.InfoDict 11 0 R
-/BBox [0 0 735 656]
-/Group 6 0 R
-/Resources <<
-/ExtGState <<
-/a0 <<
-/CA 1
-/ca 1
->>
->>/Font << /f-0-0 12 0 R>>
->>
-/Length 1668
-/Filter /FlateDecode
->>
-stream
-xXۊG}rIu0!B{q@~]3K.,vwWIHߕ:1:S!䠿<o}ZwOe;U^kXsA꓎TOyҿ!OLs'Eq~8EXk=1'(SNA+ٻo>7{yT￁4-Nr9qaˁHnVxcMiM!?+ĥ^ؐj@Z]>ܼSP2ž_>BxVWۯy~쌅{gU9TGz);O9=IJLs&ڰ=7ݺ%WwErr[yJ< 齽(hz//r7 9rK-j'U@S\"BGIeyRl[؎"]7|x WCcaal
-ywU
-őB^ZzX,fTVkȅL}0h$Ӭ8k|</:NfY}ub2A`M4	0Ie¶Zl~@;G* W!pQؑ16#a	ɧF|l>$vڕhr*(UxDa=j.r)< dٲFQRhdBXw+U&;G3A1yK CqRX.b>i	!p>չ-ET<(z\!v9UNZ5UMp|wbqqe6m<,Olg֟ɻYT>v
-{M-D<h+5$X.$s`ÅMY0ƆJB2 ,քyDKUПF|y<;%\sG,qNK@\8zn`EB
-w ^~j!O76C,c,.1> G2n$L0LhV4F7Ru	gj83[WRQPY@xxBi5|w!b +`:Yb%HJQQqb(O-^'	C0G;*4V@$/2vk<Fj83
-'mLq&i<BmH7
-%buaaLkF{;qݞwU]PМ|;btn~(^3 /:<sSz̧n8&ƍԉqc>ng*}qT71n22vzzIfx-T?<>zB#o'i0<&\e7#D]$F/LlC	ن:(4vI	y^K|^gTrRBQERKQ,HLWg4 VeQAw*zo{ǺTJn=C\yBxD6&1Ű:iUGcmnNop`EI6ՐZt`-4Z~m[ QKu ʦW»s02Eũ%σ	MIƔ^wz-W1.5
-endstream
+4 0 obj
+   2409
 endobj
-11 0 obj
+2 0 obj
 <<
-/Creator (cairo 1.10.2 \(http://cairographics.org\))
-/Producer (cairo 1.10.2 \(http://cairographics.org\))
+   /ExtGState <<
+      /a0 << /CA 1 /ca 1 >>
+   >>
+   /Font <<
+      /f-0-0 5 0 R
+   >>
 >>
 endobj
-12 0 obj
-<<
-/Type /Font
-/Subtype /Type0
-/BaseFont /KBXRUU+DejaVuSans
-/Encoding /Identity-H
-/DescendantFonts [ 13 0 R]
-/ToUnicode 14 0 R
+6 0 obj
+<< /Type /Page
+   /Parent 1 0 R
+   /MediaBox [ 0 0 663 1052 ]
+   /Contents 3 0 R
+   /Group <<
+      /Type /Group
+      /S /Transparency
+      /I true
+      /CS /DeviceRGB
+   >>
+   /Resources 2 0 R
+>>
+endobj
+7 0 obj
+<< /Length 8 0 R
+   /Filter /FlateDecode
+   /Length1 12060
 >>
+stream
+xzytU9gSUNuso&!0%&i 2L@BBTD&!"	9Lmݴ*6눴vHNޮ	b{zU\goߩK(!D'H{}Rm	!i	aS@ܝT@H>Dei]3!xNuϢ<{	Iai%o1G>3^Y{XXM̾s'{-,[9dmp3ìRYKvJ-7LTSS9Qfjr:Z5oW%Gq,i+d?s:Iؖ2֓ݜC-OD(6L3ӏ;&N@:G#&mHkk̯%.6_j6pԜs8ҩOR3R}.|"?e!F9Si"K{Ӟ4f$+僲V>aY5Yi" \Fkα\9jZ	SԣZ1QðGTsR%rO55/H*xvz8[n2^7d%PE4σ(_OTѸykdT$Fr
+Qz:1dcƣnɺ8o/5.9͘&~xرv
+rJVv/`*iJ(Bi(SӺf'Ӽܾ}f.tˍ#枸㹗X'o*˛jKhwwIl_wHq3aoIJl7>ՖQ+ԁJFY^%Heo	\9:N?547f(J!~g)e\\`&LU7m]@m_ĤL!85uЉ+u\/L5F!2piQ?cs_iCvB1|dOZRph&I}l	*UgL%S]4tHt(/Y%+`UNo[kA+2qQ$h8@WL LΡP$<T
+V{\(`HbWqq<֦f3׃.5#+1-+(*	 A2h
+JWNKat)ybA*e򸚂CEkJ޴u,aם<ƨ5QPjXuc1LZQ3m8bhPC+lD#}x}zI&xuW!9A=fǛBA_BJYn~!hYz~y;Kg}+\LWq+Oq<"(#{mmx'6Z5{e$h'41=<9P gFk_ǎ!f=JZz(eA9bM/^A̸#%b^r(!\&1qiF
+h]ssMGM.$__0P}9I99)9ԜVlXa+J+J*J.J)
+eeHJJ
+WH{$6bfr竝/uP\R.N-K.K)V&WT+ScB3Qi]KM"MQC؊fwW=v7<~S"+->ۖ.3XӻV[VPVPVQ$HZ"J\`40ȹsGgDVt_^{}zhmYڽw^-Î|+b[q^`VV 8ﰠuPr;f[U9kCb0z 2t-+F}TUml+^O#f$:Jiw}`m+X'G\>8+jV+rw[WڸqUCMefo܍{ToػwE.]~CMѣޑf<Bh"DM>)VW%%IPW4|EZt{Z[QG:1+*KQ.t.vi;Brl'y!&7?o0n=z>om}׷U<ƳmUx]ӗDdtr	_/F&0U+s˰\cpn?z\xZ%-GđVYIWqJ*16<dDp(۹N`Kߡ
+_?2ᑄAJ: .^:|6E	=z|q=z: SWEXq?zS{NыxcrsmTك;@qĎ{F{
+_a`%tq#HHckJvQয6kBLid4&:X-s~:uYʒj~t1I&`6848ATlWO}6Mg١	sl:	ԏ!/XU^z}YG_KhYS=jK>#}ޓ:Mm"KT^简Rq}3⟕&-LF,#s5Ć6ő@`x[A'srHv,r^.NLMl;ҰcUoXbSf_>cۥ^,?AO8e?8vs4(qZN%ʉbkTLMC'5}1bݦa'׼Fq.>?eg"92lr4.h%MMfc61 iW%~NNEMq'Z=|H}^lt0b~1zL҅vaaYZ7Wtv~$#}o/ǼXbXbVYx2euv}1=;WdR6S{,zV]+՞վͮjڽŻŷ37?5	/flh0f8>/U|Nog{X9iDЏx
+(XnjyԴL\J ?wg#A$;Ը*5G*WVژQ#9AZ0mh7?f~¥$A2S.IHޛ'=@c0ju-%+%sX^	أgL/q	ȓ\YȪȪz$6bV,xο6%%m}ѹa͘SVqpsw)=<m{=}ݺoLv߼ɗ_ϟ<vtQK{#vnZnp. ݊S"26	qz~CsKSMxNDFϻҏʖז
+SC!z@&a:v7Dn,Kq^
+DTJU$+HPBURuu7C8"հgao;|'rc;;Ň}*jfik~ZIl6]-ew4>]+jV*Kd>-ga@,R2m]]ɪ`_-V6{7m[QQ3lCN{sR]/BIuGް$fb(	$Xw*~@ȯӑwx	[͈߫
+uSf"QzWU]QC}|nJ\]?¢95 &@:	n} @fh\EetT' h?/-a(fKi8.+V~qNZ>ñ31g&7XqZwUjXT\ hoFh){đ"iu^9OuNS:٧zV6}t4?R9yr_ѶO֬]JuSW??|
+W'*Zj2Ժ%H
+5uf" kSr[+r~p$%7#ٰ|F!n$
+*蓦UzW+6:y(EN؉mQv&ӈ2748"w"_o;IDB8M>x"OYɀ9Y"Kh@	?;0v°buQ{MMƫf x[(X4ʆ04	Z-l-ǰcP'&ޠ;bZJZQi7KQ\>Mnd[m3x֏7섌r
++$'o `z&AƆchT^ɉ~]i'GB3^\r_b̎v	^fyg4:j&CIx "Ao	SQnWQ0¯OKQ	.1qSD7]#GLSܝio1n̈fJ-5j2;!_aZ<wկ-$TO:\̷Mc#ϩz\`,2EodAWn=OQmabkay&t2`3󞉮Fgg!<A7{vSO'۞nc6:K/3<t$?Ch/n-Z/GQ,ZΡ;:w +V_א8`Ӟ.F&"1ǃRBCwcW0#`t\e:ٟwR~Ym?V_|m;;}Yd%نP 	y_]{A
+:ƿbzaczN__wR
+u)!#[$e[Y+t;>dw~V$/B?k?rΈ\CTHQ{!Ηq!ӽ+s4J632l!lp-U0*H(/4.o[6y+N3wߊ:;lLg2a f'3Z-@ R]Ό3Ht[2YfƲb6m`h)zWhLXe6݃'#3t+}LtVm[;Ӳ~pd+Q[ۥ*ɫ4,J%Khqc xpgJ)=运'9e+Tٟhd==?3uwD7ͼs}k6~W`jPPωd FĞn/?mn外Ψ%bA'ƛ774;d~1M	|.8yH|WMx q9Y<~yĝdgΰ/wz2۱]!t5{ƹt]޴_yǇWzk{n۞+K̧!Ģ%묄N\[Z\cÜ#*Rϝϖ++
+Qfw6Ǩ1
+nwU(m#c޵5hL6܉fW5K2d'.fW=wSWq{`F:נ$+LDj-/T}T[Hهd.ε6].Sfj~Ιzs>G_j3r]CoZkEy>bKG[sq{,uЊ2QEYF_1}o"^۫y==<ηW!G+[6o/yۑKgb1 ڻED?6y}&m ܎/)Q1+3H=p|;o;.?ER~~xִ&ʏhwC5beb~.@w>"(%~b@#BPffta8.RxUq;Y<IWڕe,$A|觌 CP6J)-#ߚEbR=N6)YFFƨUKNͲߋ:bgH"j*W*N?
+SXQ[1+mlMD>\zͥ'oq7h{eo7v>=ӑuZ1VcG4=_Faȶoe	z~Oꋐq/B]6F5߲#H
+7.ܹC,Q	Z+ht	<C)ij;Hw@_W+97ø;f b|{"fwY+nVnVqNRBgY0Y}i]yd]ĖBT,V*j9g\o,uWU7D7$B_&7kVv{wA]m{7Ex*]ox;p@M7h|y/_ˏ3fr-ԴrT8lӀxIi4>HcppNx@xojZ{RKoxi(_p/8K'1Jk;øGQm!o8f)=%)pD҅d[qD%Hog]zW8!JBq{&>ҝd2FbQzr׷n$݁gxy^e
+2Cc ɇd99H^%`Ob4H]>7z~$\~4,. z)KW|O$&_b+?N֓I+g7#$قlC!9MF48<YW+N[\d_N$װtgig^VNƓJTӱ[b;;Y@jɇp́
+wd}DPLc[wRY^Lwx:~y݌#*%X(~@VcOI:gXGMl'#H/!&gJ?=$Ǽcߓ0_@YY+j$daYRg~orjr:RTYoo/:XZHn~֫IẶC:jZ<^C8FDFׅ~p3"E[h?k@l|l{e!QX\A-eJ9瑣{,"Xk\4<)Ѳ$s+ oR2A
+C̱X!Hu կ<ֵKF<2	Vˍh_ߓl|ƾoץ䑹19`ogyRY)-?@X1y (.ܻb:") ZܫP~aBݏ/
+닺Tw:SOHl,FP,94g뤽&R?JG;x
+3lmC,UZ%C.w.I׋o$\kCW௅p^_rsė5p<7<[|gg,\ |Rg%|?-3%|N.N/Sć>HK%V8q<Yp<Q	Wp"Mޑ𶄷$)	KxMBW%2aehP
+^yyxUxT^o2ࠄj%I/a_	{2س; d NjCs.g\xO@->R[$l}-JxO>','qux\¦$Rul/<>xT#맊G^G*_gSa$][7<|zXʀ*PU+QR+3`	rS<$a	$TJ`?txPҥǇDy,HB/,p|Ix-0$̖p{Rfb8[̥pJ!DK6 [v7Lp)&O-q\(a<Ƈ`qpsƎc%	cn1nÍFFQQ02#FaKVCk`X/qC
+׏K`	]A>qm AVz`	E/o!!߀>ɐk+rlzr~傞У{Qݳ{d[fv=df@CtA]$KHA*35 HidBr	$y %(!!O$Ė@J*FB4!	A	Q@@";%B/_	x%x#O%A4	jd~BWAbZOKV=_X%"
+endstream
 endobj
-13 0 obj
-<<
-/Type /Font
-/Subtype /CIDFontType2
-/BaseFont /KBXRUU+DejaVuSans
-/CIDSystemInfo <<
-/Registry (Adobe)
-/Ordering (Identity)
-/Supplement 0
->>
-/FontDescriptor 15 0 R
-/W [ 0 [ 600 294 770 557 631 500 698 634 610 787 748 988 684 610 862 575 615 686 317 277 634 633 352 611 411 549 634 591 633 634 612 520 603 694 591 837 636 392 277 634 974 774 294 731 751 684 817 633]]
->>
+8 0 obj
+   8545
 endobj
-14 0 obj
-<<
-/Length 16 0 R
-/Filter /FlateDecode
+9 0 obj
+<< /Length 10 0 R
+   /Filter /FlateDecode
 >>
 stream
-x]j0@
-bKai/9niv?FqujHyfy|>aQk1.Ɛe&UOXh\kvY0S߫m^tS?RBLxR:^#㸨hb.\xk|XnkWɬiO!^ԎXiԾ_c:ʺ޿)5OM&m-TCu,	 YLkud:P &}Fb!IW,}j3~i,}j,i쀟Ad,?+1?'}3,?ǚL_?3F2s3cw[9?FFOz++w~y9:y4`|ʿ"
+x]An0E>cSR0&vf Dg48~D-
+U?iZMpՌS/56G>Mڴ&Na|g8KUyƹ{S5c|_c9r}:`p]>sZMSv&X^u85ai=?M 9e!fgqUoEq\6MY&hhmAwk5woe$$ޣZ^<:"t~'NFuY>j9'Y48pzxz989z|H|:i_?@ӂ
+?pN>NV^=O_ӊ'AhܲȀ}N܉לѹݭe^$K7
 endstream
 endobj
-15 0 obj
-<<
-/Type /FontDescriptor
-/FontName /KBXRUU+DejaVuSans
-/FontFamily (DejaVu Sans)
-/Flags 4
-/FontBBox [ -1020 -415 1680 1166]
-/ItalicAngle 0
-/Ascent 928
-/Descent -235
-/CapHeight 1166
-/StemV 80
-/StemH 80
-/FontFile2 17 0 R
->>
+10 0 obj
+   442
 endobj
-16 0 obj
-425
+11 0 obj
+<< /Type /FontDescriptor
+   /FontName /IGBVUZ+DejaVuSans
+   /FontFamily (DejaVu Sans)
+   /Flags 32
+   /FontBBox [ -1020 -415 1680 1166 ]
+   /ItalicAngle 0
+   /Ascent 928
+   /Descent -235
+   /CapHeight 1166
+   /StemV 80
+   /StemH 80
+   /FontFile2 7 0 R
+>>
+endobj
+5 0 obj
+<< /Type /Font
+   /Subtype /TrueType
+   /BaseFont /IGBVUZ+DejaVuSans
+   /FirstChar 32
+   /LastChar 122
+   /FontDescriptor 11 0 R
+   /Encoding /WinAnsiEncoding
+   /Widths [ 317 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 636 636 0 0 0 0 0 0 0 0 0 0 0 0 0 0 684 686 698 770 631 575 774 751 294 294 0 557 862 748 787 603 0 694 634 610 731 684 988 0 610 0 0 0 0 0 500 0 612 634 549 634 615 352 0 633 277 0 0 277 974 633 611 634 634 411 520 392 633 0 817 591 591 524 ]
+    /ToUnicode 9 0 R
+>>
+endobj
+1 0 obj
+<< /Type /Pages
+   /Kids [ 6 0 R ]
+   /Count 1
+>>
 endobj
-17 0 obj
-<<
-/Length 18 0 R
-/Filter /FlateDecode
-/Length1 11376
+12 0 obj
+<< /Creator (cairo 1.12.14 (http://cairographics.org))
+   /Producer (cairo 1.12.14 (http://cairographics.org))
 >>
-stream
-xzy|U<3g빹7!{B64!@ QdP4@HUhEETD)&VJ՟UAmDjڐL眛 ׾_e2眙g<T IZʖ=6}I|B:A%w7Y=sJ73_9^!i:e[x:6}.Ξ>	IO.,O*skO*}`Fiox㉙YKNV%1_!rIV_Mfl&p2b[j("qs˨Z8wՔM-OD(vL5S;&4w#H#jq"U2Zט "ړCt4]n2rSJP37~3)pD<.vV˙PNYWN'NvMBZV#:,_ {ݬ,4
-5e[zZV@&?9|S]35c1\
-*nUAu3n,tcM>￘?у+vj[cؑ|S@qFiƦI܋<O	~{,%뉳m_qDV)>ʤO}*Qsm!AM-sz~}ː4%ל}Bޫ7"6"/Q?%/7cW~+NyD~$#wujpt&>̡K4ҕA~m4KLL(0\	<DINU&"Ӑ.	+1V%c=`.OZΙ>
-96GeiR>T)32	uVBD@CA9=#/땞:+57'{g_^k(kzʭe_Q?g>+OÐ~}N=s\-fԍoP7T2*aP',Ok9*q)'5M|BfiDk{٧$+O,Q^o)`LZ/o|F8d,EHTHNz/CN(vѣ"ζtsscFX2>>R	GU|WVEfY'˯dNch,S.vN߳%rq:Yd%&eȋPxop2Д.HP.ݛUa=D`Bu%Dctr̠(anUS	)GՍRFqJ"J"9ueyC2Xe.
-MS	̍o@45Ep`ԥthiM\;/qk{)QEI@6P2-Il(2X9["EQͪDJt/.9QT0!Ң~oOIJF+ɛAZo=5ȝJґCЅ
-4K-nky'	$wS4QEZ^l-AHY.Jrww%U|X?Zķ{_nK*W?Ӕ'P'jzDE5wKwPvu#1)3SNMb2`ݩ`hje5UFtaR;w)pMjzAewUhIn[h>c>էD2DWy$fDVFl	<JU7-Pͣ	:M9 ɐE&γV޵Fþn\.sBNhuY7e>C
-Ʀ0[;^'DҜdy,eFeacm4t	}h_\,Rc#MS,F?z8Ӻ|QJm{FfQ^`lBizOseؔc{SE:5lat5IMG%L]dTrɩ"h,u{:fEUA}AjilzХxWqZ4	6pUL+Ўh0 !yls]RRVZ{FkZ0l9/#AKJTJm=OEک>P^bZH#X7$΁Wf M/Eȶ2ŗCx1ؠРX]Ҳl2fCc)slk[w|e֑i+yY-_P=jk9#zڝ7O7ط ԎMVJ42 "EDӥDAq":N<f^Xԇ0lt\@d'ܧ\HC
-*	R:'|F6n}tt1~bIճҕ֯O+׬]J)K&ޟQop)A+d8-K<V]gS&~GZ1ZoQhlpwcyrcb	 c3%eЙ920AIuu^Zr_R{l{;ٴx*L5*C/\8tePz2t^Tz:wJF{t54hsr>(3x(~ƕh!6*[jo}}:vmJ^oFw8o2'Gd	?uk+l*PsN>\v1\#4e@ccQs9xMZЎ	xU)yyz粟jBkkΜ%~{4a㬑]g㬀oBC:9AeL)W˵r(w=r_,숾m"dURnܻj޽.рxo;jg{GyB'hTh;A/(34$
-*ILTzP0<
-='l?P=V$_ULZ3㯷GALyph2Ȋ%+*]Yeԛ>N>2<8sɇ_^c+b+u ÛtnOB'_>|'GV!zZe<oon_<en5t  `C(CMAۧw
-n&NnEjTNX}6ug6V^"j	b);Gp9Ke'H[ۉ׳vbO'5L-ލPr&UcI|2yMyL'DZq~z܆Sq?mZm x0?cgf~?RmTΤԺ):x"(ߓ0~iL'JOg'8UW\|Q4/+2H*MeI<IdbM3R]OWoW_هQD<[5zzzlFbQ`!jK}13;g:B^(&(	mmxx$$_YBKL="L[][MWVW{V{WU*VVNN_f8.C)eFo\ޛ&;|o+-^>ԱV5֠:7Ǡk4zʡ!1E&g޴d>MPWwKzO]So}'+coKsԧH;Zλ79:M;>,=ItJUoW\Wݭ:= ʐG=>+#:{QJLZx(>DDA';$8䆳s[.ۦخ	ىIٝeXVh%YV¤΅++*+*Wt~$cGƥO;>((((4444""""ӔO접j2]6{K}]ݠU{^MEx}/ܒisȼuYMԷ~@=k22Zl_:}U^/^.{\>v5dشk[c5;b?vK:%$q8wOy]FW+$5w1FdB]#$tILLNXitthb(.p?DCB32eޕYYHKkaFIVX3zիm?>ν%._;cg_~_rץ˸qֈdo-8z^ޤ1
-|U˷M뢍)92:*]zq8ȴK0(PbhPЋ! #r0nn]'Փ+j}ʕOh^Gda
-bar
-'!*=XYBqmW4ܱb.RgA @~g]JpTA&*jPY$4FX:d(j'%P:< bJݬlVQX(II6t
-Xwcgf'{<ԺZ>VUk|r&-ֺZu/[/V>
-[La<tћ.qj0gLƨ7S3F|sDNFi#$nצ`:Q.8*Np<hvkS_SJjm687bxH7n0ԉF1.u|oǌG]y"V}aWDHqeBHӻ<h>TC}L"$6	nØ7	c}3۳{=tZy͓e]Hqj*X֜䡳eYI3yQgo:9dr]o,ǂ#zHL'T,I4-ltύlD%h=!x1Q#%cbS
-SFώࣜ`o0jEA|i,rjzM~a+8zN|.hcx{W̍}0n9Y<fydwJÕ&}8sB쭖uSoyn].>=kr{\SS>M#Tt9_}ǳ&6sD^ybp7hxIRrw8B(_Udr0I2b^;te&^ߺc?`EU^/&Pc۩ٵBH/E8%ouu%"<uE7;(z|q_	).QµЬͽ[]ǎ|GG:V;ܕIPȧiJ
-:!Oq\hzxG`VDvjaji#;Fgm:RKk3~WThXd_ISOI.o<$wO[rmfJ<ɷU[2jk3{N.]:xuGhMc
-عQwA'!zcT]ڲF^b3]c->z?2|*ߧ9jYHbDd|^0pjΞz<==Ξ_	N~yˠ3kvĲ"5fɲg)o\v9;'Fٮ"vy{qJ3-.:u	ִ!?+MיּԪ,3D_vl8V5.4d/tvrd̛vcZ;gZ`?{:B^20)(>g&ƻEbTUBnfi0>LL?S 1+I,g4%IKr1>p2a#1L{=b1OE|Th&%hrzF>E?zDſiO DF==G{,o=px7(GZ7i5C6"Yl#1԰bQh%"VrQɶbx_]\:!X-VBn}HiYM2T#ٕ·޼oŰ0[=#6}	&B>FܪܪjcqO't3,1KޯOuGEl),Kb\YEz^fw-uWUbwD7\بofeU{w]t'	{G~;_uF"gO'hLٯɏfnQctj}~^ckMp
-lfH	5$	KYmmxlOP,&{noaՈx$*"$t"$b'	$IxBR1'Nl$]I7ҝ ='#u8"5	Jp9س'+<yGv!Jrj${	9+LǑ8F>|DՄ_'I>E|.ͅ[>I%ȅ>{gpjyz!-A:2v+'V'6z
-;D"gfl8FຎC0?c﷒3 u>㡇8.ry٩)A5g9Cd9w)|7Nև9 Ed=F)y82{t/R+9[qE%ŏkOWj~ON#y~#KqՄ̆<ԕ|Oz@5Y#9U't(~y*c#W԰#ݓ,mDq5fb{{t$TK
-k=
-'"T+j!Mi)>pbRm)}c'}?d̞VEIg&=8z[lt̻|~ c&ǟ߸[yF:	}2yk٨%rT$G<rTxLښD5+֬܌-,?(ؚek|~3G!Gϓ90%ss/2ލp8N@{"ՐBt'\2V->&Ѽ4(k{uƶV'Hуbk> r=d|UPܽEḞ	Nvo!D$8!	h3ߍ1p-id8O3ٻ[l)3cV	Ag{op){F񝄋m545_H|] $|ύxn,|EȂ%Eg9_A>q ξ
-I_p)9=LY
-b)	%A~/d58 NH8 r਄+Lq8ލF	Hx[[ޔ%&A«P2MK{㝄WN
-TKXmpK^^P+E	/ݓ&Þؓ5x~vKxN.	`ggri/<U;հ]¶'ݘnxhD1</~bf	=bjTGUհqWlX3<ȫQ	"y&OmvMOV0.a*XU.ĎbXZ+L!	MX&BBK_KXCٸ(KIXno<	6fx4Cpo2J,@Hƛ	3$K.at	K,aDCLj-nˁ	`\R	nbBR[b[pQd#bd~aVÐj,&C0Hb`n7`@`IȗзOPm>OzDo?习Wz .#.rldg]C@i[1ti.iˍi.4JHɸ $Cb3$!q8	S x-S1D!$DG!!/$f=Y +;Rx$mw$$~%h&ARى_pԀ`/HZ~z @hu5˿	.
-endstream
 endobj
-18 0 obj
-8287
+13 0 obj
+<< /Type /Catalog
+   /Pages 1 0 R
+>>
 endobj
-6 0 obj
-<<
-/Type /Group
-/S /Transparency
-/CS /DeviceRGB
->>endobj
-7 0 obj <<
-/XObject << /Im3 5 0 R >>
-/ProcSet [ /PDF ]
->> endobj
-10 0 obj <<
-/Type /Pages
-/Count 1
-/Kids [8 0 R]
->> endobj
-19 0 obj <<
-/Type /Catalog
-/Pages 10 0 R
->> endobj
-20 0 obj <<
-/Producer (pdfTeX-1.40.10)
-/Creator (TeX)
-/CreationDate (D:20130503000710-04'00')
-/ModDate (D:20130503000710-04'00')
-/Trapped /False
-/PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0)
->> endobj
 xref
-0 21
-0000000001 65535 f 
-0000000002 00000 f 
-0000000003 00000 f 
-0000000004 00000 f 
-0000000000 00000 f 
-0000000305 00000 n 
-0000012116 00000 n 
-0000012181 00000 n 
-0000000179 00000 n 
-0000000018 00000 n 
-0000012246 00000 n 
-0000002298 00000 n 
-0000002427 00000 n 
-0000002573 00000 n 
-0000002959 00000 n 
-0000003460 00000 n 
-0000003697 00000 n 
-0000003717 00000 n 
-0000012095 00000 n 
-0000012304 00000 n 
-0000012355 00000 n 
+0 14
+0000000000 65535 f 
+0000012816 00000 n 
+0000002524 00000 n 
+0000000015 00000 n 
+0000002501 00000 n 
+0000012325 00000 n 
+0000002633 00000 n 
+0000002848 00000 n 
+0000011488 00000 n 
+0000011511 00000 n 
+0000012031 00000 n 
+0000012054 00000 n 
+0000012881 00000 n 
+0000013011 00000 n 
 trailer
-<< /Size 21
-/Root 19 0 R
-/Info 20 0 R
-/ID [<552026DB78C544153E75AB9B07581754> <552026DB78C544153E75AB9B07581754>] >>
+<< /Size 14
+   /Root 13 0 R
+   /Info 12 0 R
+>>
 startxref
-12621
+13064
 %%EOF
diff -Naur ns-3.18.1/src/lte/doc/source/figures/lte-ue-rrc-states.png ns-3.19/src/lte/doc/source/figures/lte-ue-rrc-states.png
--- ns-3.18.1/src/lte/doc/source/figures/lte-ue-rrc-states.png	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/lte-ue-rrc-states.png	2013-12-20 09:44:51.000000000 -0800
@@ -1,123 +1,238 @@
 PNG
 
-   IHDR  t     B   bKGD       IDATx{\?p]X ")XEZ`y7į;f&&LM05M8ybi*Ly%o{=2;`?ϼ?ٙ}YeY        K    K    x[;
-  uԩ֎cpCedd̟?Q  ֎̥u `222ӭ@\   h\   h\   h\   h\   h\   h\   h\   h\   h\   h\   h\   h\   h\0p$IN}ѹsY]oɲlNNN|||@@[xx9sN:e҆F+<0-7oޜ={v޽]]]͛wMQ7FZ˲cƌsrr=zW_}Ųh
-n h/X5kZ;
-?!PUUſ[s mDȆF+00-Ν0So4՚n<uuuGֻʨQFyfrF K DPTVV8qb$77711趦ESNoVZuՖK.mܸ1**J҂jjj"""ʖGFFV%NF|AOOόLVZZvZ//C%'']kҥrn 'NhC=ΝСegg,C˗k
-PFBDŭAH6D$J
-
-jHR":|aaaDa 0s	`Ν;-ѭ[QjjjHH6j///"jjjv Dm<nDpk-߿u4DlٲC H.L3n8"ҺCMqwq۵qD4lذ[(JkӦvI"?~ޥIII 4=s6mj  lK ٓ޽kFk6DԣGP\2>>>333999""{ƌ7ol8y1uL_Q޽.Or;;;nrm !0Jv-770---11GYYY,((vt6a	!!!nڰac hH.LMo=YO6ݐXRSSsrrnܸQTTS]]hѢS$Dt5K EvvvK,!ƶ \&77>[:Tv'88x۶mDtqoMǍk<''GRkĉo^~}[ `]H.LoX&MdDbŊbmTDUUU$"jqc^XX0==f̘w]{{{nrʕ `uH.P*UUUyyy.|GkkkGh Ǝ[]]=t5k\~].755]reӦMÆX$F0 --ԩSUUU
-Ν;3hȐ!M-66uiqYY\.///OАSOZ}AAAf tLh<<L||ޟ9Z m===W)pܴ652rH-G͒,HZp~h=\+zzzZ8wwfgg?Rs}?6lT*?hxt:k׮8_____߸]v<x͍)Sz @ư"ddd[;  Z3     k YЎB  k%    3 V֎&Q  `-                                                                8X;Tccƍ  M~~C h\ZGuuٳ  hv òc v,###==ځ  Mw.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.Ba&((HPpv:f̘<![aY6'''>>>  -<<|Μ9N25T/FZZZRSS{h	gAòc v,###==hM͛gΜUy.0LvvvRR&oVR;_
-i,Ydٲeꗶs>7}ˌ 
-3 `iK.F,˲BY}W:u~jժW444\tiƍQQQ"oCvID999---Q F` Zԙ˰/nذaٚ3%owrrjii1~;j(SN!=̥RTTvu3B`~K ۣ===-ZTSSU&e˖񤉺a:[n%T!PqFBBϜ9s<Rt=z8;;fffj-%";;;d2ي+:`tybfSSܹsrBvFGG۷O`ugϞ>nܸ7oO?0L@@@SSf喖.]0?mMW~_VvV0:Fب'NL6K.;vEČ
-ſCv)00p6, @+Y&00PRM<YVSSJJehh(}'mj(ׯ?sD4o<HwND/_Xxz}y.]h6CJJVݻw溚[>bL٬WWYd+
-	ՌPtҥeY;V\?&H6k5Bma\n11;6 F %6m"Ν;޽Ν;'O$T/$&pr=55f!6y-"ݻ=zȑ#ݺuxC׮]WSSSRR2vX"zEFD[l;t@D+W\s
-WZEDnnnk׮---mnn>ydBBP:ݵ-ZĲCSN\@"ڻw/5ZAa!5СC2l͚5Lcsuu%w}L&UVV۷/66'r ~H.UrȐ!Dt1E׮]#>}p/JrfVXrID}ݱcO$KB7|.+1|
-ׯ_'"wwwCDDDQfff7o&h=CDqF3B50t
-^<Ҹ]hhJov+q<I>k^IH$
-cbvl}7o|UCr	 %䇽-@ёQ}v"khh	Jݻ?66ol(MKggg"?fR#;whn\\\4Wwf"0#T3Cw-u.KD;vkjj貲_ht86]ݕ?&fǖףG-ݾ}h  ˲DT*nާM8188ׯ7ڸù+V0TmСD} j[/rD%K`Mkرc#""*++׮]q[nuMw
-toֺ,˾KEEE(ٱEEE]z5//oʕǏwsso͛gR \z[~ɒ%DrJ6TZZjh/@D+V(..1TzIDǏW'88<Y~"۷/ϊfjFtZ#"awի曎<ݚ.6qD]NKKG{S<&6fggoDQz߅  qŷlBD6mqFcccsssQQƍ:( "cǎqy`[^?k׮d˗/sQ*K3h1#!p	֭[ܹsΝLOOOҹGիWuʚz7p "__FY}'hر%%%ڵ3w psŋ+++vZMٱ=۶m+--WWW!] % 
-\,;w\}3,:5u?~'ڸ80y1cF6^o2쩧2	yѸq4W|$g۶mܢKњ%9	߮
-8A֝>}ަxƤ5o*-/.  ZE\,{w%,,78<TM.[\sN"͚5ʕ+FQTnRi̙YͤP_,{cJRooYfKI%$洴Db
-G8
-L&s+Jh;C5\3gzyyIׯkU;ukac˖-!!!]v}
-ٮq<P(ܫW{OEIČgΜٳgOGGG>LP^G h?`pOlw)E   E7o<p y
-  `1.=_~F`L@r	  H"DGGsj	H. ѷ6k߶ 4;     $     $     $     $     $     $     $     $     $     $     $     eYk  /T**JR988p/IHH/   X vfРAnnn*3ƒ  Meq 003fpttԻT*[8$  H.dSL厎III! @r	 &			-'O|<  `;\9^x+111V  lK 0ǤI
-fɓ  $ `nݺEFF2.d&MbH  `\O9OٹsCZ1  H.L?WO9	  &$ `&__#Fp&  $ `iӦq}v8  `}H.|)S  [;
- q?nƍ֎@SNv >>XLFF  X^^n( 1\ZN^phiiٽ{iӬ222ӭ@\@8;;"  !- @%    %    %    %    %    %    %    %    %    %    %    %ܷkFD"ԩӣ>:w|!뭠z05FY~9azHTT0Ch&}ٳg5<<|޼ygΜN0ahe5RTO<0'NҎhtG]2j(ͨFeRuGU$((HP?,fgg3o_}֐ .,n͚5֎9W۾هՌ3h͚5\FDH$fիWQJJf.]RoD9;wÃgݻwG}"@@@eevG+;KGGG. .TD`V7oXPuuuG[gԨQuuuzW('NX`D"MLLdM{\	Y<r䈺ٳ}	knn>}zWMk:?'"ggg)`h\;nڴ/^|om޼[H;F+d/{r/ݫP(bbbZKrxBMNN>x𠧧gFFFIIL&+--]vסCE =)C-Cn=ܹ:Qvv++--%"OOORɕXf͚ꫯ|+
-.r2SND駟OKKŅ#<P(r92Μ9vD+#\L"
-z)"2u(hÆFkj~ "TZPP@*Ç
-f0s	@HMM%;wZl]t	
-
->wWrQ"~'Ϟ=[[[^}߾}=K/qoc"&jk֬޽ӧ/_|3gc͚5#''#GTTTTTT=z)!!A~m"ZlYKKy-pﯵ.T eH.ƍGDJ,CʸR#Çɓ'k\'|Rs]:̙32zD4lذ[(Jj:tdtww7qyzz9RTٳGT{Rf8y$?^Ҥ$"{ m],Cf\\\T֬К/$ѣG,}òO>ܢP":y$˲D/)++wvvnOtvv+))_:./TСCrr7t+k\y浦!۷o';v1<+n6554D"!"n]](Z3 DD*f.?P("q\=GbffR7nwwBBJR%&&ѣ6++kZҸ?/_ޚvD4vXDrرǏ;V'Lr֭62 @;͛Dkz&p]кgr%SFry醆0nf8ܕ,[7[XXXjjjNN΍7bbb-ZUkGB^pww=zJRTG$";;%KQZZ7($Zu9k׮]+7f  ! "%"p,<|Ic#//X!DG~:ƪ]:~泍, 88x۶mDov0a8qbpp۷ׯ_oC%Kr -Cr	@I&Yx\駟uܙ+4y7;GKUU~Tv=3RT*3-ڷ&/W\ic,}  [PJ*//o>hmm#-Ftt401mᮌWTT٩/WWWݻa{_JJJ[]]F0 --ԩSUUU
-Ν;OPi;fpuuwuumML<9((ݻ___?|?L.'ÇohhHJJ	 `Zu;w#Z;@<GXUxx85˹[V[4駟&uP===W[H<-%wVڑ#GN\\~p~h=\'22W^J$SꝹᒻy+&i]?[o5l0ooo{{{T>.8ج)᱁    IDATSی:k׮8_____߸]v<xP;  ö%###==
-  g%     ܟYjWc  f.   @4hq=,.  @a    D    D    D    D    D    D    D    D    D    D    D    D    D` P7nv  7Criճg϶v  -00! o˲֎ ڱrk  6߹                                                                                                                              רQ4G^[_owu̘1yyy͛gݻkxxyΜ9ϟ?hѢA9;;+ p˲֎ ڱr/a/ooo"gF.湋[lvvvRRj9|tttMMѣG#""Z9 X0s	 6*&&F.ݻ{w^B#eYU({bb"˲I1N1[`AMMMDDw}WYYRTT~<pUV;wf={zM @% J\fffΘ1#&&~ 1+++99Mjܾ}ɩH']]]cR|!C466
- a M555͝;Ə0LU*WMRߟa	&7tȑG:99%$$@^^^Dܯ_?"h  Ă 4mڴuUTT(J"Z~ŋwUؾ}ŋ;u~z<==GT*srr٣T*HJ7^}U"zL	hذa)))[n-(($ꫯh X VXfM`` 빝;w>p@]]¶mۈgϞ2L&ٓӦ}v"~'hǎKukhrwwOMMmii1w'RC7n=Ba?nR  K hRo8f"Z~uhmsZDbggggg%DԷo_.=5i~FǤ0---11G*.\1 "?a4  KBr	 \޻wONYY@@@ee%Wbb"2))Iw{Æ#͛7t+KMEEEqqqb|IL/J2) \;Zx{{wѱMx~ ÿK"ZbOMS$O@?.Jwٳ7l`ғ  , % ԫW.]ǅ,Y"|gyF*JRzY'mȔi8+++!!_OYBr	 m֭߿ԩS_nݺ^ѣWwuuwuu5;ǏO<lvԩ*BqΝ\!C73f(^{m,6! *ꇨ}xUUUxxxyy}y"/Lҭ[~So.rCc	읩Q7]OOϟ~I &ܹ֏ 3 І^~aÆq%M4)22_X$((h֬YΝYoְaüRixx/\`(-0 0s	 ?  f.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4H.   @4˲֎ ړ_~%&&FTr/U*Jrpp^2_X/@  &k  ̠AU3f%   `af̘wT*pH  `;\ɦL"u$C   L[.'Olx  v  sWƽcbb  $ `I&)
-''ɓ'[+$  H.ݺudF]"&MdŐ    3M>]ssCb<  `\y0899M>]s"  LH.L#F&/qM  8H.|ӦM&/np  \㹙)SX;  	mq+(((Ϸv ;ƍ\]]Nj( 1F}|[;
-  #00Q cҲ{iӦY; ddd[;
-߹Vqvv5D  PCr	 [ K    K    K    K    K    K    K    K    K    K    K    K?1׌DҩSG}tܹBV[A/A,>gΜSNVbfȐ!5J|ԨQz!00;{}4iTq)
-r,fgg3o_}˲F멿||cU8jB^kN0ahT'xa'	 `e,Xܚ5k}Ns$$$TUU񯮷SqqqtzQaax+++»wr%G6<utGz͛7kՍ=ZFGUWWgvvvh r*{?}GW& u :Z3`
-ĉ,H$,oӚN:oZjիW[ZZ.]qƨ(ʟ99;;+&&F.ݻ{w^Bss-~m3(.]T.THNN>x𠧧gFFFIIL&+--]vסC`ȑ*wխf 
-/رMhW\
-/_[o͛ SA(tކΝСegg,C˗Vd:u"O?|||ZZZƓID111\SO=EDYYYBF\]]y2iT4FD6l0~RiAAVR>ayy9I$ݭ@֔bz#<P(rydd$͜95h=ZɥeKe-[FD4+3
-CD=˲z36.*'''{{۷o߾}ɩ%oT4k."ڵkssML<}]pSLቐK.}||t.| YS^]TSSӽ{w"}"ѣGmm-Okz8?.иq̙3"w]3gTk
-ȑ#JeNNΞ={Je\\2~{hysυrׅu<yƏwiRRwxudBnFPI(|Cü|0"n MX;}y755ʚ>$	555YVVfooQYYlggWRRw۷o''xvء;z#7*?uS_~%r㣵	kllԻ+DGG߽{5h~1kC^{5μyxXp~h=\Jveff*qqpx{{'$$T*;V";v...cǎ5	{{{'O>\	&ܺukÆbg;vԻT _̖|rq[ h#H.͛Dkz&dE???vn1r+YYYz>zhJRFf4~BٳG5qh-YҸHM3z]w]<  @֭[ݻwǌmA _ Cr	@DݍkCUoǑ#G_NDGy׏9w	&haՉ'߾}{Znŕsut]v̘1룗4o  <(ľ;=6?<М={,?QDEEE<ո;<yxRT*mhh0[SG祥_|AD>>>Z}("7i /Bzmv eBwމ'|M#FT*Սo*|}ѵkd2Ycc˗,[UU%Hqֺ%%%vvvD8X&4:&mNP36͚DvRLVVV{yyQRR^D4~x\*~RA` e)^+e׭[GOѺuWhG(<utGU4K4o,9rލGm0s!Ԍ3Pl .Z߹Odd+i<;88Hϙ3{L#D[F4͘1~b+>SLݻnCvk׮	|X?ajTn  XÊzc#L  Z3     k pbgx  %    3 T 3     $     $     $     $     $     $     $     $     $     TVV^v?Jv8    Cr)>RYVVv5.TQ]]MD   @|H.[?x^WFFFzzu#0˲...  lKd2^TTT\\\\\|k׮ݺu[ۻwѣG C566nܸR#'''**ETWPd2[9cXv\R\\|MRID;w۷o>}zݫW/.twwxFF,v  0_```yy hǐ\rŋ/]tR\N׵֫W]:::Z;d KGT*nݺY;0nÆcY;sرb}K.kkk/\pҥb=z			.]X;^ y?\]]Ͳ[p(**7n\qq1wE/aٓh v'rK%
-
-n޼ID۷oppp߾}/ͩ<xpII	7vݎ;Z;(y֭cg{''{IR *T*W\9{K.^x?\\\~ᰰ0v~,@;P(;Z[[k7ܭ<^^^;w2eĉvj~ҾKLv_~"
-߿DDD뇇 __nEզ&DbŐ<III.]{{7x޽{999?ɓǏmPkgɥBt/od2p.e;۰a/uP*vvvyѢE|ݟ٩SCرc*g9sȑ#s `[O.[ZZΜ9s
-T*:ta4h \O?u#ϭ!.lݺ^R*
-bO\Z[[{-[w999yƌ{V bryƍӧOsskmmC~C=o >hРTɩZQX.]XTTbŊEe˖m۶ݹs'667|ꩧp DrT*
-
-?~ĉ'Nܺu.88XM8a<####644X%*WccϟSM.۷O?CBBΝ;m4777	 ՒKBѣyyyyyyC:thTT#<ҡC ST~mjGVwO>d۶m)))j^ (&*?ӑ#G;V__߳g<******,,7
- X֭[~cǎw޵|T`#jjjlٲnݺ)S,^888AͱDr_8pGwO>ؚ/?}񀀀[nY16*ޯ:f̘wyg
- lH[%,ؿٳg{~a<ƩT;v̜9J%0J[nCT*e˖]re	~a= /C
-
-<xpFFF޽mVQQqرŋGFF"}vvv.\믿>A1lVO<`Ϟ=?g, 'eaa={v}	&<SÆspp} .]̝;wJ~GuT*7o;Tw}w٘D x6ljjڹsgv矟4iҠAĊ b֭f?uuu˗/_zC=矇[;" ˫W~gƍ{q7Gڵkvvvڵkf:~/JRkG fNrYXXk֬Yɝ:uj *Ξ=;x'v,(5kSA 4M4^p衇]]\\h"d 6!ۿ.\pqq<p# \սk,++۷o/ߙTUUرc֬YڷǏ>ytM Wn>xK/аiӦ3f }D4m4k힃CZZZ_{eee.r?g}.]>R>䓩Sz{{[;O̙3999SN p1rCŋW^~z<A_?ʕ+}v,p_ǌsN<Ɨ\[^NJJdL `-=Onn_[ڱ @2Ǐϟ?'2KĩS;f@Oٳgرzz7 3?p޽|ϗ:uځlŊ/}g 	7;r|Ν}f0nQF \vm޽ϷYKKKKjjjϞ=8[kSSSgΜ9eʔ.X~ `zf./]u)SX%Cu;k8#I|͛b],YdٲefVv\{ƍӧOg8 ?zf.,Y2`ɓ'[>cYi z_oܹrrrZZZltgGGqƵX; vrY\\;*#++.%%ځP7ڱcǎ|ŋ[P 233[ncƌ*W(k׮<xktt}E2lŊpuuuuu0`@zz/}qQ*K.ѣshhhfffBۣ===-ZTSSc4Huh,Q J_tqk555͝;Oo=qFBBϜ9s|kJg+
-_СC;u`    IDAT8~Ç!gqww7n͛7觟~b&  IrKKK.]yƍ{w+>~'N6mZ.];vsS?裙3gzxxwG+ jx3fXv-ݻwoԩ^^^>>>o,Ѿx2]#|Gch@nf
-ꫯvܙ_ xBLwÇ.1bL&Ӽ
-;){n&QTzԇqͿ.Cݻ]t\Vznd:BN.]*++Y"UViQdd$5Z}Bma\n11;6}G}_iEejq4+~G4KC]6	Ϣnj=b?cꩌo& ;0_kUZj]ɓ			,rܲeKEEEEEޡC"Zrnvo߾cc=qi&"ܹݻܹxH"JMM5p*/ҹs	ѢE{G;rHnL<0WWW"zwd2Yee}bccPu]h˲"N:sh޽mohch		xԨQdeeek֬!d蘘>_JC]+ 1~0~y嗉Cdذa<;/<E9LkC2;tpU!Tr"=z!"ڸqDYyf "^]Dq3d":v憮]FD}\C[ʢ($$ү[}7oެ>Fʽ<x0q/)PJ&W0:>'$Ç?W%>ղfiK.ZaϽuޒN:t/<E9LkC2ra SHwnŅ***tחH$Dt
-"rqqmQSSJ{ΎWё?HVXr)V_m޽{F{LDUUUUݻgѭу4ݾ}Q7Zg;vkjj貲_htk`x׮]ߦ?&fƿO5qӖf{s}W?6U0n|³59{
-K:ʄ())IIIX lN%|	ZMR{&׸Pɥ+푐;kNoery^^ʕ+ǏFD'N5>$y*Zt)wEnߢhl1uGD/RQQlk5?&gjpuu?y:&GzW,1ye+7{Mo;Z/nfZ0N hv9rDIsDi&ƭ[jnٲtaio$ӧ'HM\γ	Ko=rYߟ_.L7-,oooqm4˲w&"// "4;! d|Fj䲨jߺMXiSF_]`Bzd xYPHI}9,j&pGfSO&pL5Jҋ/) &iUZz5[9??_//[޹sΝ;{}oڴƍEEE7n:t(,r?_j^ڄX}3*푐z|I";vlIIImmvjҸ=۶m+--+V "WWWq3GkXU*\M__F6Nv+CghŕUUUwmgL̎]Vﴥf"SC!%&|³5ffSO&FUU \cro	J啑UI&=Se\wQtt4H%˲sݐO,&''-[e{$QDd5h"p+z_|Eq3Gh>m6nҥKyFLxnh}{ʕZM>]oS<cb^lz)K.ю	O<BEda(ĤOO5fn<#3Kᇛn0FߨL4vhƍL!HRittVsssZZ%""bŊVeÇ?sΎ...S9ϟ?o49stQYM]<{tcJRooYf5446e˖GGǮ]{
-¤qϟ9sfϞ=}||>3B?nX__?sL///Tys)"rww3]!៑5
-Ezzz>}{{nҘ>n25!=r}Wq
-)1/<EA3'Oe&9x𠝝ݖ-[X l;w>}ݸ
-$k`dff.X{X`1ĨҾ};"IxM69s. /esss=O{lJ<n޼9dȐ/r7^{O.bLJII9vإKR}O&EGG755?mqD]W@,ٳbˢlUٳ[n]l>f999egg,^ڱ ɴg.H&><++!0D"y@T?[In %4MsɌfkLRP1CKTpIܻWSPC Aنa;˙3aޯyyypѣ^taG.[iL3F"={V3Į]f̘qɐs ).hϞ=/rfffxxx $333***;;}e2eʹs_"t. ⒈Νqծ]qN Ri߾}gs६o߾_й  _رc ox㍼=z _G駟Ə/t. ⒈򂂂BCCǾ[ LÇ3}k
-n/_| `WԧO#G>}zܸqm ܛo١CO?TD tqƚ>HD ⒈BBBN>]\\ܿ]vMN `XLOOONN: yyy}gɗ/_: Ў봸\MM{7:tݺuj  =zԧO}a#F466^xBa _믿Z[[<8>>_m  .]*JN@"(%%ڵk_}й :׿SNedd矃3fݻ[/9 h͛7YM\ ZO>\VV&t. iqU'NHLL駟̙3wnݺ<9 hԩSxuuu};v7|#t. %Ν;_m˃g̘1iҤ;0? oo߾ׯٻ%ZN˗/8P\ @G9rD$?>&&oAR =: C1bDsssp<8ڿO:%HӳgOC 믿\xqСĉ 0dq)W[[{Ceff':::&&&(( EÌ??r劃 ޔ)S.]V).3:tPAA˨Qƌ3f̘/9[nݒ%KΟ?GB{lܸqܹB ZTԩ'O9sѣG^^^!!!lٽ{ݻ~!C.\b
-shE			?S~~й hR_=yɓ'ϟ?;f̘QF6ϯh7***{gyѣx	oW=V^[o	 KEuuuYYYN:}tNNT*:thppaÞ}YI
-0W^r劇 ݻN\ T$Jϝ;u]KKgy&88x#G:G jժ?ԩS#G:P\\_B Jnݺ}<L4hРA08qgҥAЉ'WX@yw8XYY	 -.UWW_xɓ.\rʓ'Obq@@Ar_~z,^h|СC=}駟p%ݻ+B 4KE2_999666cj>s}SkΝ;:tXbܹsbqtRixxx~~+WZ,0CӧOɹ~:^`$LT"Joܸ!5_dmm_҆-,,V\9}tP`Bx㍝;w;w_~B ׯ0ȑ#&L:  jťDrƍk#"ҥ0`@ݯ_>p@m-,,d2F!P t9		qtt<|Љ  Q+.UݻwO^hܽ{aGG?2L)^,K	&$%%ᡛ`~?pٲeB C={: 0RIuuׯ]vQmX,ffΜ9~)c#TTT4hРQFB0s=z<y.t. `"?öq7npw_$Ǝ17Qo?[[[ss8l0asO6lPTToL>wY  ,HLL6wmϞ=&M6 0'v򪭭urr666DĞ"۷o@@@@@@>}|}}q @`S "ܹshhhjj*K LqiXyyyleimmݫWud@@@nPJ iӦ͞=S\ ̚O=ԡCӭ[7KKK 8qoU 2CtݻwCe	 >888DFF	3  ڟS;wDD K  h'Əx!0k(. 	{   ڏӧOBq	  GDDD":   //SN	Bq	  JHHș3g| v%$$$''JD K  hWFAD@((. ]qsspЉ )H$DKXC?~vv6S,X/6lH$<x0GS~~~R:1imm9a{2;#""tEg3Ȉvtt۷oBBүj>a|>{͛7G666}]`K'@s=믿Y05U:6g<>=MTi+Cш@#>|BgaT`8~bcc7W~K~Jnkaa'qGS[n5 L0AmpDDDMMjbʪ]X^^.idw:<<\3cp؀Wvؑ>1  㜟]]]e2aUs:	%RsC=feiSj#1G#&㜼̍/3oTZQQh"[[["
-		Qٵ~-[Ul177wDh""!jj|}}%	G:B\\9;;'&&J$'%%Q\\jTevaJJ
-ɏe:DZ;MD..._|۷kkkRRRk$ǌCD;vXEEEccc~~~rrG'd3{<޽{m$'Hmx|"2z|⿕cjRo1j9y_WvЁӵ#b"U\(H<<<諯""77FM͛9vN8ADJDtImFD±c.?z(u͛cx|vvvDt֭ƀs~foW=kB<'aDJxnlJӔ֭sz3Q3e^bM8O0 =2dg.777ŅDԿaG[+6FD;wnhhд0uT"Zle˖ѴiӔZ,-----~åSL!>aǇ]^^^k׮esXWW[oyxxXZZ2=7775Ӌ/M0_"%<7o?TiJVz9KƨeVt2uܙO0 2T<2}t0:3DDjjnnݻ7mذASח4\0Lnn.u]娨("ڴiSrr2EGGsWڵ+ig$q֬Y۷o~T*#dȑ#_u?l5)|+;v "jj$5H	mx|"U1z|⹕cJf4Fh'/ӗ+SJF]^^.)**ao(,,T۵ݻwO}}}
-mGU]]؎5vŽ_t;C]iMMMLL:̜9ݻFĀv~~WǌSN7ܹu&H$In݈hmd)1ȗc?iTՒSj_Sb[1|:jƨeV8fU&/'>*rssVY|9M2EdDKmךhݺu-j[[[;;;}qɺqƪU&Nn!"ggׯ0yʕݺucsj$7ԩS3	35Rޣ:ohJc+m4Fh'/1˨߈K.|yaIIoMD%%%BLֽ{w":~|ǏQ58dEAL8OgPRwN1fv~ޱcL&c+++Uc:v-&Z'ayZ7;Rǧ)[x[CԡU<xJ;)))22rҥ3gܹsO#;w9sFmSSLիWii){#J0tP"bQ.gcTGgΦ́g~zŞ<{lKb wQaeeUWWȿ}0D:}Imxzύ{U'.P&tuˋelVT`4O#|X,A1RSSͭ%p1"rtt kkkjkkώpvvfKa&)eoohF;?_v/P3|"ڱcʕ+hmjdx)aKfF#Rޣǧ)[1`8eJYYY1<D]^#*[[[Hz#Haa:JMIR???y5iZ1%))h5֩jq!îk׮-((H$uuu7oTuaZ߿ʕ++++8^?dH~`^5ĉ"(00K.gΜh{)H[2cO    IDAT#Ud6g+]ťLcԌv2+jĨ}Z<Ȑab;;;H4sLRxqƍ55%nyK}p/dөjw*xQZgg+W@DReԩ>|]k."ҥVڦ̥K[8px|"U4zܽӔ1it
-2Q3ˬp܂|siڜ+gj5C֒%KM޽[c5=zpdiiib=<<<--M%}?2q6(///XtS'0iNNҥKjiiзo߅*> OȘgX~YGj>\D&WHKd]SKl=TqwJN14hPbbЉ  0cǎ_~嫯*t"`HW\yz':  V't`02֭[.$`P\iDkM | emm-HҒ͢EM89  >577h:t0nܸ3gW\@#Ӏo08 jd2Ci?0י
-|  }K A Y,	:  ڧj- ЖP\ @;TWW'HN져 vѣGD v%PP\ @;TZZJDnnnB'`vP\ @;yxxAq	  PaaaΝ_
- %  CҥY #  ݻw% P\ @;o9Bq	  Mee_էO0G&ܔ  SP#//P\dӧO>}Z,  9::vYD ̑iYYYB Fᑑ!t" &ʕ+s k.ży~ᇒ0yϟ6lY ) bҤI...۷o: V]]o<XD K cacc3cƌ[d2s0a.]dC: 3$$$ܻwĉB'`Ν;׹sgooo0S(.H=F,t" &cǎ: ,Zȑ#S @W/^7nЉ / %22gY~Љ ͡B'`P\H4rs0=gΜ	: ̜9;CfffxxY 5 FW_MNNH$B`Jrrrnݺ/t" f%1JHH(++KKK: SѥK 0k(.Q׮]gΜ/۷o_ll,^) , F꣏>믿v%t" !//֭[B'`P\]N6mŊRT\ L@jjjnF-t" %Zt{n0v;w:u*ΉN09 Fo޼)x?~<<<<??gϞB`p}wٿЉ ;w<%1@q	`z=iҤ?I\ TeeO.t" @ZpƍB'`njee5c " w˗/: ܼiӦW^yQ\ %I-,,V\)t" F租~*,,LHH: ?[4$&&.Y$//GB`Dbbb?~?  ?88xΝB`,nݺջw'
-  &cӧO?(̚5ׯ_ǳK SVRRrU+++sXaa֭[q8Q= dӦMwYvЉh'p0ɜ566.Y[nVVVtILLy饗 ZK S_sй pY|իݻ'J[nݺu8`lpZH$g}sG:.'0fGwfmms+?6/o޽ۡC%
- dee97;dQ\9X,t:MQQQϞ=/_{(K h8-`zg̘oj{zzbvyVVӟ~i++z*,,677駾666{޶mbݻwccc.H>0`͚5/LgɓYfu;))*++_~e77KrZ"Jhoo?zÇk]ED}ѣmllǏ7ܴiСC=<<}||O<ɽJwڋI?0Ddaa!OOxϞz꩷zK-0 `v.xn~┾ӂH$:x҆gV
-۷oP^^O+ReFD^xA1СC?T}DýJ&M:UuU@@ǏQTqPqNS.hQRPP`ee~z0 
-K S/XZZnܸg<kSN555G}D")**Zn)mعsÇ?~0::ـv?Ԝ9sK.UªUo-+++++oKV^\vouQi9ݗ/߿pXU[lam߾}>;|PP-Ya{{{"ZlYQQD"8|pXX*UZ+3cj*.Ν۩S:0 
-K ^vO0k{JO<%?QNDJ?~\Wɉ?(V	#m۶)w֭l5l%%%jxxxp/'9V_QϞ={wnzmy*UZ+3c]+/_عs'G %	kjj2dH@@ 8JŅiiixSڰ^D&)QUU<R1֖>|벲2"SKCC.D"M;;;"*++Sݖc{|mʊas*.<<{*`N5a]($$$((  P\?iZ#ӧl>N/v&lLSSӹsV^HDSLѺJG0[)U򻦌w.JQff&   %ꫯ,,,86[>zHСC<OرCoTNs']yhˀh˖-r4h?Ѵ_%9eWWWVi";w;f̽SvAVrMMM쥢 `P\oŋ9b#?j߾}<oqqqٱcÇ>|m6gggR;aRk_K"rrrڸqcQQQCCCvv6[pb`//-[ܽ{!???%%eСÌ1bΝojj*++ωޞ{*1cQtttaaauu#G:wl̽Sv#NII  F%@{ J#""4Ũzj_3fе(#FѣG766jڋť־H$cǪa竮]kqi
-VɟdS.p|ĥ...5} `<P\={|4ܣ׶T*]fMϞ=mllw'lν;wDGG;88Ν;V)aժUׯ.,]"H֬Yæ0zh|UÜ<y2>>SNVVVvvvnNN0s֭۰aþkTʽJoʪsΟ|;.hgϞ[[[ ?CJMM: >|xzz+  hhW:4q5kּB` 2lȐ!NNNN: E= LGLLʕ+{=WWי3g
-@K[W^: %@{͙3楗^: ݼysҥ?{-t. NC$$$l߾СCǏ: }03z'O\xQ} `uhD"ѦM$ILLLZZZll,%%%;;ҥK,L\[27oo>m4+[N\ @7sݲꫯlmmg̘QZZT0k~B :Cq	ОDľ}&$$~B'ŗ_~yرls 8Y8qĤI{ ŋ#FX|%K \ܸq#22133Wt Ԩ}]]]gKKK }X  gZXX_xQt 13k֬ݻw0](.H.]?bĈk?cΝ  (%%ew: :x`\\ܖ-[fϞ-t. "(.˗'O,H,t:`~爈s_^\ pZL4ʕ+		YlL&:#0SYYYB # fM&-_|/W_}&tF`^rrrF=|ZYY	  K ǏϚ5K&}B?3fɓ'N n߾/ƾBg_nn{yiT 	K  "OJJ:vŋ<fAtQFx#@; q]zuܸq'N={viij̅&M$J>=hN>6` K ;w<tӧ7lܬ:th֬Yb}q=z,% FTT۷?O>Ǐg:uٳD{#a̚5뭷ڳg@@q	 YYY-Yƍݻw?~|TTTaaٗ>d?P44<ydʔ)+VHLL/-,£ @avرx:ܽ{WqD+W\dqĉkjj7bօ x)++0`&Hy^{M>|xݻw֭ @É	 ȑ#2ݻWϟ??&&fĉΝCe	`&p kll} KKÇGDDeV`̲Oظ}0# ֭[9*K"dqqq/_nh555}gcǎt*K s hnn޻w/{8Y[[[[[+0#HBCCo޼	r?rʵk?~SNBg mšMfgg裹T?~LD"ښ/?SBp;z5}t777ۿBg&%ą
-  S\\,t`B' fWWUU-t" 5k(.\\\N  z    `P\       Aq	        %    K    0    `0(.   `P\       Aq	     t&D"ǐ!CϟgsjOaoookkkGGǾ}&$$\pA),===22s	{eFmV~~~RhSp4ZKR%"Tߎ7ʪcǎ?ŋ|  `6n:R=8&ت*նߒ):<<\k#555&LPQSS6[IjG#J$Շ2Dk`0?% ;HҊE<xpĉH5%<}'/ۍyyy)))Æ͜9tvvNLL,,,H$OJJrqq9z̙36駟655Ig$wOE톺w2_pႏ͛ݻ'H<yrƍM6q `ZTի:t t=z:vxM'NCnnҪ\":yRVDyfluly_xw'"OOϢ"i# Њd"ڳgOtǎDdm۶ŋV.^X?&+V466r?ϾTwED~aNZ/ hP\@zҥKmG."vΟ?ODjɛR4iҤ޽{߿˖-/-5U㋈h4 }@q	 [nDT^^z-^ZZJDa< =z].믿[XXV\>HKiMtvf &% .L&t
-6yd͛7*Rp|Ret+ K h]#"www]7T{8===EDjײ˽UWYXX|GDjժ:])Ͼwlڴ[;7 0-(.u<xlCWkXFFڵr6FՔ)SzUZZ̽IjApʦq6H L^k܂	u>擜QD`8;;s;vuzDu4Gm*SO=UPP`~CK 0檪s-^xȐ!!!!'Nlã=z4tuݹs߲eٰ'O9rEEEMMM6l9rdmmm\\رc5eԩ~~~|nTw_ESl^n,}Ն L-e>LLL?rH-xzjcվQq&k$cZ]]6۷#`(8r	 fmmo;wmӏ?%]tѴpwwwX?:::reڴidw}1M:999r~{mllt҂W^y 1Pbb5kN  g0      n_1  K    0 c  G.   `P\       Aq	        %    K    0    `0(.   `P\       Aq	        F,t`vRRR  Gvv)@;ڣG͛'t  G=1#t  &)11q͚5B' `Dp%    K    0    `0(.   `P\       Aq	        %    K    0    `0(.   `P\       Aq	        %    K    0    `0(.   `P\       Aq	        %    K  #"R bbb~Ȉvtt۷oBB!0鑑֞&Lػw/0jJTu޽y޾o߾,tj;jqUGSϤI~W 0  n:öv5:<<\ɟ555&LPQSS6[./RիW;v쨵ņqUjMS><hee; G. ;A766?^&-[Lװ_~~rqq/n߾X[[2l0p̙?sbbbaaD"~RRѣGgΜO? d-Z;vXEEEccc~~~rrrPPj߈OIuW\=ztSS_S `e* i#KVGQǎo޼S<7<q988E    IDAT*upp 'O*%@D7oH%vvvDt-#X*M=R\r}"iK b/?X,&xH(0L(&O.u
-۱c-Y_p۶mDx@U/(bխX;r...DT__3 Z	K  Ø>}ƍʚ(99~۵kwo|H$7nܘ={6EDDMD/(>>^ڸ8yS&MԻwoٲ}r111D4|ٳgر#77 D"v+BD:!S  S%?-N:uTeΝDԭ[7D"HuFDhSD=zrlmm^Nܐ;ffDnС̙3޽>_;忉}hP\ IT[5FFFQrrƍhԩmV!nnnٺmq̞p_nY\jTƍV8q/ו򊋋t־ (  zR*.+++Uc:v]QQݦbiRRRokIINa]v%"]![ݸqC\"޽ڄ;"(.FjJDj׊#IqD"!"X̳v	\ {CWWW++:www尼"##+++.]SСC:vlXFFڵr6FՔ)SzUZZSjՋ2ٳzlՕ؛>S) 0UJG.̟?vرrJ"Zx1wMbX?}V|رcDӣMMM%"777Վ#//?:<n8"ꫯnذx6. @OZ'NO#jnnҥř3g8TkFD:EGGڵk
-
-$I]]͛7gssCK$׳Gp8%J+Wήljj*++;p {fHHi}v"СÎ;ʶo-v	?  z..+++;uDDf$ҥKUU66U\\lgg'w	k?VWW?^mLxx?*.a3%GڡS|ajissQd<h 'rʔ)D4|pLƾ^ԦBdɒ%DSL&KOO			+ṡL&KKKwwwiiiJՕڄz$''gҥÇwuutpp۷Uoyq0Lccիoggggg׿իWK$hDI 0sk֬Q nq    0    `0(.   `P\       Aq	        %    K    0    `0(.   `P\       Aq	        %    as  0/_mnnf+d2X,f+bccSSSK @xb  0=cqqȶ 8  _"h֬YVVVj:88ĴqJ  % MԤ*..ֶS 0*(. t߻woMMMSNm|  K  ݼ+g]]]CCC  K/$JX[[O:R  K  t%((H$ɗH$^zI  K  ͘1C8eN*`>  % ^|E(g̘x   Й{HH{  ك<L߾}N X GLL{rڴiB `DnqhSBg`999)))B` /YɯIh.:  PǧX,%5L^n466۷oB'` k֬:hp% lllp @	K    JP\       Aq	        %    K    0    `0(.   `P\       Aq	    0mmmطo߄.(GFFzzzZ[[{zzN0a޽(5(D"T*U]ޒHNqǐ!Cϟ4^^^111򋦰jYnذa"hk'ODGVL&5jH$2e
-G `6n:0SZ	&QlSj֭[ɑ־p4qVUUj>Eabʪ]X^^.Q́'oƍ:J˽hڵ˿K"gm3
-KhSMD..._|۷kkkRRR&#"ggBDr$"SlS^sJ$-4H_gw1R"++kѢED"ɸ[Pj8Anll?~<u-[؅)))li(-ZDD666DpBÇ͛7%yyy*0?6K(G%;u	"rppUZ@D'O/d "ڼyruly_xkqի:t t2:}alݦm۶Qhh(pرD}vݔH$DW_[ccNiUg&^*655ќ9s8ZV%)L^Ba/_ϸæNJD˖-SvٲeD4m4hHKK#Ν;744(.WVȖg-).YbM8QL~b[\ҲѣGjADg_~j+?ڵ+-__VWWs3
-KhSzח4\W0Lnn.u]-{MD6lP\-6[X\#vYL~oӧOWۑ("ڴiSrr2EGGk&{IJJ"pkMkO>-D"љ3g8փ%)L^BacoIX]]ɗȋݻw-G3R-vVq{z1	8A(=ztyyڽwlQh׮]jYTTdiiicc[SQQacccaaQXXYfc,X
-3
-E 0yd͛7*$d26lqpss[rSO=vmtt/rY;;;)U۶mknn~\]]566V&/4UVXra[,xzzѽ{G].V]eaaGѪUjTװN}	iGq`.))y###/-899M0A&d	&8::0sÚ3gm߾dgg 0](.СC|{8TUSLիWii){IjK``q8NJJ\tO<YJΜ9s"
-?b=,,ܹsj qvv;v9::T"rssS^Ի/<3jaE뗉qh0L~~X,ŊV[[P[[uMNu|VdhS^WvڂDRWWwMKRR%IQQ>aToW#[>mZHʬ{O1- Xڪ*[[[Ht]B[[[P\PM6K@<_X]]>FUxxڷ*.Qգ%Z;=^gZA0S\\lgg'.]unܸdܸqDqF9Ɛ k g0|MaL&KOO			Jaiiib=<<<--MjAԣGFr"i:Nq[PPЛoy9mr?L>֒%KHF.8vޭ6}7C)7hPDAf!  `<0?nq    0	  "c-NK    0 0      Bq	        %    K    0    `0(.   `P\       Aq	        %    K    0	٩KII:CbKD @ꪪ*D"JA&Q]]d"JD4|~ZЬ-t
-Nѣy	 FO:a"a8p ==aaaQQQaaaB k2#rĈgΜi  ۷<==N x}/ϞW299gW Z% {={1&&&>>~ܸqvvvB :khhx7l gaaQRR?Z%=bkӧODEEM<9""V sJRC"aرf͚0aP4 #++k˖-ÄO<9**A ~؂R,O<nnn/Y "*//OMMݺu͛78gΜS 7|s۶m%"駟.**vܙ0e\K0w?_}{{iӦ͞={B' ma׿{"H*/''G1ҥK7o޳gݬY^u???0xC)Dsg}6$$~mIIɆPYH`,wwwa&O7/]~xgÏ;2 P\)**Z`ǼyFq֭3gL:7 FGGũpqqywGH1p]vq<8O?t˖-sywv*tR `b_f͚{,\pܹB'`DP\YxڵkKgg7xc޼yB' &pݺu[lqrr>o<0
-(./ׯ_oggs֬Yxv Jee׮]kkkhѢ n1w]hI@;TXX|۷{ӦMBg $SAAرc̙]PPl2T Jte˖~SN#G1c_%tR Aq	Mcc|лwW_] իѣG8aЮ̝;7//oٲe.Bg f?BCCm)tF m
-G.`fڵvqq]x1*K ݲeˮ^ZRR3ٳG Kh=zdɒO>رcݻw:# 0wYYYӦM{8wFFF߿7iٹs端:~={888@Cq	-//oرΙ8`	 ŋ111;w:օLXNNNXXX@@ 0fgϞuqq:VLUAAax;;; Т<88COvtt:ւLREEŰa:t?& 0=.2w\2]Le4|)YZjL
-Et!^@CR]ӨuwKbEEa7{Ι3g^ssg_msqqw8 O8nΜ9Z,<:zhrrch/H.yyyޱ  Xf+VnX .9wWZxb{ `~̙3gϞ֭c1'`aÆk6߲Jh4'Oqyyynnn^^^NJJoÐ"q{8qbPP[PPP\\ݻ.Pbxjk;۴iC̱山u*
-Bhcsܼ֭tҰ0WWWoܸQӽ˖h{1X1Izp Σ@T;w=6.Q*ڝ;wbbbL}!%bb}}}\\hzр322մ `]mT5RT555XMHwGfg͒91؜u-[̊r!"-mcnKTd:xiӦ'&L aÆYZmDnݺK.577744\paQQQ1\qԩD㓚ZVVj]^7uTaDԧOV+Kkdy#9SZ[a[la7o&"ùLg]}GXm߶~!//٢Oޯ_&K[-$9&0KN8ADgϞm'ׯ_'"9r/^hQ 2W<vbޢb|aa!/p"ڸqDGzxd$n\feeYqh۶mN\Z%d/XZZ[m!Y7\BgK/EFF
-nll\`A``9VV%ӧO7}S鑿Ef̘AD~̙3hʕKW\ID>,/\"
-5#1Wɩ)d8 Hn%=vYBDTZZ*l/tVݻ333Cbkչܸqƍ...nnnnvyC2dHJJnCCüyw5eC_&QǏ'"FhXSSS=Pʢ:s&̎믿_WW'lT_=k֬=zT*??z/-sʕxZݽ{744z-sJ?ݺuh4<>>>ݻw뭷}iiiIMM}Gjѣ
-
-.8nǎGvssׯŋoݺeXqÆ#Fpuu:ucǤ	IW"a:,-p4!!!+VͲID#۷jDxMSMO/Z޽ӖWӧ?^tiqq1ۗpkkAO>vҚBV(Ec5kְSRRXOD{mݰhΜ9{쑈ǰI&_6ɓljjz';֐LwziM:ED֭3Hzz:zgEc;t7D3uuu~~~V6j*<c
-28gϞƋ{U?%+|g?q,LEFGGH//O۷os'ú+h\83UlLeĎp/^$W&w=>lǎ;(,,Ljڰ0"ϗhB;6f̘jyxxѽ{,566'/`rrr($$+<.ȯ)Ԗ3޾hl<sD>7:t4KfϞ-G#<44o.++cǰ;w0zh"Om^|||233n^cH*{V__ĉ^zђ%KtGNgUwﲒk+ke
-^bT曁w^
-/66ȑ#nj1f]d4/J:ܹsoHD޼7{J/֭#"//k׮555}7SL^e6n{yfc%тD  BIDATc7|3l0"Zt)q]t!+WkښFGGK/,:wDLeH߯T*xlrf'N$6_fΜ)	YZaցKhbգgP )[n%Dݗ.]dv711/M6kV~QCɕ+Wk׮vRT*===Yk+22ADC5ޠѠAtGfg{1"Zz52AK\
-^bTܹlx&Mh4*0?l6-½i_0|+**DKٗ!C͛+J,>|8<yҸD?)##ҥKj+:BG띩i/Su~Y$Z
-h6m+,gV[h4`%<S'
-UTTXT1/gwYYTSȊP ;q/8.((\bSrJכиኧy,i.RUUEF9[Z2# ݻ߻wܶm[jeqXajJH+F'!!<hx^+(?Zwwwѽi JN(
-鋧'UUU	וXϹ?rwiv0q"!Y+t	6Su~Y$Z
-h5\br766>ݺu4ع^xjɃd⑹3<CDRSϲt 飉tM!GǡAP"*))yWjusssSSS.].\?Q^$Z1ըZwfVwR׳sf~ZZ4M~Vm[r9{Q)((P(ׯ_h"痔ݻrk\hRb@LE"/֥_l)NKKӧSRRhƌf	ITf9LrNvAt_dj Jff\brNNN&ŋK7!TIIJRT%%%򫱻|||גC_~%yyyY۷$j
-Y=z<62͚5222
-cccEsqY`Fh\AVj-%Y>mLj:qܞ={788nc,ZelE+FP{W兆G9Ϥ#ʼ,.gJHHeСdVc?L.;YleFC{wek"!{YIee%>vBhmmw^^J'$ԼyWcw}G/_j/^u+ǳvt>tӯ)ԖsAݑ6vX"bd8=SO֭[%Z	$=Po){z7;;͛7ov{Tg93<OD7ɜm[r9{Q7n3<#(oVMMM]]ݞ={e>#gJX1n?v~򦦦"\"k4-[666655l޼yȑǍ5jǎ׮]kiiZfuEzt'|&O\VVvΝC;2]CeeB0kܵxd%~)Ջ29~B8sjwa/CÛc`Egw5r\tɰ.~PW^PoiSSӨQc8fÝ$^E$Y灈}^Ec+Z.g/X1B!!!n0`o*DX(UD2&/ZGz5+QCмy	IWf^3	1{g܄.Hb$4_Nnv{zpb@dҥdK'2{TIIIydssscbbT*U@@@LLLnn[ZZ',_SȢ3udtA*,ٳt<nJJJݻ7﷿E1tҦիWGFFzxxxzzFFFY8bܽ{wܹj:>>^I2;|DԵkWѿLh`Ũ
-g/cmTӭ]pww۷b6a+W&OV?l9%GIzV]v-CV3p~Abq=zpuu؏͝;7,,?**jӦM:Nzʙtuu}wu:#Ntg.Vp{ Ǒvڟ Й̙3'++kѢEm. pRJ{  Wbbb]]ݮ] W>|~`~},++w  mF߾}gϞ|rVkX 
-EXXXUUU\\{Opy!glٲ
- d<<<bbbo݇XZRL {wK,= N #N g.ɤΘ1ޱ  Luu5y{{;Br	N#++̙3  :ˋSCr	Gx[^ w}裏;Br	NiѢE/rBB±c :ujupV3fꫯN8ip  wԩQF;wG3pΝ;}'xѣ z[lyǐYB#Gf͚{ IUVVݟKʕ+JellR|7|I8 8fddN"''_ӧϮ]""" ,'O3fL^^^BBc$y͞=ԩS˖-{wJ qĈ_}cG^;oqqq.]wD  R̙S]]c@ l	%t**jŊ_uee/_h  Dlݺu޽[nh4\B'4bĈ)))|Ixx;C P󓒒-[kX l%tN*W^)));v/~a `ΝӧO{={`{H.3
-
-"##G̙/~] ܵkٳgCBBƏ?jԨ|^o q\rriϟ~zBa K_<8??ӾӦM0`@zzݻw+ )MMM>?tdЉ!ȑ#
-
-Ο??f̘%K.^t۷wX \x1**h_H.~4hР0 &&@SNOgϞ={6^l +W2dF@Cr	UVOS(			}}ʌ绺Ѯ]Ϟ=kx?y睃;"իW322+**x{nԩ]vh4UUUJR(k׮Ņ- Ԕf͚M6=c z0;;{D4jԨG(I&egg#F p\曕VZ`PH.ݾ}{ݫW.//oii-uuu>|] t7x_׭[׳gO{G`@y܄%ܸqcԨQiii 8'ON0aAAAsssY}%I?cII:e'O A1b;}Cj 	šC;
-
-O@@@RRR=: * pϟ߷o_eeC==p@{GV]t5k :Tjj  		~ w pqqJ[PKD RSS׮]k(3@r	 NP̝;Q   8<    6    l%    K    $    `3H.   f\        Ar	    6    l%    K    $ qyyynnn^^^NJJoy;qĠ 77ݻws۠BP(t%/mMNsƅ#Fx嗋,JQTTB>|-X93yBk.-ڵKP<# Jh4'O> 8}!!!>rΝ_8:4,Df"4'Qgʔ)uuuof/\`hV2h7n_l A*Ç6g$Сp`'O&"__u]t7o2T:u*ik׮ԩSiO>ZWޖ6鋜miθN9uԢE<<<hرz^zf3Uh""rww'Zҁ5ӠCP\zXii);EjH[-	&ѰaäWl%t(:ґ#GŋՎ;FDjXVQaaDqF^l{_dnҌ߭[7"ڻwo#-jD׿EWl
-{a49s&XWw!3g@:ׯ`[8>KN+;;.]:p@jYYYDx∈ޢŋ[|9}aȯ)Af_:СC.]JDn:lVUU2d52^X4ΝKD۶mjz~۶mme @Cr	i6}7D(]*>1mڴA]vm˖-ۗ_S̾tƙ3gc[n_3_V"Ɓ¢i0vذ~:eeeaaacǎ"F՞?~Μ9Dkv }/ґ}ukKF"4999DR,)qM->$J~=ޘȉDAݽ㸚wwwRYVV&5l/,V"~P2}t"zd]Θ1cM)Vp O8bƍVVVVkkkBBM2pY-^...%>LT>m,ܽ{o
- :KN+((^*]M˗E`"Roիٙ-SdآXD9i,66'njdݍf{a4ѣǄ	?S"ڹsgsssttthhpu9C
-+**^y' KNkȑDt9DrVGhƌqƆ[_S"H},aÆv'Nr
-EGG^*MDW\9qZV,VLfffGy&NX[[lٲ6n ÊK V==ǧDڗ_~ID^^^qD/<X]ܦ:gϞe/ٷo_#ᕳ"~+VKqZܴiI5IbpD디T*J%wC:^x>|Vmllx"D뛖v5V[^^.uGN׿ѿWٖ٦N=u믿N/Q7WLTJ\EӀw+g޼yD(.`+H.Cd;woĈq&mi6H9}hݢ$S񩧞"o*Wb`h0PV~B8s蘀:^OݻwҤIFRꈈ"^ܘ J+<?'LZZZg*_S:S[Ԝqa^zӧOnSH~a"{?ljrVN/Ov#?.w9C-\T63؊t$M]  8V8    ،  81B! >3    `38s	 `= K    $    `3H.   f\        Ar	    6    l%    K    $    `3H.   f\        Q; 466n޼Q  (**wI v֭_|Q   _HHC@qc    N\        Ar	    6    l tη*    IENDB`
\ No newline at end of file
+   IHDR       8gq)   bKGD       IDATxi\7%aS@DpEd-.EЊHVRiZVm؞箶EzhKQ\q=E@V%$Ŝ;w%s嚹~3\0,    Fw       P<     ǏdyzzӇ`LhF>}d5j޽| c#O |wh0	   @(    	   @(    	   @(    	   @(    	   @(    	   @(    	   @( baH$ruuݻ̙3tY\mtLѣ>K.Boٗ/_sj
+e&$$δnnn#F8| -e  h޽|1
+⛘
+ :::11Qjׯ.ׯ_+++Ӵ.|?Go߾KZ@:tP2[x}p	 L˲,J$yDz:,8o޼2Ǐdgg[.88X횵4͛H(%mMMͭ[".\X <4'X#Ookׯ_w;j(\lmm߿K-zxx_~...O<־ӧOE"QUUc3@G8 /000..vmAHpԂiӦ|СC:.koo   #G|1m۶[nI;O'r授b۷ccc(22~&8mМം"OQuuMeee;;gEE<(oiѢELLw}ױcGMéɓ':t|sqqqvjkk=z=mXXؾ}ZjXf/<Yd>%%111;v,//ߺuk^nݺzRȑ#9::Z&mݺU...K.U P<YxnZm;o\\sss\ZZ:|GOLL$";suV$\OΚ5˗Æ{i@( ,2NJJ".ș3grrr(<<\~5p"9sڥڶmzaÆ  7n,[Ǝog---߿{B ' 0MR$##믿ݻwyybbb 000>>ŋ%%%P'i%`&77Wa^^@ 8p@iiŽccc%	>4.K  42;1b֭[URY|Z:hrƍ7n;::\ŉhΝՃVvAN<s3fhZw}+W2( 	G 4Y[[Ϙ1####%%E~m߾}-,,̙s^zTqE'Oܵkn֬Y,.X@-  p'סh:x}p	   @ PZ?Nx7IÑ'    = @}'    =x   '    =x   '    =x   '    =x   '    =x   '    =x   '    =X  w
+ w
+hP<43/^3f) LӨQ  ò, 3u.|WK.;4سgΚ5kŶ|'0 "_zu%TN&}'O駟6ow" c	 ѣG,Yr^z0SN}v.]-Z$J?O P,ˮ^GRݻ_~ߡIxzz?~|			{~߉ x	 VYY9qĹsΘ1ԩS;v;4'fffVUUO( @?>ߎ= 
+N嘘#FI$ ȑ#AAABիC;ͦM6mڴf͚A={D <@ ZjՈ#>Ϸoߞ8zڵk|04O P7X<y丸6_W^ׯ_ӧΝ;`P( _NNNNNN;?~ĉ?#q ? ڔ6,;;!!!|bmmiӦݻϟ?_l0|hry ٳg:uTNСCcƌٺuq ' Ppeeeiii]v;cǎ5*22r׮]|hB( @>}_eff{߻w/'0a( @ׯt@sŕ<xSo_H	&ܿ?55?--ʕ+#G;@@ 1wǏ9rϏ,,:t(==}ƌ|ghT _֭;|p>}XhhÇ۴i8  ѣG̙dɒ@ooݺuܸqm۶/И0a ?~o4hݸ!4\ĉaaa|gh4( R.]dkkw0,˾YYY׮]sss;@q ^v_Ea۷;;;98 Ȉ_tY/7o8pUUU#%%Sl߾}ɧN'0( W_}m۶?Ņ,`&MvVZAP<+WO,  78p Y ߿?˲ϟk#w݆8q"""bcƌ;K3kӆ	L<x0&&h[0MҐV)8p)֋1?f9J~~~wn5[</aP<q4e{_HHH?L1?fȼ g߾}.;;;u/;@=x0G˗/;vln'LaeeժU'N(v`FrZbemmmmmmu<yr˖-۶mzj"*..?~˷~Z(mD"YzuPPmXXXjj]WAsO*.^cǎB'11Qkю;Ba׮]ϟ_VVN-j^"9r9s41aW/]9~80nRjW}`&%%Eڥ4VkbXqّ#G*v8x[oز}vkySX,SU3j?66VdXL6n8}}}tWr?~lggpBM)+n.0;	Pm<vXiiX,_j;'>>lRPPPPPy-ZqFYYND-[Tj۷o+XW^hM{Q}qLMM-++ˋ"~)ݸq#'''VVVfffQ\\jڍ,&$$kӸ9V]Xyy!0V+--mnnn?E"C'"JLLTlܴiI`VVwӧj[\]]XT(B'NRwlHH?^q㪍ݻwR6{cW(5y#`^OOOT/hyy]>DDTXXXPP@D666VWWs7e2aXƆ
+
+
+4FK\x\Ϫ*y|)}r?maaaaa!<jٙ,rΝ;[ciX=vbcCWL0#Rt۶m&LP*ϲiӲO
+>_n	BPq,nt>hM9>u߱RT*d2L~ދ5k0xiupxy2CX ѝ;wT>?JKK-o[܈(''Grq>Dmmʹv۶mSlܲeS젽Ej('006nܨOT5dPuP{<oJؠ "tuW~PrM[j(9ˮS/x$ ȴiյkW"oJJJ۴i~=p@"+//?|RWWW"ڵkn¸Ӷm
+Ie¸b$-VFi=+W$"kWWWgeeiӐAն׹BxZ777VVVVWWgggoذO>i?uwwޭ9ˮS/x$ Emm?˗_M8QѣJ}Ж㏕,[]]ݿRVSS-.ՆQZX,4hjz%Mms㩍ԨڧΖ3g︚?S$^ZSƢeW©@< ٳ˲$!!K(vyѢE	.ݶlҽ{w+++OOEI$>ӧOС]"ٲeʉM(u			\6;;C{/iTm.+OOn}w,'--mԨQVVV666sν~jj͞=ͭRKk.S/m; sm<;gϞu%!!aƌ|gm`.N:Z k۶l2Xwx0׮]&xb|' ;w <=='NtR|  	,dffvŅ  -X //o|' [MΝǍdC^pP<>Lvʕ7|  u>vA A`rssP<ѣǐ!CV^w mP<۷o3Ҳ' w=;;; mذa;v\~=A 4B`wc a1<M nlԩSnkv>{7)sO?ٹsg״grm{	{QǎNMRS4&QFYĶL' W[[ٳ@;w' TjSeeg}0rGӧi۶mUUb皚aN:vmdAAAaaa{w(
+v:ŖH$?S>}\]]۵k7jԨz풟a( -[hkkkkkP[[+J/رP(ILLi"}ߴi]&L𰲲jժUxx'jQZvR]O6"Ҿ3***&Oܲe˶mrb(..?~˷~tMQB#`eddQ^^w7"eCCChŊYծP,}CdƍS׷L1R<Mccc5y;VlJCTWW۪= nWrrj[fWUaM5P˃3#G*v8xEoye\-]	`<HD<f޸;tpW^9s;6|eIVTTp۵kGDP+Vի?~\]]Ͳƍ=99233388(֖.\/RSS1VlDe˖͛7hт/_355,///**Wci@VVVIIIJ푑ǎ+--Vٺ(W˃}gr}oܸQVVQ˖-Zy˸vv+۲e=7C[~W"nQ||<w;#Ԯ0  6lؠzWHH?^ÇD奘G)UÿM6=xc_viɩ]
+511Qw+00P'rrrANKdddDDRcZZ,--TD"œhߙ\,ӧOնr7u^2@ح &.!!CfKJJ-ŊO)))DԪUW^UUUqnݪi666DTPPzwB T+++<J4]ň/^c:k.-9E"*v((( "UUUմcgϞ[~Msw}*\.ݔwPjaJqƆq +1/**Zz>}ھ}{>Ĳ,IRT*ɸcW]u˗5~={v=jlYJmccgyϲiӲҡ!C4
+uٙBPRPnϓf $O &ښDD.\ܹsDԩS'&0߉hʕܬJӪuFDt.%Dt%//ehh_w7nm,}ǪtH$ZrWC=zbÇ+o^FxLU||7W:~SӎR^
+?(Mú<at>F ҼyoFӄqT*znݺR
+W\IDk׮ϯnٲ6nܘ[YYY]]a~PzfؿǏ,[lmm1Vl˲Dk.œ5JCpӶm
+Ie¸H>W޻wٵkW"oJJJ۴i^ӎR^
+?(L>[Vۨi?@K ̙3~m~3pJ_Ֆ_@.))kW(3gޥء6JNZ׾]qCTWW_uaaa555ZWNX,vqqN,|rM8qRxM;Jm{+3U٢Jm ]	`>{㮨Os1999J.^HDS5			".,,L|iiiFrww;w(4PVV'|ҩS'+++ПY"o:kٮӧwA~BSlll-[&4m1~g
+J$///PعsEɧkQjuY'Vj ǰ  ŋ#Gn㮬9~xDDDNN| 0aĉb#0ݣG
+Ol0Eܴw c	ĉbK'a:uTPP0t=z!C~NG( LP(|H$~@Ϟ=[ZZw ""c{ |&_vÆcYĉG; <:[[JS 4s~p' gccSUUw
+>|ѣGql0( L<	6lXqqK	nݺuԉUA ~x0q8magΜ; ' Sײer|L.^kC`bqqq1A jb8## `P<6m_	Nm۶֭P<8777"zA O>w
+0w( L<i0`իW;-/O &aWWWO`d2fkӦ͋/b۷#==P Ѻuk~ᇁLSQQѽ{ݻ-o߾b
+L݋)|fee' q8    IDAT}I&@ UΓ?O *$$d׮]a0Aƍܹ@ dbXrjӦ3_ wޕn;/O &rժUty7	ѣE/^;/O )**o߾5{K$F!||	d\R**5  ^ 4޽{xx0Y!!!ÆRldYš		.));)O lŊJBa׮](Yz*ALx0eݺu4i'#4\vڵk' ?}[YYQܼy`P<8wwٳg>a???\		-XƆjkkU;0~~~ݫ;#O q{oF/?,99F[h!N<whPS{ַn`xҏ^40|G 0e{=z4)×,Yw0;8oI*۷o̘1|'1gx9O __;w'  hzVUU'  hd2YNNAx fK.|	  %H	  4W^^^(P< @s	x	  +OO  \yyy=}|	  Ν;,#yA  U?;O  \;99=~ `^P< @3	a~Q \]]{=s̬,]WA-C,#Fmo/^k LɣG>.]B[[[??ٳg_|YuwHhh(0!!!Zr,--Fqyn=MC#Wyyy| 34*"ڳg)4R}kyuDGGh_\Z+//s%cZ)vZ˖-Rwݻwwݾ}[SZ%ȑ#>z!ANG R"ϛ7O$İZ+ -kSǏߜVXׯ_߽{wÆ8P͛7EEE555֭VK͛7P(_-nٚ[n2D&-\P~^{L<Z}_ƪO{M/k׮hт[gg;hw1"jٲ.5iZ"~3pb+_\\\jjj\Փ'OH$q7]__HJJ
+R `Fp	@8"ڽ{ݶmu`֏UUU5RSS
+
+MC鸬=fyxx' FIDJ37Kȍ1m۶[nIz;O'r授b۷ccc(22klF{Qv|s/05dܧTZ^a]:+vkM$QUU} LիWIEqnn9-,,BaQQ˲EEEBP չ/_re{%%%Do<h$`SRRn߾ӱc[֭[z*11Q*9ٙe2֭[/tVZ{+8::
+BCBY[wA`6m6@7..nك.--?9YMLL$";suV}Y^|9lذgϞqw5|`$Zn		F)))DMO>qoo襤$"pK9s&'''3gΨ]m۶W6lXqq~56ZXXw
+0#( ԻqƲeˈhرtҤIDlٲlF>---ԛ/NfJ%%%_u޽c QQQ}YjUNNNmmmUUս{6nطo_%S```||ŋKJJ$Iaa!wMQ"*JKK804seJKK5-+HOhAjӦNہA2@wdR}kyu1Bϳhy)5?Di5-aڵD4x`CDvZU)y䉍0/_wiڨ:Gdܯ/|AAA| 3#O %88xƌ)))pѽ{>ήgϞӧOW[|~~۷o_ggg;;;??9sܼyW^:;+8U\ɓ3wڵ5k˲,qjժ`F_0F0̞={Fw חZ?G  ystt,//Ǳ 0K akTo(*@˖-RiEEY,  4oD-_h\( G7N(*@˖- `.P< @#O``(  y'yA  ͛eyy9A\x f| s	  =[[JS@  '0$O  VUU'  hlllp	  4{8m	  =O`Ha`h999gΜ9}4A Y[[bS@ӧO>}̙3= H d2S@)**⪥ӧOggg[ZZL4iРA{bjHw
+B	ƲlFFÇSSS޽kee;L<yϢ,^rB=۷oO4_(`e FJ,?>55999-[:thDDp	Iٳg|0:cǎ;ye\tĉݻ:_~VVVu.rzjPPP``k 8m	ŋ޽{+""ՕhT0̍7rrr:wwCܽ~:55uϞ=L&2dHRRRTT=Ѡidm۶,kmmwP<!"f_]]]Ǐu=СCƍCd233?NDbx˖-8
+'0$y2;W^ݰaݻ~(|/VVVDwʕ`C'0$O梲r޽7nԩ'Mw.D"ٹs'W9Ν;Q<A		L_ZZѣ[j5c__+WGdΜ9SZZ*)o.Hx(P<,DgϞ>}o?ѣ7;oJ())OB		œ	*//_re׮]ǏߩSwΝ;Ņh`jjj+?gǱڱc_ 0nR={yfH_|J:xȑ#U_666/_%^;zh"dڵ9r̙3		MDIIɏ?fKK˿o3glٲ%ߡHڵBuSMMMjj1cxIHkkkX\QQ!o,++fGk.Ye9s̞=E|UQQRSSzŐ!C9bT u1_tܹÇ	<5o{޽L:5''	;vʉRɓ'KJJ	~},--Lb<`>pڮz3N:pBwwwAPXXoNNN:uܻwO>|DQmdiG",]tɒ%6l		;4cofxxҥKPpT*XZZG1<kf<xЯ_%K,\ʕ+5jRT*Oy	Sse˖^z+W)]VW0(?O?9sŋ}}}N&B xݽW^OVVV'O0axeLL?rHIi;h>7or,;>y2v?߿'OP9Ai;h}rzy0 OF}JOO;4˫k׮D0ԩSfœzyDDDvΝ;׶m[ii;0w,,,B`d^~{	T'''i;U|G 888QPPɓ'u;Ex2R_|ENNNVVV֭œ*h233333Nu۳gѣN (۷mvȑnݺL<eof͚53gTk-`TL1's3f||gӇ9O`Tfœљ9sff48i;'OfddN 3g΄	w08m /OFd%%%K,; 'cQSSr3f'  }x2s;y ' VZ5vXWWWy'  }vFٳ߷oA p(l߾=88Ϗ `vp @_(}}G|sv  BĿǏWWWㇴ8m /O;rH޽۶mw0G(  ǏwN0ЦMGi4m)< @${̙YYY,Zԩ0ׯ_Wl0` k׮1өS'2%ai-SjףQ6lXFF._P<?xIxx8A@=C)sjjj
+]644tȑGgϞH$`ŋ555Μ9CDT\}.]sARSEEEiiiVVVG&=zohP<,==.(( ƈeYijNۙ=&H͛'RRRbbb`eAx"իW+**|}}/]$t8jD$
+=F]<H$-}q00O<zj^
+@i;XXX8;;wŊYYY-Z8s!~pBϝ;GDaaaaaaD$Jϟ?O=T[[DD?())I,,1chϞ=M?\^,,,tO?QvvvfƄg׮]{74+H~>}Z[[knԨQiiiOfm۶UUUkjj<<<9u)'Tx;
+BD!V^doookkAUUU3glӦ/*-[hkkkkkP[[.+W}^;Ba׮]ϟ_VV&7777::e镕|Dաu@U&L𰲲jժUxx'hX
+#ݻwlP]^vkNᅅ;P<]zۻ]vSSS
+
+MC,|tt3g
+
+
+
+
+
+Ξ=kmm]q3...C`v͚:jzBCChŊ׬YCDMJbXt+y~UW;` Xʕn*ҥwL&7nj__߲2e_|xWLLJԎ6aRRR4Թ(cƌٳO9]"ԥ4e"JHH`YV"hт<y"^_D4m4eJDk֬aYvD{z/8|p"駟֭[GDQQQjWE"|D4{z1~BħGQVVDp|X\TTβcǈյ\]]v{MzzzEEEQ~+V "{{իW?~:333::Z}ݏ9+{ksttܲew͛˗r{XZZ^xkٸq#$99233388X?>uٳ^:sLy<vXiiX,_j)T<:unjrM[:vؑ#Gjf4UU<qGmlltA-ڵʲ,7ˋǇ233YP|-,,BaQQ˲EEEBP 鸽/vA
+vܩvZ988#3'>qG={C݉(<</ܴiӃ妙s7N>>>2k^'N/ý2Da׹\QbbbM(00Pߕurr"~A}9=>|(vC:~(5겁҆&?ID"HS-N\Ӗ7nĈ2'xsWׯӳgϸ7ڄ"2e
+w״iӈhҥbΎa/^?p{Wj,//D@ pLnݺq1'>%%%D"y*##cǎ[FJJ
+jիWUUUa[gp7mll@u..S\\H$"BƂbW7$~I$y;w{ObYNII|nl_~E%4ѩscUk룏>/i\uc]pG.^{ю;vnUDDDzz:SL&ܹ31nBaΝ`$wx3}Mܹs}%M6#3&)??]eBCC<x|QFog/**Zz>}ھ}{թ0'=,eq8P=#۬Y^ڲe;vXXXY%"T*Je2ݥ}apO6-;;++**꽶FX\ 6.=;222N<IH3g/vprrr}_䜜~me'46O|zeߧ{"EaDrJnW_}UuFD_~MѣXo۷o߰a_CwѥK@Dňwd;Zp%D"Qlr㽽FZ:7VwTq=vXUEׯ/++ڵ;ի_/RNu^{vvvvvvÆk>~Q)gLjпǏpogR;MD[T\\CظrJ"rppXvm~~~uuuVV҄q-kUrNNN۶m+,,,,,LLLttt$	z֭[ǫ-[ƍsss+++7lЧO]]]h׮]gu@%]v%o$99M6GԹuLI&qsALⴂ*bD")..NOOꫯ~:ұ.
+?SŻ@ O())D**//O D"z-	^ږszzD2rBħ1cOEL:Uw]8"Zxŵ4ATWW_uaaacMiY9s\z\eُ?XuUl˗+u8qѵ?:7ΝZ"xsW"#F(NY:㖒Oxp_g#7xC޸vZ"<xUq?vZM{@ё5sU666.\G$#G&BħCN4IKO>SNVVV...?,ie/^HDJtnX,NHHDvvvaaa鲸7xn666˖-S,,r]ޗFneee    IDATcc;wׯsDEE9;;O2>wӧwA~>TT"HBaΝ-Z$et-N#z93gol[[[Ϙ1###CZ^uvѬY͛'oիڵKCzҴN,iȉD]N2޽{cL|l׮]O&&&Λ7,^>Ǐ?~ Fa={=  &4^_0޼=zȑ#R   eYw0ViCѣaBZ$$l0P<I H҆A$q?PT P<իW^ypȯtUs9O|jѢEyy9) P<e˖(_8m /O|jٲeii)) P<]v| v  B'wwʲ2i;  }xSvӧ|v  B'OOO"` P<5;; `P< ϼ<xw
+0_ /O<>)|a P<Ν;| v  Bĳ'ON |M@pei;  }Y988t|gsvjeee 'œZ? 'w,2w0;
+;sww={&sTRRC9'0=W\;2OKxv`z
+M
+lmmz뭓'O'0=|(28m&&88aWL'ɓw<qvvԩMœQvvv>qAx9ФP<A)OR<`>pL'hR(Ő!CΝ;WUUŲlzziG$?}ӧ|ӄd!CTUU}gϞ})0|Ӈ	Loaaaq#FL<Ç.0` ۷S	g`(${yy]v `pOϟN>-ʳX,ߋ40 ySիW/ODpO;wYJ> p	LU@@7N	<<<N<iee^|xSL'6mR{> pLU@@ ݼy `P<o	_|@Xx'0Um۶mӦ&œQXjU~x  '0aMœQ_,-G0(O`0g'c윚jii0ׂ40 ypK 4
+OF$  `ΝH'0ab޽{|Sɸ̟?_u8@A&G$a84:|Hŋ;v`8m&Ӟezr~~~ff&_Q@>yfiiirr2Y=#O`nݺw
+05)233ǌWPx0$??'OL/H߿;4d#qLϳgJJJs*'0 y֣G"qx0kͱxzg}֥KPhkk7{˗/+aF~4a222V~޽޽{5V:t`ggw]IZ+_VVV&o}۷׬YdcǎݻW(O#'^	oo? `Rp	59O+++?~xQQQMMMvvu낃uYeYe%󟘘e-ZءG}۷&>G(qYkvGh߾}^^^\J,,,tO?8p ;;[;w4bZ0>>>6m;y0k+;UUU3glӦأFbgϞ_2gϞhf"FDD..._Uzz	<<<Zj~	J/رP(ILLT쓛moo2}ʆ"ѣG^^ׯ&Ug h,ڹspg,sggg"ھ};m۶mDZXXv=ӧO'"{{ɓ'oݺ͛DpZ$INN|@DgXS0LJJRXn\/_zxx(WЄ;gwU@` ڵk ww#GzJޞDD:ubSNDtMyՈ#-Z|ǹé(rppXǭ<vXiiX,_j+355,///**u?>uٳ^:sLQ<5ZPw0( 8__wVEÆ#u֭]ƍWn߾ӱcGn͎7oTN5nݺܹSK`.--mnnnHH$RZۉ'-999\޽;:tH_EX|}}Sq f	aaa??@Dm۶׿Uz|}}}}}߿ƌiii?v[RRr֭o棏>OE{;vnVj߿\+fnnR¡Qwи0aq6ڟpvvvuulݺ^]pA$o]hٲezgYvڴiUUU,VTT)/ɄF	qᆬT=x`,yw}PRRB؊ǏoAÇ(>>ۛ+N:J^߹s
+u-''G"L' O<^'3--mڵ={?~_~پ}+W={VS/H$i!!![ZZzqC6ӓ/_^\\\ZZwީSn̙3ϝ;WQQqٳg7$(򪭭}AT(N2	3֭[|,C;Dnµk­!,,L';*O>D[oiIXgZb;GDD(GDD]GA xxx:4==]rssNڹsgkkk={Κ5ҥK2tҐa</E ڦHݝRSS;wQKJJGe8M\pnZ6mJ'Nڕ(6RM~7hœh:qMx'O&UV[jkkÈDj]+W$X5(}}=%^VVVEEE\˗/M\E	0% ˲׮]kٲeP[x^_tH#Q߾}-2n
+ׯ}uvv3gN^^ᔞ"k׮SLwn<$IBBP(ܹEjkkRƜ(;;;gg)S/ehНӺuN&O%IQQQzzydZszپ};EEE[.^HD^^^={$zH##"PHDs+asrǙ6n5nذ"##sHDjQVa2Sb`Νw
+0Ͳxy\7+!절₊" [\JQ\PQjV=n{JV7\P¾ǼO@Fd~?o&${4k֌lyNNN2]^3{O?-[.Jl%+_b4}W<w>|8pذaDmzYYYi֖<xIT}6IC&"1 3;;`&L~DDFh۶m===SRR%@vje2ׯ_/--jݺ񹹹=z;w_~~>fVVV			gϞ
+mmiޘϚv FЩSGq̄OD4n8"z17:d"JHH "LHD&$vۀ=Wyf"b'ceo-۷w^L\8$5d2Ǐٞ6a`o1`3gnݺ555U&gP'O:u:r7T9MuۍakkIc5عF0̕+WsCD^DD{Q<1;;ښ]PP`mm-
+G;vR?{{
+MRw0UMdt_ʎ=JD70K	 :3'Na{.\ J3w555@2lܸq䝝CCCrbԑ3.\e'MYYݫa{*ߘ4&&gϞiP($<tԉp'v3mXg9sܼʮ_OQ)+WzǇn=sLŪ3w111Fstt9r\.#GncUXXx9X<m4<DDD۷Ç/..f*؛Zpxuvvvt z2≽֚ƘΧӧOwTPt/ILL<uꔢ+!!zPP222R1yZсAxC xxxx0֭[w)Si*Z~}II';Q2yyy3(WGbQFۇdNxzzx0I&%&&~W}---2dVF(rrrHۉŞ
+yG3)
+_\\lvvvvvv:D5N`0~2vؘՇl%`b/;Yxڸq#3Ν;OaN:sO>D \Q=n]ht֭[n.wrrdnVŏ(cJ 3Bg_WlllvvT*ds?|+;uĎ:ГI<YYY O>$11NNN$Qg>=+<T\{<;XJJ5yJ}7&}vϞ=uP'>ybre˖Zɓ'R|QTTTRRu0yMI/!6jҊR]޶m[MܸqCͪL<lKMBë&\֣G=z4LMohC'U9M7j(+++MIODô L	 o'nOѸq4@m۶%lCTZ\[DbRiTTT޽vdmmh"}H_~_~VVV[;}R߾RBuH$+W_z5{%2l:tV3FўBbs/^|ڶmkiiٲeˠ'O>QCPX<o޼
+52KNNN( j0>͏XD27MS|]x>}7rZ|||JJJؕz}տa[H$W}jmae-CH$U+66#PߦU
+w`lP.
++-1#]vN&4{ODUUU0{h6mbcc***9i#""ؕRWΎxlDRPPölRSyydd$999mٲ%77777w͚5#UV)www/))doy4p@5G^u#F8~xqqD"KD=EC߾}gϖ%$$k׎?CSC`$MDDݺu#66`:BvAͰ*vJDAAA.ܴiÇuV٫/59EGG+7شi+?y{#GGB[?}ѣDƦhu(~aţa4cƌ`SC`$Mu%rssUEB~ZZZm*kMuK`{[[KMNSnKD+++S?wT{35)^XX:<3CD2L&7fk[yдUV988:lY,.Xt)0sMOOgr͟ޤESֶm[x5kcǎDt!>>>Dtʕ:m"_}U\\;<{Yj}.]/žˋ;ȑ#
+{-22ˋΜ9<o;w΀ME۶m*LTx5%?|ݺu999՗.]7n}D4f̘M6=y򤲲7n߿[<x;{ݻtV{\\\(..zK.\m۶?\񐡰7Z8..nΜ9?Ca?sϞ=zPi 0Muu"a|?Z&-\Ϝ9stۖD~͘1MTUU4HujWAPmjժZ>}z6T(0U+??N:u0m( iػ=|P"^>00PʬӧOi?y&/Zg͚aii)owa[W_k߾e}0UUUlmmV\_m'TzΝ;[[[wqɒ%J=EC1f{{{ggٳgz0vvv.ЖQC066vɌ @yfϞ== fk}Aa 7m۶:6O `' ^C|ӺugϞqL' ^c'Ō fŅ#@g( xco\\\	 t&R]k f/99ui;X\UUU^^u0UuO'O6~ N߰3xݤIq
+LFrr? Hcbzob1c@k}}?ptv7(@(@"(<<1bѣi;GGG<	Ckժնmێ9rΝݻGEEd2CvpxH,		rΝFDD\'-''0 [[ŋO>POC		s'O>qℏ϶m۸NØ'!<P<!	ӧ߿ҤI|!C߿u(PcP<P<h"**ʕ+~~~_uUUסn8m<$q4_=99yտKO8u"Na	4"tP=ztvv6סopxH,bj'ht[޶m[|||ZZ/jRpxH,"BF2j(v:EW\:x^jٲ%pL'0;;;v:-Z>*--:aP͉ `P<yyy:u*::]vtP'f͚QYYATxAO8>6lXzz:סx
+퀇=ߠ3Ov:ss\Dvvv(@g(cLIIYbŚ5kw~)N?5kpO1T=&Mu(i;'OOTi&..W\ҥ2~j֬P<A2zw/ZO>׮]:i;'<>P<ANuUkk~ƃvO\ S	(??y    IDAT/n޼y׮]x~:*Ot)5jԌ3FCy~:*O9;;ogϞ}In0aa𓭭-z@g(4<X1ӧNd&p=O3O`2,--oݺ4}<CiDF|ĈT׹@`aahlv?Ԕ`X(tѣ:w;|D3g?>}Rcǎ4h߾}zi;4`X($A͙3/<xpjj*׉6|𚚚?߿_*>\500T*}Ydp<5w:'0U׮]dzjAM<]N:/Dg*OO7iP<iѣGRR͛ww^yPYY9^{M$	___ŹB\+pJHH={UhhوH,Z2S bmm^6'"|!1 fŋ@ `2:Ȅ	/^8;;Ѷm6[n%"WW׼<afD/[ƌj:HҌ'Qxx)
+w`Bonii6g,`@(={￯smY6m=ZVV.ܾ};yxxH$DADop=ر|M"ڹs'G2GGǈa]v {n@6g	̍D"޽{bb>b?T?.CBBhݺuk׮%SjaJKKmllBP(e?uH%.]zܱc0!)~TZۜ1w:'0O=
+^nnn+a?
+k-n޼[V
+
+
+4Yǳ?N0AQ;wnDi&Njz:tܩ{a8N:?~СCgϞڵ]/(kѢE%ή...M1To#<x׮]DrJR>yK'շ9;ѣGoy6""Ç˗/?qN5ޞ=#,= 
+q{U]MM6fNCRRRcii`19u{L&l׮P(LHHv=jmpIQQ7xCݩ]tt+0-			D[`@(/d2oּysGjՏ6mQ||<dΝDԮ]"ףp&-[\	ip4w:N_9sܿ!!!Gv%qNN΀F.2eJ@@@ffl={vJJ\<wuY	|tyeff~W|󍕕׉Լy5k|\0dgg=L ZAQ```JJW_}rʀdq	=OC}xYxqjjjV0}|Cq{8 mx^?:ХK}2] xt0 O *00ݻ\'2*<o	t	)**ʕ+UUU^:x<իWrrڵkcbb?u"c@''QL5`#G=1OC	Zڶmۙ3g>|rJLuƂ'!vL m^CMII/޽{_tDD"!"kkkIB-;;TAAס퀇w xhXΝO<{'Nn۶͜j<<xݠxĉ'M:޽{\'2OC `P<hA1Tyyy=몪*C퀇$	@g( '''^_~=q׉'!OO D߿ppѣ#OC(@g( t׺um۶ǧFEEtP(@QFݽ{wW\:v0	xH"`'' `}s~>RCi
+=OC\ S	`N:}]n۶f3f̸~	xիW(@g( I L>===}ĉtPWnp̙[N0z@( EQQQΝիŋ{ATWWB0;;;,,.G''2p+VYɓ˗/ʒ2\g$B		AݸqcĈ+VP6dumܸۄ	x	c@( ]ΝO8ѵkW@Py]pT
+Bz@( aݓJ33n8ng'0|S^^noou
+0U( ]~~|H.TVV9N		_*))@sJ퀇N
+@㪨())iݺ5	B62l˖-ׯ7z:"H$-[:* ̜Ν;/_NJJJLLqFUU{_RDBD̟?gFNv7\S	/999++MT޽{-ɞ>}޿???d2ȑ#WZ%(ݽ_~\0a(@Ooĉ{:
+:	xA={֪U+IB4
+|L*r'r		iD"ޘ ښ `p  Kaa!@(  _P<>P<  V03(  _p	  ˋ/P<>P<  <^:0O  #ü|=OO  #555nnn\	  xD		  xŋDvO  #ϟ?iѢAx  v?O @eccڷo'''k:Ix͛52DyyJJ@ 𨵒>}I`Zb?y䣏>ԩ]ï^ZvUnaaXkߏ۷P(0ʓ'O:tu
+0my;._vh'''2dHttٳg%R'KOHH C*޽{lwʕ;w4v7o(h\}񸸸	&(6pb0/O>EzB.aF*\x/9x5 jM-U;w񩪪r!Y͛7[`<j|%%%~~~'N(((NOO_n]@@&8=b%KtOKKdmCyS@aaaaaa\0շI}of͚Q\\\5o^VV999d2vʕ+hٟ~)-[].Jx999K$WWW"Z~=j֖<x&Glʀ>sz\.۲eA	0#""7F۶mY\\.9{,Dt9vKKKZnxz|||nnn=Ν痟^TYY!MbXUOUTToߞ `P<̸q㈨Ʀ|N&LDIII555Tπ'<ݬY6xNcǎ%̜9s֭2LەdǏk'N4|J0SO<!"=x0B|mekƍ;wnݺwEEŵk׈?x9qℵiӈwߵ>y${*Zjر3fsvvoG$u?XjUsRMiC`0re.HR$]`` ]MMMbb@ P<DD2lܸqD*cbb5"##ǏߡCҘ={jݻyi֭---}'...>>ۻlLT<]rիW>>>pvD4sLŪ3w111o]g>>>{qzzË-ZǧܹsbxڴiF8ӧڵ:<O sA"{b;N>}Rybx)9"
+
+
+R(
+
+"kDP-k."b1hЃN&aܺu
+2e7VEׯ/))lӦ˫@yw=^=NFzzz.]N&d2YQQQbbW_}շo!C?1ANN)u;3wBPq:xǵfff
+7RZK.IҼ<vrQ"1u*..pԩSϯ҂9BY tQpcǎQ}ʽ,6PO,U76;w>|Æ;uΝ;?h֭[nR]f͚zlmmzG<?FMÇACbq@@'|xAcNb<S=OOY9>j3w7oolaaaoo߽{>={|=666gNII8p`#s.:uu0y5NZu 3Ζ-[}pLz  0Z@UNAndx
+'  0àxCv M)I4999eee\s'  0)))BG\s	  ͛7=<<   [n	  ?O`@(  ̕eddxCA  f.55U.s'  0snjѢEvf  [nus܃x  3wMxB  欲ƍ}:O  `nܸQSS	  ˗/k;v:O  `._ܧOSYq Svvvll,) Pvvv۶mNaJ.]4w\SYAҥK'O:y
+:Ā'0,0\g  #ٰaW_}U\\	o'?yb{{{' IMM֭*'˗/rB#ݻw:\t7:O <	xիW.]2dAܠxgϞxxbMMͰaø _/A $!!Օ `nP<EjjjVb1A ?:t()x;w	ƍ _<zˋ Fryaf _<}}\ 0gggB555Ϟ=C4O #P<O奥\	>}JD:t:19rA#AO>ń7G2dni /<}>H$N
+		:-O S8|iiѣf /dees=ۮ];Bnnn\ 0Ç5`P<B~~~˖-N3220	' ^-9Ҳe~q' W^^^UU'cǎ[\s	Q-и={vٰ0C`ˉ  k{ae0{{5jA̡x0l'0o'O:?O y:@#ڷo_~mC`jjjښ Mȓ'O>N:Y[[u=<<իmA
+XXX$&&Z###+
+9^={;`a  ǏH$\gin޼XRRG"[s.E M0f~̪YzIǎ=:bCD$}%%%~~~'N(((NOO_n]@@&OgaTѣ3dݺu'>!66y\^@ۻwĉr9ON4ή;wVӬ'%/_tssd2A@@@ݷlu%
+`/N<D"QXX@ e;؈H.
+.b4H"2ȭo.^{mҲe˖AAA'O-@ ɖ/_ޡCkkkooh6?uppͫ?Xӗrڵ3grx sw!":\^xLD۶mclݺ\]]\ɼy>}T*o[-J'N$p5i5elm*?4~x>|\ 1w 0v`q RM6G-++cn߾<<<$D" ׷c*͚51cǏUDcDDDuuڈ#?^\\,HQ@@@Ǘdff36Xhoٳeee			ڵ3⩢iʕ\1w .\@DϞ=:jaޑcݺuk׮%S6wЁ]۷kmKuteΝjjkO=zH$RƦN<Xp]v%Ç+8p싧]vYZZx #0`_޻wcǎ\g;ƨ}srr|||lmm6iii<=xO>9}tppǕ?`(55oILLܴiӬYL={LRgKBvmۏ0^Dɶ.**rrrR$d>QQ&?,<VDDή...ˋ=icv"+WjZ.]0ܹs+++aoJmq>?SlhT( {-X~~>AQDDÇ/_}k(**"=zht{"믿"H///<:s挶+a{)Ν'Uӷu֭[ssvv0k׮}w.\خ]5k֜={.]***Jyyyd/Lӧ-..pԩSO]pww'UV͙3Gەϟܹgφ듪d(1 cf X,^n)@M6D.ٹs'k׮<trrq㆚mD[[.4L~ZVӧzV+Q^ȷ
+;&ӹ' ^0`ԨQ)Sdff~u>͛~>9{{ݻgoٳ曶={vJJً?|՝;wر%K6oެJZly1c;;;Ϟ=eV^u\mo/u HIIիӧu<Bǎ9 O?ԣGTN	O cS w޽` OxO*n`֭[<m4 OxWWW?  z?#kkk Oxgw:vQQQQߥ F	\]]۴is a	suu:fe=zܺu z9pݻwwu5<͛7N;\s\g^C~~~072    IDAT>,//:w%Kp _<X*^x/A}?6Ltf:""RCqK,	#&` _jժK.Ν:K~sFU[l۽{wm@Cygr4N:)߉h߾}?tr3faG:::|嵺pGǀ+GϓD"L&˵:ݩ߿XX؍70T<H``\.W$Jz`ggxtǎNNN֞-*))-T*_jeeպu배ӧO-/׼@$ʕ+W^]SShd˗/Сwtt@yt~)դ!žP(Td40?0bTNT0 'z|H")!˧NOII	Z)?afΜY'j/CMTUU<X!C$r{ w /}^J5{B'X@pe  NNN쨔ZCTTTVVVUUURRRhh(07n$6mUTT$%%QDDth >>>((Hm5^~ɩ<22lْyf͚ѪUۻǗdff3A/B5K&R<zm۶6 F	_?~,N<P=hÆӇΟ?"Ν;?jk/((h6mzjRSyEGG+7شi+W>DA/B5K&R<X>;;[M #C;~~~sU]nkkKD]B~YZZmRLLLС)	~jRSy)7%"[[[r\P_0jKRM*m_<=g} 8	w:88()4e\V_$&&Z*,,y`{cO0[rE㊊
+׶xI!՝mp<DkݺuYYYG( xn2mܸQ){&+WYV_uV_555j6ۺur-[i;5+iA`͍222N8B5K&Tw]Y
+7o0*Ѡx3fZf"rtt\vmvvvUUUrr2;ʘ-6n㊊6׏}VӠAoߞUSSrJ"a[W_øѮ]ϸ;`E[nˋvrr"vS0СCh̘1GqwwW^TJ}`՝mp#G2O |VD"6l`?C*\Ϝ9stۖkƌnjРAkT\Xs;V!L^jR	wA!b;z BSz?~|d~~~666V<z鰰6mXZZ|7odK<k,&bT*m[W_k߾jkm*22]ʕ+g|s<[lڵ%KRi/_J5sg܅:%Hw>r p{ :vXHH˗x ҥKW^}Νvq( o߾bȑ#\?ٳ?sn( á׮]իY 	|˗-,,P7O 0L>}W+@cؼyy^N4	  6mJLLd/_˗/-Z`TNġ	>m۶ݿŅ,kSN|rjj*{& ߕx{{3_:י3gz;, @ ;eʔcǎ\g>***ػw/Y 	 ̙wޔsa{7hP< QUUU߾}5kD" _ŋ1_+
+\m DD666v~ҥK<rҥ_*'0!y믿Ο?ѣAAA\gWTTԷo_WWׄw	A 3k֬{^x{\gs&H>|xmr@( od2Yhh/]۲B#'O>}tbbbnݸO P[YYRibb"~O?8q"00, ZÀq qSL:7Z***
+(O PN:9r$999,,L"p͛Ν7̝;, :i; ͛7:tƆ8`~X""", C ׯ_7nRNAՅl	L' P?>>>))),,իWƍ9Mӎ;RYYpڵ.o-ZU0 CA ׯ_RRҭ[훙.1cFAAΝ;m<hR<yGݿ/`0`K._x 1O gϞ9277ȑ#IIIr:tu@^MMM@@;wR)ٳgԨQӦM;qĎ;Əu@ @ =zÇKKKkjj؅"W^III}e2	{{Ν;ggg>|o߾\0O /^],%K|Ν;wnȐ!)"1O e˖=\r""L\ΕN6M (/J'O*@#A hѣGC¢M6iii{w\e"ʕ+={4~*F' Haa̙3{T&|ƌMġCmVgDDL2ȩ ' 5k0P(slL&[~Ǎ8ŋ3f:a`aa!
+׭[g`  @yyyǏ?E"'@ЬY{jՊÐ`4r|РAW^dmm]]]8v1cpP<.*++=%H*
+#F9r`k֬Yh;woĈFׯ& 	dgg'%%qoSRRnܸq}{tÇ:4Z1S׮]{իW6mpM_&M:4i( LLllɓN`ꉸ  hhт X=zTZZڳg(q@ 'P97OOO# pS    h   P<   h   P<   h   P<   h   P<   h   P<   h   P<@ KX666}?~rr&OA40̾}Ǝ۪U++++ݻϛ7ҥK/>ψ#1`ʁE"Q֭'NxumQOOOTVcaBBB^{5++^{mȑ{a#رcϟ?__3&K{]kɓA```ݑo@ xwԬ  0){W)ZTTu_Ϝ`Wr]CiiiD|vGܹsZ6GU=7mڤ\yIYYȑ##SPxQ} Kץ0??͍~Gk֬!VZ) /0{01Z<J/^/lllhȐ!r\\ƌCD-ZW^ݽ{wÆ/ "kkk"Vc7ndnذ'7nG&":H$51&L@DNNN?SffD"ʊjѢM0թo66 4|]kDdccs=vݻw٣Z'~E L'e)))͚5#k@ǏQ_jH$WWW"Z~=:DGGمÆ#MFVV٩iJɪ|||_oN""{{ZkHMM'ӧOI%[ 2ڼ.u͜9xTZSS@DfR6MxMWxb7?^6P?hx߾}DԣGaH<EEEVVV/_|򥅅Uqq'ɪvMDUUUunbԩDx:Wxb"6ml$Udy]:*))i߾=-[lҥDԡCR5k'@ƍGDW^5vyf"5k_v*''~[&۷o޽2,88y/HnݺQ޽ut;'Nڸqc(,,G3zWH$iiilN,毋n5k-.]l2@hM ԋ cJ"դr?s+ζfX[[:nǎDoΝ;ܝ:<`GU=ŪvED[fOM?tus }],Xm@ 4@.s^2lܸqD*qj3f/\`kkKWm	III6Trɓvٳ_Pa+VlٲG5<ھ.:db
+î@O Ѐ'OO/6Mk)~fL=CSG)rȑ#/J?w:鼏:UPwQdd$ۓVZZ~قCBB?^49:.: #@ 8x W3G~U#!!!##S5QFFFBBBϚ<yrpB;xyy|rݺub;X[mUVQQQ!!!~m}[o  Ce1O7od/߻wo5o;USzzfe:ujy^zeoooooիj_6uUVm6"ŵ8qt ==]$D"僯udun9yMWg/~N?_޽{I2lllǏk=733S((V8SGUIROOOEErرDԢE,D?78I9s(,,LÝU~Ԁ&4l9O	 ߞeرuޞN6hPgYv-)MX[oEDk׮o59jjڨUM6DyRvpUuޞֶrrrlmmիW59 ʏ9ihc 6+++X'$&&<x;7zh777Hdoo;o<v"v !>2Bz2Q6mZNT;::?~|..."%88xǎS?Fպu0CT& @ hl'O;1@   D\  j8  =O    Z@ Rj0-y   '    -x   '    -x   '    -x   '    -x   '    -x   '    -x012Gq Lu  Hff9ry":ho]x7Ӳ.]puu0a  ucƍG=zk׬i&3|3z( Tz̙{=z!!!F:t-@g޴i̙37oIWVVZXXd͛>]vD0( 
+L8p0  `ر!!!=z:袲իWyyyB!7cL&MB(ԴlrȐ!oVHHH6m8`P<pL"8q"..eeeC}F)z5k\.'4$^SSSkT*F3f믿IB ӂ	3iii[lٵk˗/&O<i$OOOsaʕ+rO?]fWI>}*J4;p@hhR.O VTTk׮k׮yxxL>wڵ+׹߿M6{n^|r@C	H$I\\[odɒ_v-##cŨOLL999o0On֮][C"UVQQQF`P<4իW{yy;DGG?~8**
+KUMMƍYZZ8pHDN:U$=L&۹s=' LN4{϶m̙۬3o<\㓖U$'Hdiioo޼ٙx =O 'JmֻwnݺDGG?|Ŋxbƍ޹sǜQpppسg@ `D;v?ܹ}qn
+O 0{9cX|񤤤'ZYYqǏWM$>|H^e˖N͛7AAA!!! M' 9~o1~xoo?#88XW>|r޽{GW_}5tP"/HD۷oٲe/34i(  ../$$Ν;>>>\nlذryrrraa#"
+cccǏ[yӯ]&J{k.4}( 1bĈI&999;w.66Vyvdnv8L&;z(Zh<K.3fxwO+N4q@G555?ҥK۶mO?1D'O<z6oޜ3cTZYYYUU0ac63gtqqдxř3gΝŋ˗'s ٳ>}zI"##cʔ)wgΜu& SQQԡC7nrTUUrBG;vLJJ/̙ZRRu"RSSvڵ}SNuܙDФUVVpBw/>|4	( 4ػϸ&$Л((
+l`]{Y++vQY
+*bWQUl`Y BBHy?{s!B&3g<3<s؞={ZXXL0p`j<=zdllqaAz<!8>bŊйs禥QR<mzzO>eEuDQ	j .;eʔCY$cDDD̝; >>M6T5	!i&Lpܹ̜4Ihԩ߿ʢ:B?CjjjjjAK {<ٳg>}6mDu8Q 'vǏ:uۛXZ	 ׯ_jժI&(m0yBH922ۜPTR~yRL͛7&M8qܹs1Mmy6l؍7>}ԻwAHI0yBHǛ<yr֭Ku,H2{c߾}ϝ;Gu8)&O8t萑ձ, :
+%4diiy#F]LEyBJJJV\9o޼>}P~ɥ7V hC t:}׮]nnniLL7!m-OêU~gQ@Ua U    IDAT9̙3ϟ?SB-''777&&611:IKZҊ!MBnݺ]mrFFF.i&-[	%x3.]Ĉ_2 p1___333&VYYhQM-3(Z#bX,ёr
+
+
+Fadddii9gΜh%تQJ-\._իn۶mCBB^*N;' ?Lf^ݻGu8 BH  pYO{f۷s8prK]U4ZO0~E҃YQRYf^NiiˣFV,xv4_ #y,k̘1L&ĉTǂa5jT=|[Qdddaa!1b@   33Ç:tۼy3y8ۮ]ʷo@޽U4Z `kk_RRRSS ҃4gmWԵ4TmJJJUU, :tqFUUUZZZM  ֮][TTpʒ4ݿ ={֜5.;o< """!E	!@ x5NOHH{ p &&Ftctt4 xxx^ cccF n޼)Z˗/SN҃Ȗ<)Z-^ ;wN̙3&O2hѢϟ7t o6$`Ν4m<XRL:pȧ"n$2'%Y, ϗH)Ct:Nh4p@IQP--^O>	)//7yj;wۃ[MݵkפhÇ3XR 0CBtpCC x<']Ck\B.<Lb6Zܹy搐##K.2(-!gϞMHH3fLmm- \<!.\SCÇ;w gϞٙ<\tG)+ dggKHz<JBi2\ ܺuKxHzzI-e ttt/_C HMM%wrӤڧ$
+y;w,X%BjW6w۶m `llgϞ"6):`<..$&&;F>| lll<XPPPSSf8ЫW/A
++++ 8~hXhrd0>`  
+
+zϟϟ?߮];nZ>}=ZXXXWWW\\i& 000~dw1<yҮ]=zGRG<!mWUUe``o߾
+p8JÃfK\ח\CI ,X@ʟ@RSN]gE]K}HY*k$9dE3gJi622(͛Ν;w͛7TǂPa]||<Nე2g˖-zzzlvDDK__}ӦMlCI \z5$$֖`뻺.YYQQ1gΜ:0ӊUk/իWAAA3f̨Ç0vڭ[N&c-ӧOwpp`0>4Mݞ={Zn-QݻwnnnTǂPS\
+i/^A*H7޶m[dd۷oD6^vɉpG.55U5HKKsrry $LViZL044LNN޽ݻw!9`Zzz'Ձ bp'{PB	ioFGG@PqTG!6-O"W
+w $LV?	Ldd``pܹ={<TP0yBګɓ'_5Ձ fNFzzzgϞ'0yB+//yxxPL\Fbbb^?~Lu8I^zzzT4vKWW711k׮x	  LzⅣ#"ۮ	:t+AH2@J rvlm7T<!k@ի</00T8Lz-Q Ssm6==dȐ!555T?`c6mi,k&;;/>{l\.pL*++SfTSS3k,KKKcc#G~ _ND6mX,hZ;;; ]&lm$X رcfffL&),,R,kֲ~ɓ'1VZd'-`S󹺺\~}ܹTǂBZ|ѣGJ|5JgggWVV&`֭ڵ SF6ZO0keeFGDDm(6bff~%WuttSB'@	u:tqFUUUZZZ ,,L \x |Bgm۶ӧOK?m6>>&## E`kkRUUMpŊ
+STTcI')^w^ bbb! 'ȮR%E~;wN̙3 ХKWr}WK.|>_9ol^z	 7o˗ ЩS'3HIիÇM~O[KA<y5ҿ/]]ݴ4A'Ξ= l6[	u>}n)// UVUUU,lbm76Z @t:FhUC2'N44瓰{Zٳg)]SM2X9IƑb d2  ((ݽ,22߿o߾1=Bd <$6ȓx<&rW]]hIsssO?	ٳgX,@2IŦ(gWhOOϠ <Q'|fut NIĚ5k `۶m l2!l  deWzWWW ΖW -""ٙ|CIŦ(dO)HHH`0ÆɟZ=!w1aNK#kRnץKd֭kjjs ϟ??]vboF^ `ccs6^zA@ V*++S||<J=Qll-LJPs<y<$$QR<!-u&o#G":e ѣ7z.!4m4ɓz-`	rҴibg2eSI'
+%<~ rss
+@6PR<!-uqo/_L>088իWbŲ Xtvqqa0ڵ[np
+f%W2}}}WW%K<x@g.e˖N:1LGGu	*uO[Kw < 4i4ŋi#BR3gΌ5HZLӦMYt֭[r-@9),,:?]#-E䭭:디}Cj}OȇigQF}Xv	i)[|$rA888vڕpT|N	N:UVV6uTUn@E',,, @?"=I9ڷoĉ۷S"^f!aii	 ;w:uiUuUM,`t|Xvʕ+[AZ[$@fb4V0a§OiL511	6ŕ #Gh'{%R<!eiij!,[ѣw:0yBګu֥TG4v)_޽׬YCu,HaW֭	ZScǎ:0yBÇTG4vQFEGG/_X&	i/''/^PLmGGGǽ{߿)
+&OH{999$H`D	&L0aTǂ4&OH{999ׯ_S@,<Qh׮] h"A	':vHܡ-Ojժ=zcA'1yB-'}w;p<!+Wlذ!88ĉT40
+v,YBu HH=x ;;QQQNxYfQ8U*hժΝ;'L0yR<!̟?ѣGNr]< (iSǏ?~>|Ku8HC`._}ϟɄ	3'AD4&O#**hӦMT4&OH0Ç7SA
+v]vVڸqcAAձ :>>>'Of0waRlyR)K.СŋiL6ھ}F:޹sgJAS)w>{穎iL6jժƍ	ݨ-OHQN4($$dѢE"j>L5kV=tt)H!|>IlٲQQQT&OHKh|-OH!ȶS5K.]~=9	'~At8&OH!	[Tвet͛7LV022"?vQ<,SSӕ+WFFFQRc<!fnn.9nee%:
+&cXɓ7o1L9s' 899Q8I~)ձ ug+[fffaa!Q9rݻwtz||<ձj׮]^TԩSoɓTǂ:3ԩSTG
+		IHH6۷oӧ֖HPCN<9aܮ]RR?mGR1.]:
+\!!!TN;[nk׮:0yB |Ȑ!TG4v۩> ֬Ysԩ\cA'R0' BR=_~:~0yB!cX4~4 VZGu,H{!f'0vخ]FDDPR3<!lh4ڊ+N8Ou,H`B
+bb,X`mm-ۓ'Oc0ZKMM=y [~=ҥKLLh#FYZZΙ3F,i&-[Չ˗PSS6mDFF@yyI---W^-:Mr###===|}} ǎ533c2NNNaaa^zYYYm6$$իwI4~x'''CZ'$$*@kݺu;w7=zGnb g 7N6MX||<YNtרQD`}_Q9h-#G-poFtˑ#G\kp8~~~H'LPkee@ gJՐX:/4ZB
+&6)+++%%JT#  ŋhǎ`ÆbrJrrree۷o `׮]͛7uƍUUUiii;wy󦙙Ç:dbbsNђ>;w. L2nٿ~-vJMM522,,,d#FСCǏ/))z1Dt	 XvmQQ)++KNN&S1)2i$GGM6I)?Pi!"ŋJO+pÇ؈E',@nIMMny  sΜ9# 111FGGh-߿JJݻ(eWϞ=͛_|	 :u^ߢE?.,&eb0/_0B<)|#T5g___rѽ'Nhh6&aW%E0L 铰@yyhrUIIh /ZBlA]iB?V. t:Fh4a-C ܹs^:[.)8Ì3Cv!`bv{'@0{|2=>r_yhb[ZBx<ϟ?s͛CBB.]?J%XbEllׯ?x<!	~pvv&]vM* ֭[-ϟ? ;w4z-d]gϞ] -~>| §"44G>!Y`B
+&}v͛+**fΜ)oƍb+j-:rHiiiiiill%Kk<y2 ,Y$**ݻwYYY}RvՃ_~bjkk={vAooo ۷cǊ\nIIɩS࿫H%;tЛ7ouRV *2&C!꿄D_ZL&u={?~FF,K,-9!''Gtp_rH^$zoFJF+W3gtttwss[p؟<F}h˗W;v;w۷oeJ]?44T|b/)SxFY*ӧOommmCȲEkp8^K ,X.agΜ)}Wlݼyd)&Oʦ"
+D#F*poӳQ @>8M322  bm `ڴig믿5IR=윜SSFq)e>|h`BE_;w9ݲeKNLuW
+H<PlW-,,f̘Q]]-VfGDD뻻oڴI9IE-^ٲe!A)իWCBBlmm%K<x 233O`0,--rŮ]LfQQvIT]!rܲ۷o/]߿?9=\9 AAA-YYY ЩS'777ÆGaҥ/+¦?`  pww|rYYYmmm~~~TT/^ݺuѣ֭[srr+++ϟ?O߿q,ysɒ%TGbTT&Oʦ"
+!999&&& haHWXX fff<B1c&s\2w	p8VVV w^ <ֳgϤ tuu? 5wj*@Mc===Oq +R;;;''rˍ7 ׷_~ tҽ{>ܶm[ݻw={{iisZ:fvS[ZZJ)ӵkW h5.f̘all{nA'$C4wUf4 xw ___rͯr|Y2:t L>]/Eϴirssy<'xdژ1c<y$ ѣ"ɤOUTҥKw]ZZJu,HEa򄔄^ӄ#BM߿N:tQ    IDATmʪK.555r`ׯ_&{L&sĉ 0i$&Jv͛7%&&fԩ2NGGGK.JK.%bժU
+  &DjgΜ9+Ձ RDCnrd'/KsWWWw   &&9 ,,,Fccc[4`##QF966Gr*))䦾Ǐ<rŊ{VDNݙ̛7/22R!#̓Ru(qtҥ޽{dDL <eggWWWcbb `ڴiS=wd቉k@)//OOO8qb̾}~a̙6lhjm-ZpȥR$ RrdիWɅ,Kwܹr
+.--\OQ ^";ѣυ8enn޷oǏr)))*//5k־}Zn40yRwZ>}m8ձ R_}&{VVV:99ڒmllșDGKab>}RgNtVll#jjjΝw^̜Zy ˖-+..&zAH&OxO>ݹsg~ϟ/\ABi|}}	x4;Ȟb&Ϋ8}4Ab}o߾hOhh=<<""">}D̕D޴={~[nKlr.\S!'ly vvv&MڸqczEBQIKH+-88X,R^zv֍<رcۏ;Fnꫯ x={Rn,^33K9yCߺuKz ())7Tդ
+/OlaAaaaa:::2^NM{jOhxA[PKյ7oޝ;w(D8Ibs+':T\^^=x`>>>t:а[n/~\1999͘1#''S2j~͛7~Rܹѣ7l h'E!d䤅			TRW^^^n?~LNd;v|Ubbatuup?>|أG.SRBD혧7o ȑ#9w>dȐ7RR!<!u%qqy W2uɋ\P*"6h4ۓ'Oc0ZKMMJHb,X`mmM";v̌d:99UVV*ziʕ7o$wBNT[A3H6T󅭎1Ux]rϯ\Yi$̙3BPNRʌ=:11QX@ 4i9٘(WW׌&]%ecffLu H%`RW::1f$/D_E//VTTp8;vY>+++%%СCǏ/))z/[ڊ+RRRrrrLBHX,A3ҥKW;;ŋK%b݁FFF&1c,--{u	 8}koiCѣǖ-[LBHlb;y?~(:y<XbSYuttt:Nh;vtv/_sA	!f,?@ ={v~~>_|<#Ex<3fmۨQ'R$6:}v/_ggg2k׮ukkkg[kT@vvƌ/>rHII	ձ aBbT'yj׮ l޼"!!a̙rsѢEUUU)))?,Ν; _~bjkk={vAooo/E%L6Ԕ\	i3LBHTێL~VZ;vȐ!raٲe pܹۛ6\Q,3:w<s&\*`2g޻woC}HK`BRvK,ٲeKNLu]1  ...]v֭;pڵի!!!C__uɒ%<RTܹs|rQATI2M&CHSkGFF15s'Oh ?!IZPKXt/.^Hu 2<!"X,ZBΝcA	!	[ŋ]փPs`Bɓ6<xpwIu <!"T,\Ձ 
+P6***:
+4PQQ1$L8qQQQׯ:l<Q ++kܸqTGf
+		6 L&sΜ9+W444:Tml			WzBN6NQ|5Lǜ9sX,V\\Ձ e	!eZfԩSqUv͆vڣu֓'O޹s'ϧ:T<!<k׮ݸqeVXAu,`˓VYd˗/ϟ?Ou HpBJnbb2]vAuDHi;ҹsg;vQRLR9sr8{X[ŋ|]///cAJQ`ҤI[LL̤I)y6tuu_)&OQcرIIIIIIFbTr\*A,XĉTǂ'(xҥ7o~py0<i)S߿@`{ڵGTVVRj.LԩSr)&OQ3==իWfub '4ww%''SRLKJJ;AMG<'-ԱcG??(AʀB*sηnr}y&n;m6o޼k׮Qjq<!*:tpM##?{pPS`6ttta 'TMzzz6mCArn;mF~ᇣGVWWSjY<!Z/_ܩSgeeQviӧX'ORjY<!rLMM/\Iu8H<i9++ѣG۷@P	!Udll|ovTdb`2T(3cƌwPjA<!'LxaA2aL& Auvvf	!E߿f͚~a۶mTfq#bG:R0yBHvڝ;wXpP#X,xB}MMMbb"ՁBj`qqq۷o;w.ϧ: 6:Rt !$I&7"..`P )44tذa/^prr:x>|K.\A`"2.66@P	!uҷo۷o?}teeeTaHt:}ԩ111<Xa򄐚qsszKJJv!)S|T'ԏ˝;w{]PP@u8i;$Gu H0yBH-k.;;Ν;Tv!Qӧ+++Y)!BGG&88͛M+&۴ikddԭ[9s4
+CZ[[Z[[<yR Hɉ޴M'@$''S'RRRfi4ZJJ>߄A%	ptttM+d<!|ҥKt}	?PR!Ǐׯ2kMjkksss ^^^
+
+ ss[>:pd<p `ffsηor8Hsss =ztޞHyK6&Oi;wNu ڮO>ϧ:
+Bi4ڛ7oVcݻw 'W/'O
+@\ brssիbߊ%Ol2&ccco>m4n~L8	-IaX,			!M wss#bܸqFbdd$W1r{xx\x`LL ,_Ml˅eD_6JCM!
+RSSEKu_Q ղ`wwF_dOǏ pXYYH?hɓ*֡C I //O\ pttu v]B-d<!Q[nݳgbcFNNNׯ:
+Zn߾-%K"mmmSRRc=
+ 888 ӧ=__Rm,K@jjj @___,`@pq h۶-ylCɓ,%(^^^eee{hCy{{w!>>^»wM4iС<p@AA	F)W 7nlժBQnܸq...߿߷oJM!)BHyk׮۷?(KK˨(@*gٲe;v^R.//^TTdjjjcccccӦM2YC*vǎ kkɌ%[@۷u떽}>}pueƑDƍ{-I>/ʊ`ԴnZqߤ6mDFF:|rի $%%^\%%e?~%KG!)BH͚5Nc[~(*ԩSXX})/X  6n ˗/^Q^qL(Yx˗H
+9r ,--_%'49y<ձh8EZkŊ|>گ\BVX,Vi4ZZZ$g̙ "W1rK۷|<yDI2=088 ###9NQQѮ]L):99Il	da拋		i3`̙nnn.-Ї)F޾}[LNN˿+CCC]]ݎ;Ν;۷g pBs.i{{*Pu[^^nkk ~7 h߾Od?@ x>AwޕXK/gr~%."%66VIJ&	!p5333ooo)èSSF?" SNI/cnnC+..ׯ7JFrtt\jUC{nǏ >>>-|> ;C
+AU'$$>FGGmΜ9RU|'[nӺuk'Nop]]]ǎehda򄐶СӳgϨ  /_.++ϏhW-\.ŋFnݺ	c֭999Օϟ'߿sC4ŋvJuHAo!4χݻdOOOÑzYN# D?omlltuu,ݐݳgO}}}rF={s999G&==ӧ;w:,8UBZM6鞞ʬZ!vHY,Bp$ڵ+ 4QX  5wޭ[nH`v144LLL		=zÇ\ɓS\\񢢢,,,?~Lcǎ=~ʪYgs|||M䍁̟? ƌ#ɓ'G20yBÆIPmCDXXr0 ?pnWUU?	L:~]266m<SSS nݺ%5޸q >~(cy(,,:,<!***Z.2e:  &LhTyyyF"w  33GUv1;wnhB˼6m ʕ+eK.n&R__|?p Ձf	!cgg&xpdu4 _t ;gFF ̜9Sʔ9s l\ͰaÂ5yBHyxxdeezzz޼yS] LݺuK0{q شi讔AϚ5k߾}rld2e?i!WJy>Lv~~~d"Lϟ?_~ʕ+=zfy'4r),,;bĈsݻW	 l6G
+Ƞ:t<!̙3-WX!;]zuϞ=nnn&MZhQmF#"""++ӧO\.$))gϞ[QQq֭	& ;q˖-\.wQQQfN39B+B*dc̘1555=s&瘙Ё|Nʸ۶m+=AZkJHeLӭӥk(Im%V:u*((Ɔ`̞=_I$MEbL!
+Ç
+<m&իWXXXtCCnݺ-^XlF?f̘ӆʈ1y_e)܅(**j$i4ZJJJG$
+RNRlgA~PPq	?ILLˣ:X,ݻM֢.Lp={lٲ˗/{yyeggK,&˩d?*88ܹsWn߾=}۷cccܹh-	'Fɉ#F_v?:;֢E޿okk'Q%O.]
+055rqqiZ	#$xb@@رc7oLu8#0T. M 2fNj'd5k^YYIuDfSRϕV##;
+Pcff& 9R	u) T̙3]\\BBB铔HuDbaazzzNZ.y7|}}wh1R=hR@&'P#K>TuQ]md`00KKˍ7jJjLBرcfff3ABmү_?)S*t.\XZZ:t>4TL'x5 ~ZW0yB(!!aÆV8q:vH.+,,TZnѦMȡC^Z	5 PaAΝKIIy-CrӓkM۾}ѣG={u} i&%ԥd<!3tlfeeQ
+	EOOӓ|$MiMrTQQѫW;vzb=}>>>-@I2BMQRR2f̘}M2pTѣ׭[Gu Hm,[,--޽{-t~sNɉfggg{zzBȎ64IƎ*3$!Zn}ʕٳgO:uΜ9TGD=6d2//\% l۶ʕ+e<	C_p!!!a666:::sQrbaBYRRRLҮ]Ď;R.]xbAjիW;vs玷7ձHscǎ/^:-Of:thNNW_}Hu8T1OH^k>SO޽{S	!\۷OOO:u1cVX񨎈8UAwޥ:.]ܼyd.]pT&O!`2Gݳge<&R' 011<xpZZZnݨEU`R'%%% rH^_em    IDAT˗/Uvm@PYYJxH<!%++ǧo߾Z lyB޽@ ˣ:$LB
+fllOW1cUh<YnL:t`bbɓz	!xA\ʕ+|6|19"v!ycAr	!RӮ]cڵ|>Zvۡ&sssӆ?04	&OdffvĉCmݺTGR0yBM-Oj'P2eݻwʺwLu8-W V\\\\\Lu HV<!K.&L2eJMM)<&suu@0yB)^ddK\C#R$LPؘ>@0yB)߃HY*@ѱcǗ/_R&O!eNII#) ͦ麺TԒëW
+']7\|ꈚCɓ	!D޽{?x3f35	5<LBT233|rjj3g	5O***'<zcǖQl6N I]`R	&&&xbVV&Yf2/򄚣}Ay@L0yB!CMPFv	5f<y0yBSSS	*33S	 nݺS<fZ&O!U'lzI ;VReX8	5&O'"N86vwޑA]]ݰaT$lyBdmmS	&O!6nܸ'Offfr\F.ݻ'qLP3aF0yB4|rMêҥK3x*@̈́c&O!o߾6;	u֝>}ZQՇ3f1Oj'+M:@i!5P3UVVNO4'vuu ]]]:.V@ ÇP`j&###@@+'
+
+
+ʪ۽{w}ױcG  ̨ ٳg}@ 0TCddd _|:8ڏDTG>|ɓ>  A*0`ĈTҮ]^zQ?|WϞ=ԩձF`*3f̩S!@usggуXP#t !$
+~oߒzI1fC yBiR_<LB!OkX,A	!9>DV<!B#0yR<!BI`B
+L&O!J {:
+8LB!ɓ	!R	<LB!x<d25'Bz555 ```@u q<!BI`BQ'5BZ rj>-$===++ov.DrEHѱ	yASʩ\& @ HHH:tu``ɓ'6  @t{@@wF'#LLLnӦQn̙%o1YO_~=k֬;2LnݺwK2Z'u"@%TTs@ň#>}$po·ci4ZJJXɿKX //Oʩx%fQVVFn,--%ugdϟ?7!c1)7,cjj*$i9J{%;; 
+
+
+5[B\.K.KJJ5j@G%~4Ck׮+s!  V"ndћ0u.ܹ۷022ŋSNA՝>}\.wРA$Q>iҤK.oݺ絵ׁ-&zs$.]eeeQQQ^^^e)mI(6C)-OK䘘 @BBBe/Є߽{ zzz9 ݻ ,--kkk% '
+o+W 077Wpnn! \zU111 0h r 66	x" >yDyd,&T__ ={2-G5[Ο? T-O!xxxNu,  FFF&''w}Νx/ ذaCmmֿ	d|r777nnn˗/5b]]ݴ7n1Bx@p)瑱,b5)))144Ė'BHV#G 
+r8iӦ؀kj3fL.]
+<؄nBFF H,<zh ?lȐ!</11ԩS<߿1@5zddRXL 3mڴ\ׄ2ڦuTGdCuBHd;,E4GⱾ2EEEt:dCʘL&F{K;~8 mۖb5& yQ,رcׯ oH2VUUԩSEBRfݲe˾@2'|>!  XZZnܸUV-111<oȑ `aa1b>/E$fܸq...߿߷o+&ݼy֭[AAAM8FFFIIIyyyFslll=rsse/mI`ׯ	tk޿pҡC~ATDvXh5k @DD8$;`cc /_XަM|>%/Z2]kxxxbbbAAA~~A***-=JJJ0yR<!d >LަMȡC^ܘ+  ^JKKx;;;QQQr vz 27NxddR{E˲( xEECAŔb*rIQAQJ+:}y=S!-)Bjf((^1~evv]x>yy߫;/ffgyNΝmFDNKLV\\~p' ҥKK.%	&ʕ+e2ٶmۮ]FdŅ=l26]1N˗/|Q˗/_ND'O6;K/P(
+E\\xNW_%Ke	ϰZ{qqӀ=xW,F u 7kӧOϞ=x:!0SN%GK$o߾-J7J}3)))jh/4q*+W޸qCVWVVOwf5=z,^8''T?~qV+˷o.v"' G$zdV||ٯgj@-2dΝ;=ڤaÆњ5k,excu|f~=ɚfg?,O":s؉ /( Or7""w1^(խxb}X%kΝf$ٳ4Mǎth???Lnx{:|Zٓ333G 
+EXXsrr&b5kz0EPt7|qĉDt^$LcƎKDb' 9[[D\:0   [nm  4^܇F~^Өܺu+((H,/y  '	 D}KىӨܺu]vbg|x  ӧOO1WP<  )??_Ӆ	  @L/_?r'   1]rgqqq;  \kv  ._*v  '   <~œsA   WQ׮]N@   s5o޼Cb'x  #""  hΝ;sω	  @%%%7n܈;  8Ο?0L>}N  WTT!v PQQQ֭΂ܹsAAA~~~b' xpPIIIbg0%&&qÓ3B233NV*_}رc 0ϟ5k؉`	 6;t>W޿?22RD@0O  6	x:v옗׳>+v" '  	rYs8~\\\NC `3]vvF;pt:;O  6h~wGwʕON
+ <3...rV;v;<<\D6P< >p<?~|R)N	/ -bgMӝ:ujb'	 zuy ?>|0&&FDP< R^ݻw]u;vEDP< ҳ>+Jq88p ::Z,P< RӦM'uΝ/Ɗ'  ݻ7'xSC `cze;b'	 zu"V=kv S*`̙3[١x Mb'g߾}]vر؉@x <yR,ddd$%%'  8p௿cr{xj P< eO;p {	}gN
+ tW@aݻw'&& '  mO`(77Ν;cǎ;O  v1p~BD!޽K.b'6	 .jsssN0Lff&5(  "  cǎrDt1cƈ'  {oBD"H΢ټysNl ]t	_rȩTI&'  {8t؉:TVV,v"`3a 1bL&N/6PQQw߉< QllѣGU*UG`oB1cL&c>}zҤI[vuum޼yTTXSS'u%--0?5jR>}zeejҥKÛ4iҤI˗k4<yd͚5LII!҉'z{{Ο?:VһwoR٤IȬ,MD}H///77s疕;~kѢ\.oٲebbbvv6wP%%%~-54  ۷ﾫ{uBBD"ٷoQ)Sedd>lݺa`l@uu5=3FV2zhÀo3ܲuVs4Zeݤ^)-++cte}9/J'Oj'  
+{jݝ=lj111zZ.**ZjEDDulӦMVVVYY۷GID?<0w\"j׮+**;ֶm[*aɒ%DiӦ76mڔ-[fK.DԬY3-#\VXADJ2%%ٳFnڰan<<{lDD͛7a&MjuIIIVVVTTwP4iR-:#C `_sԩS޽{ggg1"  @!ݍ:y&yzz{_wNDiiiMMMe%ý䰿޽{-Zp̑{.=z כvhӧ<yp7}9GEE{ׯ_ׇq4	rDrСu	 ~"kם$JKK7[zQǪ*NgFD=уw]\\LD{6څDbiVADŦ}9سG......RT*0̙3gw}}&A,XвeKF##880 `_?w?pm?OaMVPPGO<1ۑ-X{%[hcqscMMMMMNt3g,[,11QT>|wnOlذ74< @#oիv};WǏ[H7le6mD&>X`6hݻ7;w~W|||5q̔dzS'  ;vO?j6mѲeJKK?~9uTϘ1ĉO<9~j֭[>|͛7&:s|ڵkܹRrssq479255֭[UUU*ڵk6l߿?8pEEEZw&j&X3B!v i4??ŋעe˖+Ff;n^xR,AsQC1{hbfƌM ۧNӵk$Ɂw'	 >L<w޵hj˗/ԩ[>c+;myȑ#
+ϛoS%Ktã{K.WNfgй˗i(HF&a[j\xa_}/Z-wO
+
+ >=z4***??0Jպuw}wbv{  Ð!Cڶmyfox{A PRImVSS#v.`_111b'	 Lh~iӦy ?}			ٲe؉L6ɓW\#IAt8 PztN)))ٶmی3P95l(  τ	
+<5T7ntwwWN @8q_~]h0ZڵkL~'14`(  o޼ߋؾ}ܹMDp8 @}߿@@޽{NlixYy og޷oo&v"NFR͛7wdK$z}N9sw g  N{gfsq&,XhW/r7y oRt̙iii%%%bL+"ڳgbݻcǎ3grj$P< ^suuW	ѣrع+W	'  xzzN6mʕۋV/עE\޲el@FZmJJJ޽Je&M"##6###܂Ν[VVf5+KMlVJR}|`o?^n{Vo;1   zzzZ~2e
+;٣FZe;GNKNN6m
+-++RxScCK,*//. 87o>mڴKVUUiDp¢"Z]RRe1k}RLII),,>{Q6nܸsVZedd<x𠲲ٳW\Oج0ۯpիV6mع@  Ds:,]NOVҥoյkװA[~pcxxK֯_oԷoɓ/~͛7;vةSk׮qd%4aSc+3g?1>8>  y睶mVUUc3gGGG߿m5{0ADŦ#s4_N"J[a]]])XΝ;O:#Ù'  1=xz_՞;w̙3Ν;|'OƏ~_*2MUU[&MTUUkR>Yq4C:le޽㢹Ί    IDATƍvZl>8846  `===ݻgݸq|||_͛#GÉhÆCq4ݛΝ;W8L[V`DDD$&&cdppa @dfR*ζn߾H>x`D8B׮]+,,8poa}ҤID]Ν;**77wMo69255֭[UUU*ڵk6l߿?wV	:9ug͚U?"v  ̚5knܸaa;9xQIlZ2dG03f8pdŝ.xNl/xna)x Zڵkllmyo߿_~j6m
+		quumӦjJZ|ݻ+[mb&;;;11UV|ŋNldu
+(N<IDgϞ,p8 C8w\~v1~xs+j{qx poƁ󽼼,:s?رHsqx p!!!'O-v.`Q\\ܓ'ON8!v" | Qhbɒ%)))b?,;< 8#F\r_U*bKJJN>-v" &y p,7n|~(v"`K8 poꫯ<yrb'!!ܹsb'"C /\?/{3fعP< 8'O<sGuqq;A1xLhp #R*Ν?!v.@YYYNZb؉C'  ǕwQFKV}ِdb'   ?>;;_					;Fjŷn;p8 4K/t圜mۊNs~Zoع@ ***^xFsioooiD4M~\\\Ξ=A7 8:OOϯd	Ft_reƍ'  'о}>}:99YՊNo߾+VY&,,L\ 8{Çk.WWWi޽>hРLs	 >}:::::::==]&'BREFFO^^^b  ?W_eeeM:ư࣏>+a'<xZ  ̈#Ǐm۶r"*//?F!vN,%%e޽|3<#v.p	 =;rHTTTyyN0a­[hɸ222fϞdɒ^zI\q'  g?Ĵifk֬tD$J-Z]Ϟ={Ν駟84O  Nʕ+,--5(˯^ڱcGrFgΜ;vlZZD";phl T*Փ'O:+%gtɘÇrP< 8t:kZOOO+1QFeff. 8%NmpD7mڴss"LLL|饗v؁O8 >|<z?笜G5f̘;wrp	 Y]z5###--2D"9uԀDI-\}N '  O?mٲeǎ...'d:\|U̞=;%%ef;p>(  n۶ZV*jZDPEEń	;6n8	 RQQٳgA=}ܹs'OguժU~~~b%>N7Ǐϙ3CbP\Z	 RFFFRRY 4d,- ͝~UVb'pC @Á<   	   @ O    x        (    @     '    P<   	   @ O    x     I$DbޢE}Θ1#''OwfOa={rR٭[ӧeffr]v1c6`Vg5GZ)\81.VݴiӰa\]]5kֳg3ff^ p: ڵkSr!5ѣG͎_hTTTƚ0Ujj*ɑչpb4Z]R}A߾}fȜXp	 @[V-))9}Y7f1t4#<N8+V~JzիWׯ_߿}kvA//>j0%%СC?F'3:w:nܸq-[\nݭ[j'O.__pULTz Y26}/4mڔ233v!"j֬Y~~>GѣGHP5)
+"6*44֭[ǑȺυ瘵Nu޽D_TT3,Ă3O  !<<|޼yDW_NlBD		KKK#9s愅5͙3Gc裏>"ET*4Gr9:;?lժ qx pG&ٻr8{,%&&mMHHehر]t),,ܰa#9KYM}bbb h߾==|PhZDv="رVv_e]*i/^\]]1>HKYMڶmˑ]3z	 Qt:Sw[V*#p"(  ŭ[OhG/ "qVv{``iT*]`-Yc<#9fs.uǝ*Ɵi6m{ طoEDD߯հ={me1Ə߹s]{/#9:HM#++ #|  ,6}{EQw?~//#GR[n%"___?s9fSeh޼7ѡ8/`i )9˛;1XՖ>}zD4x`NB9|||V\yZ]YY>XROD)))jhDV6G{#2>c%U6__ߕ+W^v<??ҥ(, 8%gyst6+>>׳3*_R^^>|p1fp͛&&4j|±w&řAPl޼ sr7""w9s挥 *N9bĈ LP(¦Oc'OYF?.Vgs.?UZnٳg߻w 222`   @&v  `/y'    p	 ¹% {'    P<   	   @ O    x        (    @     '    P<   	   @ O    x   @&v  !v
+ PNN)84O ĒN 	0b   \FFFRR80'    P<   	   @ O    x        (    @     '    P<   	   @ O    x        (    @     '    P<   	   @ O    x        (    @     '    P< Sd'O]0{쉏J[nӧONgGa233rll]1pppV5^HSnz뭷:v֤Inݺϟ7,V0|,Hblrر?\D   ٮ]l~1{PJV^^]%ώfcbbb***&jvF~f͚YyaFYʇ]]]O81	  ~J>|8EDD9r$y{{X*ӧW^]~}9r1!!>۷oooo"JHH0Mjى4/Qݏ9RRRR
+
+
+֮]˱tVq-؟H"8p 4'  ;{O;wCQf%ѣGHP5)
+"6J844֭[1F<<<ڵkxbQ&MxQ?p  v3fd2"JLLH$aaa:taaa$))I.J-[ѼyBBBgǴ4"3gNXXQSXX؜9s1>#"ZhJN{ƫg<z O={֭[x.iѢŃ,ix37i$Aaڵ#"w
+
+"˗/m#:%\SSӥK"M'"4ӉHTN<yͿV5T'p[j4#gJuE
+#. @cT<j7Jo۶ڷoVjuh޽c=#CAaDTUU%tR<;rUVVQܹZl(5F7\Mkfin Ȩx2[ڵk׬YCDce}}}srr9lTSS^\jY<Y4K,3f{n~W*\\\Ο?ou.  ؝QTZZjSTTԬY1wޝ9s&ܽ{WPc^c޾};?}xiUAAСC(::Vqwi4Íjd2A
+n ްlǧE~~~<fŕΟ?_PX~h߾}'#gv6;w|krY;wf:uݹ7rcm޼wWĮ  3:d6fƌDe˖ŋќ9s4@&da{#GHT
+zT׭[DGqU#xذaDpNDQQQ<q(N"  8;ѣG٧TUUmV*;vcLCM:ϺYr7jueee~~>χdZޝ흒RXXVV^LZ688)Fzx✜RFS\\_wM<{,޼y35mt˖-ś7odke8'H  wTZZڪU+"bرڶm#KcΝ;D10{=Kyy9|Sfp[|X-8".)//j9vZSScvbbbt:A  Ύx?~<0@EEDDф	,i@;o<":t0N9bĈ LP(¦On=#<;th???LnT=MXtؑOd)ŋϟ?` Bѭ[ۦ׽xbFR-[G=zXlWqH~  PkIII8@ÀO   	   @ O    x        (    @     '    P<   	   @ O    x        (    @     '    $È  44=zh4hZWWWWDҧOG @N   6mt6]R?H$R+\  <y&D\ 
+'  qƙ3eMx  <xٓO&M| l  ˤILO>$&&Mx  {=zL_LdM6+%C  9bfĉ"Pw(  ^~嚚M41b '  XB:fwwwqS#O  `Gnnn5 '  d{Z|||*v: u	  kD4n88## TTTtY {#Gddd5n8SpP ppIIIbgАBg ݉lڴiʔ)bgn	  ɓN6P< @}H$b `(    @     '    P<   	   @ O    x        (    @     '    P< 0̞={rR֭sss233rll]1P"H$`Vk.f FٝFww-Zwƌ999_:%O<i),&&p{LLE߿D"ӧǤpKRRD"4N4hD"?~<ǀ` ڵkˣmVTTƚ0SߔjIZ FG̨Q=zUw{!Id2WWגvÇ-9^˖&euֆ[>|@D+W4ِ]5 X pJv}s9r$y{{X*ӧW^]~}a			Dgݾ}[Vx{{QBBcjPPZ6^H̅Ϙ|vgjKJJN>=k,www"<xNh(>PYR>"""LغsÆ׳5kϽ>6ژED얫WKjT
+'nX pJ{s?t5kL2ѣDP(
+egg7P"ZnvB#>c
+-/M6%LAX]ڽawaKӽСCٍC!͛7ZnѢ?!"___JevRVgm}ʔ)DsiZFAD:Pu ;H>Sd"Zpօ/ӉM6Ն
+\xYaEј1cebujBưœ=z$]\\߿}\cܳgуaݻk]<k׎$r7, 8%(j}-Q[؃bMMM.]?7nWhds:O@mڴulxnҤIf'2b"/֮]KD#G4MիW3BDf'euf~D*H;1Nx↥ d7wVUVV~sN"jٲ%ۗ$iݻ&qw2ZpC^#>4۷";vfQQ{vIIT*}aڬ3g. uU  PBBB޽n:[E:NW^__ŋ7olȑ#O<y)|Siii555G!"QFt:R6dŋpX
+ '[nqqVv{``iT*]`-Y=/b	H Ʀ'tPMݻ3g|a\\_evOOXNbccJi0mݬ_6os}0D	 ׏'G15~Ν;߿H$Υ~icBŕΟ?ޓ~0rر7oQTTQQQDtcǎq} ؗUUPPv"R*֭[֑15,\x}Tݻku0LAAL&ddSBP(>}jv$''[]y↥ TYr7jueee~~у%;%%PV^jfud]gLœV	    IDAT---=}ٳkLP5uT"JLL9YGK$?(R]huO #|=Kyy9)wSfpu$p]8bk,|֡/0wH$ϟFk֬!i6lYư#l u:]ff#d2B>}zNNQXzzzttL&󋎎NOO7=bzh4;v4.4@+h..hwroDD;scrL^ּyȠQ[{ID;w4>ggϞ9֐gl7	cO  ԛ$qç       4:'<    8      (    @     '    P<   	   @ O    x        (    @     '    P<    ; ;hD.]TPPЧOvډ}䈝CC N,))Iٳg)$È ӫYf͂Znm۶޽{ŵk׺uVe2VHNNNLL۷D";;'(  ڵk̙??bgv돞r\V7m4>>~رÇf	 N6mva={;;N7`.hZFP5*>>>66VP$' Zwk`drJxxQVQ>>>OҥK= *  _=tQ95*.tqq1۪h\\\Q95T8  ڵkg͚/ܹOt@555{|'WW^z:u
+%uC3O  TVV&''Ϙ1cهFhܹvRTTfffrjP< U\\<xC߿O>t.]|GF>|xV
+'  ^.]Գgϲ.Kb?{~[Ӊ'  rsspر;8
+LIrO>Gپ}ѣN 'N6lXDDĉ'NKDDٳHӋ/o߾~aFi;  .KJJ0aƍqU]]~Coɉ۾}TS
+'  ıcǦS^^^F٫			7o75$ ;qرc'NeTNʹr"}ڵ뫯?~pBs  p8gϞ0aBjj*@u9  {```^Nl  ?|=r[pŋ?ޯ_?s@ _=zԷo_oolR)v:03~'N\pubu	 !Cܻw;h8<yү_?Ryq777Ӂ:| 3mڴ,TN`[J2##իy@ KKKۼyMBBB.]lذaժUǏ;\  "*((ի̙3?Ss_>q˗> '  `#FlذA\ @,}6y+Vظq? v.PK8 ݩS"##^ys⥗^~z^^$P<@ɓnݺs޽bHaaa.]>y扝 ШxڵkN6m̝;wѢEع`( [zhۑ%d2Y@@@||ɓ'k0̞={rR֭sssّa̸8\k.KlZt{"Mb8"XJo^^^-^u  4J:n}foRGGG=gǊX1111fNMM5^Hۮ}v||^J@#{nTz{nx(RTyyyÇ'a#G$"oo+V\~]R=}իׯ߿?G<;&$$g}vmZ]XXMD				QPPZ6;6Y=G^jjjz葔=zI 4FSN/7=ݹs:t5k&ώG%"BgԔP((;;(P"ZnDGqE50vJg(J@cqF\~-!o[-\\\s{555sܸqƷt6~x"ONgd"Zpօa&NDmڴ4jzFdBCC_yN8qbVd2ϰaÎ9bQ_j׮\.		ٴia͛7
+EͧMSTU*Ւ%KzѣGe˖fxך6mg1SRR/{yy5o?ts:FgKPxxx4hVٶm۠A5k&;v8gΜǏ;]o߾~~~			Gn2~u8f  UWWifM!-Xc$x֭l̖-[E<CᅧI&	
+k׮f[CF	t҅>sӉ4U3A{lݺU&H$38e6Ç[6l3f.h'vѣ{pYsQQQQ1M:1c2Mƙ[}Q TWWכ7o6Z:p6m۶QjZn߾=ݻcf߂###>|((ݝΑgGJ"0Ja;wQ˖-پz;"͐JjٲٳMSd&&&СC?VEEEVئM۷o7~=lܹs]vǏ8vX۶ms[d	yyymڴxƍM6%e˖%<<ҥKeeeo65khˀ8V{.+V "RRXXX]]}QFq7_zӪUTVV={6""͛0L&MhEEEj$+++**' htzan'`Zڵk׬YCDܻ0=ds⩦&$$VZpOV#Mzjf_J2kO1;;{Ĉ2L?`N͛Dlx믿6̭{DfT"
+7܋E{--Z0;_>sѣ_޴#GS>}ɓoܸAD:uO?**KMM~>' h\N8AD?Vh{QQQfKJJbx({̙3ݻۉAjzf9"p믿\]]ӍSLOO4&N3qss#GJKKjtqq1l~/.H$KS:"*..6Ğ=rqqqqqJRTWWWaΜ9þzn2	 I&R]eeeNڴiӴiݻ!9{jɂ[/^̽;S<;N0>cfj;w&e˖qܑjzFjz饗bccvڕMVPPGO<14p'rO\jW<M1̙3˖-KLLT*D4~xM55K hx*++===׮]k)3h˖-/&9sptL&
+
+
+2ώG!"R)S_nJDVjzFmk}ٺG1aH7le6mD&'=}s	'6hݻ7;w~W|||5xF$33S&ѣG%IXXXMMMUUU۶mRc8vdvSQbb0n_+W޸qCVWVV|HՎD{޺zjCjji.ȋ]_?,))yQFF[lyҼqrO\5ksrrػ9"/  `ÆGeeeuuuAA0/m۶BFS\\tR"jҤ	wzZ @/oZ",vˎ;m۶>0̝;w<<<$Y6$[6ol69"p>|رc9/+Ff;n^xt)"##L{VVbwb,:u*wzZ @,ӷ{O\t:&L?k޼yD4tPAa:.33S$B6}tQӥGGGd2??t'&h:vh)Ag阋mŊ}Z;u֡C?XEh͛#GT(>>>oK,޽Gݗ.]ja@rO\j4
+Eddj#G0ىZruu.^0LNN믿޾}{WWW__ZɈ `\~s999}; 3rsswub'  POrss{)v" ܹsb'Vxի< ֩S|+P<@cqڵN: `P<@cq֭: vbgVxƢ}V*++; 4O<aoa)JB ZbgE.j +P<@cP(pLO<aM' h,pAӧOqqxƢy<J$Db0$ILL}S-k]0gϞ@\T*u6}ZilU*ռyod7o:ڭ5_ Ĕ)S)5Re2D"wH$i5Uƍ;|Zo,Xh"dle<̺ul;Sݚ8 Eppyߐj'Ch4{eݻwV:t==[Mvĉ^bU*ӧO^~}ꫯhϞ=|?O#3b5yo9rdqqX9SZZɓzQ":ty^{Mu<SXi֬YnnnHH]z2FÇ[hq밍\g  l^JN][nI$///Nnt{_ťK-:K"ܺubxfIOܺt钖'QFcǎ?~\.54RV/]4<<I&M4	_|9{uPee[o9zh\}$V'?H$*Î*u߲e͛7ODjƌ2c-
+V"J=\U>Μ9#H~vM~kѢ\.oٲebbbvvDmj))){V*M4ʲDD۷orss;wYYj|`_ @ѽ{ٳg׺{v_~a]t)~l2v/BDڵw1|xf2eQkFFG>FAD_|ڵkhȑFfz	<XV8fÀ֭[NWKe++VNdD_|b&$$n)y=YU͛׵kWLNcL7ꨨ(9t:]rriShhhYYwV,[[A Ȝ9s:uT
+^uȐ!={:t(-^}U}o6mdeeݾ}{ȑDsmD9h "ڱk?f`px~:ÇBŶI#<Ǣ<Mt+m]i}H6|eeT2"M'a|7g~pޙ0~ߙp;w1?Vnn.{T%"CǺDGGG===gϞ"6VUUQHHHoo/+h4{/{)J"są,fDDɓ'{zz'UcU<yrNN^ƌCD[limmjIII`^}v";vl^^ލ74ŋ
+ٲ_x1!!6n؀< /o>"JOO8{ƍ6lP*ǥQqqӆ"7nO<ѺJ\.>>>,c09V||<PTTDDӦM3ĉ?(66VtN"\OqzyKx[$
+v@MMMDe3))_,**|qcԩDTPP`>2OլYܹsƅDbJlH  F^1G]	BCC9{m8%CQɓq`YqgmK,x,FD>>>]:;;HT
+VTTQ```OOϝ;wmRV+c;Yygg'{kdWUh۶mzYt	&Z}-S0/!6y#v yzzG%6`SY<{ټysHHF{dd$555PTf̘1k׮(**ʸGIqg];ykͰC(33n3q;IO8q͚5»ptLVrv7}fT<U毋)XDH )JY{g(66699.\0..}|r&gpv7 mθA__Jbg;Wo<Bqq1v&q\YY626E555̝gLΝ#»?z)yM6
+͇b~ESe؜^N	 Nff̙3˶<Dk.Voтh߾}M!!!Dta=='O6kfѰm6YㆆbccY`c̀mعsgssVolldɴ9H&OBVU+VoG9x7^u"3f7o-Z׿TüvADƍ۳gOkkFeyXVXXx~FTPP毋)XDH d*;?^tPx&gpJc
+o`Rhy23w\fCŋ7Q<e<
+_{5Ȼjy,hu%dUm<==j⺭\ղzO
+`Z-<OqWxhր'*!p
+{9' pGiiiӧO73!(22Ҽp&MKvvvttqͳ?ZFT*}||_uk<ۛRRSS8Yq㌷X'x",,LPT)Sdggڲؼ
+yXU֭[msb4gΜ{t:CI&yzzFFF:d^Zv۶mlR*jܹsy8NOO񉋋obs
+Ú<Y ͜9ĉ0{uֱG_~%&&fӦMׯ:
+ ŋ766[vڬY.]4ydÑK/TPP¾b.m njΝ?î]dd7ϜZ[[w/h  IDAT#sr-H MĬ^z֭RvJZf?rssyq y0bN^: 䊊Tc2o޼O?T.ǧ@. Kc	E}쁫Z<uV\\\ZZ{z8p}f̘qqc{V! C8p@X-_/??_@N @DSPP_L4IX`4NJJڿ˥	 h`` 11Q}g>>>RS__߃>u)L&u8`'|l @D}+WW2`ZKC ?qqqo6;áСCQQQRQH  ]駟yfNNNHHȲeˤF?͓:p< ZjUqqqMM͜9sF۷o'&&FDDTWW+m< jj?8qk~jϟ?+u8 `ދ?~sslmm=q2Q ~~~~~NpU9sرc&L:p$O  :u*&&f---&o/$	\q/޽{+++J8'  |}}O<2&+V,YG./9rdRN	 O@@sbccgϞG͛k֬4:qaÆ7|3???--Mpm;  t:]vvJKK'O088Ȫ>SOI=z}vv}ݛ%u80,< ׮][o:d2٘1c.]-u =FtҚÁ	 @ӧỎ|衇>	uuu+**{  2Μhpp>۱cTQ￟={+W>dN< ?O
+nڴi#H̙3SL9vXHHÝ'  Ay\lHڼyӫ9	$O  ]rryNwM6xh ݻwxyyI|l  Tŋ+++'//A㳨L&׬'ɓ'K($O  'OVVV~2lppP.744H#ޜ¬<J%uD0Ґ<KjmmxQ_W_}j4"5kVNNqhmmݶm[__ʕ+gΜ)u8kҥRpB .,##C( F3d(  ~wɽ#00P( ?Nv  ·	`C    '    <   	   @$O    " y      H    D@    '    <   	   @$O  qSSSýƎdgg&SRRBCCBCC=qɀ2L&:μܑ	 &	9qR		={իkkkEќ9sd2٬YxBf!m0cLZwߕd3f0@R+sY =3XwwZyINNf===cl͹b2IKK*lp?:ck>o={c=fq'={?H\~Ie4 ~r_ho߾}}}s14[d	ڵZƍyyyDd1	&hZrGZ:e.Br86:֭S*D裏zlZu֮ۛ]k؅9o.R)ɮ]fիW-.CZ&vq"JHH('~X pI=WUU=̙3DRMU*UWW
+٥...Mʍm\)n믿%r#XjCBB&YXYz,[6olW^!e˖?ț7oR('~X pI=gff_WfBe[l!~P.uG!HFc\nWlK"pLG'ѓO>`$ˏ?NDSN8.>>b攅5AMMEGGEEEQMM xڰ)((XHai %9MD6oL08~Jإnhh(66|Mrb[:>c:<=IFb:ڽ{7qyyyDV-vtpaMf!mcbbӆ6N".v˗/('~X pI=}-wqY?JÇѽ\H\,Z߹sdMDbǵzxxx{{wttp-˯_nqj_6LDKџ'so3w۷o[[R yG  I&jz0\RR244x  "
+HKK;g𨨨$r|Ŋmݺ500@8$O  JD׮]oFDkYyxxy\.饗(77ݙF`K(<vpJJJ3feeQii؄6g!m;DtСHBk֬}vJJO?$jF $O  HDB}X9kc.33sĉnz뭷"%O622X			ٳ---DdxhdRR={b/dvXbW\\l/+qDxxx^^^JJJggMı>  ǣ
+x}cǎ?8@DAAA_[=c
+RXk7߰/;vHLݬk>oZ-qw^}XlԤP(
+[y⇥ 4LعsgssVoll4ydjj*ݸqCն޽!t߮vtd.B{Etϟ_~0=$ɫW4~\.y9QoF<X+WQzz:_Q< KYٗͩj?b\bّ62:OT<o,X~ĸk>QoF/\j7oduuuHai %]ח?aaa
+BRM2%;;ّ֤#GjuppBVG1b~]
+:qWPPPBBªU.\`qL"1.>}:>|ӧO62oj̙<s}7nHJ; y'}c RVV#u  o   :   p279     #`'    <   	   @$O    " y      H    D@    '    <   	   @$O    " y   A!u   +++:QVjH eddH qR    2	   @$O    " y      -=    IENDB`
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/ue-meas-consumer.dia ns-3.19/src/lte/doc/source/figures/ue-meas-consumer.dia
--- ns-3.18.1/src/lte/doc/source/figures/ue-meas-consumer.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/ue-meas-consumer.dia	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,10 @@
+     ]]s8}ϯpvML2yJw?8`HN:}%p	A亪e[sttuu?^$iGCdÁ&4f8iY/T}:fݧӇ+|L,N0XX8,t:86+[~gYD\Y/(,78M.9ݪ@wLU]-_פ;V;@Tԣ7,KP4p|(.iźl$,ۑ&,n8XqfCO͍m.춹.N&q
+?*Z͒hN:CaMeqaz+=$VZiv{*j4T}P]}eUNO'gkalLEZͶTt,vZww{cv뼉ɲaz|K,qO$[5󣩟Lõ
+$co߬]de]RxDЮQUx[u"/ޏfXWF!_O$ןƾ!OAFݷ"fՕ7{'S]9j3*>ެ6~.GIp퍻?m#ȓogY6!"MbAâc1BvBg#䢆" Gٗ?6mVt`".Y$NpL  01cW+0|@0tWq
+Hn.p04s+Gqck^|I{es VM4^v[X"qfmADqz꧷f	^|,:"5)6%:rQв	t|7)y+xs[VFVm(	7nmZ oxcڞf&x䬶M&oT#&f||ӵxě̸]{|gԠT H;iapoLMU$ʐI57⨱9&!G,o)?!jz<BxGt<ra<zO *prM:U͈dqXcč?Þhδ#NK{V-F|73bt!Fk?IXkW_OKVҎ'0+a%K^<4J;8Jf%;R5+GGI5MNOT&H0#mR^*ܦ28	8	8#YNb9%N(	Q$һ'r߭1vr1Xmc}?'iG#j4ͱB9.g̢ZA,5.vT=<9V<Bgr$ny$GYY?Gy~xk񧿊^dTϿ=o%F;dU$a.Tn&m0EsQ4K7|R~y/递9xX$DȲsfq1?~bZQ<4dTGC;N9e"AVP.;cCv\q:ôȻ!W_Dh`[[YWB#Ola^hx 4@h/40jaլpꮄ&EM
+FAnUnqEov)]Br -DrW)*xS"Gzg٠9LkGZJo569P;6:<!c(/u)ZLRg«//wr%䣼	fW;;o$`N%-xrd&dUpOPO:T	oӛ'r̮czAcYΚ&x|Oe`xsR_h>Ba
+c0!"gB6g3^P*Rw?gXJ$\Yv#B[HhFdE$ғ5_Ty\>Bυ?mN]e_9lbw7s7quuWVײ:B]]}QKY,{kwELysJ[8(%&
+_?R]/'(IZJf)	|F')%r:\/sG]J$OހG.n4p%X?tyw>*Oӗ<r]lErzw!e4w*<B9aײ]hDQTv<1ahtym!ԭ9%gԦU2g0q|݆c|77@VN;Cxy*Pw۶w OC-8g}ܲ1seTד,<_'w$zЙAW fekϰܨ\'7^=x/^{&ņΒ܂TꠜX_*K"`b,O `0umz&ӑnW/|?v£ίڶS՝q*(sQ\#.M{ǠDu G p x7 G-<٪fd5gOzuw
+ ]L0
+ngk<\{5vp Z?
+6:ӊ\PpgF3I͙ѸnVV085NJҎdCb$i9glՔڶwֻȯWJ.%f9[hwcZi``mĹb^0m*RC9cmv??hFe3^#иlޱ f :rg7H7Ax xoAv#8[n-a5-+mj:}-Y2	˱׋T{~pg;U\߭H~\EVD-ƴ?d*{.0[FHPi0ڜVRU2񋹸0te$YPt	02cye"8)>ğ_P  
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/ue-meas-piecewise-a1.dia ns-3.19/src/lte/doc/source/figures/ue-meas-piecewise-a1.dia
--- ns-3.18.1/src/lte/doc/source/figures/ue-meas-piecewise-a1.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/ue-meas-piecewise-a1.dia	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,12 @@
+     ݏ8+_v'U=#r	JnN؅HX5k
+3e2~#랥Yķ=`;=ţd~>]tnOęxvۛÃ2'K;c(\wweY
+44p̙94MWJFI=n{o&ţwVs]Ӡ{Al2j?Ir|9G%ʸP<{~S}zH>4wʉ!A?p<9yanͥݚ"IaDƥ<]d#qk(&a'-?Qv ʗ;MqsV$hylCtW߇Y8ؾlWQ_v
+zo>.#?=Le-nV9inܱST;Y&"bZӴı(mI2`4tlyo+	YS6Z$O>E`ԇCú={RmdcLFNYhq!rAEFH$ʓ8gLnM<Vh,_	7Ifя,gy8#p:{<:T3ZCgC TERC8r	z*8a9k%xN'%QЇ
+A>;86l@5T~@ rKOa̶	s>RH lSE>! }d#%q<`68u-]<G)fRnw>7x U<8':h&gOYՃYE:@#uc0W#6Bg~?9a<I8@F  'ĉc~mjIŕ*Nhr񗜋 @!8p 0W&_>>%4R#DaH_[]=H$*I QDA"`H%dH53($ @<h<n:!0$ҟD<< r׍#ܘ.=#Y .iՁ(j(NxR-hR6QMәn5@q j;5S6kPfLG
+I7O-|(
+uC!PHw
+I7BBBUH
+B\C!)$<,	Uւ:.|k ڐHu"bP;ۨڛ"h"sKcG(24j"FjN@EXEX)Vk"NjX@zDYVd*TG|+ڊ5
+Qf(2eMZ{R-[cTAfekhȔGt75V[6fekhȔߊO~_>P(wslGX*4<h7+;켸(%@
+K`^|lDcs"Up_z8nqyl[3?.rꠄК<)w;IH@Jݴ w{}PgX	/`mL&S2PD)]9nj,2%蔙eɔv<dJ %Wۈl%TR))&rD'鄤I:rcIeMǮX7AuAqe8{wj{F]?u1XNHN&ՐKgJע%S+$EHC6A 9B ]KgXLTR	uY֚!LY0=s*>ֆ_4
+xG4r#M`r3vܠ\8m(AR]ԈY2bˬoiXx˞nzmzD FÛ&}&'CSpksJcDw	;nAQp (KeQ?	(ql<t}&x\73LѸ4KKaMp1%io4j܄F0A(*ʌdaճ#T	qMlK ܼ@|]6o] ŚOA|. ЗN}]nhl'p}A@C|߾oX05挗:xxxVK7bQ RuF^n кx#9uXc5XzwU>Ӕ3ܪ  
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/ue-meas-piecewise-a1-hys.dia ns-3.19/src/lte/doc/source/figures/ue-meas-piecewise-a1-hys.dia
--- ns-3.18.1/src/lte/doc/source/figures/ue-meas-piecewise-a1-hys.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/ue-meas-piecewise-a1-hys.dia	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,9 @@
+     ݏ8@˝Ħ|lVڻYi[=#rao_;HB8#uKMϕJÏ_W%iGC`,}wǻf-oDx0\fg+ܦ4+6VaHy`pfTYM]N,x͆E]i5us_ꧡ5]ImK^jomGMjZQx/8݁}_NVH"	!A|Ϸ]삗9yI~%:NٱIF,ٰSrk(A-?az ïV]$pK-jzyfrUto$d>κv}6.3F޾<,6-jVnSrm֫ΝPeEt˒]?g@Y`N4F3>	vyqM:~)G:cx=TNh@Y\rLBWԑ;J*nDX#`}u(0q|0 sQ:V	w2~b˂)=淟sѶ<в!DNRI~m	"Z?'6T)$pfO)Ub*֊x.'%?
+AZ#-Y@0=*5 R]!@; #Bp?` <9L41f ։t]|j-i6/sPƃ}oL$~nX=e,Z4Ȋh/ҋnn>9COX`c:X !Tjx'3f\q1_=5 " #+ ^(Ϡ_4R\#D`Ho-.t@" $"D$D=!C"Iv@"D 
+"	>q5$DHy$rՃ%pa 2g=ȽƤ/"8*P,x"R-h6QMҙl5@:q j;5S6	kP.NZ
+
+y:Q1BN@-=D>"BSH:yX$!˱!B>!H5(EĠHwIQC{"dk"'=ڣH:S#PB(rA	V"dڣH:V#"P^PiuO(2kQ$J6bCaLغ4FEjPYuO(2akQ$MՆ{"YuO(2akQsL(-LĎ|+q, i5[&,]̰Hy)"WCAtE6W5A$bA廭]-j-i8\8OCsND1pNDC:>8'lwP+'/-[Ht>iwos.,]~Ⱦj~FoJ'~Tq]T/tA}A#+p$STPou%H7TNRߡ
+^Xs^UHc
+:؁dw/m!ѥϻ迉`!b^W+.xX
+$ x&L)I}aWԔۃA5^%Q8JJ5h<+؁nA.yJ3R&O
+:uCzHRdtJ~m}9C*D(O\֚¸f\i8'}@cAZ?fa~_jG&9M9PaVi%"|Q67Tp!28ǯEn/-fu[?o&,Bg4 3_j3R#nhVѠQ19AaavXb[Sտ,|N\_NS8ep)p5gsZB|h[,`LSBL"(\F.}[R m  %WlY"e<EoYU$CFBPl}=o2N?(a4LCS&$LR=B_:S|{pL{TM~yɯ<2rs18ױ ̗oN}]z@!Sge0+aϻ2ւ٧[y9ys#{dnJ{X>T}*X}sM`?r9X⫭jG(*QnotnYxW3  
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/figures/ue-meas-piecewise-motion.dia ns-3.19/src/lte/doc/source/figures/ue-meas-piecewise-motion.dia
--- ns-3.18.1/src/lte/doc/source/figures/ue-meas-piecewise-motion.dia	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/doc/source/figures/ue-meas-piecewise-motion.dia	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,17 @@
+     [s6)eNӇNۙnꑍrK?{%`0h3ɌA>$ė@{dqGDc2pu3Oϧ*k"Lw74|N`406B핦Ux4ٱ(M_<LLtcG7)JQ#n&wk2-Lkv[Č6mbz&J|^$ntWʔ^(\^K*jN'+?&(7q״^uO(Nc.Q0^'YҀwCP;?M뿣ArL;UVʓgAUX
+'"`mWoc~PX<F><|%=ݬ^}Ylr6Lq1X.eqiaZ+8]˻JD2-+gJCƞIv>f8kQ2X4-i
+Xa.ѡa!0  d4(,
+]jMo16ߞ/2`_4g4/VCM׆u^}NW x
+,pdFLWn.Y2; =Rp N
+4\ЂdFNӬzf{2]|y\+XIqǂ,kIivG~Fd%6.q,_=WPN];:!d@49Uffe&qyۄ_ҁI(4Bi
+4;;HAh
+B Bx8E	2L2woCcp"8$58d0`gD|F$LhHHjY:)0_eYle ͑i %Xy~«dHTF#{0ПyXF20&:%Tk #ƊK9CIP l:gDτ3IC4u@$DB΅ܡH( 0 4
+PAHBK!R#,Eq(d+
+NJ!e(4
+PQHF
+N~ň˴,ȑD]
+Ec(ɎPl|U!S2(H(RajQ48S#PCPd˃"EHGj$6XH""GYX"EӪ؈5r(P2Hwy(Tņ1H5TaPңhpV5vED5TaPҠ(vQ&47ܣGᆷ
+ɡ
+=j5@f!(q,ZID
+Q4DI%p
+!mW5.SPXc3A_@Q))t{3DQ܍Q>De$]%K>MBJΣN.'x=*՚Hwԭ[9Cma&&=_JmըVkFdHQYgHBUBH)CHuϐ,vz`7)g ZM]3\MORx+zZ3ΫXߥ=gH#-.3d4GUqU{{U{"Wh5  
\ No newline at end of file
diff -Naur ns-3.18.1/src/lte/doc/source/lte-design.rst ns-3.19/src/lte/doc/source/lte-design.rst
--- ns-3.18.1/src/lte/doc/source/lte-design.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/lte-design.rst	2013-12-20 09:44:51.000000000 -0800
@@ -1,14 +1,14 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
-
-++++++++++++++++++++++++++
- Design Documentation
-++++++++++++++++++++++++++
+++++++++++++++++++++
+Design Documentation
+++++++++++++++++++++
 
 
----------
+--------
 Overview
----------
+--------
 
 
 An overview of the  LTE-EPC simulation model is depicted in
@@ -34,9 +34,9 @@
 
 .. _sec-design-criteria:
 
------------------------
+---------------
 Design Criteria
------------------------
+---------------
 
 
 LTE Model
@@ -61,7 +61,7 @@
     The reason is that, since packet scheduling is done on
     a per-RB basis, an eNB might transmit on a subset only of all the available
     RBs, hence interfering with other eNBs only on those RBs where it is
-    trasmitting.
+    transmitting.
     Note that this requirement rules out the adoption of a system level simulation
     approach, which evaluates resource allocation only at the granularity of
     call/bearer establishment.
@@ -114,11 +114,10 @@
 The main objective of the EPC model is to provides means for the
 simulation of end-to-end IP connectivity over the LTE model. 
 To this aim, it supports for the
-interconnection of multiple UEs to the internet, via a radio access
+interconnection of multiple UEs to the Internet, via a radio access
 network of multiple eNBs connected to a single SGW/PGW node, as shown
 in Figure :ref:`fig-epc-topology`.
 
-
 The following design choices have been made for the EPC model:
 
  #. The only Packet Data Network (PDN) type supported is IPv4.
@@ -157,18 +156,18 @@
 
 
 
-.. _overall-architecture:
+.. _sec-overall-architecture:
 
------------------------
+------------
 Architecture
------------------------
+------------
 
 
 
 
 
-LTE Model 
-++++++++++
+LTE Model
++++++++++
 
 
 
@@ -391,6 +390,8 @@
 on the actual models used in each case. 
 
 
+.. _sec-fading-model:
+
 Fading Model
 ++++++++++++
 
@@ -439,12 +440,12 @@
 Antennas
 ++++++++
 
-Being based on the SpectrumPhy, the LTE PHY model supports antenna
-modeling via the ns-3 AntennaModel class. Hence, any model based on
+Being based on the ``SpectrumPhy``, the LTE PHY model supports antenna
+modeling via the ns-3 ``AntennaModel`` class. Hence, any model based on
 this class can be associated with any eNB or UE instance. For
-instance, the use of the CosineAntennaModel associated with an eNB
+instance, the use of the ``CosineAntennaModel`` associated with an eNB
 device allows to model one sector of a macro base station. By default,
-the IsotropicAntennaModel is used for both eNBs and UEs. 
+the ``IsotropicAntennaModel`` is used for both eNBs and UEs. 
 
 
 
@@ -455,9 +456,9 @@
         \clearpage
 
 
-----
+---
 PHY
-----
+---
 
 
 Overview
@@ -476,9 +477,10 @@
 .. _fig-lte-subframe-structure:
 
 .. figure:: figures/lte-subframe-structure.*
-   :width: 50px
+   :align: center
+   :width: 300px
 
-   Lte subframe division.
+   LTE subframe division.
 
 
 Considering the granularity of the simulator based on RB, the control and the reference signaling have to be consequently modeled considering this constraint.  According to the standard [TS36211]_, the downlink control frame starts at the beginning of each subframe and lasts up to three symbols across the whole system bandwidth, where the actual duration is provided by the Physical Control Format Indicator Channel (PCFICH). The information on the allocation are then mapped in the remaining resource up to the duration defined by the PCFICH, in the so called Physical Downlink Control Channel (PDCCH). A PDCCH transports a single message called Downlink Control Information (DCI) coming from the MAC layer, where the scheduler indicates the resource allocation for a specific user.
@@ -725,7 +727,7 @@
 Therefore the PHY layer implements the MIMO model as the gain perceived by the receiver when using a MIMO scheme respect to the one obtained using SISO one. We note that, these gains referred to a case where there is no correlation between the antennas in MIMO scheme; therefore do not model degradation due to paths correlation.
 
 
-.. _phy-ue-measurements:
+.. _sec-phy-ue-measurements:
 
 UE PHY Measurements Model
 +++++++++++++++++++++++++
@@ -776,9 +778,9 @@
 
 
 
-----------
-HARQ 
-----------
+----
+HARQ
+----
 
 The HARQ scheme implemented is based on a incremental redundancy (IR) solutions combined with multiple stop-and-wait processes for enabling a continuous data flow. In detail, the solution adopted is the *soft combining hybrid IR Full incremental redundancy* (also called IR Type II), which implies that the retransmissions contain only new information respect to the previous ones. The resource allocation algorithm of the HARQ has been implemented within the respective scheduler classes (i.e., ``RrFfMacScheduler`` and ``PfFfMacScheduler``, refer to their correspondent sections for more info), while the decodification part of the HARQ has been implemented in the ``LteSpectrumPhy`` and ``LteHarqPhy`` classes which will be detailed in this section.
 
@@ -821,9 +823,9 @@
    Interaction between HARQ and LTE protocol stack
 
 
-------
-MAC 
-------
+---
+MAC
+---
   
 
 Resource Allocation Model
@@ -832,7 +834,7 @@
 
 We now briefly describe how resource allocation is handled in LTE,
 clarifying how it is modeled in the simulator. The scheduler is in
-charge of generating specific structures calles Data Control Indication (DCI)
+charge of generating specific structures called *Data Control Indication* (DCI)
 which are then transmitted by the PHY of the eNB to the connected UEs, in order
 to inform them of the resource allocation on a per subframe basis. In doing this
 in the downlink direction, the scheduler has to fill some specific fields of the
@@ -914,6 +916,7 @@
 MAC headers specified by 3GPP. 
 
 
+.. _sec-ff-mac-scheduler:
 
 The FemtoForum MAC Scheduler Interface
 ++++++++++++++++++++++++++++++++++++++
@@ -1003,7 +1006,7 @@
 
 For what concern the HARQ, RR implements the non adaptive version, which implies that in allocating the retransmission attempts RR uses the same allocation configuration of the original block, which means maintaining the same RBGs and MCS. UEs that are allocated for HARQ retransmissions are not considered for the transmission of new data in case they have a transmission opportunity available in the same TTI. Finally, HARQ can be disabled with ns3 attribute system for maintaining backward compatibility with old test cases and code, in detail::
 
-  Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
+   Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
 
 The scheduler implements the filtering of the uplink CQIs according to their nature with ``UlCqiFilter`` attibute, in detail:
 
@@ -1081,11 +1084,14 @@
    \right)}{\tau}
    
 
-For what concern the HARQ, PF implements the non adaptive version, which implies that in allocating the retransmission attempts the scheduler uses the same allocation configuration of the original block, which means maintaining the same RBGs and MCS. UEs that are allocated for HARQ retransmissions are not considered for the transmission of new data in case they have a transmission opportunity available in the same TTI. Finally, HARQ can be disabled with ns3 attribute system for maintaining backward compatibility with old test cases and code, in detail.
+For what concern the HARQ, PF implements the non adaptive version, which implies that in allocating the retransmission attempts the scheduler uses the same allocation configuration of the original block, which means maintaining the same RBGs and MCS. UEs that are allocated for HARQ retransmissions are not considered for the transmission of new data in case they have a transmission opportunity available in the same TTI. Finally, HARQ can be disabled with ns3 attribute system for maintaining backward compatibility with old test cases and code, in detail::
+
+   Config::SetDefault ("ns3::PfFfMacScheduler::HarqEnabled", BooleanValue (false));
+
 
 
 Maximum Throughput (MT) Scheduler
-----------------------------------
+---------------------------------
 
 The Maximum Throughput (MT) scheduler [FCapo2012]_ aims to maximize the overall throughput of eNB.
 It allocates each RB to the user that can achieve the maximum achievable rate in the current TTI.
@@ -1122,7 +1128,7 @@
 
 
 Throughput to Average (TTA) Scheduler
---------------------------------------
+-------------------------------------
 
 The Throughput to Average (TTA) scheduler [FCapo2012]_ can be considered as an intermediate between MT and PF. 
 The metric used in TTA is calculated as follows:
@@ -1255,6 +1261,8 @@
 metric (:math:`Msch`, :math:`MCoI`) by weight :math:`W[n]`. This strategy will guarantee the throughput of lower
 quality UE tend towards the TBR. 
 
+::
+
   Config::SetDefault ("ns3::PfFfMacScheduler::HarqEnabled", BooleanValue (false));
 
 The scheduler implements the filtering of the uplink CQIs according to their nature with ``UlCqiFilter`` attibute, in detail:
@@ -1264,6 +1272,8 @@
   - ``ALL_UL_CQI``: all CQIs are stored in the same internal attibute (i.e., the last CQI received is stored independently from its nature).
 
 
+.. _sec-random-access:
+
 Random Access
 +++++++++++++
 
@@ -1347,9 +1357,9 @@
         \clearpage
 
 
-----
-RLC 
-----
+---
+RLC
+---
 
 
 
@@ -1441,7 +1451,7 @@
           in the receiver peer
 
 
-.. _am_data_transfer:
+.. _sec-am_data_transfer:
 
 AM RLC
 ++++++
@@ -1667,7 +1677,7 @@
 retransmission are not performed, and there are no STATUS PDUs.
 
 Transmit operations in uplink
-------------------------------
+-----------------------------
 
 The transmit operations in the uplink are similar to those of the
 downlink, with the main difference that the Report_Buffer_Status is
@@ -1857,11 +1867,13 @@
 
  - generation (at the eNB) and interpretation (at the UE) of System
    Information (in particular the Master Information Block and, at the
-   time of this writing, only System Information Block Type 2)
+   time of this writing, only System Information Block Type 1 and 2)
+ - initial cell selection
  - RRC connection establishment procedure
  - RRC reconfiguration procedure, supporting the following use cases:
    + reconfiguration of the SRS configuration index
    + reconfiguration of the PHY TX mode (MIMO)
+   + reconfiguration of UE measurements
    + data radio bearer setup
    + handover
  - RRC connection re-establishment, supporting the following use
@@ -1901,6 +1913,7 @@
 .. _fig-lte-ue-rrc-states:
 
 .. figure:: figures/lte-ue-rrc-states.*
+   :scale: 70 %
    :align: center
 
    UE RRC State Machine
@@ -1938,11 +1951,173 @@
 .. _fig-lte-enb-rrc-states:
 
 .. figure:: figures/lte-enb-rrc-states.*
+   :scale: 70 %
    :align: center
 
    ENB RRC State Machine for each UE
 
 
+.. _sec-initial-cell-selection:
+
+Initial Cell Selection
+++++++++++++++++++++++
+
+Initial cell selection is an IDLE mode procedure, performed by UE when it has
+not yet camped or attached to an eNodeB. The objective of the procedure is to
+find a suitable cell and attach to it to gain access to the cellular network.
+
+It is typically done at the beginning of simulation, as depicted in Figure
+:ref:`fig-lte-cell-selection-timeline` below. The time diagram on the left side
+is illustrating the case where initial cell selection succeed on first try,
+while the diagram on the right side is for the case where it fails on the first
+try and succeed on the second try. The timing assumes the use of real RRC
+protocol model (see :ref:`sec-rrc-protocol-models`) and no transmission error.
+
+.. _fig-lte-cell-selection-timeline:
+
+.. figure:: figures/lte-cell-selection-timeline.*
+   :scale: 80 %
+   :align: center
+
+   Sample runs of initial cell selection in UE and timing of related events
+
+The functionality is based on 3GPP IDLE mode specifications, such as in
+[TS36300]_, [TS36304]_, and [TS36331]_. However, a proper implementation of IDLE
+mode is still missing in the simulator, so we reserve several simplifying
+assumptions:
+
+ - multiple carrier frequency is not supported;
+ 
+ - multiple Public Land Mobile Network (PLMN) identities (i.e. multiple network
+   operators) is not supported;
+ 
+ - RSRQ measurements are not utilized;
+ 
+ - stored information cell selection is not supported;
+
+ - "Any Cell Selection" state and camping to an acceptable cell is not
+   supported;
+ 
+ - marking a cell as barred or reserved is not supported;
+
+ - cell reselection is not supported, hence it is not possible for UE to camp to
+   a different cell after the initial camp has been placed; and
+ 
+ - UE's Closed Subscriber Group (CSG) white list contains only one CSG identity.
+   
+Also note that initial cell selection is only available for EPC-enabled
+simulations. LTE-only simulations must use the manual attachment method. See
+section :ref:`sec-network-attachment` of the User Documentation for more
+information on their differences in usage.
+
+The next subsections cover different parts of initial cell selection, namely
+*cell search*, *broadcast of system information*, and *cell selection evaluation*.
+
+.. _sec-cell-search:
+
+Cell Search
+-----------
+
+Cell search aims to detect surrounding cells and measure the strength of
+received signal from each of these cells. One of these cells will become the
+UE's entry point to join the cellular network.
+
+The measurements are based on the RSRP of the received PSS, averaged by Layer 1
+filtering, and performed by the PHY layer, as previously described in more
+detail in section :ref:`sec-phy-ue-measurements`. PSS is transmitted by eNodeB
+over the central 72 sub-carriers of the DL channel (Section 5.1.7.3 [TS36300]_),
+hence we model cell search to operate using a DL bandwidth of 6 RBs. Note that
+measurements of RSRQ are not available at this point of time in simulation. As
+a consequence, the ``LteUePhy::RsrqUeMeasThreshold`` attribute does not apply
+during cell search.
+
+By using the measured RSRP, the PHY entity is able to generate a list of
+detected cells, each with its corresponding cell ID and averaged RSRP. This list
+is periodically pushed via CPHY SAP to the RRC entity as a measurement report.
+
+The RRC entity inspects the report and simply choose the cell with the strongest
+RSRP, as also indicated in Section 5.2.3.1 of [TS36304]_. Then it instructs back
+the PHY entity to synchronize to this particular cell. The actual operating
+bandwidth of the cell is still unknown at this time, so the PHY entity listens
+only to the minimum bandwidth of 6 RBs. Nevertheless, the PHY entity will be
+able to receive system broadcast message from this particular eNodeB, which is
+the topic of the next subsection.
+
+Broadcast of System Information
+-------------------------------
+
+System information blocks are broadcasted by eNodeB to UEs at predefined time
+intervals, adapted from Section 5.2.1.2 of [TS36331]_. The supported system
+information blocks are:
+
+ - Master Information Block (MIB)
+      Contains parameters related to the PHY layer, generated during cell
+      configuration and broadcasted every 10 ms at the beginning of radio frame
+      as a control message.
+
+ - System Information Block Type 1 (SIB1)
+      Contains information regarding network access, broadcasted every 20 ms at
+      the middle of radio frame as a control message. Not used in manual
+      attachment method. UE must have decoded MIB before it can receive SIB1.
+      
+ - System Information Block Type 2 (SIB2)
+      Contains UL- and RACH-related settings, scheduled to transmit via RRC
+      protocol at 16 ms after cell configuration, and then repeats every 80 ms
+      (configurable through `LteEnbRrc::SystemInformationPeriodicity` attribute.
+      UE must be camped to a cell in order to be able to receive its SIB2.
+
+Reception of system information is fundamental for UE to advance in its
+lifecycle. MIB enables the UE to increase the initial DL bandwidth of 6 RBs to
+the actual operating bandwidth of the network. SIB1 provides information
+necessary for cell selection evaluation (explained in the next section). And
+finally SIB2 is required before the UE is allowed to switch to CONNECTED state.
+
+Cell Selection Evaluation
+-------------------------
+
+UE RRC reviews the measurement report produced in :ref:`sec-cell-search` and the
+cell access information provided by SIB1. Once both information is available for
+a specific cell, the UE triggers the evaluation process. The purpose of this
+process is to determine whether the cell is a suitable cell to camp to.
+
+The evaluation process is a slightly simplified version of Section 5.2.3.2 of
+[TS36304]_. It consists of the following criteria:
+
+ - Rx level criterion; and
+ 
+ - closed subscriber group (CSG) criterion.
+ 
+The first criterion, Rx level, is based on the cell's measured RSRP
+:math:`Q_{rxlevmeas}`, which has to be higher than a required minimum
+:math:`Q_{rxlevmin}` in order to pass the criterion:
+
+.. math::
+
+   Q_{rxlevmeas} - Q_{rxlevmin} > 0 
+
+where :math:`Q_{rxlevmin}` is determined by each eNodeB and is obtainable by UE
+from SIB1.
+
+The last criterion, CSG, is a combination of a true-or-false parameter called
+*CSG indication* and a simple number *CSG identity*. The basic rule is that UE
+shall not camp to eNodeB with a different CSG identity. But this rule is only
+enforced when CSG indication is valued as true. More details are provided in
+Section :ref:`sec-network-attachment` of the User Documentation.
+
+When the cell passes all the above criteria, the cell is deemed as *suitable*.
+Then UE camps to it (`IDLE_CAMPED_NORMALLY` state).
+
+After this, upper layer may request UE to enter CONNECTED mode. Please refer to
+section :ref:`sec-rrc-connection-establishment` for details on this.
+
+On the other hand, when the cell does not pass the CSG criterion, then the cell
+is labeled as *acceptable* (Section 10.1.1.1 [TS36300]_). In this case, the RRC
+entity will tell the PHY entity to synchronize to the second strongest cell and
+repeat the initial cell selection procedure using that cell. As long as no
+suitable cell is found, the UE will repeat these steps while avoiding cells that
+have been identified as acceptable.
+
+   
 
 Radio Admission Control
 +++++++++++++++++++++++
@@ -1990,109 +2165,493 @@
 based on UE measurements are planned only at a later stage).
 
 
-UE Measurements
-+++++++++++++++
+.. _sec-ue-measurements:
 
+UE RRC Measurements Model
++++++++++++++++++++++++++
 
 UE RRC measurements support
 ---------------------------
 
-The UE RRC entity provides support for UE measurements; in
-particular, it implements the procedures described in Section 5.5 of
-[TS36331]_, with the following simplifying assumptions:
+The UE RRC entity provides support for UE measurements; in particular, it
+implements the procedures described in Section 5.5 of [TS36331]_, with the
+following simplifying assumptions:
 
- - only E-UTRA intra-frequency measurements are supported;
+ - only E-UTRA intra-frequency measurements are supported, which implies:
+   
+   - only one measurement object is used during the simulation;
+   - measurement gaps are not needed to perform the measurements;
+   - Event B1 and B2 are not implemented;
+   
+ - only `reportStrongestCells` purpose is supported, while `reportCGI` and
+   `reportStrongestCellsForSON` purposes are not supported;
 
- - measurement gaps are not needed to perform the measurements;
+ - `s-Measure` is not supported;
+ 
+ - since carrier aggregation is not supported in by the LTE module, the
+   following assumptions in UE measurements hold true:
+   
+   - no notion of secondary cell (`SCell`);
+   - primary cell (`PCell`) simply means serving cell;
+   - Event A6 is not implemented;
+   
+ - speed dependant scaling of time-to-trigger (Section 5.5.6.2 of [TS36331]_) is
+   not supported.
 
- - only event-driven measurements are supported; the other type of
-   measurements are not supported;
+Overall design
+--------------
 
- - only the events A2 and A4 are to be supported; 
+The model is based on the concept of *UE measurements consumer*, which is an
+entity that may request an eNodeB RRC entity to provide UE measurement reports.
+Consumers are, for example, :ref:`sec-handover-algorithm`, which compute
+handover decision based on UE measurement reports. Test cases and user's
+programs may also become consumers. Figure :ref:`fig-ue-meas-consumer` depicts
+the relationship between these entities.
 
- - time-to-trigger is not supported, i.e., a time-to-trigger value
-   equal to zero is always assumed;
+.. _fig-ue-meas-consumer:
+   
+.. figure:: figures/ue-meas-consumer.*
+   :scale: 80 %
+   :align: center
 
- - layer 3 filtering assumes that the periodicity of the measurements
-   reported by the PHY is equal to 200ms;
+   Relationship between UE measurements and its consumers
 
- - in measurement reports, the reportQuantity is always assumed to be
-   "both", i.e., both RSRP and RSRQ are always reported, regardless of
-   the trigger quantity.
+The whole UE measurements function at the RRC level is divided into 4 major
+parts:
 
+ #. Measurement configuration (handled by ``LteUeRrc::ApplyMeasConfig``)
+ 
+ #. Performing measurements (handled by ``LteUeRrc::DoReportUeMeasurements``)
+ 
+ #. Measurement report triggering (handled by
+    ``LteUeRrc::MeasurementReportTriggering``)
+   
+ #. Measurement reporting (handled by ``LteUeRrc::SendMeasurementReport``)
 
-eNB RRC measurement configuration
----------------------------------
+The following sections will describe each of the parts above.
 
-The eNB RRC entity configures the UE measurements. The eNB RRC entity
-sends the configuration parameters to the UE RRC entity in the
-MeasConfig IE of the RRC Connection Reconfiguration message when the UE
-attaches to the eNB or the RRC Handover Request message when the target
-eNB initiates the handover procedure.
+Measurement configuration
+-------------------------
 
-The eNB RRC entity implements the configuration parameters and procedures
-described in Section 5.5 of [TS36331]_, with the following simplifying
-assumptions:
+An eNodeB RRC entity configures UE measurements by sending the configuration
+parameters to the UE RRC entity. This set of parameters are defined within the
+``MeasConfig`` Information Element (IE) of the RRC Connection Reconfiguration
+message (:ref:`sec-rrc-connection-reconfiguration`).
 
- - only E-UTRA intra-frequency measurements are configured, so only the
-   downlink carrier frequency of the serving cell is configured as
-   measurement object;
+The eNodeB RRC entity implements the configuration parameters and procedures
+described in Section 5.5.2 of [TS36331]_, with the following simplifying
+assumption:
 
- - only the events A2 and A4 are configured;
+ - configuration (i.e. addition, modification, and removal) can only be done
+   before the simulation begins;
+   
+ - all UEs attached to the eNodeB will be configured the same way, i.e. there is
+   no support for configuring specific measurement for specific UE; and
+   
+ - it is assumed that there is a one-to-one mapping between the PCI and the
+   E-UTRAN Global Cell Identifier (EGCI). This is consistent with the PCI
+   modeling assumptions described in :ref:`sec-phy-ue-measurements`.
+
+The eNodeB RRC instance here acts as an intermediary between the consumers and
+the attached UEs. At the beginning of simulation, each consumer provides the
+eNodeB RRC instance with the UE measurements configuration that it requires.
+After that, the eNodeB RRC distributes the configuration to attached UEs.
+
+Users may customize the measurement configuration using several methods. Please
+refer to Section :ref:`sec-configure-ue-measurements` of the User Documentation
+for the description of these methods.
 
- - only the RSRQ threshold is configured for both events;
+.. _sec-performing-measurements:
 
- - the reportInterval parameter is configured to 480 ms, so once the
-   events are triggered, the UE will send the measurement reports with
-   this periodicity;
+Performing measurements
+-----------------------
 
- - the filterCoefficientRSRQ parameter is configured to fc4, it is the
-   default value specified in the protocol specification [TS36331]_;
+UE RRC receives both RSRP and RSRQ measurements on periodical basis from UE PHY,
+as described in :ref:`sec-phy-ue-measurements`. *Layer 3 filtering* will be
+applied to these received measurements. The implementation of the filtering
+follows Section 5.5.3.2 of [TS36331]_:
 
- - the hysteresis and timeToTrigger parameters are configured with
-   values equal to zero;
+.. math::
 
- - it is assumed that there is a one-to-one mapping between the PCI
-   and the E-UTRAN Global Cell Identifier (EGCI). This is consistent
-   with the PCI modeling assumptions described in :ref:`phy-ue-measurements`.
+   F_n = (1 - a) \times F_{n-1} + a \times M_n
 
+where:
 
+ - :math:`M_n` is the latest received measurement result from the physical
+   layer;
+ - :math:`F_n` is the updated filtered measurement result;
+ - :math:`F_{n-1}` is the old filtered measurement result, where
+   :math:`F_0 = M_1` (i.e. the first measurement is not filtered); and
+ - :math:`a = (\frac{1}{2})^{\frac{k}{4}}`, where :math:`k` is the configurable
+   `filterCoefficent` provided by the ``QuantityConfig``;
+   
+:math:`k = 4` is the default value, but can be configured by setting the
+`RsrpFilterCoefficient` and `RsrqFilterCoefficient` attributes in
+``LteEnbRrc``.
+
+Therefore :math:`k = 0` will disable Layer 3 filtering. On the other hand, past
+measurements can be granted more influence on the filtering results by using
+larger value of :math:`k`.
+
+Measurement reporting triggering
+--------------------------------
+
+In this part, UE RRC will go through the list of active measurement
+configuration and check whether the triggering condition is fulfilled in
+accordance with Section 5.5.4 of [TS36331]_. When at least one triggering
+condition from all the active measurement configuration is fulfilled, the
+measurement reporting procedure (described in the next subsection) will be
+initiated.
+
+3GPP defines two kinds of `triggerType`: *periodical* and *event-based*. At the
+moment, only event-based criterion is supported. There are various events that
+can be selected, which are briefly described in the table below: 
+
+.. table:: List of supported event-based triggering criteria
+
+   ======== ======================================================
+   Name     Description
+   ======== ======================================================
+   Event A1 Serving cell becomes better than `threshold`
+   Event A2 Serving cell becomes worse than `threshold`
+   Event A3 Neighbour becomes `offset` dB better than serving cell
+   Event A4 Neighbour becomes better than `threshold`
+   Event A5 Serving becomes worse than `threshold1`
+            *AND* neighbour becomes better than `threshold2`
+   ======== ======================================================
+
+Two main conditions to be checked in an event-based trigger are the *entering
+condition* and the *leaving condition*. More details on these two can be found
+in Section 5.5.4 of [TS36331]_.
+
+An event-based trigger can be further configured by introducing hysteresis and
+time-to-trigger. *Hysteresis* (:math:`Hys`) defines the distance between the
+entering and leaving conditions in dB. Similarly, *time-to-trigger* introduces
+delay to both entering and leaving conditions, but as a unit of time.
+
+The *periodical* type of reporting trigger is not supported, but its behaviour
+can be easily obtained by using an event-based trigger. This can be done by
+configuring the measurement in such a way that the entering condition is always
+fulfilled, for example, by setting the threshold of Event A1 to zero (the
+minimum level). As a result, the measurement reports will always be triggered
+at every certain interval, as determined by the `reportInterval` field within
+``LteRrcSap::ReportConfigEutra``, therefore producing the same behaviour as
+periodical reporting.
+
+As a limitation with respect to 3GPP specifications, the current model does not
+support any cell-specific configuration. These configuration parameters are
+defined in measurement object. As a consequence, incorporating a list of black
+cells into the triggering process is not supported. Moreover, cell-specific
+offset (i.e., :math:`O_{cn}` and :math:`O_{cp}` in Event A3, A4, and A5) are not
+supported as well. The value equal to zero is always assumed in place of them.
+
+Measurement reporting
+---------------------
+
+This part handles the submission of measurement report from the UE RRC entity
+to the serving eNodeB entity via RRC protocol. Several simplifying assumptions
+have been adopted:
+
+ - `reportAmount` is *not* applicable (i.e. always assumed to be infinite);
+   
+ - in measurement reports, the `reportQuantity` is always assumed to be `BOTH`,
+   i.e., both RSRP and RSRQ are always reported, regardless of the
+   `triggerQuantity`.
+
+
+.. _sec-handover:
 
 Handover
 ++++++++
 
-The RRC model support the execution of an X2-based handover procedure.
-There are 2 ways to trigger the handover procedure:
+The RRC model supports UE mobility in CONNECTED mode by invoking the X2-based
+handover procedure. The model is intra-EUTRAN and intra-frequency, as based on
+Section 10.1.2.1 of [TS36300]_.
+
+This section focuses on the process of triggering a handover. The handover
+execution procedure itself is covered in Section :ref:`sec-x2`.
 
- - the handover could be triggered explicitly by the simulation program
-   by scheduling an execution of the method ``LteEnbRrc::SendHandoverRequest ()``
+There are two ways to trigger the handover procedure:
 
- - the handover could be triggered automatically by the eNB RRC entity.
-   The eNB executes the following algorithm :ref:`fig-lte-handover-algorithm` 
-   to trigger the handover procedure for a UE providing measurements in its
-   serving cell and the neighbour cells the UE measures:
+ - *explicitly* (or manually) triggered by the simulation program by scheduling
+   an execution of the method ``LteEnbRrc::SendHandoverRequest``; or
 
-.. _fig-lte-handover-algorithm:
+ - *automatically* triggered by the eNodeB RRC entity based on UE measurements
+   and according to the selected handover algorithm.
 
-.. figure:: figures/lte-handover-algorithm.*
+Section :ref:`sec-x2-based-handover` of the User Documentation provides some
+examples on using both explicit and automatic handover triggers in simulation.
+The next subsection will take a closer look on the automatic method, by
+describing the design aspects of the handover algorithm interface and the
+available handover algorithms.
+
+.. _sec-handover-algorithm:
+
+Handover algorithm
+------------------
+
+Handover in 3GPP LTE has the following properties:
+
+ - UE-assisted
+     The UE provides input to the network in the form of measurement reports.
+     This is handled by the :ref:`sec-ue-measurements`.
+   
+ - Network-controlled
+     The network (i.e. the source eNodeB and the target eNodeB) decides when to
+     trigger the handover and oversees its execution.
+
+The *handover algorithm* operates at the source eNodeB and is responsible in
+making handover decisions in an "automatic" manner. It interacts with an eNodeB
+RRC instance via the *Handover Management SAP* interface. These relationships
+are illustrated in Figure :ref:`fig-ue-meas-consumer` from the previous section.
+
+The handover algorithm interface consists of the following methods:
+
+ - ``AddUeMeasReportConfigForHandover``
+     (Handover Algorithm -> eNodeB RRC) Used by the handover algorithm to
+     request measurement reports from the eNodeB RRC entity, by passing the
+     desired reporting configuration. The configuration will be applied to
+     all future attached UEs.
+
+ - ``ReportUeMeas``
+     (eNodeB RRC -> Handover Algorithm) Based on the UE measurements configured
+     earlier in ``AddUeMeasReportConfigForHandover``, UE may submit measurement
+     reports to the eNodeB. The eNodeB RRC entity uses the ``ReportUeMeas``
+     interface to forward these measurement reports to the handover algorithm.
+     
+ - ``TriggerHandover``
+     (Handover Algorithm -> eNodeB RRC) After examining the measurement reports
+     (but not necessarily), the handover algorithm may declare a handover. This
+     method is used to notify the eNodeB RRC entity about this decision, which
+     will then proceed to commence the handover procedure. 
+
+One note for the ``AddUeMeasReportConfigForHandover``. The method will return
+the ``measId`` (measurement identity) of the newly created measurement
+configuration. Typically a handover algorithm would store this unique number. It
+may be useful in the ``ReportUeMeas`` method, for example when more than one
+configuration has been requested and the handover algorithm needs to
+differentiate incoming reports based on the configuration that triggered them.
+
+A handover algorithm is implemented by writing a subclass of the
+``LteHandoverAlgorithm`` abstract superclass and implementing each of the above
+mentioned SAP interface methods. Users may develop their own handover algorithm
+this way, and then use it in any simulation by following the steps outlined in
+Section :ref:`sec-x2-based-handover` of the User Documentation.
+
+Alternatively, users may choose to use one of the 3 built-in handover algorithms
+provided by the LTE module: no-op, A2-A4-RSRQ, and strongest cell handover
+algorithm. They are ready to be used in simulations or can be taken as an
+example of implementing a handover algorithm. Each of these built-in algorithms
+is covered in each of the following subsections.
+
+No-op handover algorithm
+------------------------
+
+The *no-op handover algorithm* (``NoOpHandoverAlgorithm`` class) is the simplest
+possible implementation of handover algorithm. It basically does nothing, i.e.,
+does not call any of the Handover Management SAP interface methods. Users may
+choose this handover algorithm if they wish to disable automatic handover
+trigger in their simulation.
+
+A2-A4-RSRQ handover algorithm
+-----------------------------
+
+The *A2-A4-RSRQ handover algorithm* provides the functionality of the default
+handover algorithm originally included in LENA M6 (ns-3.18), ported to the
+Handover Management SAP interface as the ``A2A4RsrqHandoverAlgorithm`` class.
+
+As the name implies, the algorithm utilizes the Reference Signal Received
+Quality (RSRQ) measurements acquired from Event A2 and Event A4. Thus, the
+algorithm will add 2 measurement configuration to the corresponding eNodeB RRC
+instance. Their intended use are described as follows:
+
+ - *Event A2* (serving cell's RSRQ becomes worse than `threshold`) is leveraged
+   to indicate that the UE is experiencing poor signal quality and may benefit
+   from a handover.
+ 
+ - *Event A4* (neighbour cell's RSRQ becomes better than `threshold`) is used
+   to detect neighbouring cells and acquire their corresponding RSRQ from every
+   attached UE, which are then stored internally by the algorithm. By default,
+   the algorithm configures Event A4 with a very low threshold, so that the
+   trigger criteria are always true.
+   
+Figure :ref:`fig-lte-legacy-handover-algorithm` below summarizes this procedure.
+
+.. _fig-lte-legacy-handover-algorithm:
+
+.. figure:: figures/lte-legacy-handover-algorithm.*
+   :scale: 70 %
+   :align: center
+
+   A2-A4-RSRQ handover algorithm
+ 
+Two attributes can be set to tune the algorithm behaviour:
+
+ - ``ServingCellThreshold``
+     The `threshold` for Event A2, i.e. a UE must have an RSRQ lower than this
+     threshold to be considered for a handover.
+
+ - ``NeighbourCellOffset``
+     The `offset` that aims to ensure that the UE would receive better signal
+     quality after the handover. A neighbouring cell is considered as a target
+     cell for the handover only if its RSRQ is higher than the serving cell's
+     RSRQ by the amount of this `offset`.
+
+The value of both attributes are expressed as RSRQ range (Section 9.1.7 of
+[TS36133]_), which is an integer between 0 and 34, with 0 as the lowest RSRQ.
+
+Strongest cell handover algorithm
+---------------------------------
+
+The *strongest cell handover algorithm*, or also sometimes known as the
+*traditional power budget (PBGT) algorithm*, is developed using [Dimou2009]_ as
+reference. The idea is to provide each UE with the best possible Reference
+Signal Received Power (RSRP). This is done by performing a handover as soon as
+a better cell (i.e. with stronger RSRP) is detected.
+
+*Event A3* (neighbour cell's RSRP becomes better than serving cell's RSRP) is
+chosen to realize this concept. The ``A3RsrpHandoverAlgorithm`` class is the
+result of the implementation. Handover is triggered for the UE to the best cell
+in the measurement report.
+
+A simulation which uses this algorithm is usually more vulnerable to ping-pong
+handover (consecutive handover to the previous source eNodeB within short period
+of time), especially when the :ref:`sec-fading-model` is enabled. This problem
+is typically tackled by introducing a certain delay to the handover. The
+algorithm does this by including hysteresis and time-to-trigger parameters
+(Section 6.3.5 of [TS36331]_) to the UE measurements configuration.
+
+*Hysteresis* (a.k.a. handover margin) delays the handover in regard of RSRP. The
+value is expressed in dB, ranges between 0 to 15 dB, and have a 0.5 dB accuracy,
+e.g., an input value of 2.7 dB is rounded to 2.5 dB.
+
+On the other hand, *time-to-trigger* delays the handover in regard of time. 3GPP
+defines 16 valid values for time-to-trigger (all in milliseconds): 0, 40, 64,    
+80, 100, 128, 160, 256, 320, 480, 512, 640, 1024, 1280, 2560, and 5120.
+
+The difference between hysteresis and time-to-trigger is illustrated in Figure
+:ref:`fig-lte-strongest-cell-handover-algorithm` below, which is taken from the
+`lena-x2-handover-measures` example. It depicts the perceived RSRP of serving
+cell and a neighbouring cell by a UE which moves pass the border of the cells.
+
+.. _fig-lte-strongest-cell-handover-algorithm:
+
+.. figure:: figures/lte-strongest-cell-handover-algorithm.*
    :align: center
 
-   Algorithm to automatically trigger the Handover procedure
+   Effect of hysteresis and time-to-trigger in strongest cell handover algorithm
 
-The simulation user can set two parameters to control the handover decision:
+By default, the algorithm uses a hysteresis of 3.0 dB and time-to-trigger of
+256 ms. These values can be tuned through the ``Hysteresis`` and
+``TimeToTrigger`` attributes of the ``A3RsrpHandoverAlgorithm`` class.
 
- - servingHandoverThreshold, if the RSRQ value measured by the UE in its
-   serving cell is less or equal to the servingHandoverThreshold parameter
-   (i.e. the conditions of the UE in the serving cell are getting bad or
-   not good enough), then the eNB considers this UE to hand it over to a new
-   neighbour eNB. The handover will eventually be triggered depending on the 
-   measurements of the neighbour cells.
 
- - neighbourHandoverOffset, if the UE is considered for handover, and
-   the difference between the best neighbour RSRQ 
-   and the RSRQ difference between the neighbor and the serving cell
-   is greater or equal to the neighbourHandoverOffset 
-   parameter, then the handover procedure is triggered for this UE.
+Neighbour Relation
+++++++++++++++++++
+
+LTE module supports a simplified *Automatic Neighbour Relation* (ANR) function.
+This is handled by the ``LteAnr`` class, which interacts with an eNodeB RRC
+instance through the ANR SAP interface.
+
+Neighbour Relation Table
+------------------------
+
+The ANR holds a *Neighbour Relation Table* (NRT), similar to the description in
+Section 22.3.2a of [TS36300]_. Each entry in the table is called a *Neighbour
+Relation* (NR) and represents a detected neighbouring cell, which contains the
+following boolean fields:
+
+ - `No Remove`
+     Indicates that the NR shall *not* be removed from the NRT. This is `true`
+     by default for user-provided NR and `false` otherwise.
+     
+ - `No X2`
+     Indicates that the NR shall *not* use an X2 interface in order to initiate
+     procedures towards the eNodeB parenting the target cell. This is `false` by
+     default for user-provided NR, and `true` otherwise.
+
+ - `No HO`
+     Indicates that the NR shall *not* be used by the eNodeB for handover
+     reasons. This is `true` in most cases, except when the NR is both
+     user-provided and network-detected.
+
+Each NR entry may have at least one of the following properties:
+
+ - User-provided
+     This type of NR is created as instructed by the simulation user. For
+     example, a NR is created automatically upon a user-initiated establishment
+     of X2 connection between 2 eNodeBs, e.g. as described in Section
+     :ref:`sec-x2-based-handover`. Another way to create a user-provided NR is
+     to call the ``AddNeighbourRelation`` function explicitly.
+
+ - Network-detected
+     This type of NR is automatically created during the simulation as a result
+     of the discovery of a nearby cell.
+
+In order to automatically create network-detected NR, ANR utilizes UE
+measurements. In other words, ANR is a consumer of UE measurements, as depicted
+in Figure :ref:`fig-ue-meas-consumer`. RSRQ and Event A4 (neighbour becomes
+better than `threshold`) are used for the reporting configuration. The default
+Event A4 `threshold` is set to the lowest possible, i.e., maximum detection
+capability, but can be changed by setting the ``Threshold`` attribute of
+``LteAnr`` class. Note that the A2-A4-RSRQ handover algorithm also utilizes a
+similar reporting configuration. Despite the similarity, when both ANR and this
+handover algorithm are active in the eNodeB, they use separate reporting
+configuration.
+
+Also note that automatic setup of X2 interface is not supported. This is the
+reason why the `No X2` and `No HO` fields are true in a network-detected but not
+user-detected NR.
+
+Role of ANR in Simulation
+-------------------------
+
+The ANR SAP interface provides the means of communication between ANR and eNodeB
+RRC. Some interface functions are used by eNodeB RRC to interact with the NRT,
+as shown below:
+
+ - ``AddNeighbourRelation``
+     (eNodeB RRC -> ANR) Add a new user-provided NR entry into the NRT.
+
+ - ``GetNoRemove``
+     (eNodeB RRC -> ANR) Get the value of `No Remove` field of an NR entry of
+     the given cell ID.
+     
+ - ``GetNoHo``
+     (eNodeB RRC -> ANR) Get the value of `No HO` field of an NR entry of
+     the given cell ID.
+
+ - ``GetNoX2``
+     (eNodeB RRC -> ANR) Get the value of `No X2` field of an NR entry of
+     the given cell ID.
+
+Other interface functions exist to support the role of ANR as a UE measurements
+consumer, as listed below:
+
+ - ``AddUeMeasReportConfigForAnr``
+     (ANR -> eNodeB RRC) Used by the ANR to request measurement reports from the
+     eNodeB RRC entity, by passing the desired reporting configuration. The
+     configuration will be applied to all future attached UEs.
+     
+ - ``ReportUeMeas``
+     (eNodeB RRC -> ANR) Based on the UE measurements configured earlier in
+     ``AddUeMeasReportConfigForAnr``, UE may submit measurement reports to the
+     eNodeB. The eNodeB RRC entity uses the ``ReportUeMeas`` interface to
+     forward these measurement reports to the ANR.
+
+Please refer to the corresponding API documentation for ``LteAnrSap`` class for
+more details on the usage and the required parameters.
+
+The ANR is utilized by the eNodeB RRC instance as a data structure to keep track
+of the situation of nearby neighbouring cells. The ANR also helps the eNodeB RRC
+instance to determine whether it is possible to execute a handover procedure to
+a neighbouring cell. This is realized by the fact that eNodeB RRC will only
+allow a handover procedure to happen if the NR entry of the target cell has both
+`No HO` and `No X2` fields set to `false`. 
+
+ANR is enabled by default in every eNodeB instance in the simulation. It can be
+disabled by setting the ``AnrEnabled`` attribute in ``LteHelper`` class to
+`false`.
 
 
 RRC sequence diagrams
@@ -2101,6 +2660,8 @@
 In this section we provide some sequence diagrams that explain the
 most important RRC procedures being modeled.
 
+.. _sec-rrc-connection-establishment:
+
 RRC connection establishment
 ----------------------------
 
@@ -2118,6 +2679,8 @@
 
 
 
+.. _sec-rrc-connection-reconfiguration:
+
 RRC connection reconfiguration
 ------------------------------
 
@@ -2351,9 +2914,9 @@
 
 
 
---------
+---
 NAS
---------
+---
 
 
 The focus of the LTE-EPC model is on the NAS Active state, which corresponds to EMM Registered, ECM connected, and RRC connected. Because of this, the following simplifications are made:
@@ -2472,9 +3035,9 @@
  #. it removes the GTP header and retrieves the TEID which is
     contained in it;
  #. leveraging on the one-to-one mapping between S1-U bearers and
-    Radio Bearers (which is a 3GPP requirement), it determines the Radio
-    Bearer ID (RBID) to which the packet belongs;
- #. it records the RBID in a dedicated tag called LteRadioBearerTag,
+    Radio Bearers (which is a 3GPP requirement), it determines the 
+    Bearer ID (BID) to which the packet belongs;
+ #. it records the BID in a dedicated tag called EpsBearerTag,
     which is added to the packet; 
  #. it forwards the packet to the LteEnbNetDevice of the eNB node via
     a raw packet socket
@@ -2483,7 +3046,7 @@
 end-to-end IP header, since the IP/UDP/GTP headers of the S1 protocol
 stack have already been stripped. Upon reception of
 the packet from the EpcEnbApplication, the LteEnbNetDevice will
-retrieve the RBID from the LteRadioBearerTag, and based on the RBID
+retrieve the BID from the EpsBearerTag, and based on the BID
 will determine the Radio Bearer instance (and the corresponding PDCP
 and RLC protocol instances) which are then used to forward the packet
 to the UE over the LTE radio interface. Finally, the LteUeNetDevice of
@@ -2515,15 +3078,15 @@
 
 The eNB receives the packet via its LteEnbNetDevice. Since there is a
 single PDCP and RLC protocol instance for each Radio Bearer, the
-LteEnbNetDevice is able to determine the RBID of the packet. This RBID
-is then recorded onto an LteRadioBearerTag, which is added to the
+LteEnbNetDevice is able to determine the BID of the packet. This BID
+is then recorded onto an EpsBearerTag, which is added to the
 packet. The LteEnbNetDevice then forwards the packet to the
 EpcEnbApplication via a raw packet socket.
 
 Upon receiving the packet, the EpcEnbApplication performs the
 following operations:
 
- #. it retrieves the RBID from the LteRadioBearerTag in the packet;
+ #. it retrieves the BID from the EpsBearerTag in the packet;
  #. it determines the corresponding EPS Bearer instance and GTP-U TEID by
     leveraging on the one-to-one mapping between S1-U bearers and Radio
     Bearers;
@@ -2580,7 +3143,7 @@
 
 
 
-
+.. _sec-x2:
 
 ---
 X2 
@@ -2597,8 +3160,7 @@
 
 For a representation of how the X2 interface fits in the overall
 architecture of the LENA simulation model, the reader is referred to
-the figure :ref:`overall-architecture`.
-
+the figure :ref:`fig-epc-topology`.
 
 The X2 interface implemented in the simulator provides detailed implementation of the following elementary procedures of the Mobility Management functionality [TS36423]_:
 
@@ -2617,16 +3179,30 @@
 in particular, *lossless handover* as described in Section 2.6.3.2 of
 [Sesia2009]_ is not supported at the time of this writing.
 
-Figure :ref:`fig-x2-based-handover-seq-diagram` shows the interaction of the entities of the X2 model in the simulator.
+Figure :ref:`fig-x2-based-handover-seq-diagram` below shows the interaction of
+the entities of the X2 model in the simulator. The shaded labels indicate the
+moments when the UE or eNodeB transition to another RRC state.
 
 .. _fig-x2-based-handover-seq-diagram:
 
 .. figure:: figures/lte-epc-x2-handover-seq-diagram.*
-    :width: 700px
-    :align: center
+   :scale: 80 %
+   :align: center
 
-    Sequence diagram of the X2-based handover
+   Sequence diagram of the X2-based handover
 
+The figure also shows two timers within the handover procedure: the *handover
+leaving timer* is maintained by the source eNodeB, while the *handover joining
+timer* by the target eNodeB. The duration of the timers can be configured in
+the ``HandoverLeavingTimeoutDuration`` and ``HandoverJoiningTimeoutDuration``
+attributes of the respective ``LteEnbRrc`` instances. When one of these timers
+expire, the handover procedure is considered as failed.
+
+However, there is no proper handling of handover failure in the current version
+of LTE module. Users should tune the simulation properly in order to avoid
+handover failure, otherwise unexpected behaviour may occur. Please refer to
+Section :ref:`sec-tuning-handover-simulation` of the User Documentation for some
+tips regarding this matter.
 
 The X2 model is an entity that uses services from:
 
@@ -2833,9 +3409,9 @@
 
 
 
------------------
+---
 S11
------------------
+---
 
 The S11 interface provides control plane interaction between the SGW
 and the MME using the GTPv2-C protocol specified in [TS29274]_. In the
@@ -2875,19 +3451,23 @@
 various components. These objects are:
 
 
- * LteHelper, which takes care of the configuration of the LTE radio
+ * ``LteHelper``, which takes care of the configuration of the LTE radio
    access network, as well as of coordinating the setup and release of
-   EPS bearers 
- * EpcHelper, which takes care of the configuratio of the Evolved
-   Packet Core
+   EPS bearers. The ``LteHelper`` class provides both the API
+   definition and its implementation.  
+ * ``EpcHelper``, which takes care of the configuration of the Evolved
+   Packet Core. The ``EpcHelper`` class is an abstract base class
+   which only provides the API definition; the implementation is delegated
+   to child classes in order to allow for different EPC network
+   models.
 
 It is possible to create a simple LTE-only simulations by
-using LteHelper alone, or to create complete LTE-EPC simulations by
-using both LteHelper and EpcHelper. When both helpers are used, they
-interact in a master-slave fashion, with LteHelper being the Master
-that interacts directly with the user program, and EpcHelper working
+using ``LteHelper`` alone, or to create complete LTE-EPC simulations by
+using both ``LteHelper`` and ``EpcHelper``. When both helpers are used, they
+interact in a master-slave fashion, with ``LteHelper`` being the Master
+that interacts directly with the user program, and ``EpcHelper`` working
 "under the hood" to configure the EPC upon explicit methods called by
-LteHelper. The exact interactions are displayed in the Figure :ref:`fig-helpers`.
+``LteHelper``. The exact interactions are displayed in the Figure :ref:`fig-helpers`.
 
 .. _fig-helpers:
    
diff -Naur ns-3.18.1/src/lte/doc/source/lte-references.rst ns-3.19/src/lte/doc/source/lte-references.rst
--- ns-3.18.1/src/lte/doc/source/lte-references.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/lte-references.rst	2013-12-20 09:44:51.000000000 -0800
@@ -20,11 +20,11 @@
 
 .. [TS36213] 3GPP TS 36.213 "E-UTRA Physical layer procedures"
 
-.. [TS36214] 3GPP TS 36.213 "E-UTRA Physical layer – Measurements"
+.. [TS36214] 3GPP TS 36.214 "E-UTRA Physical layer – Measurements"
 
 .. [TS36300] 3GPP TS 36.300 "E-UTRA and E-UTRAN; Overall description; Stage 2"
 
-.. [TS36304] 3GPP TS 36.104 "E-UTRA User Equipment (UE) procedures in idle mode"
+.. [TS36304] 3GPP TS 36.304 "E-UTRA User Equipment (UE) procedures in idle mode"
 
 .. [TS36321] 3GPP TS 36.321 "E-UTRA Medium Access Control (MAC) protocol specification"
 
@@ -40,34 +40,39 @@
 
 .. [TS36423] 3GPP TS 36.423 "E-UTRAN X2 application protocol (X2AP)"
 
+.. [TR36814] 3GPP TR 36.814 "E-UTRA Further advancements for E-UTRA physical layer aspects"
 
-.. [R1-081483] 3GPP R1-081483 `Conveying MCS and TB size via PDCCH <http://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_52b/Docs/R1-081483.zip>`_
-
-.. [R4-092042] 3GPP R4-092042 "Simulation assumptions and parameters for FDD HeNB RF requirements"
+.. [R1-081483] 3GPP R1-081483 `"Conveying MCS and TB size via PDCCH"
+   <http://www.3gpp.org/ftp/tsg_ran/WG1_RL1/TSGR1_52b/Docs/R1-081483.zip>`_
 
-.. [TR36814] 3GPP TR 36.814 "E-UTRA Further advancements for E-UTRA physical layer aspects"
+.. [R4-092042] 3GPP R4-092042 `"Simulation assumptions and parameters for FDD HeNB RF requirements"
+   <http://www.3gpp.org/ftp/tsg_ran/wg4_radio/TSGR4_51/Documents/R4-092042.zip>`_
 
-.. [FFAPI] `FemtoForum LTE MAC Scheduler Interface Specification v1.11 <http://www.femtoforum.org/femto/technical.php>`_
+.. [FFAPI] FemtoForum `"LTE MAC Scheduler Interface Specification v1.11"
+   <http://www.smallcellforum.org/smallcellforum_resources/pdfsend05.php?file=LTE%20MAC%20Scheduler%20Interface%20Specification.pdf>`_
 
-.. [ns3tutorial] `The ns-3 Tutorial <http://www.nsnam.org/docs/tutorial/singlehtml/index.html>`_
+.. [ns3tutorial] `"The ns-3 Tutorial"
+   <http://www.nsnam.org/docs/tutorial/singlehtml/index.html>`_
 
-.. [ns3manual] `The ns-3 Manual <http://www.nsnam.org/docs/manual/singlehtml/index.html>`_
+.. [ns3manual] `"The ns-3 Manual"
+   <http://www.nsnam.org/docs/manual/singlehtml/index.html>`_
 
-.. [Sesia2009] S. Sesia, I. Toufik and M. Baker, "LTE - The UMTS Long Term Evolution - from theory to practice", 
+.. [Sesia2009] S. Sesia, I. Toufik and M. Baker,
+   "LTE - The UMTS Long Term Evolution - from theory to practice",
    Wiley, 2009
 
 .. [Baldo2009] N. Baldo and M. Miozzo, "Spectrum-aware Channel and PHY layer modeling for ns3", 
-   Proceedings of ICST NSTools 2009, Pisa, Italy. 
+   Proceedings of ICST NSTools 2009, Pisa, Italy
 
-.. [Piro2010] Giuseppe Piro, Luigi Alfredo Grieco, Gennaro Boggia, and Pietro Camarda, A Two-level 
-   Scheduling Algorithm for QoS Support in the Downlink of LTE Cellular Networks", Proc. of 
-   European Wireless, EW2010, Lucca, Italy, Apr., 2010 
+.. [Piro2010] Giuseppe Piro, Luigi Alfredo Grieco, Gennaro Boggia, and Pietro Camarda,
+   "A Two-level Scheduling Algorithm for QoS Support in the Downlink of LTE Cellular Networks",
+   Proc. of European Wireless, EW2010, Lucca, Italy, Apr., 2010 
 
 .. [Holtzman2000] J.M. Holtzman, "CDMA forward link waterfilling power control", 
    in Proc. of IEEE VTC Spring, 2000.
 
 .. [Piro2011] G. Piro, N. Baldo. M. Miozzo, "An LTE module for the ns-3 network simulator", 
-    in Proc. of Wns3 2011 (in conjunction with SimuTOOLS 2011), March 2011, Barcelona (Spain)
+   in Proc. of Wns3 2011 (in conjunction with SimuTOOLS 2011), March 2011, Barcelona (Spain)
 
 .. [Seo2004] H. Seo, B. G. Lee. "A proportional-fair power allocation scheme for fair and efficient multiuser OFDM systems", 
    in Proc. of IEEE GLOBECOM, December 2004. Dallas (USA)
@@ -76,40 +81,65 @@
    competition and proposals for the award of 800 MHz and 2.6 GHz
    spectrum and related issues", March 2011 
 
-.. [RealWireless] RealWireless, Low-power shared access to spectrum
-   for mobile broadband,  Final Report, Ofcom Project MC/073, 18th
+.. [RealWireless] RealWireless, "Low-power shared access to spectrum
+   for mobile broadband",  Final Report, Ofcom Project MC/073, 18th
    March 2011 
 
-.. [PaduaPEM] http://mailman.isi.edu/pipermail/ns-developers/2011-November/009559.html
+.. [PaduaPEM] `"Ns-developers - LTE error model contribution"
+   <http://mailman.isi.edu/pipermail/ns-developers/2011-November/009559.html>`_
 
-.. [ViennaLteSim] The Vienna LTE Simulators http://www.nt.tuwien.ac.at/about-us/staff/josep-colom-ikuno/lte-simulators/
+.. [ViennaLteSim] `"The Vienna LTE Simulators"
+   <http://www.nt.tuwien.ac.at/about-us/staff/josep-colom-ikuno/lte-simulators/>`_
 
-.. [LozanoCost] Joan Olmos, Silvia Ruiz, Mario García-Lozano and David Martín-Sacristán, "Link Abstraction Models Based on Mutual Information for LTE Downlink", COST 2100 TD(10)11052 Report
+.. [LozanoCost] Joan Olmos, Silvia Ruiz, Mario García-Lozano and David Martín-Sacristán,
+   "Link Abstraction Models Based on Mutual Information for LTE Downlink",
+   COST 2100 TD(10)11052 Report
 
-.. [wimaxEmd] WiMAX Forum White Paper, WiMAX System Evaluation Methodology, July 2008.
+.. [wimaxEmd] WiMAX Forum White Paper, "WiMAX System Evaluation Methodology", July 2008.
 
-.. [mathworks] Matlab R2011b Documentation Communications System Toolbox, `Methodology for Simulating Multipath Fading Channels <http://www.mathworks.es/help/toolbox/comm/ug/a1069449399.html#bq5zk36>`_
+.. [mathworks] Matlab R2011b Documentation Communications System Toolbox,
+   `"Methodology for Simulating Multipath Fading Channels"
+   <http://www.mathworks.es/help/toolbox/comm/ug/a1069449399.html#bq5zk36>`_
 
-.. [CatreuxMIMO] S. Catreux, L.J. Greenstein, V. Erceg, "Some results and insights on the performance gains of MIMO systems," Selected Areas in Communications, IEEE Journal on , vol.21, no.5, pp. 839- 847, June 2003
+.. [CatreuxMIMO] S. Catreux, L.J. Greenstein, V. Erceg,
+   "Some results and insights on the performance gains of MIMO systems,"
+   Selected Areas in Communications, IEEE Journal on , vol.21, no.5, pp. 839- 847, June 2003
 
-.. [Ikuno2010] J.C. Ikuno, M. Wrulich, M. Rupp, "System Level Simulation of LTE Networks," Vehicular Technology Conference (VTC 2010-Spring), 2010 IEEE 71st , vol., no., pp.1-5, 16-19 May 2010
+.. [Ikuno2010] J.C. Ikuno, M. Wrulich, M. Rupp, "System Level Simulation of LTE Networks,"
+   Vehicular Technology Conference (VTC 2010-Spring), 2010 IEEE 71st , vol., no., pp.1-5, 16-19 May 2010
 
-
-.. [Milos2012] J. Milos, "Performace Analysis Of PCFICH LTE Control Channel", Proceedings of the 19th Conference STUDENT EEICT 2012, Brno, CZ, 2012.
+.. [Milos2012] J. Milos, "Performance Analysis Of PCFICH LTE Control Channel",
+   Proceedings of the 19th Conference STUDENT EEICT 2012, Brno, CZ, 2012.
 
 .. [FujitsuWhitePaper] "Enhancing LTE Cell-Edge Performance via PDCCH ICIC".
 
-
-.. [Bharucha2011] Z. Bharucha, G. Auer, T. Abe, N. Miki, "Femto-to-Macro Control Channel Interference Mitigation via Cell ID Manipulation in LTE," Vehicular Technology Conference (VTC Fall), 2011 IEEE , vol., no., pp.1-6, 5-8 Sept. 2011
-
-.. [R4-081920] 3GPP R4-081920 `LTE PDCCH/PCFICH Demodulation Performance Results with Implementation Margin
- <http://www.3gpp.org/ftp/tsg_ran/wg4_radio/TSGR4_48/Documents/R4-081920.zip>`_
-
-.. [FCapo2012] F.Capozzi, G.Piro L.A.Grieco, G.Boggia, P.Camarda, "Downlink Packet Scheduling in LTE Cellular Networks: Key Design Issues and a Survey", IEEE Comm. Surveys and Tutorials, vol.2012, no.99, pp.1-23, Jun. 2012
-
-.. [FABokhari2009] F.A. Bokhari, H. Yanikomeroglu, W.K. Wong, M. Rahman, "Cross-Layer Resource Scheduling for Video Traffic in the Downlink of OFDMA-Based Wireless 4G Networks",EURASIP J. Wirel. Commun. Netw., vol.2009, no.3, pp. 1-10, Jan. 2009. 
-
-.. [WKWong2004] W.K. Wong, H.Y. Tang, V.C.M, Leung, "Token bank fair queuing: a new scheduling algorithm for wireless multimedia services", Int. J. Commun. Syst., vol.17, no.6, pp.591-614, Aug.2004. 
-
-.. [GMonghal2008] G.Mongha, K.I. Pedersen, I.Z. Kovacs, P.E. Mogensen, " QoS Oriented Time and Frequency Domain Packet Schedulers for The UTRAN Long Term Evolution", In Proc. IEEE VTC, 2008.
-
+.. [Bharucha2011] Z. Bharucha, G. Auer, T. Abe, N. Miki,
+   "Femto-to-Macro Control Channel Interference Mitigation via Cell ID Manipulation in LTE,"
+   Vehicular Technology Conference (VTC Fall), 2011 IEEE , vol., no., pp.1-6, 5-8 Sept. 2011
+
+.. [R4-081920] 3GPP R4-081920 `"LTE PDCCH/PCFICH Demodulation Performance Results with Implementation Margin"
+   <http://www.3gpp.org/ftp/tsg_ran/wg4_radio/TSGR4_48/Documents/R4-081920.zip>`_
+
+.. [FCapo2012] F.Capozzi, G.Piro, L.A. Grieco, G.Boggia, P.Camarda,
+   "Downlink Packet Scheduling in LTE Cellular Networks: Key Design Issues and a Survey",
+   IEEE Comm. Surveys and Tutorials, vol.2012, no.99, pp.1-23, Jun. 2012
+
+.. [FABokhari2009] F.A. Bokhari, H. Yanikomeroglu, W.K. Wong, M. Rahman,
+   "Cross-Layer Resource Scheduling for Video Traffic in the Downlink of OFDMA-Based Wireless 4G Networks",
+   EURASIP J. Wirel. Commun. Netw., vol.2009, no.3, pp. 1-10, Jan. 2009. 
+
+.. [WKWong2004] W.K. Wong, H.Y. Tang, V.C.M, Leung,
+   "Token bank fair queuing: a new scheduling algorithm for wireless multimedia services",
+   Int. J. Commun. Syst., vol.17, no.6, pp.591-614, Aug.2004. 
+
+.. [GMonghal2008] G. Mongha, K.I. Pedersen, I.Z. Kovacs, P.E. Mogensen,
+   "QoS Oriented Time and Frequency Domain Packet Schedulers for The UTRAN Long Term Evolution",
+   In Proc. IEEE VTC, 2008.
+
+.. [Dimou2009] K. Dimou, M. Wang, Y. Yang, M. Kazmi, A. Larmo, J. Pettersson, W. Muller, Y. Timner,
+   "Handover within 3GPP LTE: Design Principles and Performance",
+   Vehicular Technology Conference Fall (VTC 2009-Fall), 2009 IEEE 70th, pp.1-5, 20-23 Sept. 2009
+
+.. [Lee2010] Y.J. Lee, B.J. Shin, J.C. Lim, D.H. Hong,
+   "Effects of time-to-trigger parameter on handover performance in SON-based LTE systems",
+   Communications (APCC), 2010 16th Asia-Pacific Conference on, pp.492-496, Oct. 31 2010--Nov. 3 2010
diff -Naur ns-3.18.1/src/lte/doc/source/lte-testing.rst ns-3.19/src/lte/doc/source/lte-testing.rst
--- ns-3.18.1/src/lte/doc/source/lte-testing.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/lte-testing.rst	2013-12-20 09:44:51.000000000 -0800
@@ -1,9 +1,10 @@
 .. include:: replace.txt
+.. highlight:: bash
 
 
-+++++++++++++++++++++++++++
- Testing Documentation
-+++++++++++++++++++++++++++
++++++++++++++++++++++
+Testing Documentation
++++++++++++++++++++++
 
 
 Overview
@@ -12,20 +13,20 @@
 To test and validate the ns-3 LTE module, several test suites are provided which are integrated with the ns-3 test framework.
 To run them, you need to have configured the build of the simulator in this way::
 
-    ./waf configure --enable-tests --enable-modules=lte --enable-examples
-    ./test.py
+    $ ./waf configure --enable-tests --enable-modules=lte --enable-examples
+    $ ./test.py
 
 The above will run not only the test suites belonging to the LTE module, but also those belonging to all the other ns-3 modules on which the LTE module depends. See the ns-3 manual for generic information on the testing framework.
 
 You can get a more detailed report in HTML format in this way::
 
-    ./test.py -w results.html
+    $ ./test.py -w results.html
 
 After the above command has run, you can view the detailed result for each test by opening the file ``results.html`` with a web browser. 
 
 You can run each test suite separately using this command::
 
-    ./test.py -s test-suite-name
+    $ ./test.py -s test-suite-name
 
 For more details about ``test.py`` and the ns-3 testing framework, please refer to the ns-3 manual.
 
@@ -161,7 +162,7 @@
 Inter-cell Interference Tests
 -----------------------------
 
-The test suite `lte-interference`` provides system tests recreating an
+The test suite `lte-interference` provides system tests recreating an
 inter-cell interference scenario with two eNBs, each having a single
 UE attached to it and employing Adaptive Modulation and Coding both in
 the downlink and in the uplink. The topology of the scenario
@@ -195,16 +196,247 @@
 
 
 UE Measurements Tests
------------------------------
+---------------------
 
-The test suite `lte-ue-measurements`` provides system tests recreating an
-inter-cell interference scenario identical of the one defined for `lte-interference`` test-suite. However, in this test the quantities to be tested are represented by RSRP and RSRQ measurements performed by the UE in two different points of the stack: the source, which is UE PHY layer, and the destination, that is the eNB RRC.
+The test suite `lte-ue-measurements` provides system tests recreating an
+inter-cell interference scenario identical of the one defined for
+`lte-interference` test-suite. However, in this test the quantities to be
+tested are represented by RSRP and RSRQ measurements performed by the UE in two
+different points of the stack: the source, which is UE PHY layer, and the
+destination, that is the eNB RRC.
+
+The test vectors are obtained by the use of a dedicated octave script (available
+in `src/lte/test/reference/lte-ue-measurements.m`), which does the link budget
+calculations (including interference) corresponding to the topology of each
+test case, and outputs the resulting RSRP and RSRQ. The obtained values are then
+used for checking the correctness of the UE Measurements at PHY layer. After
+that, they have to be converted according to 3GPP formatting for the purpose of
+checking their correctness at eNB RRC level.
 
-The test vectors are obtained by use of a dedicated octave script
-(available in
-`src/lte/test/reference/lte-ue-measurements.m`), which does
-the link budget calculations (including interference) corresponding to the topology of each
-test case, and outputs the resulting RSRP and RSRQ. The obtained values are then used for checking the correctness of the UE Measurements at PHY layer, while they have to converted according to 3GPP formatting for checking they correctness at eNB RRC level.
+
+
+UE measurement configuration tests
+----------------------------------
+
+Besides the previously mentioned test suite, there are 3 other test suites for
+testing UE measurements: `lte-ue-measurements-piecewise-1`,
+`lte-ue-measurements-piecewise-2`, and `lte-ue-measurements-handover`. These
+test suites are more focused on the reporting trigger procedure, i.e. the
+correctness of the implementation of the event-based triggering criteria is
+verified here.
+
+In more specific, the tests verify the *timing* and the *content* of each
+measurement reports received by eNodeB. Each test case is an stand-alone LTE
+simulation and the test case will pass if measurement report(s) only occurs at
+the prescribed time and shows the correct level of RSRP (RSRQ is not verified at
+the moment).
+
+
+Piecewise configuration
+#######################
+
+The piecewise configuration aims to test a particular UE measurements
+configuration. The simulation script will setup the corresponding measurements
+configuration to the UE, which will be active throughout the simulation.
+
+Since the reference values are precalculated by hands, several assumptions are
+made to simplify the simulation. Firstly, the channel is only affected by path
+loss model (in this case, Friis model is used). Secondly, the ideal RRC protocol
+is used, and layer 3 filtering is disabled. Finally, the UE moves in a
+predefined motion pattern between 4 distinct spots, as depicted in Figure
+:ref:`fig-ue-meas-piecewise-motion` below. Therefore the fluctuation of the
+measured RSRP can be determined more easily.
+
+.. _fig-ue-meas-piecewise-motion:
+   
+.. figure:: figures/ue-meas-piecewise-motion.*
+   :scale: 80 %
+   :align: center
+
+   UE movement trace throughout the simulation in piecewise configuration
+
+The motivation behind the *"teleport"* between the predefined spots is to
+introduce drastic change of RSRP level, which will guarantee the triggering of
+entering or leaving condition of the tested event. By performing drastic
+changes, the test can be run within shorter amount of time.
+
+Figure :ref:`fig-ue-meas-piecewise-a1` below shows the measured RSRP after
+layer 1 filtering by the PHY layer during the simulation with a piecewise
+configuration. Because layer 3 filtering is disabled, these are the exact values
+used by the UE RRC instance to evaluate reporting trigger procedure. Notice that
+the values are refreshed every 200 ms, which is the default filtering period of
+PHY layer measurements report. The figure also shows the time when entering and
+leaving conditions of an example instance of Event A1 (serving cell becomes
+better than threshold) occur during the simulation.
+
+.. _fig-ue-meas-piecewise-a1:
+   
+.. figure:: figures/ue-meas-piecewise-a1.*
+   :scale: 80 %
+   :align: center
+
+   Measured RSRP trace of an example Event A1 test case in piecewise
+   configuration
+
+Each reporting criterion is tested several times with different threshold/offset
+parameters. Some test scenarios also take hysteresis and time-to-trigger into
+account. Figure :ref:`fig-ue-meas-piecewise-a1-hys` depicts the effect of
+hysteresis in another example of Event A1 test.
+
+.. _fig-ue-meas-piecewise-a1-hys:
+   
+.. figure:: figures/ue-meas-piecewise-a1-hys.*
+   :scale: 80 %
+   :align: center
+
+   Measured RSRP trace of an example Event A1 with hysteresis test case in
+   piecewise configuration
+
+Piecewise configuration is used in two test suites of UE measurements. The first
+one is `lte-ue-measurements-piecewise-1`, henceforth Piecewise test #1, which
+simulates 1 UE and 1 eNodeB. The other one is `lte-ue-measurements-piecewise-2`,
+which has 1 UE and 2 eNodeBs in the simulation.
+
+Piecewise test #1 is intended to test the event-based criteria which are not
+dependent on the existence of a neighbouring cell. These criteria include Event
+A1 and A2. The other events are also briefly tested to verify that they are
+still working correctly (albeit not reporting anything) in the absence of any
+neighbouring cell. Table :ref:`tab-ue-meas-piecewise-1` below lists the
+scenarios tested in piecewise test #1. 
+
+.. _tab-ue-meas-piecewise-1:
+
+.. table:: UE measurements test scenarios using piecewise configuration #1
+
+   ====== ================== ================ ========== ===============
+   Test # Reporting Criteria Threshold/Offset Hysteresis Time-to-Trigger
+   ====== ================== ================ ========== ===============
+   1      Event A1           Low              No         No
+   2      Event A1           Normal           No         No
+   3      Event A1           Normal           No         Short
+   4      Event A1           Normal           No         Long
+   5      Event A1           Normal           No         Super
+   6      Event A1           Normal           Yes        No
+   7      Event A1           High             No         No
+   8      Event A2           Low              No         No
+   9      Event A2           Normal           No         No
+   10     Event A2           Normal           No         Short
+   11     Event A2           Normal           No         Long
+   12     Event A2           Normal           No         Super
+   13     Event A2           Normal           Yes        No
+   14     Event A2           High             No         No
+   15     Event A3           Zero             No         No
+   16     Event A4           Normal           No         No
+   17     Event A5           Normal-Normal    No         No
+   ====== ================== ================ ========== ===============
+
+Other events such as Event A3, A4, and A5 depend on measurements of neighbouring
+cell, so they are more thoroughly tested in Piecewise test #2. The simulation
+places the nodes on a straight line and instruct the UE to *"jump"* in a similar
+manner as in Piecewise test #1. Handover is disabled in the simulation, so the
+role of serving and neighbouring cells do not switch during the simulation.
+Table :ref:`tab-ue-meas-piecewise-2` below lists the scenarios tested in
+Piecewise test #2.
+
+.. _tab-ue-meas-piecewise-2:
+
+.. table:: UE measurements test scenarios using piecewise configuration #2
+
+   ====== ================== ================ ========== ===============
+   Test # Reporting Criteria Threshold/Offset Hysteresis Time-to-Trigger
+   ====== ================== ================ ========== ===============
+   1      Event A1           Low              No         No
+   2      Event A1           Normal           No         No
+   3      Event A1           Normal           Yes        No
+   4      Event A1           High             No         No
+   5      Event A2           Low              No         No
+   6      Event A2           Normal           No         No
+   7      Event A2           Normal           Yes        No
+   8      Event A2           High             No         No
+   9      Event A3           Positive         No         No
+   10     Event A3           Zero             No         No
+   11     Event A3           Zero             No         Short
+   12     Event A3           Zero             No         Super
+   13     Event A3           Zero             Yes        No
+   14     Event A3           Negative         No         No
+   15     Event A4           Low              No         No
+   16     Event A4           Normal           No         No
+   17     Event A4           Normal           No         Short
+   18     Event A4           Normal           No         Super
+   19     Event A4           Normal           Yes        No
+   20     Event A4           High             No         No
+   21     Event A5           Low-Low          No         No
+   22     Event A5           Low-Normal       No         No
+   23     Event A5           Low-High         No         No
+   24     Event A5           Normal-Low       No         No
+   25     Event A5           Normal-Normal    No         No
+   26     Event A5           Normal-Normal    No         Short
+   27     Event A5           Normal-Normal    No         Super
+   28     Event A5           Normal-Normal    Yes        No
+   29     Event A5           Normal-High      No         No
+   30     Event A5           High-Low         No         No
+   31     Event A5           High-Normal      No         No
+   32     Event A5           High-High        No         No
+   ====== ================== ================ ========== ===============
+
+One note about the tests with time-to-trigger, they are tested using 3 different
+values of time-to-trigger: *short* (shorter than report interval), *long*
+(shorter than the filter measurement period of 200 ms), and *super* (longer than
+200 ms). The first two ensure that time-to-trigger evaluation always use the
+latest measurement reports received from PHY layer. While the last one is
+responsible for verifying time-to-trigger cancellation, for example when a
+measurement report from PHY shows that the entering/leaving condition is no
+longer true before the first trigger is fired.
+
+Handover configuration
+######################
+
+The purpose of the handover configuration is to verify whether UE measurement
+configuration is updated properly after a succesful handover takes place. For
+this purpose, the simulation will construct 2 eNodeBs with different UE
+measurement configuration, and the UE will perform handover from one cell to
+another. The UE will be located on a straight line between the 2 eNodeBs, and
+the handover will be invoked manually. The duration of each simulation is
+2 seconds (except the last test case) and the handover is triggered exactly at
+halfway of simulation.
+
+The `lte-ue-measurements-handover` test suite covers various types of
+configuration differences. The first one is the difference in report interval,
+e.g. the first eNodeB is configured with 480 ms report interval, while the
+second eNodeB is configured with 240 ms report interval. Therefore, when the UE
+performed handover to the second cell, the new report interval must take effect.
+As in piecewise configuration, the timing and the content of each measurement
+report received by the eNodeB will be verified.
+
+Other types of differences covered by the test suite are differences in event
+and differences in threshold/offset. Table :ref:`tab-ue-meas-handover` below
+lists the tested scenarios. 
+
+.. _tab-ue-meas-handover:
+
+.. table:: UE measurements test scenarios using handover configuration
+
+   ====== ================ =========================== ===========================
+   Test # Test Subject     Initial Configuration       Post-Handover Configuration
+   ====== ================ =========================== ===========================
+   1      Report interval  480 ms                      240 ms
+   2      Report interval  120 ms                      640 ms
+   3      Event            Event A1                    Event A2
+   4      Event            Event A2                    Event A1
+   5      Event            Event A3                    Event A4
+   6      Event            Event A4                    Event A3
+   7      Event            Event A2                    Event A3
+   8      Event            Event A3                    Event A2
+   9      Event            Event A4                    Event A5
+   10     Event            Event A5                    Event A4
+   11     Threshold/offset RSRP range 52 (Event A1)    RSRP range 56 (Event A1)
+   12     Threshold/offset RSRP range 52 (Event A2)    RSRP range 56 (Event A2)
+   13     Threshold/offset A3 offset -30 (Event A3)    A3 offset +30 (Event A3)
+   14     Threshold/offset RSRP range 52 (Event A4)    RSRP range 56 (Event A4)
+   15     Threshold/offset RSRP range 52-52 (Event A5) RSRP range 56-56 (Event A5)
+   16     Time-to-trigger  1024 ms                     100 ms
+   17     Time-to-trigger  1024 ms                     640 ms
+   ====== ================ =========================== ===========================
 
 
 
@@ -573,24 +805,52 @@
 --------------------
 
 
-The test suite ``lte-phy-error-model`` generates different test cases for evaluating both data and control error models. For what concern the data, the test consists of nine test cases with single eNB and a various number of UEs, all having the same Radio Bearer specification. Each test is designed for evaluating the error rate perceived by a specific TB size in order to verify that it corresponds to the expected values according to the BLER generated for CB size analog to the TB size. This means that, for instance, the test will check that the performance of a TB of :math:`N` bits is analogous to the one of a a CB size of :math:`N` bits by collecting the performance of a user which has been forced the generation of a such TB size according to the distance to eNB. In order to significantly test the BLER at MAC level, we configured the Adaptive Modulation and Coding (AMC) module, the ``LteAmc`` class, for making it less robust to channel conditions by using the PiroEW2010 AMC model and configuring it to select the MCS considering a target BER of 0.03 (instead of the default value of 0.00005). We note that these values do not reflect the actual BER, since they come from an analytical bound which does not consider all the transmission chain aspects; therefore the BER and BLER actually experienced at the reception of a TB is in general different. 
-
-The parameters of the nine test cases are reported in the following:
-
- #. 4 UEs placed 1800 meters far from the eNB, which implies the use of MCS 2 (SINR of -5.51 dB) and a TB of 256 bits, that in turns produce a BLER of 0.33 (see point A in figure :ref:`fig-mcs-2-test`).
- #. 2 UEs placed 1800 meters far from the eNB, which implies the use of MCS 2 (SINR of -5.51 dB) and a TB of 528 bits, that in turns produce a BLER of 0.11 (see point B in figure :ref:`fig-mcs-2-test`).
- #. 1 UE placed 1800 meters far from the eNB, which implies the use of MCS 2 (SINR of -5.51 dB) and a TB of 1088 bits, that in turns produce a BLER of 0.02 (see point C in figure :ref:`fig-mcs-2-test`).
- #. 1 UE placed 600 meters far from the eNB, which implies the use of MCS 12 (SINR of 4.43 dB) and a TB of 4800 bits, that in turns produce a BLER of 0.3 (see point D in figure :ref:`fig-mcs-12-test`).
- #. 3 UEs placed 600 meters far from the eNB, which implies the use of MCS 12 (SINR of 4.43 dB) and a TB of 1632 bits, that in turns produce a BLER of 0.55 (see point E in figure :ref:`fig-mcs-12-test`).
- #. 1 UE placed 470 meters far from the eNB, which implies the use of MCS 16 (SINR of 8.48 dB) and a TB of 7272 bits (segmented in 2 CBs of 3648 and 3584 bits), that in turns produce a BLER of 0.14, since each CB has CBLER equal to 0.075 (see point F in figure :ref:`fig-mcs-14-test`).
-
+The test suite ``lte-phy-error-model`` generates different test cases for
+evaluating both data and control error models. For what concern the data, the
+test consists of six test cases with single eNB and a various number of UEs,
+all having the same Radio Bearer specification. Each test is designed for
+evaluating the error rate perceived by a specific TB size in order to verify
+that it corresponds to the expected values according to the BLER generated for
+CB size analog to the TB size. This means that, for instance, the test will
+check that the performance of a TB of :math:`N` bits is analogous to the one of
+a CB size of :math:`N` bits by collecting the performance of a user which has
+been forced the generation of a such TB size according to the distance to eNB.
+In order to significantly test the BLER at MAC level, we configured the Adaptive
+Modulation and Coding (AMC) module, the ``LteAmc`` class, for making it less
+robust to channel conditions by using the PiroEW2010 AMC model and configuring
+it to select the MCS considering a target BER of 0.03 (instead of the default
+value of 0.00005). We note that these values do not reflect the actual BER,
+since they come from an analytical bound which does not consider all the
+transmission chain aspects; therefore the BER and BLER actually experienced at
+the reception of a TB is in general different.
+
+The parameters of the six test cases are reported in the following:
+
+#. 4 UEs placed 1800 meters far from the eNB, which implies the use of MCS 2
+   (SINR of -5.51 dB) and a TB of 256 bits, that in turns produce a BLER of 0.33
+   (see point A in figure :ref:`fig-mcs-2-test`).
+#. 2 UEs placed 1800 meters far from the eNB, which implies the use of MCS 2
+   (SINR of -5.51 dB) and a TB of 528 bits, that in turns produce a BLER of 0.11
+   (see point B in figure :ref:`fig-mcs-2-test`).
+#. 1 UE placed 1800 meters far from the eNB, which implies the use of MCS 2
+   (SINR of -5.51 dB) and a TB of 1088 bits, that in turns produce a BLER of
+   0.02 (see point C in figure :ref:`fig-mcs-2-test`).
+#. 1 UE placed 600 meters far from the eNB, which implies the use of MCS 12
+   (SINR of 4.43 dB) and a TB of 4800 bits, that in turns produce a BLER of 0.3
+   (see point D in figure :ref:`fig-mcs-12-test`).
+#. 3 UEs placed 600 meters far from the eNB, which implies the use of MCS 12
+   (SINR of 4.43 dB) and a TB of 1632 bits, that in turns produce a BLER of 0.55
+   (see point E in figure :ref:`fig-mcs-12-test`).
+#. 1 UE placed 470 meters far from the eNB, which implies the use of MCS 16
+   (SINR of 8.48 dB) and a TB of 7272 bits (segmented in 2 CBs of 3648 and 3584
+   bits), that in turns produce a BLER of 0.14, since each CB has CBLER equal to
+   0.075 (see point F in figure :ref:`fig-mcs-14-test`).
 
 .. _fig-mcs-2-test:
 
 .. figure:: figures/MCS_2_test.*
    :align: center
 
-
    BLER for tests 1, 2, 3.
 
 .. _fig-mcs-12-test:
@@ -607,15 +867,34 @@
 
    BLER for test 6.
 
-
-The test verifies that in each case the expected number of packets received correct corresponds to a Bernoulli distribution with a confidence interval of 99%, where the probability of success in each trail is :math:`p=1-BER` and :math:`n` is the total number of packet sent.
-
-The error model of PCFICH-PDDCH channels consists of 4 test cases with a single UE and several eNBs, where the UE is connected to only one eNB in order to have the remaining acting as interfering ones. The errors on data are disabled in order to verify only the ones due to erroneous decodification of PCFICH-PDCCH. The test verifies that the error on the data received respects the decodification error probability of the PCFICH-PDCCH with a tolerance of 0.1 due to the errors that might be produced in quantizing the MI and the error curve. As before, the system has been forced on working in a less conservative fashion in the AMC module for appreciating the results in border situations. The parameters of the 4 tests cases are reported in the following:
-
- #. 2 eNBs placed 1078 meters far from the UE, which implies a SINR of -2.00 dB and a TB of 217 bits, that in turns produce a BLER of 0.007.
- #. 3 eNBs placed 1078 meters far from the UE, which implies a SINR of -4.00 dB and a TB of 217 bits, that in turns produce a BLER of 0.045.
- #. 4 eNBs placed 1078 meters far from the UE, which implies a SINR of -6.00 dB and a TB of 133 bits, that in turns produce a BLER of 0.206.
- #. 5 eNBs placed 1078 meters far from the UE, which implies a SINR of -7.00 dB and a TB of 81 bits, that in turns produce a BLER of 0.343.
+The test condition verifies that in each test case the expected number of
+packets received correctly corresponds to a Bernoulli distribution with a
+confidence interval of 99%, where the probability of success in each trail is
+:math:`p=1-BER` and :math:`n` is the total number of packets sent.
+
+The error model of PCFICH-PDCCH channels consists of 4 test cases with a single
+UE and several eNBs, where the UE is connected to only one eNB in order to have
+the remaining acting as interfering ones. The errors on data are disabled in
+order to verify only the ones due to erroneous decodification of PCFICH-PDCCH.
+As before, the system has been forced on working in a less conservative fashion
+in the AMC module for appreciating the results in border situations. The
+parameters of the 4 tests cases are reported in the following:
+
+#. 2 eNBs placed 1078 meters far from the UE, which implies a SINR of -2.00 dB
+   and a TB of 217 bits, that in turns produce a BLER of 0.007.
+#. 3 eNBs placed 1040 meters far from the UE, which implies a SINR of -4.00 dB
+   and a TB of 217 bits, that in turns produce a BLER of 0.045.
+#. 4 eNBs placed 1250 meters far from the UE, which implies a SINR of -6.00 dB
+   and a TB of 133 bits, that in turns produce a BLER of 0.206.
+#. 5 eNBs placed 1260 meters far from the UE, which implies a SINR of -7.00 dB
+   and a TB of 81 bits, that in turns produce a BLER of 0.343.
+
+The test condition verifies that in each test case the expected number
+of packets received correct corresponds to a Bernoulli distribution
+with a confidence interval of 99.8%, where the probability of success
+in each trail is :math:`p=1-BER` and :math:`n` is the total number of
+packet sent. The larger confidence interval is due to the errors that
+might be produced in quantizing the MI and the error curve.  
 
 
 HARQ Model
@@ -782,6 +1061,58 @@
 
  
 
+Initial cell selection
+----------------------
+
+The test suite `lte-cell-selection` is responsible for verifying the
+:ref:`sec-initial-cell-selection` procedure. The test is a simulation of a small 
+network of 2 non-CSG cells and 2 non-CSG cells. Several static UEs are then
+placed at predefined locations. The UEs enter the simulation without being
+attached to any cell. Initial cell selection is enabled for these UEs, so each
+UE will find the best cell and attach to it by themselves.
+
+At predefined check points time during the simulation, the test verifies that
+every UE is attached to the right cell. Moreover, the test also ensures that the
+UE is properly connected, i.e., its final state is `CONNECTED_NORMALLY`. Figure
+:ref:`fig-lte-cell-selection-scenario` depicts the network layout and the
+expected result. When a UE is depicted as having 2 successful cell selections
+(e.g., UE #3 and #4), any of them is accepted by the test case.
+
+.. _fig-lte-cell-selection-scenario:
+
+.. figure:: figures/lte-cell-selection-scenario.*
+   :scale: 80 %
+   :align: center
+
+   Sample result of cell selection test
+
+The figure shows that CSG members may attach to either CSG or non-CSG cells, and
+simply choose the stronger one. On the other hand, non-members can only attach
+to non-CSG cells, even when they are actually receiving stronger signal from a
+CSG cell.
+
+For reference purpose, Table :ref:`tab-cell-selection-error-rate` shows the
+error rate of each UE when receiving transmission from the control channel.
+Based on this information, the check point time for UE #3 is done at a later
+time than the others to compensate for its higher risk of failure.
+
+.. _tab-cell-selection-error-rate:
+
+.. table:: UE error rate in Initial Cell Selection test
+
+   ==== ==========
+   UE # Error rate
+   ==== ==========
+   1     0.00%
+   2     1.44%
+   3    12.39%
+   4     0.33%
+   5     0.00%
+   6     0.00%
+   ==== ==========
+
+The test uses the default Friis path loss model and without any channel fading
+model.
 
 
 GTP-U protocol
@@ -910,6 +1241,7 @@
 instance of this scenario defined by the following parameters:
 
  - the number of eNBs in the X-axes
+ - the number of UEs
  - the number of EPS bearers activated for the UE
  - a list of check point events to be triggered, where each event is defined by:
    + the time of the first check point event
@@ -917,9 +1249,22 @@
    + interval time between two check point events
    + the index of the UE doing the handover
    + the index of the eNB where the UE must be connected
+ - a boolean flag indicating whether UDP traffic is to be used instead of TCP traffic
+ - the type of scheduler to be used
+ - the type of handover algorithm to be used
+ - a boolean flag indicating whether handover is admitted by default 
  - a boolean flag indicating whether the ideal RRC protocol is to be used instead of the
    real RRC protocol
- - the type of scheduler to be used (RR or PF)
+
+The test suite consists of many test cases. In fact, it has been one of the most
+time-consuming test suite in ns-3. The test cases run with *some* combination of
+the following variable parameters:
+
+ - number of eNBs: 2, 3, 4;
+ - number of EPS bearers: 0, 1, 2;
+ - RRC: ideal, real (see :ref:`sec-rrc-protocol-models`);
+ - MAC scheduler: round robin, proportional fair (see :ref:`sec-ff-mac-scheduler`); and
+ - handover algorithm: A2-A4-RSRQ, strongest cell (see :ref:`sec-handover-algorithm`).
 
 Each test case passes if the following conditions are true:
 
@@ -992,3 +1337,48 @@
 computation, utilizing the fact that the handover will be delayed when this
 computation is broken. In the default simulation configuration, the handover
 delay observed because of a broken RA-RNTI computation is typically 6 ms.
+
+
+Selection of target cell in handover algorithm
+----------------------------------------------
+
+eNodeB may utilize :ref:`sec-handover-algorithm` to automatically create
+handover decisions during simulation. The decision includes the UE which should
+do the handover and the target cell where the UE should perform handover to.
+
+The test suite ``lte-handover-target`` verifies that the handover algorithm is
+making the right decision, in particular, in choosing the right target cell. It
+consists of several short test cases for different network topology (2×2 grid
+and 3×2 grid) and types of handover algorithm (the A2-A4-RSRQ handover algorithm
+and the strongest cell handover algorithm).
+
+Each test case is a simulation of a micro-cell environment with the following
+parameter:
+
+ - EPC is enabled
+ - several circular (isotropic antenna) micro-cell eNodeBs in a rectangular grid
+   layout, with 130 m distance between each adjacent point 
+ - 1 static UE, positioned close to and attached to the source cell
+ - no control channel error model
+ - no application installed
+ - no channel fading
+ - default path loss model (Friis)
+ - 1s simulation duration
+
+To trigger a handover, the test case "shutdowns" the source cell at +0.5s
+simulation time. Figure :ref:`fig-lte-handover-target-scenario` below
+illustrates the process. This is done by setting the source cell's Tx power to
+a very low value. As a result, the handover algorithm notices that the UE
+deserves a handover and several neighbouring cells become candidates of target
+cell at the same time.
+
+.. _fig-lte-handover-target-scenario:
+
+.. figure:: figures/lte-handover-target-scenario.*
+   :scale: 80 %
+   :align: center
+
+   ``lte-handover-target`` test scenario in a 2×2 grid
+
+The test case then verifies that the handover algorithm, when faced with more
+than one options of target cells, is able to choose the right one.
diff -Naur ns-3.18.1/src/lte/doc/source/lte-user.rst ns-3.19/src/lte/doc/source/lte-user.rst
--- ns-3.18.1/src/lte/doc/source/lte-user.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/doc/source/lte-user.rst	2013-12-20 09:44:51.000000000 -0800
@@ -1,9 +1,9 @@
 .. include:: replace.txt
 
 
-+++++++++++++++++++++++++++++++++
- User Documentation
-+++++++++++++++++++++++++++++++++
+++++++++++++++++++
+User Documentation
+++++++++++++++++++
 
 
 Background
@@ -39,6 +39,8 @@
 
 
 
+.. _sec-basic-simulation-program:
+
 Basic simulation program
 ------------------------
 
@@ -60,7 +62,7 @@
       // the rest of the simulation program follows
 
 
-#. Create a LteHelper object::
+#. Create an ``LteHelper`` object::
 
       Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
 
@@ -68,7 +70,7 @@
    objects (e.g., the Channel object) and provide the methods to add
    eNBs and UEs and configure them.
 
-#. Create Node objects for the eNB(s) and the UEs::
+#. Create ``Node`` objects for the eNB(s) and the UEs::
 
       NodeContainer enbNodes;
       enbNodes.Create (1);
@@ -137,8 +139,8 @@
 For how to compile and run simulation programs, please refer to [ns3tutorial]_.
 
 
-Configuration of LTE model parameters 
---------------------------------------
+Configuration of LTE model parameters
+-------------------------------------
 
 All the relevant LTE model parameters are managed through the ns-3
 attribute system. Please refer to the [ns3tutorial]_ and [ns3manual]_
@@ -261,10 +263,12 @@
      ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::LteEnbMac"
      ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::LteEnbPhy"
      ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::LteUePhy"
-     ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::EpcHelper"
+     ./waf --run lena-simple --command-template="%s --PrintAttributes=ns3::PointToPointEpcHelper"
  
 
 
+.. _sec-simulation-output:
+
 Simulation Output
 -----------------
 
@@ -382,14 +386,14 @@
   2. Cell ID
   3. unique UE ID (IMSI)
   4. RSRP
-  5. Linear average of the SINR peceived by the RBs
+  5. Linear average over all RBs of the downlink SINR in linear units
 
 The contents in the UE SINR file are:
 
   1. Simulation time in seconds at which the allocation is indicated by the scheduler
   2. Cell ID
   3. unique UE ID (IMSI)
-  4. SINR in linear units for the UE
+  4. uplink SINR in linear units for the UE
 
 In the interference filename the content is:
 
@@ -503,7 +507,7 @@
    Excerpt of the fading trace included in the simulator for an urban  scenario (speed of 3 kmph).
 
 
-Mobility Model with Buildings 
+Mobility Model with Buildings
 -----------------------------
 
 We now explain by examples how to use the buildings model (in particular, the ``MobilityBuildingInfo`` and the ``BuildingPropagationModel`` classes) in an ns-3 simulation program to setup an LTE simulation scenario that includes buildings and indoor nodes.
@@ -653,10 +657,12 @@
 with different antenna orientations to be installed on each node.
 
 
+.. _sec-radio-environment-maps:
+
 Radio Environment Maps
 ----------------------
 
-By using the class RadioEnvironmentMapHelper it is possible to output
+By using the class ``RadioEnvironmentMapHelper`` it is possible to output
 to a file a Radio Environment Map (REM), i.e., a uniform 2D grid of values
 that represent the Signal-to-noise ratio in the downlink with respect
 to the eNB that has the strongest signal at each point. 
@@ -676,9 +682,9 @@
   remHelper->SetAttribute ("Z", DoubleValue (0.0));
   remHelper->Install ();
 
-By configuring the attributes of the RadioEnvironmentMapHelper object
+By configuring the attributes of the ``RadioEnvironmentMapHelper`` object
 as shown above, you can tune the parameters of the REM to be
-generated. Note that each RadioEnvironmentMapHelper instance can
+generated. Note that each ``RadioEnvironmentMapHelper`` instance can
 generate only one REM; if you want to generate more REMs, you need to
 create one separate instance for each REM. 
 
@@ -758,6 +764,7 @@
 
 
 
+.. _sec-evolved-packet-core:
 
 Evolved Packet Core (EPC)
 -------------------------
@@ -769,11 +776,18 @@
 IPv4 over LTE, and also to connect an LTE network to any other IPv4
 network you might have in your simulation.
 
-First of all, in your simulation program you need to create two
-helpers::
+First of all, in addition to ``LteHelper`` that we already introduced
+in :ref:`sec-basic-simulation-program`, you need to use an additional
+``EpcHelper`` class, which will take care of creating the EPC entities and
+network topology. Note that you can't use ``EpcHelper`` directly, as
+it is an abstract base class; instead, you need to use one of its
+child classes, which provide different EPC topology implementations. In
+this example we will consider ``PointToPointEpcHelper``, which
+implements an EPC based on point-to-point links. To use it, you need
+first to insert this code in your simulation program::
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
 
 Then, you need to tell the LTE helper that the EPC will be used::
 
@@ -794,11 +808,11 @@
 the default; otherwise, the attribute won't be changed (e.g., if
 you changed the default to ``RLC_AM_ALWAYS``, it won't be touched).
 
-It is to be noted that, upon construction, the EpcHelper will also
-create and configure the PGW node. Its configuration in particular
-is very complex, and hence is done automatically by the Helper. Still,
-it is allowed to access the PGW node in order to connect it to other
-IPv4 network (e.g., the internet). Here is a very simple example about
+It is to be noted that the ``EpcHelper`` will also automatically
+create the PGW node and configure it so that it can properly handle
+traffic from/to the LTE radio access network.  Still,
+you need to add some explicit code to connect the PGW to other
+IPv4 networks (e.g., the internet). Here is a very simple example about
 how to connect a single remote host to the PGW via a point-to-point
 link::
 
@@ -826,7 +840,7 @@
 
 It's important to specify routes so that the remote host can reach LTE
 UEs. One way of doing this is by exploiting the fact that the
-EpcHelper will by default assign to LTE UEs an IP address in the
+``PointToPointEpcHelper`` will by default assign to LTE UEs an IP address in the
 7.0.0.0 network. With this in mind, it suffices to do::
 
   Ipv4StaticRoutingHelper ipv4RoutingHelper;
@@ -913,74 +927,401 @@
 
 
 
-X2-based handover
------------------
+.. _sec-network-attachment:
 
-The execution of an X2-based handover between two eNBs requires the
-configuration of an X2 interface between the two eNBs. This needs to
-be done explicitly within the simulation program like this::
+Network Attachment
+------------------
 
-     lteHelper->AddX2Interface (enbNodes);
+As shown in the basic example in section :ref:`sec-basic-simulation-program`,
+attaching a UE to an eNodeB is done by calling ``LteHelper::Attach`` function.
 
-where ``enbNodes`` is a ``NodeContainer`` that contains the two eNBs
-between which the X2 interface is to be configured.
+There are 2 possible ways of network attachment. The first method is the
+*"manual"* one, while the second one has a more *"automatic"* sense on it. Each
+of them will be covered in this section.
+
+Manual attachment
+*****************
+
+This method uses the ``LteHelper::Attach`` function mentioned above. It has been
+the only available network attachment method in earlier versions of LTE module.
+It is typically invoked before the simulation begins::
+
+   lteHelper->Attach (ueDevs, enbDev); // attach one or more UEs to a single eNodeB
+
+``LteHelper::InstallEnbDevice`` and ``LteHelper::InstallUeDevice`` functions
+must have been called before attaching. In an EPC-enabled simulation, it is also
+required to have IPv4 properly pre-installed in the UE.
+
+This method is very simple, but requires you to know exactly which UE belongs to
+to which eNodeB before the simulation begins. This can be difficult when the UE
+initial position is randomly determined by the simulation script.
+
+One may choose the distance between the UE and the eNodeB as a criterion for
+selecting the appropriate cell. It is quite simple (at least from the
+simulator's point of view) and sometimes practical. But it is important to note
+that sometimes distance does not make a single correct criterion. For instance,
+the eNodeB antenna directivity should be considered as well. Besides that, one
+should also take into account the channel condition, which might be fluctuating
+if there is fading or shadowing in effect. In these kind of cases, network
+attachment should not be based on distance alone.
+
+In real life, UE will automatically evaluate certain criteria and select the
+best cell to attach to, without manual intervention from the user. Obviously
+this is not the case in this ``LteHelper::Attach`` function. The other network
+attachment method uses more *"automatic"* approach to network attachment, as
+will be described next.
+
+Automatic attachment using Idle mode cell selection procedure
+*************************************************************
+
+The strength of the received signal is the standard criterion used for selecting
+the best cell to attach to. The use of this criterion is implemented in the
+`initial cell selection` process, which can be invoked by calling another
+version of the ``LteHelper::Attach`` function, as shown below::
+
+   lteHelper->Attach (ueDevs); // attach one or more UEs to a strongest cell
+
+The difference with the manual method is that the destination eNodeB is not
+specified. The procedure will find the best cell for the UEs, based on several
+criteria, including the strength of the received signal (RSRP).
+
+After the method is called, the UE will spend some time to measure the
+neighbouring cells, and then attempt to attach to the best one. More details can
+be found in section :ref:`sec-initial-cell-selection` of the Design
+Documentation.
 
+It is important to note that this method only works in EPC-enabled simulations.
+LTE-only simulations must resort to manual attachment method.
 
-Manual handover trigger
+Closed Subscriber Group
 ***********************
 
-Handover event can be triggered "manually" within the simulation
-program by scheduling an  explicit handover event. The ``LteHelper``
-provides a convenient method for the scheduling of a handover
-event. As an example, let us assume that ``ueLteDevs``` is a
-``NetDeviceContainer`` that contains the UE that is to be handed over,
-and that ``enbLteDevs`` is another ``NetDeviceContainer`` that
-contains the source and the target eNB. Then, an handover at 0.1s can be
-scheduled like this::
+An interesting use case of the initial cell selection process is to setup a
+simulation environment with Closed Subscriber Group (CSG).
 
-     lteHelper->HandoverRequest (Seconds (0.100), 
-                                 ueLteDevs.Get (0), 
-                                 enbLteDevs.Get (0), 
-                                 enbLteDevs.Get (1));
+For example, a certain eNodeB, typically a smaller version such as femtocell,
+might belong to a private owner (e.g. a household or business), allowing access
+only to some UEs which have been previously registered by the owner. The eNodeB
+and the registered UEs altogether form a CSG.
+
+The access restriction can be simulated by "labeling" the CSG members with the
+same CSG ID. This is done through the attributes in both eNodeB and UE, for
+example using the following ``LteHelper`` functions::
+
+   // label the following eNodeBs with CSG identity of 1 and CSG indication enabled
+   lteHelper->SetEnbDeviceAttribute ("CsgId", UintegerValue (1));
+   lteHelper->SetEnbDeviceAttribute ("CsgIndication", BooleanValue (true));
 
+   // label one or more UEs with CSG identity of 1
+   lteHelper->SetUeDeviceAttribute ("CsgId", UintegerValue (1));
+   
+   // install the eNodeBs and UEs
+   NetDeviceContainer csgEnbDevs = lteHelper->InstallEnbDevice (csgEnbNodes);
+   NetDeviceContainer csgUeDevs = lteHelper->InstallUeDevice (csgUeNodes);
 
-Note that the UE needs to be already connected to the source eNB,
-otherwise the simulation will terminate with an error message.
+Then enable the initial cell selection procedure on the UEs:: 
 
+   lteHelper->Attach (csgUeDevs);
 
-Automatic handover trigger
-**************************
+This is necessary because the CSG restriction only works with automatic method
+of network attachment, but not in the manual method.
+
+Note that setting the CSG indication of an eNodeB as false (the default value)
+will disable the restriction, i.e., any UEs can connect to this eNodeB.
+
+
+
+.. _sec-configure-ue-measurements:
+
+Configure UE measurements
+-------------------------
 
-Handover procedure can be triggered "automatically" by the serving eNB of 
-the UE. It is also known as the source eNB in the handover procedure. In
-order to control when the handover procedure is initiated, you can configure
-the parameters of the handover algorithm in your simulation program 
-through the ns-3 attributes of the eNB RRC entity::
+The active UE measurement configuration in a simulation is dictated by the
+selected so called "consumers", such as handover algorithm. Users may add their
+own configuration into action, and there are several ways to do so:
 
+ #. direct configuration in eNodeB RRC entity;
+ 
+ #. configuring existing handover algorithm; and
+ 
+ #. developing a new handover algorithm.
+ 
+This section will cover the first method only. The second method is covered in
+:ref:`sec-automatic-handover`, while the third method is explained in length in
+Section :ref:`sec-handover-algorithm` of the Design Documentation.
+
+Direct configuration in eNodeB RRC works as follows. User begins by creating a
+new ``LteRrcSap::ReportConfigEutra`` instance and pass it to the
+``LteEnbRrc::AddUeMeasReportConfig`` function. The function will return the
+``measId`` (measurement identity) which is a unique reference of the
+configuration in the eNodeB instance. This function must be called before the
+simulation begins. The measurement configuration will be active in all UEs
+attached to the eNodeB throughout the duration of the simulation. During the
+simulation, user can capture the measurement reports produced by the UEs by
+listening to the existing ``LteEnbRrc::RecvMeasurementReport`` trace source.
 
-  Config::SetDefault ("ns3::LteEnbRrc::ServingCellHandoverThreshold",
-                      UintegerValue (30));
+The structure `ReportConfigEutra` is in accord with 3GPP specification.
+Definition of the structure and each member field can be found in Section 6.3.5
+of [TS36331]_.
 
-  Config::SetDefault ("ns3::LteEnbRrc::NeighbourCellHandoverOffset",
-                      UintegerValue (1));
+The code sample below configures Event A1 RSRP measurement to every eNodeB
+within the container ``devs``::
 
+   LteRrcSap::ReportConfigEutra config;        
+   config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+   config.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRP;
+   config.threshold1.range = 41;
+   config.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRP;
+   config.reportInterval = LteRrcSap::ReportConfigEutra::MS480;
+   
+   std::vector<uint8_t> measIdList;
 
-The UE measurements are used in the automatic handover algorithm. You can
-configure the parameters of the UE measurements in your simulation program
-through the ns-3 attributes of the eNB RRC entity. You can set the thresholds
-of events A2 and A4::
+   NetDeviceContainer::Iterator it;
+   for (it = devs.Begin (); it != devs.End (); it++)
+   {
+     Ptr<NetDevice> dev = *it;
+     Ptr<LteEnbNetDevice> enbDev = dev->GetObject<LteEnbNetDevice> ();
+     Ptr<LteEnbRrc> enbRrc = enbDev->GetRrc ();
+    
+     uint8_t measId = enbRrc->AddUeMeasReportConfig (config);
+     measIdList.push_back (measId); // remember the measId created
+    
+     enbRrc->TraceConnect ("RecvMeasurementReport",
+                           "context",
+                           MakeCallback (&RecvMeasurementReportCallback));
+   }
+
+Note that thresholds are expressed as range. In the example above, the range 41
+for RSRP corresponds to -100 dBm. The conversion from and to the range format is
+due to Section 9.1.4 and 9.1.7 of [TS36133]_. The ``EutranMeasurementMapping``
+class has several static functions that can be used for this purpose.
+
+The corresponding callback function would have a definition similar as below::
+
+   void
+   RecvMeasurementReportCallback (std::string context,
+                                  uint64_t imsi,
+                                  uint16_t cellId,
+                                  uint16_t rnti,
+                                  LteRrcSap::MeasurementReport measReport);
+
+This method will register the callback function as a consumer of UE
+measurements. In the case where there are more than one consumers in the
+simulation (e.g. handover algorithm), the measurements intended for other
+consumers will also be captured by this callback function. Users may utilize the
+the ``measId`` field, contained within the ``LteRrcSap::MeasurementReport``
+argument of the callback function, to tell which measurement configuration has
+triggered the report.
+
+In general, this mechanism prevents one consumer to unknowingly intervene with
+another consumer's reporting configuration.
+
+Note that only the reporting configuration part (i.e.
+``LteRrcSap::ReportConfigEutra``) of the UE measurements parameter is open for
+consumers to configure, while the other parts are kept hidden. The
+intra-frequency limitation is the main motivation behind this API implementation
+decision:
 
+ - there is only one, unambiguous and definitive *measurement object*, thus
+   there is no need to configure it;
+   
+ - *measurement identities* are kept hidden because of the fact that there is
+   one-to-one mapping between reporting configuration and measurement identity,
+   thus a new measurement identity is set up automatically when a new reporting
+   configuration is created;
 
-  Config::SetDefault ("ns3::LteEnbRrc::EventA2Threshold",
-                      UintegerValue (32));
+ - *quantity configuration* is configured elsewhere, see
+   :ref:`sec-performing-measurements`; and
+   
+ - *measurement gaps* are not supported, because it is only applicable for
+   inter-frequency settings;
 
-  Config::SetDefault ("ns3::LteEnbRrc::EventA4Threshold",
-                      UintegerValue (2));
 
 
-You can find more info about events A2 and A4 in Subsections 5.5.4.3 and 5.5.4.5
-of [TS36331]_.
+.. _sec-x2-based-handover:
 
+X2-based handover
+-----------------
+
+As defined by 3GPP, handover is a procedure for changing the serving cell of a
+UE in CONNECTED mode. The two eNodeBs involved in the process are typically
+called the *source eNodeB* and the *target eNodeB*.
+
+In order to enable the execution of X2-based handover in simulation, there are
+two requirements that must be met. Firstly, EPC must be enabled in the
+simulation (see :ref:`sec-evolved-packet-core`).
+
+Secondly, an X2 interface must be configured between the two eNodeBs, which
+needs to be done explicitly within the simulation program::
+
+   lteHelper->AddX2Interface (enbNodes);
+
+where ``enbNodes`` is a ``NodeContainer`` that contains the two eNodeBs between
+which the X2 interface is to be configured. If the container has more than two
+eNodeBs, the function will create an X2 interface between every pair of eNodeBs
+in the container.
+
+Lastly, the target eNodeB must be configured as "open" to X2 HANDOVER REQUEST.
+Every eNodeB is open by default, so no extra instruction is needed in most
+cases. However, users may set the eNodeB to "closed" by setting the boolean
+attribute ``LteEnbRrc::AdmitHandoverRequest`` to `false`. As an example, you can
+run the ``lena-x2-handover`` program and setting the attribute in this way::
+
+   NS_LOG=EpcX2:LteEnbRrc ./waf --run lena-x2-handover --command="%s --ns3::LteEnbRrc::AdmitHandoverRequest=false"
+
+After the above three requirements are fulfilled, the handover procedure can be
+triggered manually or automatically. Each will be presented in the following
+subsections.
+
+
+Manual handover trigger
+***********************
+
+Handover event can be triggered "manually" within the simulation program by
+scheduling an explicit handover event. The ``LteHelper`` object provides a
+convenient method for the scheduling of a handover event. As an example, let us
+assume that ``ueLteDevs`` is a ``NetDeviceContainer`` that contains the UE that
+is to be handed over, and that ``enbLteDevs`` is another ``NetDeviceContainer``
+that contains the source and the target eNB. Then, a handover at 0.1s can be
+scheduled like this::
+
+   lteHelper->HandoverRequest (Seconds (0.100), 
+                               ueLteDevs.Get (0), 
+                               enbLteDevs.Get (0), 
+                               enbLteDevs.Get (1));
+
+Note that the UE needs to be already connected to the source eNB, otherwise the
+simulation will terminate with an error message. 
+
+For an example with full source code, please refer to the ``lena-x2-handover``
+example program.
+
+
+.. _sec-automatic-handover:
+
+Automatic handover trigger
+**************************
+
+Handover procedure can also be triggered "automatically" by the serving eNodeB 
+of the UE. The logic behind the trigger depends on the handover algorithm
+currently active in the eNodeB RRC entity. Users may select and configure the
+handover algorithm that will be used in the simulation, which will be explained
+shortly in this section. Users may also opt to write their own implementation of
+handover algorithm, as described in Section :ref:`sec-handover-algorithm` of the
+Design Documentation.
+
+Selecting a handover algorithm is done via the ``LteHelper`` object and its
+``SetHandoverAlgorithmType`` method as shown below::
+
+   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+   lteHelper->SetHandoverAlgorithmType ("ns3::A2A4RsrqHandoverAlgorithm");
+ 
+The selected handover algorithm may also provide several configurable
+attributes, which can be set as follows::
+
+   lteHelper->SetHandoverAlgorithmAttribute ("ServingCellThreshold",
+                                             UintegerValue (30));
+   lteHelper->SetHandoverAlgorithmAttribute ("NeighbourCellOffset",
+                                             UintegerValue (1));
+
+Three options of handover algorithm are included in the LTE module. The
+*A2-A4-RSRQ* handover algorithm (named as ``ns3::A2A4RsrqHandoverAlgorithm``) is
+the default option, and the usage has already been shown above.
+
+Another option is the *strongest cell* handover algorithm (named as
+``ns3::A3RsrpHandoverAlgorithm``), which can be selected and configured by the
+following code::
+
+   lteHelper->SetHandoverAlgorithmType ("ns3::A3RsrpHandoverAlgorithm");
+   lteHelper->SetHandoverAlgorithmAttribute ("Hysteresis",
+                                             DoubleValue (3.0));
+   lteHelper->SetHandoverAlgorithmAttribute ("TimeToTrigger",
+                                             TimeValue (MilliSeconds (256)));
+
+The last option is a special one, called the *no-op* handover algorithm, which
+basically disables automatic handover trigger. This is useful for example in
+cases where manual handover trigger need an exclusive control of all handover
+decision. It does not have any configurable attributes. The usage is as
+follows::
+
+   lteHelper->SetHandoverAlgorithmType ("ns3::NoOpHandoverAlgorithm");
+
+For more information on each handover algorithm's decision policy and their
+attributes, please refer to their respective subsections in Section
+:ref:`sec-handover-algorithm` of the Design Documentation.
+
+Finally, the ``InstallEnbDevice`` function of ``LteHelper`` will instantiate one
+instance of the selected handover algorithm for each eNodeB device. In other
+words, make sure to select the right handover algorithm before finalizing it in
+the following line of code::
+
+   NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice (enbNodes); 
+
+Example with full source code of using automatic handover trigger can be found
+in the ``lena-x2-handover-measures`` example program.
+
+
+.. _sec-tuning-handover-simulation:
+
+Tuning simulation with handover
+*******************************
+
+As mentioned in the Design Documentation, the current implementation of handover
+model may produce unpredicted behaviour when handover failure occurs. This
+subsection will focus on the steps that should be taken into account by users
+if they plan to use handover in their simulations.
+
+The major cause of handover failure that we will tackle is the error in
+transmitting handover-related signaling messages during the execution of a
+handover procedure. As apparent from the Figure
+:ref:`fig-x2-based-handover-seq-diagram` from the Design Documentation, there
+are many of them and they use different interfaces and protocols. For the sake
+of simplicity, we can safely assume that the X2 interface (between the source
+eNodeB and the target eNodeB) and the S1 interface (between the target eNodeB
+and the SGW/PGW) are quite stable. Therefore we will focus our attention to the
+RRC protocol (between the UE and the eNodeBs) and the Random Access procedure,
+which are normally transmitted through the air and susceptible to degradation of
+channel condition. 
+
+A general tips to reduce transmission error is to *ensure high enough SINR*
+level in every UE. This can be done by a proper planning of the network topology
+that *minimizes network coverage hole*. If the topology has a known coverage
+hole, then the UE should be configured not to venture to that area.
+
+Another approach to keep in mind is to *avoid too-late handovers*. In other
+words, handover should happen before the UE's SINR becomes too low, otherwise
+the UE may fail to receive the handover command from the source eNodeB. Handover
+algorithms have the means to control how early or late a handover decision is
+made. For example, A2-A4-RSRQ handover algorithm can be configured with a higher
+threshold to make it decide a handover earlier. Similarly, smaller hysteresis
+and/or shorter time-to-trigger in the strongest cell handover algorithm
+typically results in earlier handovers. In order to find the right values for
+these parameters, one of the factors that should be considered is the UE
+movement speed. Generally, a faster moving UE requires the handover to be
+executed earlier. Some research work have suggested recommended values, such as
+in [Lee2010]_.
+
+The above tips should be enough in normal simulation uses, but in the case some
+special needs arise then an extreme measure can be taken into consideration.
+For instance, users may consider *disabling the channel error models*. This will
+ensure that all handover-related signaling messages will be transmitted
+successfully, regardless of distance and channel condition. However, it will
+also affect all other data or control packets not related to handover, which may
+be an unwanted side effect. Otherwise, it can be done as follows::
+
+   Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled");
+   Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled");
+   
+By using the above code, we disable the error model in both control and data
+channels and in both directions (downlink and uplink). This is necessary because
+handover-related signaling messages are transmitted using these channels. An
+exception is when the simulation uses the ideal RRC protocol. In this case, only
+the Random Access procedure is left to be considered. The procedure consists of
+control messages, therefore we only need to disable the control channel's error
+model.
+      
+
+.. _sec-handover-traces:
 
 Handover traces
 ***************
@@ -991,76 +1332,73 @@
 handover execution phase at both the UE and eNB side. As an example,
 in your simulation program you can declare the following methods::
 
-
-  void 
-  NotifyHandoverStartUe (std::string context, 
-                         uint64_t imsi, 
-                         uint16_t cellid, 
-                         uint16_t rnti, 
-                         uint16_t targetCellId)
-  {
-    std::cout << context 
-              << " UE IMSI " << imsi 
-              << ": previously connected to CellId " << cellid 
-              << " with RNTI " << rnti 
-              << ", doing handover to CellId " << targetCellId 
-              << std::endl;
-  }
-
-  void 
-  NotifyHandoverEndOkUe (std::string context, 
-                         uint64_t imsi, 
-                         uint16_t cellid, 
-                         uint16_t rnti)
-  {
-    std::cout << context 
-              << " UE IMSI " << imsi 
-              << ": successful handover to CellId " << cellid 
-              << " with RNTI " << rnti 
-              << std::endl;
-  }
-
-  void 
-  NotifyHandoverStartEnb (std::string context, 
+   void 
+   NotifyHandoverStartUe (std::string context, 
                           uint64_t imsi, 
-                          uint16_t cellid, 
+                          uint16_t cellId, 
                           uint16_t rnti, 
                           uint16_t targetCellId)
-  {
-    std::cout << context 
-              << " eNB CellId " << cellid 
-              << ": start handover of UE with IMSI " << imsi 
-              << " RNTI " << rnti 
-              << " to CellId " << targetCellId 
-              << std::endl;
-  }
+   {
+     std::cout << Simulator::Now ().GetSeconds () << " " << context 
+               << " UE IMSI " << imsi 
+               << ": previously connected to CellId " << cellId 
+               << " with RNTI " << rnti 
+               << ", doing handover to CellId " << targetCellId 
+               << std::endl;
+   }
 
-  void 
-  NotifyHandoverEndOkEnb (std::string context, 
+   void 
+   NotifyHandoverEndOkUe (std::string context, 
                           uint64_t imsi, 
-                          uint16_t cellid, 
+                          uint16_t cellId, 
                           uint16_t rnti)
-  {
-    std::cout << context 
-              << " eNB CellId " << cellid 
-              << ": completed handover of UE with IMSI " << imsi 
-              << " RNTI " << rnti 
-              << std::endl;
-  }
-
+   {
+     std::cout << Simulator::Now ().GetSeconds () << " " << context 
+               << " UE IMSI " << imsi 
+               << ": successful handover to CellId " << cellId 
+               << " with RNTI " << rnti 
+               << std::endl;
+   }
+
+   void 
+   NotifyHandoverStartEnb (std::string context, 
+                           uint64_t imsi, 
+                           uint16_t cellId, 
+                           uint16_t rnti, 
+                           uint16_t targetCellId)
+   {
+     std::cout << Simulator::Now ().GetSeconds () << " " << context 
+               << " eNB CellId " << cellId 
+               << ": start handover of UE with IMSI " << imsi 
+               << " RNTI " << rnti 
+               << " to CellId " << targetCellId 
+               << std::endl;
+   }
+
+   void 
+   NotifyHandoverEndOkEnb (std::string context, 
+                           uint64_t imsi, 
+                           uint16_t cellId, 
+                           uint16_t rnti)
+   {
+     std::cout << Simulator::Now ().GetSeconds () << " " << context 
+               << " eNB CellId " << cellId 
+               << ": completed handover of UE with IMSI " << imsi 
+               << " RNTI " << rnti 
+               << std::endl;
+   }
 
 Then, you can hook up these methods to the corresponding trace sources
 like this::
 
-  Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverStart",
-                   MakeCallback (&NotifyHandoverStartEnb));
-  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverStart",
-                   MakeCallback (&NotifyHandoverStartUe));
-  Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverEndOk",
-                   MakeCallback (&NotifyHandoverEndOkEnb));
-  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverEndOk",
-                   MakeCallback (&NotifyHandoverEndOkUe));
-
+   Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverStart",
+                    MakeCallback (&NotifyHandoverStartEnb));
+   Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverStart",
+                    MakeCallback (&NotifyHandoverStartUe));
+   Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverEndOk",
+                    MakeCallback (&NotifyHandoverEndOkEnb));
+   Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverEndOk",
+                    MakeCallback (&NotifyHandoverEndOkUe));
 
 The example program ``src/lte/examples/lena-x2-handover.cc``
 illustrates how the all above instructions can be integrated in a
@@ -1075,14 +1413,6 @@
     NS_LOG=LteEnbRrc:LteUeRrc:EpcX2 ./waf --run lena-x2-handover
 
 
-Whether a target eNB will accept or not an incoming X2 HANDOVER
-REQUEST is controlled by the boolean attribute
-``LteEnbRrc::AdmitHandoverRequest`` (default: true). As an example,
-you can run the ``lena-x2-handover`` program setting the attribute to
-false in this way::
-
-   NS_LOG=EpcX2:LteEnbRrc ./waf --run lena-x2-handover 
-     --command="%s --ns3::LteEnbRrc::AdmitHandoverRequest=false"
 
 
 
@@ -1093,28 +1423,311 @@
 show how to simulate different LTE scenarios. 
 
 
+
 Reference scenarios
 -------------------
 
 There is a vast amount of reference LTE simulation scenarios which can
 be found in the literature. Here we list some of them: 
 
- * The dual stripe model [R4-092042]_, which is partially implemented
-   in the example program
-   ``src/lte/examples/lena-dual-stripe.cc``. This example program
-   features a lot of configurable parameters which can be customize by
-   changing the corresponding global variable. To get a list of all these
-   parameters, you can run this command::
-
-     ./waf --run lena-dual-stripe --command-template="%s --PrintGlobals"
-
-
-
- * The system simulation scenarios mentioned in section A.2 of [TR36814]_
-
-
+ * The system simulation scenarios mentioned in section A.2 of [TR36814]_.
 
+ * The dual stripe model [R4-092042]_, which is partially implemented in the
+   example program ``src/lte/examples/lena-dual-stripe.cc``. This example
+   program features a lot of configurable parameters which can be customized by
+   changing the corresponding global variables. To get a list of all these
+   global variables, you can run this command::
 
+     ./waf --run lena-dual-stripe --command-template="%s --PrintGlobals"
+     
+   The following subsection presents an example of running a simulation
+   campaign using this example program.
+
+
+Handover simulation campaign
+****************************
+
+In this subsection, we will demonstrate an example of running a simulation
+campaign using the LTE module of |ns3|. The objective of the campaign is to
+compare the effect of each built-in handover algorithm of the LTE module.
+
+The campaign will use the ``lena-dual-stripe`` example program. First, we have
+to modify the example program to produce the output that we need. In this
+occassion, we want to produce the number of handovers, user average throughput,
+and average SINR.
+
+The number of handovers can be obtained by counting the number of times the
+`HandoverEndOk` :ref:`sec-handover-traces` is fired. Then the user average
+throughput can be obtained by enabling the RLC :ref:`sec-simulation-output`.
+Finally, SINR can be obtained by enabling the PHY simulation output. The
+following sample code snippet shows one possible way to obtain the above::
+
+   void
+   NotifyHandoverEndOkUe (std::string context, uint64_t imsi,
+                          uint16_t cellId, uint16_t rnti)
+   {
+     std::cout << "Handover IMSI " << imsi << std::endl;
+   }
+
+   int
+   main (int argc, char *argv[])
+   {
+     /*** SNIP ***/
+
+     Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverEndOk",
+                      MakeCallback (&NotifyHandoverEndOkUe));
+
+     lteHelper->EnablePhyTraces ();
+     lteHelper->EnableRlcTraces ();
+     Ptr<RadioBearerStatsCalculator> rlcStats = lteHelper->GetRlcStats ();
+     rlcStats->SetAttribute ("StartTime", TimeValue (Seconds (0)));
+     rlcStats->SetAttribute ("EpochDuration", TimeValue (Seconds (simTime)));
+
+     Simulator::Run ();
+     Simulator::Destroy ();
+     return 0;
+   }
+
+Then we have to configure the parameters of the program to suit our simulation
+needs. We are looking for the following assumptions in our simulation:
+
+ * 7 sites of tri-sectored macro eNodeBs (i.e. 21 macrocells) deployed in
+   hexagonal layout with 500 m inter-site distance.
+
+ * Although ``lena-dual-stripe`` is originally intended for a two-tier
+   (macrocell and femtocell) simulation, we will simplify our simulation to
+   one-tier (macrocell) simulation only.
+
+ * UEs are randomly distributed around the sites and attach to the network
+   automatically using Idle mode cell selection. After that, UE will roam the
+   simulation environment with 60 kmph movement speed.
+
+ * 50 seconds simulation duration, so UEs would have traveled far enough to
+   trigger some handovers.
+
+ * 46 dBm macrocell Tx power and 10 dBm UE Tx power.
+
+ * EPC mode will be used because the X2 handover procedure requires it to be
+   enabled.
+
+ * Full-buffer downlink and uplink traffic, both in 5 MHz bandwidth, using TCP
+   protocol and Proportional Fair scheduler.
+
+ * Ideal RRC protocol.
+
+Table :ref:`tab-handover-campaign-program-parameter` below shows how we
+configure the parameters of ``lena-dual-stripe`` to achieve the above
+assumptions.
+
+.. _tab-handover-campaign-program-parameter:
+
+.. table:: ``lena-dual-stripe`` parameter configuration for handover campaign
+
+   ================== ========== ===============================================
+   Parameter name     Value      Description
+   ================== ========== ===============================================
+   simTime            50         50 seconds simulation duration
+   nBlocks            0          Disabling apartment buildings and femtocells
+   nMacroEnbSites     7          Number of macrocell sites (each site has 3
+                                 cells)
+   nMacroEnbSitesX    2          The macrocell sites will be positioned in a
+                                 2-3-2 formation
+   interSiteDistance  500        500 m distance between adjacent macrocell sites
+   macroEnbTxPowerDbm 46         46 dBm Tx power for each macrocell
+   epc                1          Enable EPC mode
+   epcDl              1          Enable full-buffer DL traffic
+   epcUl              1          Enable full-buffer UL traffic
+   useUdp             0          Disable UDP traffic and enable TCP instead
+   macroUeDensity     0.00002    Determines number of UEs (translates to 48 UEs
+                                 in our simulation)
+   outdoorUeMinSpeed  16.6667    Minimum UE movement speed in m/s (60 kmph)
+   outdoorUeMaxSpeed  16.6667    Maximum UE movement speed in m/s (60 kmph)
+   macroEnbBandwidth  25         5 MHz DL and UL bandwidth
+   generateRem        1          (Optional) For plotting the Radio Environment
+                                 Map
+   ================== ========== ===============================================
+
+Some of the required assumptions are not available as parameters of
+``lena-dual-stripe``. In this case, we override the default attributes, as
+shown in Table :ref:`tab-handover-campaign-default-values` below.
+
+.. _tab-handover-campaign-default-values:
+
+.. table:: Overriding default attributes for handover campaign
+
+   ==================================================== ================================== ==============================================
+   Default value name                                   Value                              Description
+   ==================================================== ================================== ==============================================
+   ns3::LteHelper::HandoverAlgorithm                    `ns3::NoOpHandoverAlgorithm`,      Choice of handover algorithm
+                                                        `ns3::A3RsrpHandoverAlgorithm`, or
+                                                        `ns3::A2A4RsrqHandoverAlgorithm`
+   ns3::LteHelper::Scheduler                            `ns3::PfFfMacScheduler`            Proportional Fair scheduler
+   ns3::LteHelper::UseIdealRrc                           1                                 Ideal RRC protocol
+   ns3::RadioBearerStatsCalculator::DlRlcOutputFilename `<run>`-DlRlcStats.txt             File name for DL RLC trace output
+   ns3::RadioBearerStatsCalculator::UlRlcOutputFilename `<run>`-UlRlcStats.txt             File name for UL RLC trace output
+   ns3::PhyStatsCalculator::DlRsrpSinrFilename          `<run>`-DlRsrpSinrStats.txt        File name for DL PHY RSRP/SINR trace output
+   ns3::PhyStatsCalculator::UlSinrFilename              `<run>`-UlSinrStats.txt            File name for UL PHY SINR trace output
+   ==================================================== ================================== ==============================================
+
+|ns3| provides many ways for passing configuration values into a simulation. In
+this example, we will use the command line arguments. It is basically done by
+appending the parameters and their values to the ``waf`` call when starting each
+individual simulation. So the ``waf`` calls for invoking our 3 simulations would
+look as below::
+
+   $ ./waf --run="lena-dual-stripe
+     --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2
+     --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667
+     --ns3::LteHelper::HandoverAlgorithm=ns3::NoOpHandoverAlgorithm
+     --ns3::RadioBearerStatsCalculator::DlRlcOutputFilename=no-op-DlRlcStats.txt
+     --ns3::RadioBearerStatsCalculator::UlRlcOutputFilename=no-op-UlRlcStats.txt
+     --ns3::PhyStatsCalculator::DlRsrpSinrFilename=no-op-DlRsrpSinrStats.txt
+     --ns3::PhyStatsCalculator::UlSinrFilename=no-op-UlSinrStats.txt
+     --RngRun=1" > no-op.txt
+
+   $ ./waf --run="lena-dual-stripe
+     --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2
+     --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667
+     --ns3::LteHelper::HandoverAlgorithm=ns3::A3RsrpHandoverAlgorithm
+     --ns3::RadioBearerStatsCalculator::DlRlcOutputFilename=a3-rsrp-DlRlcStats.txt
+     --ns3::RadioBearerStatsCalculator::UlRlcOutputFilename=a3-rsrp-UlRlcStats.txt
+     --ns3::PhyStatsCalculator::DlRsrpSinrFilename=a3-rsrp-DlRsrpSinrStats.txt
+     --ns3::PhyStatsCalculator::UlSinrFilename=a3-rsrp-UlSinrStats.txt
+     --RngRun=1" > a3-rsrp.txt
+
+   $ ./waf --run="lena-dual-stripe
+     --simTime=50 --nBlocks=0 --nMacroEnbSites=7 --nMacroEnbSitesX=2
+     --epc=1 --useUdp=0 --outdoorUeMinSpeed=16.6667 --outdoorUeMaxSpeed=16.6667
+     --ns3::LteHelper::HandoverAlgorithm=ns3::A2A4RsrqHandoverAlgorithm
+     --ns3::RadioBearerStatsCalculator::DlRlcOutputFilename=a2-a4-rsrq-DlRlcStats.txt
+     --ns3::RadioBearerStatsCalculator::UlRlcOutputFilename=a2-a4-rsrq-UlRlcStats.txt
+     --ns3::PhyStatsCalculator::DlRsrpSinrFilename=a2-a4-rsrq-DlRsrpSinrStats.txt
+     --ns3::PhyStatsCalculator::UlSinrFilename=a2-a4-rsrq-UlSinrStats.txt
+     --RngRun=1" > a2-a4-rsrq.txt
+
+Some notes on the execution:
+
+ * Notice that some arguments are not specified because they are already the
+   same as the default values. We also keep the handover algorithms on each own
+   default settings.
+
+ * Note the file names of simulation output, e.g. RLC traces and PHY traces,
+   because we have to make sure that they are not overwritten by the next
+   simulation run. In this example, we specify the names one by one using the
+   command line arguments.
+
+ * The ``--RngRun=1`` argument at the end is used for setting the run number
+   used by the random number generator used in the simulation. We re-run the
+   same simulations with different `RngRun` values, hence creating several
+   independent replications of the same simulations. Then we average the
+   results obtained from these replications to achieve some statistical
+   confidence.
+
+ * We can add a ``--generateRem=1`` argument to generate the files necessary for
+   generating the Radio Environment Map (REM) of the simulation. The result is
+   Figure :ref:`fig-lte-handover-campaign-rem` below, which can be produced by
+   following the steps described in Section :ref:`sec-radio-environment-maps`.
+   This figure also shows the position of eNodeBs and UEs at the beginning of a
+   simulation using ``RngRun = 1``. Other values of `RngRun` may produce
+   different UE position.
+   
+.. _fig-lte-handover-campaign-rem:
 
+.. figure:: figures/lte-handover-campaign-rem.*
+   :align: center
 
+   REM obtained from a simulation in handover campaign
 
+After hours of running, the simulation campaign will eventually end. Next we
+will perform some post-processing on the produced simulation output to obtain
+meaningful information out of it.
+
+In this example, we use GNU Octave to assist the processing of throughput and
+SINR data, as demonstrated in a sample GNU Octave script below::
+
+   % RxBytes is the 10th column
+   DlRxBytes = load ("no-op-DlRlcStats.txt") (:,10);
+   DlAverageThroughputKbps = sum (DlRxBytes) * 8 / 1000 / 50
+
+   % RxBytes is the 10th column
+   UlRxBytes = load ("no-op-UlRlcStats.txt") (:,10);
+   UlAverageThroughputKbps = sum (UlRxBytes) * 8 / 1000 / 50
+
+   % Sinr is the 6th column
+   DlSinr = load ("no-op-DlRsrpSinrStats.txt") (:,6);
+   % eliminate NaN values
+   idx = isnan (DlSinr);
+   DlSinr (idx) = 0;
+   DlAverageSinrDb = 10 * log10 (mean (DlSinr)) % convert to dB
+
+   % Sinr is the 5th column
+   UlSinr = load ("no-op-UlSinrStats.txt") (:,5);
+   % eliminate NaN values
+   idx = isnan (UlSinr);
+   UlSinr (idx) = 0;
+   UlAverageSinrDb = 10 * log10 (mean (UlSinr)) % convert to dB
+
+As for the number of handovers, we can use simple shell scripting to count the
+number of occurrences of string "Handover" in the log file::
+
+   $ grep "Handover" no-op.txt | wc -l
+
+Table :ref:`tab-handover-campaign-results` below shows the complete statistics
+after we are done with post-processing on every individual simulation run. The
+values shown are the average of the results obtained from ``RngRun`` of 1, 2, 3,
+and 4.
+
+.. _tab-handover-campaign-results:
+
+.. table:: Results of handover campaign
+
+   ===================================== ========== =========== ==============
+   Statistics                            No-op      A2-A4-RSRQ  Strongest cell
+   ===================================== ========== =========== ==============
+   Average DL system throughput          6 615 kbps 20 509 kbps 19 709 kbps
+   Average UL system throughput          4 095 kbps 5 705 kbps  6 627 kbps
+   Average DL SINR                       -0.10 dB   5.19 dB     5.24 dB
+   Average UL SINR                       9.54 dB    81.57 dB    79.65 dB
+   Number of handovers per UE per second 0          0.05694     0.04771
+   ===================================== ========== =========== ==============
+
+.. Below are the detailed datasheets from the campaign, for informational
+   purpose, but hidden from the published document.
+
+.. ======================= ========== ========== ========== ========== =======
+   NoOp                    RngRun = 1 RngRun = 2 RngRun = 3 RngRun = 4 Average
+   ======================= ========== ========== ========== ========== =======
+   DlAverageThroughputKbps 8 476      4 478      6 913      6 593      6 615
+   UlAverageThroughputKbps 4 923      2 962      4 715      3 779      4 095
+   DlAverageSinrDb         0.40       -0.99      0.84       -0.64      -0.10
+   UlAverageSinrDb         7.93       8.06       12.52      9.65       9.54
+   NumHandoverPerUePerSec  0          0          0          0          0
+   ======================= ========== ========== ========== ========== =======
+
+.. ======================= ========== ========== ========== ========== =======
+   A2A4Rsrq                RngRun = 1 RngRun = 2 RngRun = 3 RngRun = 4 Average
+   ======================= ========== ========== ========== ========== =======
+   DlAverageThroughputKbps 21 575     18 500     n/a        21 451     20 509
+   UlAverageThroughputKbps 6 039      5 320      n/a        5 757      5 705
+   DlAverageSinrDb         5.31       5.16       n/a        5.09       5.19
+   UlAverageSinrDb         84.17      79.18      n/a        81.37      81.57
+   NumHandoverPerUePerSec  0.05458    0.06000    n/a        0.05625    0.05694
+   ======================= ========== ========== ========== ========== =======
+   RngRun = 3 simulation got a segmentation fault as around +15.2s. The cause is
+   unknown at the moment.
+
+.. ======================= ========== ========== ========== ========== =======
+   A3Rsrp                  RngRun = 1 RngRun = 2 RngRun = 3 RngRun = 4 Average
+   ======================= ========== ========== ========== ========== =======
+   DlAverageThroughputKbps 20 349     17 781     20 229     20 478     19 709
+   UlAverageThroughputKbps 6 491      6 397      7 555      6 064      6 627
+   DlAverageSinrDb         5.24       5.08       5.63       5.01       5.24
+   UlAverageSinrDb         83.62      81.94      78.84      74.19      79.65
+   NumHandoverPerUePerSec  0.04625    0.04917    0.04958    0.04583    0.04771
+   ======================= ========== ========== ========== ========== =======
+
+The results show that having a handover algorithm in a mobility simulation
+improves both user throughput and SINR significantly. There is little difference
+between the two handover algorithms in this campaign scenario. It would be
+interesting to see their performance in different scenarios, such as scenarios
+with home eNodeBs deployment.
diff -Naur ns-3.18.1/src/lte/examples/lena-dual-stripe.cc ns-3.19/src/lte/examples/lena-dual-stripe.cc
--- ns-3.18.1/src/lte/examples/lena-dual-stripe.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/examples/lena-dual-stripe.cc	2013-12-20 09:44:51.000000000 -0800
@@ -55,7 +55,7 @@
   FemtocellBlockAllocator (Box area, uint32_t nApartmentsX, uint32_t nFloors);
   void Create (uint32_t n);
   void Create ();
-  
+
 private:
   bool OverlapsWithAnyPrevious (Box);
   Box m_area;
@@ -66,7 +66,7 @@
   double m_ySize;
   Ptr<UniformRandomVariable> m_xMinVar;
   Ptr<UniformRandomVariable> m_yMinVar;
-  
+
 };
 
 FemtocellBlockAllocator::FemtocellBlockAllocator (Box area, uint32_t nApartmentsX, uint32_t nFloors)
@@ -76,12 +76,12 @@
     m_xSize (nApartmentsX*10 + 20),
     m_ySize (70)
 {
-    m_xMinVar = CreateObject<UniformRandomVariable> ();
-    m_xMinVar->SetAttribute ("Min", DoubleValue (area.xMin));
-    m_xMinVar->SetAttribute ("Max", DoubleValue (area.xMax - m_xSize));
-    m_yMinVar = CreateObject<UniformRandomVariable> ();
-    m_yMinVar->SetAttribute ("Min", DoubleValue (area.yMin));
-    m_yMinVar->SetAttribute ("Max", DoubleValue (area.yMax - m_ySize));
+  m_xMinVar = CreateObject<UniformRandomVariable> ();
+  m_xMinVar->SetAttribute ("Min", DoubleValue (area.xMin));
+  m_xMinVar->SetAttribute ("Max", DoubleValue (area.xMax - m_xSize));
+  m_yMinVar = CreateObject<UniformRandomVariable> ();
+  m_yMinVar->SetAttribute ("Min", DoubleValue (area.yMin));
+  m_yMinVar->SetAttribute ("Max", DoubleValue (area.yMax - m_ySize));
 }
 
 void 
@@ -104,7 +104,7 @@
       box.xMin = m_xMinVar->GetValue ();
       box.xMax = box.xMin + m_xSize;
       box.yMin = m_yMinVar->GetValue ();
-      box.yMax = box.yMin + m_ySize;      
+      box.yMax = box.yMin + m_ySize;
       ++attempt;
     }
   while (OverlapsWithAnyPrevious (box));
@@ -156,7 +156,7 @@
       ++index;
       Box box = (*it)->GetBoundaries ();
       outFile << "set object " << index
-              << " rect from " << box.xMin  << "," << box.yMin  
+              << " rect from " << box.xMin  << "," << box.yMin
               << " to "   << box.xMax  << "," << box.yMax
               << " front fs empty "
               << std::endl;
@@ -184,7 +184,7 @@
             {
               Vector pos = node->GetObject<MobilityModel> ()->GetPosition ();
               outFile << "set label \"" << uedev->GetImsi ()
-                      << "\" at "<< pos.x << "," << pos.y << " left font \"Helvetica,4\" textcolor rgb \"grey\" front point pt 1 ps 0.3 lc rgb \"grey\" offset 0,0"  
+                      << "\" at "<< pos.x << "," << pos.y << " left font \"Helvetica,4\" textcolor rgb \"grey\" front point pt 1 ps 0.3 lc rgb \"grey\" offset 0,0"
                       << std::endl;
             }
         }
@@ -212,7 +212,8 @@
             {
               Vector pos = node->GetObject<MobilityModel> ()->GetPosition ();
               outFile << "set label \"" << enbdev->GetCellId ()
-                      << "\" at "<< pos.x << "," << pos.y << " left font \"Helvetica,4\" textcolor rgb \"white\" front  point pt 2 ps 0.3 lc rgb \"white\" offset 0,0"  
+                      << "\" at "<< pos.x << "," << pos.y
+                      << " left font \"Helvetica,4\" textcolor rgb \"white\" front  point pt 2 ps 0.3 lc rgb \"white\" offset 0,0"
                       << std::endl;
             }
         }
@@ -220,133 +221,131 @@
 }
 
 
-static ns3::GlobalValue g_nBlocks ("nBlocks", 
-                                   "Number of femtocell blocks", 
+static ns3::GlobalValue g_nBlocks ("nBlocks",
+                                   "Number of femtocell blocks",
                                    ns3::UintegerValue (1),
                                    ns3::MakeUintegerChecker<uint32_t> ());
-static ns3::GlobalValue g_nApartmentsX ("nApartmentsX", 
-                                        "Number of apartments along the X axis in a femtocell block",  
+static ns3::GlobalValue g_nApartmentsX ("nApartmentsX",
+                                        "Number of apartments along the X axis in a femtocell block",
                                         ns3::UintegerValue (10),
                                         ns3::MakeUintegerChecker<uint32_t> ());
-static ns3::GlobalValue g_nFloors ("nFloors", 
-                                   "Number of floors",  
+static ns3::GlobalValue g_nFloors ("nFloors",
+                                   "Number of floors",
                                    ns3::UintegerValue (1),
                                    ns3::MakeUintegerChecker<uint32_t> ());
-static ns3::GlobalValue g_nMacroEnbSites ("nMacroEnbSites", 
-                                          "How many macro sites there are",  
+static ns3::GlobalValue g_nMacroEnbSites ("nMacroEnbSites",
+                                          "How many macro sites there are",
                                           ns3::UintegerValue (3),
                                           ns3::MakeUintegerChecker<uint32_t> ());
-static ns3::GlobalValue g_nMacroEnbSitesX ("nMacroEnbSitesX", 
-                                           "(minimum) number of sites along the X-axis of the hex grid",  
+static ns3::GlobalValue g_nMacroEnbSitesX ("nMacroEnbSitesX",
+                                           "(minimum) number of sites along the X-axis of the hex grid",
                                            ns3::UintegerValue (1),
                                            ns3::MakeUintegerChecker<uint32_t> ());
-static ns3::GlobalValue g_interSiteDistance ("interSiteDistance", 
-                                             "min distance between two nearby macro cell sites",  
+static ns3::GlobalValue g_interSiteDistance ("interSiteDistance",
+                                             "min distance between two nearby macro cell sites",
                                              ns3::DoubleValue (500),
                                              ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_areaMarginFactor ("areaMarginFactor", 
+static ns3::GlobalValue g_areaMarginFactor ("areaMarginFactor",
                                             "how much the UE area extends outside the macrocell grid, "
-                                            "expressed as fraction of the interSiteDistance",   
+                                            "expressed as fraction of the interSiteDistance",
                                             ns3::DoubleValue (0.5),
                                             ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_macroUeDensity ("macroUeDensity", 
-                                          "How many macrocell UEs there are per square meter",   
+static ns3::GlobalValue g_macroUeDensity ("macroUeDensity",
+                                          "How many macrocell UEs there are per square meter",
                                           ns3::DoubleValue (0.00002),
                                           ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_homeEnbDeploymentRatio ("homeEnbDeploymentRatio", 
-                                                  "The HeNB deployment ratio as per 3GPP R4-092042",   
+static ns3::GlobalValue g_homeEnbDeploymentRatio ("homeEnbDeploymentRatio",
+                                                  "The HeNB deployment ratio as per 3GPP R4-092042",
                                                   ns3::DoubleValue (0.2),
                                                   ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_homeEnbActivationRatio ("homeEnbActivationRatio", 
-                                                  "The HeNB activation ratio as per 3GPP R4-092042",   
+static ns3::GlobalValue g_homeEnbActivationRatio ("homeEnbActivationRatio",
+                                                  "The HeNB activation ratio as per 3GPP R4-092042",
                                                   ns3::DoubleValue (0.5),
                                                   ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_homeUesHomeEnbRatio ("homeUesHomeEnbRatio", 
-                                               "How many (on average) home UEs per HeNB there are in the simulation",         
+static ns3::GlobalValue g_homeUesHomeEnbRatio ("homeUesHomeEnbRatio",
+                                               "How many (on average) home UEs per HeNB there are in the simulation",
                                                ns3::DoubleValue (1.0),
                                                ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_macroEnbTxPowerDbm ("macroEnbTxPowerDbm", 
-                                              "TX power [dBm] used by macro eNBs",   
+static ns3::GlobalValue g_macroEnbTxPowerDbm ("macroEnbTxPowerDbm",
+                                              "TX power [dBm] used by macro eNBs",
                                               ns3::DoubleValue (46.0),
                                               ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_homeEnbTxPowerDbm ("homeEnbTxPowerDbm", 
-                                             "TX power [dBm] used by HeNBs",   
+static ns3::GlobalValue g_homeEnbTxPowerDbm ("homeEnbTxPowerDbm",
+                                             "TX power [dBm] used by HeNBs",
                                              ns3::DoubleValue (20.0),
                                              ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_macroEnbDlEarfcn ("macroEnbDlEarfcn", 
-                                            "DL EARFCN used by macro eNBs", 
+static ns3::GlobalValue g_macroEnbDlEarfcn ("macroEnbDlEarfcn",
+                                            "DL EARFCN used by macro eNBs",
                                             ns3::UintegerValue (100),
                                             ns3::MakeUintegerChecker<uint16_t> ());
-static ns3::GlobalValue g_homeEnbDlEarfcn ("homeEnbDlEarfcn", 
-                                           "DL EARFCN used by HeNBs",  
+static ns3::GlobalValue g_homeEnbDlEarfcn ("homeEnbDlEarfcn",
+                                           "DL EARFCN used by HeNBs",
                                            ns3::UintegerValue (100),
                                            ns3::MakeUintegerChecker<uint16_t> ());
-static ns3::GlobalValue g_macroEnbBandwidth ("macroEnbBandwidth", 
-                                             "bandwidth [num RBs] used by macro eNBs",  
+static ns3::GlobalValue g_macroEnbBandwidth ("macroEnbBandwidth",
+                                             "bandwidth [num RBs] used by macro eNBs",
                                              ns3::UintegerValue (25),
                                              ns3::MakeUintegerChecker<uint16_t> ());
-static ns3::GlobalValue g_homeEnbBandwidth ("homeEnbBandwidth", 
-                                            "bandwidth [num RBs] used by HeNBs",  
+static ns3::GlobalValue g_homeEnbBandwidth ("homeEnbBandwidth",
+                                            "bandwidth [num RBs] used by HeNBs",
                                             ns3::UintegerValue (25),
                                             ns3::MakeUintegerChecker<uint16_t> ());
-static ns3::GlobalValue g_simTime ("simTime", 
-                                   "Total duration of the simulation [s]",  
+static ns3::GlobalValue g_simTime ("simTime",
+                                   "Total duration of the simulation [s]",
                                    ns3::DoubleValue (0.25),
                                    ns3::MakeDoubleChecker<double> ());
-static ns3::GlobalValue g_generateRem ("generateRem", 
+static ns3::GlobalValue g_generateRem ("generateRem",
                                        "if true, will generate a REM and then abort the simulation;"
-                                       "if false, will run the simulation normally (without generating any REM)",  
+                                       "if false, will run the simulation normally (without generating any REM)",
                                        ns3::BooleanValue (false),
                                        ns3::MakeBooleanChecker ());
-static ns3::GlobalValue g_epc ("epc", 
+static ns3::GlobalValue g_epc ("epc",
                                "If true, will setup the EPC to simulate an end-to-end topology, "
                                "with real IP applications over PDCP and RLC UM (or RLC AM by changing "
                                "the default value of EpsBearerToRlcMapping e.g. to RLC_AM_ALWAYS). "
-                               "If false, only the LTE radio access will be simulated with RLC SM. ",  
+                               "If false, only the LTE radio access will be simulated with RLC SM. ",
                                ns3::BooleanValue (false),
                                ns3::MakeBooleanChecker ());
-static ns3::GlobalValue g_epcDl ("epcDl", 
+static ns3::GlobalValue g_epcDl ("epcDl",
                                  "if true, will activate data flows in the downlink when EPC is being used. "
                                  "If false, downlink flows won't be activated. "
-                                 "If EPC is not used, this parameter will be ignored.",  
+                                 "If EPC is not used, this parameter will be ignored.",
                                  ns3::BooleanValue (true),
                                  ns3::MakeBooleanChecker ());
-static ns3::GlobalValue g_epcUl ("epcUl", 
+static ns3::GlobalValue g_epcUl ("epcUl",
                                  "if true, will activate data flows in the uplink when EPC is being used. "
                                  "If false, uplink flows won't be activated. "
-                                 "If EPC is not used, this parameter will be ignored.",  
+                                 "If EPC is not used, this parameter will be ignored.",
                                  ns3::BooleanValue (true),
                                  ns3::MakeBooleanChecker ());
-static ns3::GlobalValue g_useUdp ("useUdp", 
+static ns3::GlobalValue g_useUdp ("useUdp",
                                   "if true, the UdpClient application will be used. "
                                   "Otherwise, the BulkSend application will be used over a TCP connection. "
-                                  "If EPC is not used, this parameter will be ignored.",  
+                                  "If EPC is not used, this parameter will be ignored.",
                                   ns3::BooleanValue (true),
                                   ns3::MakeBooleanChecker ());
-static ns3::GlobalValue g_fadingTrace ("fadingTrace", 
-                                           "The path of the fading trace (by default no fading trace "
-                                           "is loaded, i.e., fading is not considered)",  
-                                           ns3::StringValue (""),
-                                           ns3::MakeStringChecker ());
+static ns3::GlobalValue g_fadingTrace ("fadingTrace",
+                                       "The path of the fading trace (by default no fading trace "
+                                       "is loaded, i.e., fading is not considered)",
+                                       ns3::StringValue (""),
+                                       ns3::MakeStringChecker ());
 static ns3::GlobalValue g_numBearersPerUe ("numBearersPerUe",
-                                               "How many bearers per UE there are in the simulation",
-                                               ns3::UintegerValue (1),
-                                               ns3::MakeUintegerChecker<uint16_t> ());
-
+                                           "How many bearers per UE there are in the simulation",
+                                           ns3::UintegerValue (1),
+                                           ns3::MakeUintegerChecker<uint16_t> ());
 static ns3::GlobalValue g_srsPeriodicity ("srsPeriodicity",
-                                               "SRS Periodicity (has to be at least greater than the number of UEs per eNB)",
-                                               ns3::UintegerValue (80),
-                                               ns3::MakeUintegerChecker<uint16_t> ());
-
+                                          "SRS Periodicity (has to be at least "
+                                          "greater than the number of UEs per eNB)",
+                                          ns3::UintegerValue (80),
+                                          ns3::MakeUintegerChecker<uint16_t> ());
 static ns3::GlobalValue g_outdoorUeMinSpeed ("outdoorUeMinSpeed",
-                                   "Minimum speed value of macor UE with random waypoint model [m/s].",
-                                   ns3::DoubleValue (0.0),
-                                   ns3::MakeDoubleChecker<double> ());
-
+                                             "Minimum speed value of macor UE with random waypoint model [m/s].",
+                                             ns3::DoubleValue (0.0),
+                                             ns3::MakeDoubleChecker<double> ());
 static ns3::GlobalValue g_outdoorUeMaxSpeed ("outdoorUeMaxSpeed",
-                                   "Maximum speed value of macor UE with random waypoint model [m/s].",
-                                   ns3::DoubleValue (0.0),
-                                   ns3::MakeDoubleChecker<double> ());
+                                             "Maximum speed value of macor UE with random waypoint model [m/s].",
+                                             ns3::DoubleValue (0.0),
+                                             ns3::MakeDoubleChecker<double> ());
 
 int
 main (int argc, char *argv[])
@@ -427,7 +426,7 @@
   GlobalValue::GetValueByName ("outdoorUeMaxSpeed", doubleValue);
   uint16_t outdoorUeMaxSpeed = doubleValue.Get ();
 
-  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue(srsPeriodicity));
+  Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (srsPeriodicity));
 
   Box macroUeBox;
   double ueZ = 1.5;
@@ -447,7 +446,7 @@
       macroUeBox = Box (-areaMarginFactor*interSiteDistance, 
                         (nMacroEnbSitesX + areaMarginFactor)*interSiteDistance, 
                         -areaMarginFactor*interSiteDistance, 
-                        (nMacroEnbSitesY -1)*interSiteDistance*sqrt(0.75) + areaMarginFactor*interSiteDistance,
+                        (nMacroEnbSitesY -1)*interSiteDistance*sqrt (0.75) + areaMarginFactor*interSiteDistance,
                         ueZ, ueZ);
     }
   else
@@ -455,7 +454,7 @@
       // still need the box to place femtocell blocks
       macroUeBox = Box (0, 150, 0, 150, ueZ, ueZ);
     }
-  
+
   FemtocellBlockAllocator blockAllocator (macroUeBox, nApartmentsX, nFloors);
   blockAllocator.Create (nBlocks);
 
@@ -465,9 +464,9 @@
   uint32_t nHomeUes = round (nHomeEnbs * homeUesHomeEnbRatio);
   NS_LOG_LOGIC ("nHomeUes = " << nHomeUes);
   double macroUeAreaSize = (macroUeBox.xMax - macroUeBox.xMin) * (macroUeBox.yMax - macroUeBox.yMin);
-  uint32_t nMacroUes = round (macroUeAreaSize * macroUeDensity) ;
+  uint32_t nMacroUes = round (macroUeAreaSize * macroUeDensity);
   NS_LOG_LOGIC ("nMacroUes = " << nMacroUes << " (density=" << macroUeDensity << ")");
-  
+
   NodeContainer homeEnbs;
   homeEnbs.Create (nHomeEnbs);
   NodeContainer macroEnbs;
@@ -492,23 +491,23 @@
 
 //   lteHelper->EnableLogComponents ();
 //   LogComponentEnable ("PfFfMacScheduler", LOG_LEVEL_ALL);
-  
+
   if (!fadingTrace.empty ())
     {
       lteHelper->SetAttribute ("FadingModel", StringValue ("ns3::TraceFadingLossModel"));
-      lteHelper->SetFadingModelAttribute("TraceFilename", StringValue (fadingTrace));
+      lteHelper->SetFadingModelAttribute ("TraceFilename", StringValue (fadingTrace));
     }
 
-  Ptr<EpcHelper> epcHelper;
+  Ptr<PointToPointEpcHelper> epcHelper;
   if (epc)
     {
       NS_LOG_LOGIC ("enabling EPC");
-      epcHelper = CreateObject<EpcHelper> ();
-      lteHelper->SetEpcHelper (epcHelper);      
+      epcHelper = CreateObject<PointToPointEpcHelper> ();
+      lteHelper->SetEpcHelper (epcHelper);
     }
 
   // Macro eNBs in 3-sector hex grid
-  
+
   mobility.Install (macroEnbs);
   BuildingsHelper::Install (macroEnbs);
   Ptr<LteHexGridEnbTopologyHelper> lteHexGridEnbTopologyHelper = CreateObject<LteHexGridEnbTopologyHelper> ();
@@ -533,7 +532,7 @@
     }
   
   // HomeEnbs randomly indoor
-  
+
   Ptr<PositionAllocator> positionAlloc = CreateObject<RandomRoomPositionAllocator> ();
   mobility.SetPositionAllocator (positionAlloc);
   mobility.Install (homeEnbs);
@@ -544,14 +543,17 @@
   lteHelper->SetEnbDeviceAttribute ("UlEarfcn", UintegerValue (homeEnbDlEarfcn + 18000));
   lteHelper->SetEnbDeviceAttribute ("DlBandwidth", UintegerValue (homeEnbBandwidth));
   lteHelper->SetEnbDeviceAttribute ("UlBandwidth", UintegerValue (homeEnbBandwidth));
+  lteHelper->SetEnbDeviceAttribute ("CsgId", UintegerValue (1));
+  lteHelper->SetEnbDeviceAttribute ("CsgIndication", BooleanValue (true));
   NetDeviceContainer homeEnbDevs  = lteHelper->InstallEnbDevice (homeEnbs);
 
-
   // home UEs located in the same apartment in which there are the Home eNBs
   positionAlloc = CreateObject<SameRoomPositionAllocator> (homeEnbs);
   mobility.SetPositionAllocator (positionAlloc);
   mobility.Install (homeUes);
   BuildingsHelper::Install (homeUes);
+  // set the home UE as a CSG member of the home eNodeBs
+  lteHelper->SetUeDeviceAttribute ("CsgId", UintegerValue (1));
   NetDeviceContainer homeUeDevs = lteHelper->InstallUeDevice (homeUes);
 
   // macro Ues
@@ -614,10 +616,11 @@
   Ipv4InterfaceContainer ueIpIfaces;
   Ptr<Node> remoteHost;
   NetDeviceContainer ueDevs;
+
   if (epc)
     {
       NS_LOG_LOGIC ("setting up internet and remote host");
-  
+
       // Create a single RemoteHost
       NodeContainer remoteHostContainer;
       remoteHostContainer.Create (1);
@@ -646,34 +649,38 @@
       ues.Add (homeUes);
       ues.Add (macroUes);
       ueDevs.Add (homeUeDevs);
-      ueDevs.Add (macroUeDevs);      
+      ueDevs.Add (macroUeDevs);
 
-      // Install the IP stack on the UEs      
+      // Install the IP stack on the UEs
       internet.Install (ues);
       ueIpIfaces = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
+
+      // attachment (needs to be done after IP stack configuration)
+      // using initial cell selection
+      lteHelper->Attach (macroUeDevs);
+      lteHelper->Attach (homeUeDevs);
     }
+  else
+    {
+      // macro UEs attached to the closest macro eNB
+      lteHelper->AttachToClosestEnb (macroUeDevs, macroEnbDevs);
 
-  // attachment (needs to be done after IP stack configuration)
-  // macro UEs attached to the closest macro eNB
-  lteHelper->AttachToClosestEnb (macroUeDevs, macroEnbDevs);
-  // each home UE is ttach explicitly to its home eNB
-  NetDeviceContainer::Iterator ueDevIt;
-  NetDeviceContainer::Iterator enbDevIt = homeEnbDevs.Begin ();
-
-  for (ueDevIt = homeUeDevs.Begin ();
-       ueDevIt != homeUeDevs.End ();
-       ++ueDevIt, ++enbDevIt)
-    {
-      // this because of the order in which SameRoomPositionAllocator
-      // will place the UEs
-      if (enbDevIt == homeEnbDevs.End ())
+      // each home UE is attached explicitly to its home eNB
+      NetDeviceContainer::Iterator ueDevIt;
+      NetDeviceContainer::Iterator enbDevIt;
+      for (ueDevIt = homeUeDevs.Begin (), enbDevIt = homeEnbDevs.Begin ();
+           ueDevIt != homeUeDevs.End (); ++ueDevIt, ++enbDevIt)
         {
-          enbDevIt = homeEnbDevs.Begin ();
+          // this because of the order in which SameRoomPositionAllocator
+          // will place the UEs
+          if (enbDevIt == homeEnbDevs.End ())
+            {
+              enbDevIt = homeEnbDevs.Begin ();
+            }
+          lteHelper->Attach (*ueDevIt, *enbDevIt);
         }
-      lteHelper->Attach (*ueDevIt, *enbDevIt);
     }
 
-
   if (epc)
     {
       NS_LOG_LOGIC ("setting up applications");
@@ -687,7 +694,7 @@
       // exactly at the same time) 
       Ptr<UniformRandomVariable> startTimeSeconds = CreateObject<UniformRandomVariable> ();
       if (useUdp)
-        {      
+        {
           startTimeSeconds->SetAttribute ("Min", DoubleValue (0));
           startTimeSeconds->SetAttribute ("Max", DoubleValue (0.010));
         }
@@ -732,7 +739,7 @@
                       clientApps.Add (ulClientHelper.Install (ue));
                       PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", 
                                                            InetSocketAddress (Ipv4Address::GetAny (), ulPort));
-                      serverApps.Add (ulPacketSinkHelper.Install (remoteHost));  
+                      serverApps.Add (ulPacketSinkHelper.Install (remoteHost));
                     }
                 }
               else // use TCP
@@ -749,11 +756,11 @@
                       serverApps.Add (dlPacketSinkHelper.Install (ue));
                     }
                   if (epcUl)
-                    {     
-                      NS_LOG_LOGIC ("installing TCP UL app for UE " << u);              
+                    {
+                      NS_LOG_LOGIC ("installing TCP UL app for UE " << u);
                       BulkSendHelper ulClientHelper ("ns3::TcpSocketFactory",
                                                      InetSocketAddress (remoteHostAddr, ulPort));
-                      ulClientHelper.SetAttribute ("MaxBytes", UintegerValue (0));                  
+                      ulClientHelper.SetAttribute ("MaxBytes", UintegerValue (0));
                       clientApps.Add (ulClientHelper.Install (ue));
                       PacketSinkHelper ulPacketSinkHelper ("ns3::TcpSocketFactory", 
                                                            InetSocketAddress (Ipv4Address::GetAny (), ulPort));
@@ -795,7 +802,7 @@
       // for radio bearer activation purposes, consider together home UEs and macro UEs
       NetDeviceContainer ueDevs;
       ueDevs.Add (homeUeDevs);
-      ueDevs.Add (macroUeDevs);  
+      ueDevs.Add (macroUeDevs);
       for (uint32_t u = 0; u < ueDevs.GetN (); ++u)
         {
           Ptr<NetDevice> ueDev = ueDevs.Get (u);
@@ -830,7 +837,7 @@
     }
   else
     {
-      Simulator::Stop (Seconds (simTime));  
+      Simulator::Stop (Seconds (simTime));
     }
 
   lteHelper->EnableMacTraces ();
diff -Naur ns-3.18.1/src/lte/examples/lena-profiling.cc ns-3.19/src/lte/examples/lena-profiling.cc
--- ns-3.18.1/src/lte/examples/lena-profiling.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/examples/lena-profiling.cc	2013-12-20 09:44:51.000000000 -0800
@@ -1,208 +1,208 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Jaume Nin <jnin@cttc.es>
- */
-
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/mobility-module.h"
-#include "ns3/lte-module.h"
-#include "ns3/config-store.h"
-#include <ns3/buildings-module.h>
-#include <iomanip>
-#include <string>
-#include <vector>
-//#include "ns3/gtk-config-store.h"
-
-using namespace ns3;
-
-int
-main (int argc, char *argv[])
-{
-  uint32_t nEnbPerFloor = 1;
-  uint32_t nUe = 1;
-  uint32_t nFloors = 0;
-  double simTime = 1.0;
-  CommandLine cmd;
-
-  cmd.AddValue ("nEnb", "Number of eNodeBs per floor", nEnbPerFloor);
-  cmd.AddValue ("nUe", "Number of UEs", nUe);
-  cmd.AddValue ("nFloors", "Number of floors, 0 for Friis propagation model",
-                nFloors);
-  cmd.AddValue ("simTime", "Total duration of the simulation (in seconds)",
-                simTime);
-  cmd.Parse (argc, argv);
-
-  ConfigStore inputConfig;
-  inputConfig.ConfigureDefaults ();
-
-  // parse again so you can override default values from the command line
-  cmd.Parse (argc, argv);
-
-  // Geometry of the scenario (in meters)
-  // Assume squared building
-  double nodeHeight = 1.5;
-  double roomHeight = 3;
-  double roomLength = 8;
-  uint32_t nRooms = std::ceil (std::sqrt (nEnbPerFloor));
-  uint32_t nEnb;
-
-  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  //lteHelper->EnableLogComponents ();
-  //LogComponentEnable ("BuildingsPropagationLossModel", LOG_LEVEL_ALL);
-  if (nFloors == 0)
-    {
-      lteHelper->SetAttribute ("PathlossModel",
-                               StringValue ("ns3::FriisPropagationLossModel"));
-      nEnb = nEnbPerFloor;
-    }
-  else
-    {
-      lteHelper->SetAttribute ("PathlossModel",
-                               StringValue ("ns3::HybridBuildingsPropagationLossModel"));
-      nEnb = nFloors * nEnbPerFloor;
-    }
-
-  // Create Nodes: eNodeB and UE
-  NodeContainer enbNodes;
-  std::vector<NodeContainer> ueNodes;
-
-  enbNodes.Create (nEnb);
-  for (uint32_t i = 0; i < nEnb; i++)
-    {
-      NodeContainer ueNode;
-      ueNode.Create (nUe);
-      ueNodes.push_back (ueNode);
-    }
-
-  MobilityHelper mobility;
-  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-  std::vector<Vector> enbPosition;
-  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
-  Ptr<Building> building;
-
-  if (nFloors == 0)
-    {
-      // Position of eNBs
-      uint32_t plantedEnb = 0;
-      for (uint32_t row = 0; row < nRooms; row++)
-        {
-          for (uint32_t column = 0; column < nRooms && plantedEnb < nEnbPerFloor; column++, plantedEnb++)
-            {
-              Vector v (roomLength * (column + 0.5), roomLength * (row + 0.5), nodeHeight);
-              positionAlloc->Add (v);
-              enbPosition.push_back (v);
-              mobility.Install (ueNodes.at(plantedEnb));
-            }
-        }
-      mobility.SetPositionAllocator (positionAlloc);
-      mobility.Install (enbNodes);
-      BuildingsHelper::Install (enbNodes);
-
-      // Position of UEs attached to eNB
-      for (uint32_t i = 0; i < nEnb; i++)
-        {
-          Ptr<UniformRandomVariable> posX = CreateObject<UniformRandomVariable> ();
-          posX->SetAttribute ("Min", DoubleValue (enbPosition.at(i).x - roomLength * 0.5));
-          posX->SetAttribute ("Max", DoubleValue (enbPosition.at(i).x + roomLength * 0.5));
-          Ptr<UniformRandomVariable> posY = CreateObject<UniformRandomVariable> ();
-          posY->SetAttribute ("Min", DoubleValue (enbPosition.at(i).y - roomLength * 0.5));
-          posY->SetAttribute ("Max", DoubleValue (enbPosition.at(i).y + roomLength * 0.5));
-          positionAlloc = CreateObject<ListPositionAllocator> ();
-          for (uint32_t j = 0; j < nUe; j++)
-            {
-              positionAlloc->Add (Vector (posX->GetValue (), posY->GetValue (), nodeHeight));
-              mobility.SetPositionAllocator (positionAlloc);
-            }
-          mobility.Install (ueNodes.at(i));
-          BuildingsHelper::Install (ueNodes.at(i));
-        }
-
-    }
-  else
-    {
-      building = CreateObject<Building> ();
-      building->SetBoundaries (Box (0.0, nRooms * roomLength,
-                                    0.0, nRooms * roomLength,
-                                    0.0, nFloors* roomHeight));
-      building->SetBuildingType (Building::Residential);
-      building->SetExtWallsType (Building::ConcreteWithWindows);
-      building->SetNFloors (nFloors);
-      building->SetNRoomsX (nRooms);
-      building->SetNRoomsY (nRooms);
-      mobility.Install (enbNodes);
-      BuildingsHelper::Install (enbNodes);
-      uint32_t plantedEnb = 0;
-      for (uint32_t floor = 0; floor < nFloors; floor++)
-        {
-          uint32_t plantedEnbPerFloor = 0;
-          for (uint32_t row = 0; row < nRooms; row++)
-            {
-              for (uint32_t column = 0; column < nRooms && plantedEnbPerFloor < nEnbPerFloor; column++, plantedEnb++, plantedEnbPerFloor++)
-                {
-                  Vector v (roomLength * (column + 0.5),
-                            roomLength * (row + 0.5),
-                            nodeHeight + roomHeight * floor);
-                  positionAlloc->Add (v);
-                  enbPosition.push_back (v);
-                  Ptr<MobilityModel> mmEnb = enbNodes.Get (plantedEnb)->GetObject<MobilityModel> ();
-                  mmEnb->SetPosition (v);
-
-                  // Positioning UEs attached to eNB
-                  mobility.Install (ueNodes.at(plantedEnb));
-                  BuildingsHelper::Install (ueNodes.at(plantedEnb));
-                  for (uint32_t ue = 0; ue < nUe; ue++)
-                    {
-                      Ptr<MobilityModel> mmUe = ueNodes.at(plantedEnb).Get (ue)->GetObject<MobilityModel> ();
-                      Vector vUe (v.x, v.y, v.z);
-                      mmUe->SetPosition (vUe);
-                    }
-                }
-            }
-        }
-    }
-
-
-  // Create Devices and install them in the Nodes (eNB and UE)
-  NetDeviceContainer enbDevs;
-  std::vector<NetDeviceContainer> ueDevs;
-  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
-  for (uint32_t i = 0; i < nEnb; i++)
-    {
-      NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at(i));
-      ueDevs.push_back (ueDev);
-      lteHelper->Attach (ueDev, enbDevs.Get (i));
-      enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
-      EpsBearer bearer (q);
-      lteHelper->ActivateDataRadioBearer (ueDev, bearer);
-    }
-
-
-  BuildingsHelper::MakeMobilityModelConsistent ();
-
-  Simulator::Stop (Seconds (simTime));
-  lteHelper->EnableTraces ();
-
-  Simulator::Run ();
-
-  /*GtkConfigStore config;
-  config.ConfigureAttributes ();*/
-
-  Simulator::Destroy ();
-  return 0;
-}
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Jaume Nin <jnin@cttc.es>
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/lte-module.h"
+#include "ns3/config-store.h"
+#include <ns3/buildings-module.h>
+#include <iomanip>
+#include <string>
+#include <vector>
+//#include "ns3/gtk-config-store.h"
+
+using namespace ns3;
+
+int
+main (int argc, char *argv[])
+{
+  uint32_t nEnbPerFloor = 1;
+  uint32_t nUe = 1;
+  uint32_t nFloors = 0;
+  double simTime = 1.0;
+  CommandLine cmd;
+
+  cmd.AddValue ("nEnb", "Number of eNodeBs per floor", nEnbPerFloor);
+  cmd.AddValue ("nUe", "Number of UEs", nUe);
+  cmd.AddValue ("nFloors", "Number of floors, 0 for Friis propagation model",
+                nFloors);
+  cmd.AddValue ("simTime", "Total duration of the simulation (in seconds)",
+                simTime);
+  cmd.Parse (argc, argv);
+
+  ConfigStore inputConfig;
+  inputConfig.ConfigureDefaults ();
+
+  // parse again so you can override default values from the command line
+  cmd.Parse (argc, argv);
+
+  // Geometry of the scenario (in meters)
+  // Assume squared building
+  double nodeHeight = 1.5;
+  double roomHeight = 3;
+  double roomLength = 8;
+  uint32_t nRooms = std::ceil (std::sqrt (nEnbPerFloor));
+  uint32_t nEnb;
+
+  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+  //lteHelper->EnableLogComponents ();
+  //LogComponentEnable ("BuildingsPropagationLossModel", LOG_LEVEL_ALL);
+  if (nFloors == 0)
+    {
+      lteHelper->SetAttribute ("PathlossModel",
+                               StringValue ("ns3::FriisPropagationLossModel"));
+      nEnb = nEnbPerFloor;
+    }
+  else
+    {
+      lteHelper->SetAttribute ("PathlossModel",
+                               StringValue ("ns3::HybridBuildingsPropagationLossModel"));
+      nEnb = nFloors * nEnbPerFloor;
+    }
+
+  // Create Nodes: eNodeB and UE
+  NodeContainer enbNodes;
+  std::vector<NodeContainer> ueNodes;
+
+  enbNodes.Create (nEnb);
+  for (uint32_t i = 0; i < nEnb; i++)
+    {
+      NodeContainer ueNode;
+      ueNode.Create (nUe);
+      ueNodes.push_back (ueNode);
+    }
+
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  std::vector<Vector> enbPosition;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  Ptr<Building> building;
+
+  if (nFloors == 0)
+    {
+      // Position of eNBs
+      uint32_t plantedEnb = 0;
+      for (uint32_t row = 0; row < nRooms; row++)
+        {
+          for (uint32_t column = 0; column < nRooms && plantedEnb < nEnbPerFloor; column++, plantedEnb++)
+            {
+              Vector v (roomLength * (column + 0.5), roomLength * (row + 0.5), nodeHeight);
+              positionAlloc->Add (v);
+              enbPosition.push_back (v);
+              mobility.Install (ueNodes.at(plantedEnb));
+            }
+        }
+      mobility.SetPositionAllocator (positionAlloc);
+      mobility.Install (enbNodes);
+      BuildingsHelper::Install (enbNodes);
+
+      // Position of UEs attached to eNB
+      for (uint32_t i = 0; i < nEnb; i++)
+        {
+          Ptr<UniformRandomVariable> posX = CreateObject<UniformRandomVariable> ();
+          posX->SetAttribute ("Min", DoubleValue (enbPosition.at(i).x - roomLength * 0.5));
+          posX->SetAttribute ("Max", DoubleValue (enbPosition.at(i).x + roomLength * 0.5));
+          Ptr<UniformRandomVariable> posY = CreateObject<UniformRandomVariable> ();
+          posY->SetAttribute ("Min", DoubleValue (enbPosition.at(i).y - roomLength * 0.5));
+          posY->SetAttribute ("Max", DoubleValue (enbPosition.at(i).y + roomLength * 0.5));
+          positionAlloc = CreateObject<ListPositionAllocator> ();
+          for (uint32_t j = 0; j < nUe; j++)
+            {
+              positionAlloc->Add (Vector (posX->GetValue (), posY->GetValue (), nodeHeight));
+              mobility.SetPositionAllocator (positionAlloc);
+            }
+          mobility.Install (ueNodes.at(i));
+          BuildingsHelper::Install (ueNodes.at(i));
+        }
+
+    }
+  else
+    {
+      building = CreateObject<Building> ();
+      building->SetBoundaries (Box (0.0, nRooms * roomLength,
+                                    0.0, nRooms * roomLength,
+                                    0.0, nFloors* roomHeight));
+      building->SetBuildingType (Building::Residential);
+      building->SetExtWallsType (Building::ConcreteWithWindows);
+      building->SetNFloors (nFloors);
+      building->SetNRoomsX (nRooms);
+      building->SetNRoomsY (nRooms);
+      mobility.Install (enbNodes);
+      BuildingsHelper::Install (enbNodes);
+      uint32_t plantedEnb = 0;
+      for (uint32_t floor = 0; floor < nFloors; floor++)
+        {
+          uint32_t plantedEnbPerFloor = 0;
+          for (uint32_t row = 0; row < nRooms; row++)
+            {
+              for (uint32_t column = 0; column < nRooms && plantedEnbPerFloor < nEnbPerFloor; column++, plantedEnb++, plantedEnbPerFloor++)
+                {
+                  Vector v (roomLength * (column + 0.5),
+                            roomLength * (row + 0.5),
+                            nodeHeight + roomHeight * floor);
+                  positionAlloc->Add (v);
+                  enbPosition.push_back (v);
+                  Ptr<MobilityModel> mmEnb = enbNodes.Get (plantedEnb)->GetObject<MobilityModel> ();
+                  mmEnb->SetPosition (v);
+
+                  // Positioning UEs attached to eNB
+                  mobility.Install (ueNodes.at(plantedEnb));
+                  BuildingsHelper::Install (ueNodes.at(plantedEnb));
+                  for (uint32_t ue = 0; ue < nUe; ue++)
+                    {
+                      Ptr<MobilityModel> mmUe = ueNodes.at(plantedEnb).Get (ue)->GetObject<MobilityModel> ();
+                      Vector vUe (v.x, v.y, v.z);
+                      mmUe->SetPosition (vUe);
+                    }
+                }
+            }
+        }
+    }
+
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  NetDeviceContainer enbDevs;
+  std::vector<NetDeviceContainer> ueDevs;
+  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
+  for (uint32_t i = 0; i < nEnb; i++)
+    {
+      NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at(i));
+      ueDevs.push_back (ueDev);
+      lteHelper->Attach (ueDev, enbDevs.Get (i));
+      enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
+      EpsBearer bearer (q);
+      lteHelper->ActivateDataRadioBearer (ueDev, bearer);
+    }
+
+
+  BuildingsHelper::MakeMobilityModelConsistent ();
+
+  Simulator::Stop (Seconds (simTime));
+  lteHelper->EnableTraces ();
+
+  Simulator::Run ();
+
+  /*GtkConfigStore config;
+  config.ConfigureAttributes ();*/
+
+  Simulator::Destroy ();
+  return 0;
+}
diff -Naur ns-3.18.1/src/lte/examples/lena-rem-sector-antenna.cc ns-3.19/src/lte/examples/lena-rem-sector-antenna.cc
--- ns-3.18.1/src/lte/examples/lena-rem-sector-antenna.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/examples/lena-rem-sector-antenna.cc	2013-12-20 09:44:51.000000000 -0800
@@ -1,230 +1,230 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Jaume Nin <jnin@cttc.es>
- */
-
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/mobility-module.h"
-#include "ns3/lte-module.h"
-#include "ns3/config-store.h"
-#include <ns3/buildings-propagation-loss-model.h>
-#include <ns3/buildings-helper.h>
-#include <ns3/radio-environment-map-helper.h>
-#include <iomanip>
-#include <string>
-#include <vector>
-//#include "ns3/gtk-config-store.h"
-
-using namespace ns3;
-using std::vector;
-
-int
-main (int argc, char *argv[])
-{
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  ConfigStore inputConfig;
-  inputConfig.ConfigureDefaults ();
-
-  cmd.Parse (argc, argv);
-
-  // Geometry of the scenario (in meters)
-  // Assume squared building
-  double nodeHeight = 1.5;
-  double roomHeight = 3;
-  double roomLength = 500;
-  uint32_t nRooms = 2;
-  // Create one eNodeB per room + one 3 sector eNodeB (i.e. 3 eNodeB) + one regular eNodeB
-  uint32_t nEnb = nRooms*nRooms + 4;
-  uint32_t nUe = 1;
-
-  Ptr < LteHelper > lteHelper = CreateObject<LteHelper> ();
-  //lteHelper->EnableLogComponents ();
-  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisPropagationLossModel"));
-
-  // Create Nodes: eNodeB and UE
-  NodeContainer enbNodes;
-  NodeContainer oneSectorNodes;
-  NodeContainer threeSectorNodes;
-  vector < NodeContainer > ueNodes;
-
-  oneSectorNodes.Create (nEnb-3);
-  threeSectorNodes.Create (3);
-
-  enbNodes.Add (oneSectorNodes);
-  enbNodes.Add (threeSectorNodes);
-
-  for (uint32_t i = 0; i < nEnb; i++)
-    {
-      NodeContainer ueNode;
-      ueNode.Create (nUe);
-      ueNodes.push_back (ueNode);
-    }
-
-  MobilityHelper mobility;
-  vector<Vector> enbPosition;
-  Ptr < ListPositionAllocator > positionAlloc = CreateObject<ListPositionAllocator> ();
-  Ptr < Building > building;
-  building = Create<Building> ();
-  building->SetBoundaries (Box (0.0, nRooms * roomLength,
-                                0.0, nRooms * roomLength,
-                                0.0, roomHeight));
-  building->SetBuildingType (Building::Residential);
-  building->SetExtWallsType (Building::ConcreteWithWindows);
-  building->SetNFloors (1);
-  building->SetNRoomsX (nRooms);
-  building->SetNRoomsY (nRooms);
-  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
-  mobility.Install (enbNodes);
-  BuildingsHelper::Install (enbNodes);
-  uint32_t plantedEnb = 0;
-  for (uint32_t row = 0; row < nRooms; row++)
-    {
-      for (uint32_t column = 0; column < nRooms; column++, plantedEnb++)
-        {
-          Vector v (roomLength * (column + 0.5),
-                    roomLength * (row + 0.5),
-                    nodeHeight );
-          positionAlloc->Add (v);
-          enbPosition.push_back (v);
-          Ptr<MobilityModel> mmEnb = enbNodes.Get (plantedEnb)->GetObject<MobilityModel> ();
-          mmEnb->SetPosition (v);
-        }
-    }
-
-  // Add a 1-sector site
-  Vector v (500, 3000, nodeHeight);
-  positionAlloc->Add (v);
-  enbPosition.push_back (v);
-  mobility.Install (ueNodes.at(plantedEnb));
-  plantedEnb++;
-
-  // Add the 3-sector site
-  for (uint32_t index = 0; index < 3; index++, plantedEnb++)
-    {
-      Vector v (500, 2000, nodeHeight);
-      positionAlloc->Add (v);
-      enbPosition.push_back (v);
-      mobility.Install (ueNodes.at(plantedEnb));
-    }
-
-
-  mobility.SetPositionAllocator (positionAlloc);
-  mobility.Install (enbNodes);
-
-  // Position of UEs attached to eNB
-  for (uint32_t i = 0; i < nEnb; i++)
-    {
-      Ptr<UniformRandomVariable> posX = CreateObject<UniformRandomVariable> ();
-      posX->SetAttribute ("Min", DoubleValue (enbPosition.at(i).x - roomLength * 0));
-      posX->SetAttribute ("Max", DoubleValue (enbPosition.at(i).x + roomLength * 0));
-      Ptr<UniformRandomVariable> posY = CreateObject<UniformRandomVariable> ();
-      posY->SetAttribute ("Min", DoubleValue (enbPosition.at(i).y - roomLength * 0));
-      posY->SetAttribute ("Max", DoubleValue (enbPosition.at(i).y + roomLength * 0));
-      positionAlloc = CreateObject<ListPositionAllocator> ();
-      for (uint32_t j = 0; j < nUe; j++)
-        {
-          if ( i == nEnb - 3 )
-            {
-              positionAlloc->Add (Vector (enbPosition.at(i).x + 10, enbPosition.at(i).y, nodeHeight));
-            }
-          else if ( i == nEnb - 2 )
-            {
-              positionAlloc->Add (Vector (enbPosition.at(i).x - std::sqrt (10), enbPosition.at(i).y + std::sqrt (10), nodeHeight));
-            }
-          else if ( i == nEnb - 1 )
-            {
-              positionAlloc->Add (Vector (enbPosition.at(i).x - std::sqrt (10), enbPosition.at(i).y - std::sqrt (10), nodeHeight));
-            }
-          else
-            {
-              positionAlloc->Add (Vector (posX->GetValue (), posY->GetValue (), nodeHeight));
-            }
-          mobility.SetPositionAllocator (positionAlloc);
-        }
-      mobility.Install (ueNodes.at(i));
-      BuildingsHelper::Install (ueNodes.at(i));
-    }
-
-  // Create Devices and install them in the Nodes (eNB and UE)
-  NetDeviceContainer enbDevs;
-  vector < NetDeviceContainer > ueDevs;
-
-  // power setting in dBm for small cells
-  Config::SetDefault ("ns3::LteEnbPhy::TxPower", DoubleValue (20.0));
-  enbDevs = lteHelper->InstallEnbDevice (oneSectorNodes);
-
-
-  // power setting for three-sector macrocell
-  Config::SetDefault ("ns3::LteEnbPhy::TxPower", DoubleValue (43.0));
-
-  // Beam width is made quite narrow so sectors can be noticed in the REM
-  lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
-  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (0));
-  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
-  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
-  enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (0)));
-
-  lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
-  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (360/3));
-  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
-  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
-  enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (1)));
-
-  lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
-  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (2*360/3));
-  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
-  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
-  enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (2)));
-
-  for (uint32_t i = 0; i < nEnb; i++)
-    {
-      NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at(i));
-      ueDevs.push_back (ueDev);
-      lteHelper->Attach (ueDev, enbDevs.Get (i));
-      enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
-      EpsBearer bearer (q);
-      lteHelper->ActivateDataRadioBearer (ueDev, bearer);
-    }
-
-  BuildingsHelper::MakeMobilityModelConsistent ();
-
-  // by default, simulation will anyway stop right after the REM has been generated
-  Simulator::Stop (Seconds (0.0069));  
-
-  Ptr<RadioEnvironmentMapHelper> remHelper = CreateObject<RadioEnvironmentMapHelper> ();
-  remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0"));
-  remHelper->SetAttribute ("OutputFile", StringValue ("rem.out"));
-  remHelper->SetAttribute ("XMin", DoubleValue (-2000.0));
-  remHelper->SetAttribute ("XMax", DoubleValue (+2000.0));
-  remHelper->SetAttribute ("YMin", DoubleValue (-500.0));
-  remHelper->SetAttribute ("YMax", DoubleValue (+3500.0));
-  remHelper->SetAttribute ("Z", DoubleValue (1.5));
-  remHelper->Install ();
-
-  Simulator::Run ();
-
-//  GtkConfigStore config;
-//  config.ConfigureAttributes ();
-
-  lteHelper = 0;
-  Simulator::Destroy ();
-  return 0;
-}
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Jaume Nin <jnin@cttc.es>
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/lte-module.h"
+#include "ns3/config-store.h"
+#include <ns3/buildings-propagation-loss-model.h>
+#include <ns3/buildings-helper.h>
+#include <ns3/radio-environment-map-helper.h>
+#include <iomanip>
+#include <string>
+#include <vector>
+//#include "ns3/gtk-config-store.h"
+
+using namespace ns3;
+using std::vector;
+
+int
+main (int argc, char *argv[])
+{
+  CommandLine cmd;
+  cmd.Parse (argc, argv);
+
+  ConfigStore inputConfig;
+  inputConfig.ConfigureDefaults ();
+
+  cmd.Parse (argc, argv);
+
+  // Geometry of the scenario (in meters)
+  // Assume squared building
+  double nodeHeight = 1.5;
+  double roomHeight = 3;
+  double roomLength = 500;
+  uint32_t nRooms = 2;
+  // Create one eNodeB per room + one 3 sector eNodeB (i.e. 3 eNodeB) + one regular eNodeB
+  uint32_t nEnb = nRooms*nRooms + 4;
+  uint32_t nUe = 1;
+
+  Ptr < LteHelper > lteHelper = CreateObject<LteHelper> ();
+  //lteHelper->EnableLogComponents ();
+  lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisPropagationLossModel"));
+
+  // Create Nodes: eNodeB and UE
+  NodeContainer enbNodes;
+  NodeContainer oneSectorNodes;
+  NodeContainer threeSectorNodes;
+  vector < NodeContainer > ueNodes;
+
+  oneSectorNodes.Create (nEnb-3);
+  threeSectorNodes.Create (3);
+
+  enbNodes.Add (oneSectorNodes);
+  enbNodes.Add (threeSectorNodes);
+
+  for (uint32_t i = 0; i < nEnb; i++)
+    {
+      NodeContainer ueNode;
+      ueNode.Create (nUe);
+      ueNodes.push_back (ueNode);
+    }
+
+  MobilityHelper mobility;
+  vector<Vector> enbPosition;
+  Ptr < ListPositionAllocator > positionAlloc = CreateObject<ListPositionAllocator> ();
+  Ptr < Building > building;
+  building = Create<Building> ();
+  building->SetBoundaries (Box (0.0, nRooms * roomLength,
+                                0.0, nRooms * roomLength,
+                                0.0, roomHeight));
+  building->SetBuildingType (Building::Residential);
+  building->SetExtWallsType (Building::ConcreteWithWindows);
+  building->SetNFloors (1);
+  building->SetNRoomsX (nRooms);
+  building->SetNRoomsY (nRooms);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (enbNodes);
+  BuildingsHelper::Install (enbNodes);
+  uint32_t plantedEnb = 0;
+  for (uint32_t row = 0; row < nRooms; row++)
+    {
+      for (uint32_t column = 0; column < nRooms; column++, plantedEnb++)
+        {
+          Vector v (roomLength * (column + 0.5),
+                    roomLength * (row + 0.5),
+                    nodeHeight );
+          positionAlloc->Add (v);
+          enbPosition.push_back (v);
+          Ptr<MobilityModel> mmEnb = enbNodes.Get (plantedEnb)->GetObject<MobilityModel> ();
+          mmEnb->SetPosition (v);
+        }
+    }
+
+  // Add a 1-sector site
+  Vector v (500, 3000, nodeHeight);
+  positionAlloc->Add (v);
+  enbPosition.push_back (v);
+  mobility.Install (ueNodes.at(plantedEnb));
+  plantedEnb++;
+
+  // Add the 3-sector site
+  for (uint32_t index = 0; index < 3; index++, plantedEnb++)
+    {
+      Vector v (500, 2000, nodeHeight);
+      positionAlloc->Add (v);
+      enbPosition.push_back (v);
+      mobility.Install (ueNodes.at(plantedEnb));
+    }
+
+
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.Install (enbNodes);
+
+  // Position of UEs attached to eNB
+  for (uint32_t i = 0; i < nEnb; i++)
+    {
+      Ptr<UniformRandomVariable> posX = CreateObject<UniformRandomVariable> ();
+      posX->SetAttribute ("Min", DoubleValue (enbPosition.at(i).x - roomLength * 0));
+      posX->SetAttribute ("Max", DoubleValue (enbPosition.at(i).x + roomLength * 0));
+      Ptr<UniformRandomVariable> posY = CreateObject<UniformRandomVariable> ();
+      posY->SetAttribute ("Min", DoubleValue (enbPosition.at(i).y - roomLength * 0));
+      posY->SetAttribute ("Max", DoubleValue (enbPosition.at(i).y + roomLength * 0));
+      positionAlloc = CreateObject<ListPositionAllocator> ();
+      for (uint32_t j = 0; j < nUe; j++)
+        {
+          if ( i == nEnb - 3 )
+            {
+              positionAlloc->Add (Vector (enbPosition.at(i).x + 10, enbPosition.at(i).y, nodeHeight));
+            }
+          else if ( i == nEnb - 2 )
+            {
+              positionAlloc->Add (Vector (enbPosition.at(i).x - std::sqrt (10), enbPosition.at(i).y + std::sqrt (10), nodeHeight));
+            }
+          else if ( i == nEnb - 1 )
+            {
+              positionAlloc->Add (Vector (enbPosition.at(i).x - std::sqrt (10), enbPosition.at(i).y - std::sqrt (10), nodeHeight));
+            }
+          else
+            {
+              positionAlloc->Add (Vector (posX->GetValue (), posY->GetValue (), nodeHeight));
+            }
+          mobility.SetPositionAllocator (positionAlloc);
+        }
+      mobility.Install (ueNodes.at(i));
+      BuildingsHelper::Install (ueNodes.at(i));
+    }
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  NetDeviceContainer enbDevs;
+  vector < NetDeviceContainer > ueDevs;
+
+  // power setting in dBm for small cells
+  Config::SetDefault ("ns3::LteEnbPhy::TxPower", DoubleValue (20.0));
+  enbDevs = lteHelper->InstallEnbDevice (oneSectorNodes);
+
+
+  // power setting for three-sector macrocell
+  Config::SetDefault ("ns3::LteEnbPhy::TxPower", DoubleValue (43.0));
+
+  // Beam width is made quite narrow so sectors can be noticed in the REM
+  lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
+  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (0));
+  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
+  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
+  enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (0)));
+
+  lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
+  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (360/3));
+  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
+  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
+  enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (1)));
+
+  lteHelper->SetEnbAntennaModelType ("ns3::CosineAntennaModel");
+  lteHelper->SetEnbAntennaModelAttribute ("Orientation", DoubleValue (2*360/3));
+  lteHelper->SetEnbAntennaModelAttribute ("Beamwidth",   DoubleValue (100));
+  lteHelper->SetEnbAntennaModelAttribute ("MaxGain",     DoubleValue (0.0));
+  enbDevs.Add ( lteHelper->InstallEnbDevice (threeSectorNodes.Get (2)));
+
+  for (uint32_t i = 0; i < nEnb; i++)
+    {
+      NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at(i));
+      ueDevs.push_back (ueDev);
+      lteHelper->Attach (ueDev, enbDevs.Get (i));
+      enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
+      EpsBearer bearer (q);
+      lteHelper->ActivateDataRadioBearer (ueDev, bearer);
+    }
+
+  BuildingsHelper::MakeMobilityModelConsistent ();
+
+  // by default, simulation will anyway stop right after the REM has been generated
+  Simulator::Stop (Seconds (0.0069));  
+
+  Ptr<RadioEnvironmentMapHelper> remHelper = CreateObject<RadioEnvironmentMapHelper> ();
+  remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0"));
+  remHelper->SetAttribute ("OutputFile", StringValue ("rem.out"));
+  remHelper->SetAttribute ("XMin", DoubleValue (-2000.0));
+  remHelper->SetAttribute ("XMax", DoubleValue (+2000.0));
+  remHelper->SetAttribute ("YMin", DoubleValue (-500.0));
+  remHelper->SetAttribute ("YMax", DoubleValue (+3500.0));
+  remHelper->SetAttribute ("Z", DoubleValue (1.5));
+  remHelper->Install ();
+
+  Simulator::Run ();
+
+//  GtkConfigStore config;
+//  config.ConfigureAttributes ();
+
+  lteHelper = 0;
+  Simulator::Destroy ();
+  return 0;
+}
diff -Naur ns-3.18.1/src/lte/examples/lena-simple-epc.cc ns-3.19/src/lte/examples/lena-simple-epc.cc
--- ns-3.18.1/src/lte/examples/lena-simple-epc.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/examples/lena-simple-epc.cc	2013-12-20 09:44:51.000000000 -0800
@@ -57,7 +57,7 @@
   cmd.Parse(argc, argv);
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper>  epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
 
   ConfigStore inputConfig;
diff -Naur ns-3.18.1/src/lte/examples/lena-x2-handover.cc ns-3.19/src/lte/examples/lena-x2-handover.cc
--- ns-3.18.1/src/lte/examples/lena-x2-handover.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/examples/lena-x2-handover.cc	2013-12-20 09:44:51.000000000 -0800
@@ -29,91 +29,89 @@
 
 using namespace ns3;
 
+NS_LOG_COMPONENT_DEFINE ("LenaX2HandoverExample");
 
-
-void 
-NotifyConnectionEstablishedUe (std::string context, 
-                               uint64_t imsi, 
-                               uint16_t cellid, 
+void
+NotifyConnectionEstablishedUe (std::string context,
+                               uint64_t imsi,
+                               uint16_t cellid,
                                uint16_t rnti)
 {
-  std::cout << context 
-            << " UE IMSI " << imsi 
-            << ": connected to CellId " << cellid 
-            << " with RNTI " << rnti 
+  std::cout << Simulator::Now ().GetSeconds () << " " << context
+            << " UE IMSI " << imsi
+            << ": connected to CellId " << cellid
+            << " with RNTI " << rnti
             << std::endl;
 }
 
-void 
-NotifyHandoverStartUe (std::string context, 
-                       uint64_t imsi, 
-                       uint16_t cellid, 
-                       uint16_t rnti, 
+void
+NotifyHandoverStartUe (std::string context,
+                       uint64_t imsi,
+                       uint16_t cellid,
+                       uint16_t rnti,
                        uint16_t targetCellId)
 {
-  std::cout << context 
-            << " UE IMSI " << imsi 
-            << ": previously connected to CellId " << cellid 
-            << " with RNTI " << rnti 
-            << ", doing handover to CellId " << targetCellId 
+  std::cout << Simulator::Now ().GetSeconds () << " " << context
+            << " UE IMSI " << imsi
+            << ": previously connected to CellId " << cellid
+            << " with RNTI " << rnti
+            << ", doing handover to CellId " << targetCellId
             << std::endl;
 }
 
-void 
-NotifyHandoverEndOkUe (std::string context, 
-                       uint64_t imsi, 
-                       uint16_t cellid, 
+void
+NotifyHandoverEndOkUe (std::string context,
+                       uint64_t imsi,
+                       uint16_t cellid,
                        uint16_t rnti)
 {
-  std::cout << context 
-            << " UE IMSI " << imsi 
-            << ": successful handover to CellId " << cellid 
-            << " with RNTI " << rnti 
+  std::cout << Simulator::Now ().GetSeconds () << " " << context
+            << " UE IMSI " << imsi
+            << ": successful handover to CellId " << cellid
+            << " with RNTI " << rnti
             << std::endl;
 }
 
-void 
-NotifyConnectionEstablishedEnb (std::string context, 
-                                uint64_t imsi, 
-                                uint16_t cellid, 
+void
+NotifyConnectionEstablishedEnb (std::string context,
+                                uint64_t imsi,
+                                uint16_t cellid,
                                 uint16_t rnti)
 {
-  std::cout << context 
-            << " eNB CellId " << cellid 
-            << ": successful connection of UE with IMSI " << imsi 
-            << " RNTI " << rnti 
+  std::cout << Simulator::Now ().GetSeconds () << " " << context
+            << " eNB CellId " << cellid
+            << ": successful connection of UE with IMSI " << imsi
+            << " RNTI " << rnti
             << std::endl;
 }
 
-void 
-NotifyHandoverStartEnb (std::string context, 
-                        uint64_t imsi, 
-                        uint16_t cellid, 
-                        uint16_t rnti, 
+void
+NotifyHandoverStartEnb (std::string context,
+                        uint64_t imsi,
+                        uint16_t cellid,
+                        uint16_t rnti,
                         uint16_t targetCellId)
 {
-  std::cout << context 
-            << " eNB CellId " << cellid 
-            << ": start handover of UE with IMSI " << imsi 
-            << " RNTI " << rnti 
-            << " to CellId " << targetCellId 
+  std::cout << Simulator::Now ().GetSeconds () << " " << context
+            << " eNB CellId " << cellid
+            << ": start handover of UE with IMSI " << imsi
+            << " RNTI " << rnti
+            << " to CellId " << targetCellId
             << std::endl;
 }
 
-void 
-NotifyHandoverEndOkEnb (std::string context, 
-                        uint64_t imsi, 
-                        uint16_t cellid, 
+void
+NotifyHandoverEndOkEnb (std::string context,
+                        uint64_t imsi,
+                        uint16_t cellid,
                         uint16_t rnti)
 {
-  std::cout << context 
-            << " eNB CellId " << cellid 
-            << ": completed handover of UE with IMSI " << imsi 
-            << " RNTI " << rnti 
+  std::cout << Simulator::Now ().GetSeconds () << " " << context
+            << " eNB CellId " << cellid
+            << ": completed handover of UE with IMSI " << imsi
+            << " RNTI " << rnti
             << std::endl;
 }
- 
-
 
 
 /**
@@ -121,7 +119,6 @@
  * It instantiates two eNodeB, attaches one UE to the 'source' eNB and
  * triggers a handover of the UE towards the 'target' eNB.
  */
-NS_LOG_COMPONENT_DEFINE ("EpcX2HandoverExample");
 int
 main (int argc, char *argv[])
 {
@@ -146,23 +143,24 @@
 
   // change some default attributes so that they are reasonable for
   // this scenario, but do this before processing command line
-  // arguments, so that the user is allowed to override these settings 
-  Config::SetDefault ("ns3::UdpClient::Interval", TimeValue (MilliSeconds(10)));
-  Config::SetDefault ("ns3::UdpClient::MaxPackets", UintegerValue(1000000));
-  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue(false));
+  // arguments, so that the user is allowed to override these settings
+  Config::SetDefault ("ns3::UdpClient::Interval", TimeValue (MilliSeconds (10)));
+  Config::SetDefault ("ns3::UdpClient::MaxPackets", UintegerValue (1000000));
+  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (false));
 
   // Command line arguments
   CommandLine cmd;
-  cmd.AddValue("numberOfUes", "Number of UEs", numberOfUes);
-  cmd.AddValue("numberOfEnbs", "Number of eNodeBs", numberOfEnbs);
-  cmd.AddValue("simTime", "Total duration of the simulation (in seconds)",simTime);
-  cmd.Parse(argc, argv);
+  cmd.AddValue ("numberOfUes", "Number of UEs", numberOfUes);
+  cmd.AddValue ("numberOfEnbs", "Number of eNodeBs", numberOfEnbs);
+  cmd.AddValue ("simTime", "Total duration of the simulation (in seconds)", simTime);
+  cmd.Parse (argc, argv);
 
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
-  lteHelper->SetSchedulerType("ns3::RrFfMacScheduler");
+  lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
+  lteHelper->SetHandoverAlgorithmType ("ns3::NoOpHandoverAlgorithm"); // disable automatic handover
 
   Ptr<Node> pgw = epcHelper->GetPgwNode ();
 
@@ -193,24 +191,24 @@
 
   NodeContainer ueNodes;
   NodeContainer enbNodes;
-  enbNodes.Create(numberOfEnbs);
-  ueNodes.Create(numberOfUes);
+  enbNodes.Create (numberOfEnbs);
+  ueNodes.Create (numberOfUes);
 
   // Install Mobility Model
   Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
   for (uint16_t i = 0; i < numberOfEnbs; i++)
     {
-      positionAlloc->Add (Vector(distance * 2*i - distance, 0, 0));
+      positionAlloc->Add (Vector (distance * 2 * i - distance, 0, 0));
     }
   for (uint16_t i = 0; i < numberOfUes; i++)
     {
-      positionAlloc->Add (Vector(0, 0, 0));
+      positionAlloc->Add (Vector (0, 0, 0));
     }
   MobilityHelper mobility;
-  mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
-  mobility.SetPositionAllocator(positionAlloc);
-  mobility.Install(enbNodes);
-  mobility.Install(ueNodes);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.Install (enbNodes);
+  mobility.Install (ueNodes);
 
   // Install LTE Devices in eNB and UEs
   NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice (enbNodes);
@@ -233,23 +231,23 @@
   // Attach all UEs to the first eNodeB
   for (uint16_t i = 0; i < numberOfUes; i++)
     {
-      lteHelper->Attach (ueLteDevs.Get(i), enbLteDevs.Get(0));
+      lteHelper->Attach (ueLteDevs.Get (i), enbLteDevs.Get (0));
     }
 
 
   NS_LOG_LOGIC ("setting up applications");
-    
+
   // Install and start applications on UEs and remote host
   uint16_t dlPort = 10000;
   uint16_t ulPort = 20000;
 
   // randomize a bit start times to avoid simulation artifacts
   // (e.g., buffer overflows due to packet transmissions happening
-  // exactly at the same time) 
+  // exactly at the same time)
   Ptr<UniformRandomVariable> startTimeSeconds = CreateObject<UniformRandomVariable> ();
   startTimeSeconds->SetAttribute ("Min", DoubleValue (0));
   startTimeSeconds->SetAttribute ("Max", DoubleValue (0.010));
-     
+
   for (uint32_t u = 0; u < numberOfUes; ++u)
     {
       Ptr<Node> ue = ueNodes.Get (u);
@@ -264,33 +262,33 @@
 
           ApplicationContainer clientApps;
           ApplicationContainer serverApps;
-          
+
           NS_LOG_LOGIC ("installing UDP DL app for UE " << u);
           UdpClientHelper dlClientHelper (ueIpIfaces.GetAddress (u), dlPort);
           clientApps.Add (dlClientHelper.Install (remoteHost));
-          PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", 
+          PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory",
                                                InetSocketAddress (Ipv4Address::GetAny (), dlPort));
           serverApps.Add (dlPacketSinkHelper.Install (ue));
-              
+
           NS_LOG_LOGIC ("installing UDP UL app for UE " << u);
           UdpClientHelper ulClientHelper (remoteHostAddr, ulPort);
           clientApps.Add (ulClientHelper.Install (ue));
-          PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", 
+          PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory",
                                                InetSocketAddress (Ipv4Address::GetAny (), ulPort));
-          serverApps.Add (ulPacketSinkHelper.Install (remoteHost));  
-             
+          serverApps.Add (ulPacketSinkHelper.Install (remoteHost));
+
           Ptr<EpcTft> tft = Create<EpcTft> ();
           EpcTft::PacketFilter dlpf;
           dlpf.localPortStart = dlPort;
           dlpf.localPortEnd = dlPort;
-          tft->Add (dlpf); 
+          tft->Add (dlpf);
           EpcTft::PacketFilter ulpf;
           ulpf.remotePortStart = ulPort;
           ulpf.remotePortEnd = ulPort;
           tft->Add (ulpf);
           EpsBearer bearer (EpsBearer::NGBR_VIDEO_TCP_DEFAULT);
           lteHelper->ActivateDedicatedEpsBearer (ueLteDevs.Get (u), bearer, tft);
-          
+
           Time startTime = Seconds (startTimeSeconds->GetValue ());
           serverApps.Start (startTime);
           clientApps.Start (startTime);
@@ -304,11 +302,11 @@
 
   // X2-based Handover
   lteHelper->HandoverRequest (Seconds (0.100), ueLteDevs.Get (0), enbLteDevs.Get (0), enbLteDevs.Get (1));
-  
-  
+
   // Uncomment to enable PCAP tracing
   //p2ph.EnablePcapAll("lena-x2-handover");
 
+  lteHelper->EnablePhyTraces ();
   lteHelper->EnableMacTraces ();
   lteHelper->EnableRlcTraces ();
   lteHelper->EnablePdcpTraces ();
@@ -333,13 +331,13 @@
                    MakeCallback (&NotifyHandoverEndOkUe));
 
 
-  Simulator::Stop(Seconds(simTime));
-  Simulator::Run();
+  Simulator::Stop (Seconds (simTime));
+  Simulator::Run ();
 
   // GtkConfigStore config;
-  // config.ConfigureAttributes();
+  // config.ConfigureAttributes ();
 
-  Simulator::Destroy();
+  Simulator::Destroy ();
   return 0;
 
 }
diff -Naur ns-3.18.1/src/lte/examples/lena-x2-handover-measures.cc ns-3.19/src/lte/examples/lena-x2-handover-measures.cc
--- ns-3.18.1/src/lte/examples/lena-x2-handover-measures.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/examples/lena-x2-handover-measures.cc	2013-12-20 09:44:51.000000000 -0800
@@ -27,12 +27,92 @@
 #include "ns3/point-to-point-module.h"
 #include "ns3/config-store-module.h"
 
-#include <iomanip>
-
 using namespace ns3;
 
 NS_LOG_COMPONENT_DEFINE ("LenaX2HandoverMeasures");
 
+void
+NotifyConnectionEstablishedUe (std::string context,
+                               uint64_t imsi,
+                               uint16_t cellid,
+                               uint16_t rnti)
+{
+  std::cout << context
+            << " UE IMSI " << imsi
+            << ": connected to CellId " << cellid
+            << " with RNTI " << rnti
+            << std::endl;
+}
+
+void
+NotifyHandoverStartUe (std::string context,
+                       uint64_t imsi,
+                       uint16_t cellid,
+                       uint16_t rnti,
+                       uint16_t targetCellId)
+{
+  std::cout << context
+            << " UE IMSI " << imsi
+            << ": previously connected to CellId " << cellid
+            << " with RNTI " << rnti
+            << ", doing handover to CellId " << targetCellId
+            << std::endl;
+}
+
+void
+NotifyHandoverEndOkUe (std::string context,
+                       uint64_t imsi,
+                       uint16_t cellid,
+                       uint16_t rnti)
+{
+  std::cout << context
+            << " UE IMSI " << imsi
+            << ": successful handover to CellId " << cellid
+            << " with RNTI " << rnti
+            << std::endl;
+}
+
+void
+NotifyConnectionEstablishedEnb (std::string context,
+                                uint64_t imsi,
+                                uint16_t cellid,
+                                uint16_t rnti)
+{
+  std::cout << context
+            << " eNB CellId " << cellid
+            << ": successful connection of UE with IMSI " << imsi
+            << " RNTI " << rnti
+            << std::endl;
+}
+
+void
+NotifyHandoverStartEnb (std::string context,
+                        uint64_t imsi,
+                        uint16_t cellid,
+                        uint16_t rnti,
+                        uint16_t targetCellId)
+{
+  std::cout << context
+            << " eNB CellId " << cellid
+            << ": start handover of UE with IMSI " << imsi
+            << " RNTI " << rnti
+            << " to CellId " << targetCellId
+            << std::endl;
+}
+
+void
+NotifyHandoverEndOkEnb (std::string context,
+                        uint64_t imsi,
+                        uint16_t cellid,
+                        uint16_t rnti)
+{
+  std::cout << context
+            << " eNB CellId " << cellid
+            << ": completed handover of UE with IMSI " << imsi
+            << " RNTI " << rnti
+            << std::endl;
+}
+
 
 /**
  * Sample simulation script for an automatic X2-based handover based on the RSRQ measures.
@@ -44,7 +124,7 @@
 int
 main (int argc, char *argv[])
 {
-  // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
+  // LogLevel logLevel = (LogLevel)(LOG_PREFIX_ALL | LOG_LEVEL_ALL);
 
   // LogComponentEnable ("LteHelper", logLevel);
   // LogComponentEnable ("EpcHelper", logLevel);
@@ -56,37 +136,51 @@
   // LogComponentEnable ("LteEnbNetDevice", logLevel);
   // LogComponentEnable ("LteUeRrc", logLevel);
   // LogComponentEnable ("LteUeNetDevice", logLevel);
+  // LogComponentEnable ("A2A4RsrqHandoverAlgorithm", logLevel);
+  // LogComponentEnable ("A3RsrpHandoverAlgorithm", logLevel);
 
   uint16_t numberOfUes = 1;
   uint16_t numberOfEnbs = 2;
   uint16_t numBearersPerUe = 0;
-  double distance = 1000.0; // m
-  double yForUe = 1000.0;   // m
-  double speed = 20;        // m/s
-  double simTime = 3.0 * distance / speed; // 3000 m / 20 m/s = 150 secs
-  double enbTxPowerDbm = 20.0;
+  double distance = 500.0; // m
+  double yForUe = 500.0;   // m
+  double speed = 20;       // m/s
+  double simTime = (double)(numberOfEnbs + 1) * distance / speed; // 1500 m / 20 m/s = 75 secs
+  double enbTxPowerDbm = 46.0;
 
   // change some default attributes so that they are reasonable for
   // this scenario, but do this before processing command line
-  // arguments, so that the user is allowed to override these settings 
-  Config::SetDefault ("ns3::UdpClient::Interval", TimeValue (MilliSeconds(10)));
-  Config::SetDefault ("ns3::UdpClient::MaxPackets", UintegerValue(1000000));
-  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue(true));
+  // arguments, so that the user is allowed to override these settings
+  Config::SetDefault ("ns3::UdpClient::Interval", TimeValue (MilliSeconds (10)));
+  Config::SetDefault ("ns3::UdpClient::MaxPackets", UintegerValue (1000000));
+  Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
 
   // Command line arguments
   CommandLine cmd;
-  cmd.AddValue("simTime", "Total duration of the simulation (in seconds)", simTime);
-  cmd.AddValue("speed", "Speed of the UE (default = 20 m/s)", speed);
-  cmd.AddValue("enbTxPowerDbm", "TX power [dBm] used by HeNBs (defalut = 20.0)", enbTxPowerDbm);
+  cmd.AddValue ("simTime", "Total duration of the simulation (in seconds)", simTime);
+  cmd.AddValue ("speed", "Speed of the UE (default = 20 m/s)", speed);
+  cmd.AddValue ("enbTxPowerDbm", "TX power [dBm] used by HeNBs (defalut = 46.0)", enbTxPowerDbm);
 
-  cmd.Parse(argc, argv);
+  cmd.Parse (argc, argv);
 
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
   lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
 
+  lteHelper->SetHandoverAlgorithmType ("ns3::A2A4RsrqHandoverAlgorithm");
+  lteHelper->SetHandoverAlgorithmAttribute ("ServingCellThreshold",
+                                            UintegerValue (30));
+  lteHelper->SetHandoverAlgorithmAttribute ("NeighbourCellOffset",
+                                            UintegerValue (1));
+
+  //  lteHelper->SetHandoverAlgorithmType ("ns3::A3RsrpHandoverAlgorithm");
+  //  lteHelper->SetHandoverAlgorithmAttribute ("Hysteresis",
+  //                                            DoubleValue (3.0));
+  //  lteHelper->SetHandoverAlgorithmAttribute ("TimeToTrigger",
+  //                                            TimeValue (MilliSeconds (256)));
+
   Ptr<Node> pgw = epcHelper->GetPgwNode ();
 
   // Create a single RemoteHost
@@ -114,6 +208,21 @@
   // interface 0 is localhost, 1 is the p2p device
   remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
 
+  /*
+   * Network topology:
+   *
+   *      |     + --------------------------------------------------------->
+   *      |     UE
+   *      |
+   *      |               d                   d                   d
+   *    y |     |-------------------x-------------------x-------------------
+   *      |     |                 eNodeB              eNodeB
+   *      |   d |
+   *      |     |
+   *      |     |                                             d = distance
+   *            o (0, 0, 0)                                   y = yForUe
+   */
+
   NodeContainer ueNodes;
   NodeContainer enbNodes;
   enbNodes.Create (numberOfEnbs);
@@ -127,14 +236,14 @@
       enbPositionAlloc->Add (enbPosition);
     }
   MobilityHelper enbMobility;
-  enbMobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
-  enbMobility.SetPositionAllocator(enbPositionAlloc);
-  enbMobility.Install(enbNodes);
+  enbMobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  enbMobility.SetPositionAllocator (enbPositionAlloc);
+  enbMobility.Install (enbNodes);
 
   // Install Mobility Model in UE
   MobilityHelper ueMobility;
   ueMobility.SetMobilityModel ("ns3::ConstantVelocityMobilityModel");
-  ueMobility.Install(ueNodes);
+  ueMobility.Install (ueNodes);
   ueNodes.Get (0)->GetObject<MobilityModel> ()->SetPosition (Vector (0, yForUe, 0));
   ueNodes.Get (0)->GetObject<ConstantVelocityMobilityModel> ()->SetVelocity (Vector (speed, 0, 0));
 
@@ -160,23 +269,23 @@
   // Attach all UEs to the first eNodeB
   for (uint16_t i = 0; i < numberOfUes; i++)
     {
-      lteHelper->Attach (ueLteDevs.Get(i), enbLteDevs.Get(0));
+      lteHelper->Attach (ueLteDevs.Get (i), enbLteDevs.Get (0));
     }
 
 
   NS_LOG_LOGIC ("setting up applications");
-    
+
   // Install and start applications on UEs and remote host
   uint16_t dlPort = 10000;
   uint16_t ulPort = 20000;
 
   // randomize a bit start times to avoid simulation artifacts
   // (e.g., buffer overflows due to packet transmissions happening
-  // exactly at the same time) 
+  // exactly at the same time)
   Ptr<UniformRandomVariable> startTimeSeconds = CreateObject<UniformRandomVariable> ();
   startTimeSeconds->SetAttribute ("Min", DoubleValue (0));
   startTimeSeconds->SetAttribute ("Max", DoubleValue (0.010));
-     
+
   for (uint32_t u = 0; u < numberOfUes; ++u)
     {
       Ptr<Node> ue = ueNodes.Get (u);
@@ -195,22 +304,22 @@
           NS_LOG_LOGIC ("installing UDP DL app for UE " << u);
           UdpClientHelper dlClientHelper (ueIpIfaces.GetAddress (u), dlPort);
           clientApps.Add (dlClientHelper.Install (remoteHost));
-          PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory", 
+          PacketSinkHelper dlPacketSinkHelper ("ns3::UdpSocketFactory",
                                                InetSocketAddress (Ipv4Address::GetAny (), dlPort));
           serverApps.Add (dlPacketSinkHelper.Install (ue));
 
           NS_LOG_LOGIC ("installing UDP UL app for UE " << u);
           UdpClientHelper ulClientHelper (remoteHostAddr, ulPort);
           clientApps.Add (ulClientHelper.Install (ue));
-          PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory", 
+          PacketSinkHelper ulPacketSinkHelper ("ns3::UdpSocketFactory",
                                                InetSocketAddress (Ipv4Address::GetAny (), ulPort));
-          serverApps.Add (ulPacketSinkHelper.Install (remoteHost));  
+          serverApps.Add (ulPacketSinkHelper.Install (remoteHost));
 
           Ptr<EpcTft> tft = Create<EpcTft> ();
           EpcTft::PacketFilter dlpf;
           dlpf.localPortStart = dlPort;
           dlpf.localPortEnd = dlPort;
-          tft->Add (dlpf); 
+          tft->Add (dlpf);
           EpcTft::PacketFilter ulpf;
           ulpf.remotePortStart = ulPort;
           ulpf.remotePortEnd = ulPort;
@@ -221,6 +330,7 @@
           Time startTime = Seconds (startTimeSeconds->GetValue ());
           serverApps.Start (startTime);
           clientApps.Start (startTime);
+
         } // end for b
     }
 
@@ -229,11 +339,10 @@
   lteHelper->AddX2Interface (enbNodes);
 
   // X2-based Handover
-//   lteHelper->HandoverRequest (Seconds (0.100), ueLteDevs.Get (0), enbLteDevs.Get (0), enbLteDevs.Get (1));
-  
-  
+  //lteHelper->HandoverRequest (Seconds (0.100), ueLteDevs.Get (0), enbLteDevs.Get (0), enbLteDevs.Get (1));
+
   // Uncomment to enable PCAP tracing
-  //p2ph.EnablePcapAll("lena-x2-handover");
+  // p2ph.EnablePcapAll("lena-x2-handover-measures");
 
   lteHelper->EnablePhyTraces ();
   lteHelper->EnableMacTraces ();
@@ -244,14 +353,28 @@
   Ptr<RadioBearerStatsCalculator> pdcpStats = lteHelper->GetPdcpStats ();
   pdcpStats->SetAttribute ("EpochDuration", TimeValue (Seconds (1.0)));
 
+  // connect custom trace sinks for RRC connection establishment and handover notification
+  Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/ConnectionEstablished",
+                   MakeCallback (&NotifyConnectionEstablishedEnb));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
+                   MakeCallback (&NotifyConnectionEstablishedUe));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverStart",
+                   MakeCallback (&NotifyHandoverStartEnb));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverStart",
+                   MakeCallback (&NotifyHandoverStartUe));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverEndOk",
+                   MakeCallback (&NotifyHandoverEndOkEnb));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/HandoverEndOk",
+                   MakeCallback (&NotifyHandoverEndOkUe));
+
 
-  Simulator::Stop(Seconds(simTime));
-  Simulator::Run();
+  Simulator::Stop (Seconds (simTime));
+  Simulator::Run ();
 
   // GtkConfigStore config;
-  // config.ConfigureAttributes();
+  // config.ConfigureAttributes ();
 
-  Simulator::Destroy();
+  Simulator::Destroy ();
   return 0;
 
 }
diff -Naur ns-3.18.1/src/lte/helper/epc-helper.cc ns-3.19/src/lte/helper/epc-helper.cc
--- ns-3.18.1/src/lte/helper/epc-helper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/epc-helper.cc	2013-12-20 09:44:51.000000000 -0800
@@ -1,6 +1,6 @@
 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2011-2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ * Copyright (c) 2011-2013 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -22,84 +22,21 @@
 
 #include <ns3/epc-helper.h>
 #include <ns3/log.h>
-#include <ns3/inet-socket-address.h>
-#include <ns3/mac48-address.h>
-#include <ns3/eps-bearer.h>
+#include <ns3/node.h>
 #include <ns3/ipv4-address.h>
-#include <ns3/internet-stack-helper.h>
-#include <ns3/point-to-point-helper.h>
-#include <ns3/packet-socket-helper.h>
-#include <ns3/packet-socket-address.h>
-#include <ns3/epc-enb-application.h>
-#include <ns3/epc-sgw-pgw-application.h>
-
-#include <ns3/lte-enb-rrc.h>
-#include <ns3/epc-x2.h>
-#include <ns3/lte-enb-net-device.h>
-#include <ns3/lte-ue-net-device.h>
-#include <ns3/epc-mme.h>
-#include <ns3/epc-ue-nas.h>
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("EpcHelper");
+NS_LOG_COMPONENT_DEFINE ("EpcHelper")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (EpcHelper);
+NS_OBJECT_ENSURE_REGISTERED (EpcHelper)
+  ;
 
 
 EpcHelper::EpcHelper () 
-  : m_gtpuUdpPort (2152)  // fixed by the standard
 {
   NS_LOG_FUNCTION (this);
-
-  // since we use point-to-point links for all S1-U links, 
-  // we use a /30 subnet which can hold exactly two addresses 
-  // (remember that net broadcast and null address are not valid)
-  m_s1uIpv4AddressHelper.SetBase ("10.0.0.0", "255.255.255.252");
-
-  m_x2Ipv4AddressHelper.SetBase ("12.0.0.0", "255.255.255.252");
-
-  // we use a /8 net for all UEs
-  m_ueAddressHelper.SetBase ("7.0.0.0", "255.0.0.0");
-  
-  // create SgwPgwNode
-  m_sgwPgw = CreateObject<Node> ();
-  InternetStackHelper internet;
-  internet.Install (m_sgwPgw);
-  
-  // create S1-U socket
-  Ptr<Socket> sgwPgwS1uSocket = Socket::CreateSocket (m_sgwPgw, TypeId::LookupByName ("ns3::UdpSocketFactory"));
-  int retval = sgwPgwS1uSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), m_gtpuUdpPort));
-  NS_ASSERT (retval == 0);
-
-  // create TUN device implementing tunneling of user data over GTP-U/UDP/IP 
-  m_tunDevice = CreateObject<VirtualNetDevice> ();
-  // allow jumbo packets
-  m_tunDevice->SetAttribute ("Mtu", UintegerValue (30000));
-
-  // yes we need this
-  m_tunDevice->SetAddress (Mac48Address::Allocate ()); 
-
-  m_sgwPgw->AddDevice (m_tunDevice);
-  NetDeviceContainer tunDeviceContainer;
-  tunDeviceContainer.Add (m_tunDevice);
-  
-  // the TUN device is on the same subnet as the UEs, so when a packet
-  // addressed to an UE arrives at the intenet to the WAN interface of
-  // the PGW it will be forwarded to the TUN device. 
-  Ipv4InterfaceContainer tunDeviceIpv4IfContainer = m_ueAddressHelper.Assign (tunDeviceContainer);  
-
-  // create EpcSgwPgwApplication
-  m_sgwPgwApp = CreateObject<EpcSgwPgwApplication> (m_tunDevice, sgwPgwS1uSocket);
-  m_sgwPgw->AddApplication (m_sgwPgwApp);
-  
-  // connect SgwPgwApplication and virtual net device for tunneling
-  m_tunDevice->SetSendCallback (MakeCallback (&EpcSgwPgwApplication::RecvFromTunDevice, m_sgwPgwApp));
-
-  // Create MME and connect with SGW via S11 interface
-  m_mme = CreateObject<EpcMme> ();
-  m_mme->SetS11SapSgw (m_sgwPgwApp->GetS11SapSgw ());
-  m_sgwPgwApp->SetS11SapMme (m_mme->GetS11SapMme ());
 }
 
 EpcHelper::~EpcHelper ()
@@ -112,38 +49,7 @@
 {
   static TypeId tid = TypeId ("ns3::EpcHelper")
     .SetParent<Object> ()
-    .AddConstructor<EpcHelper> ()
-    .AddAttribute ("S1uLinkDataRate", 
-                   "The data rate to be used for the next S1-U link to be created",
-                   DataRateValue (DataRate ("10Gb/s")),
-                   MakeDataRateAccessor (&EpcHelper::m_s1uLinkDataRate),
-                   MakeDataRateChecker ())
-    .AddAttribute ("S1uLinkDelay", 
-                   "The delay to be used for the next S1-U link to be created",
-                   TimeValue (Seconds (0)),
-                   MakeTimeAccessor (&EpcHelper::m_s1uLinkDelay),
-                   MakeTimeChecker ())
-    .AddAttribute ("S1uLinkMtu", 
-                   "The MTU of the next S1-U link to be created. Note that, because of the additional GTP/UDP/IP tunneling overhead, you need a MTU larger than the end-to-end MTU that you want to support.",
-                   UintegerValue (2000),
-                   MakeUintegerAccessor (&EpcHelper::m_s1uLinkMtu),
-                   MakeUintegerChecker<uint16_t> ())
-    .AddAttribute ("X2LinkDataRate",
-                   "The data rate to be used for the next X2 link to be created",
-                   DataRateValue (DataRate ("10Gb/s")),
-                   MakeDataRateAccessor (&EpcHelper::m_x2LinkDataRate),
-                   MakeDataRateChecker ())
-    .AddAttribute ("X2LinkDelay",
-                   "The delay to be used for the next X2 link to be created",
-                   TimeValue (Seconds (0)),
-                   MakeTimeAccessor (&EpcHelper::m_x2LinkDelay),
-                   MakeTimeChecker ())
-    .AddAttribute ("X2LinkMtu",
-                   "The MTU of the next X2 link to be created. Note that, because of some big X2 messages, you need a big MTU.",
-                   UintegerValue (3000),
-                   MakeUintegerAccessor (&EpcHelper::m_x2LinkMtu),
-                   MakeUintegerChecker<uint16_t> ())
-  ;
+    ;
   return tid;
 }
 
@@ -151,194 +57,9 @@
 EpcHelper::DoDispose ()
 {
   NS_LOG_FUNCTION (this);
-  m_tunDevice->SetSendCallback (MakeNullCallback<bool, Ptr<Packet>, const Address&, const Address&, uint16_t> ());
-  m_tunDevice = 0;
-  m_sgwPgwApp = 0;  
-  m_sgwPgw->Dispose ();
-}
-
-
-void
-EpcHelper::AddEnb (Ptr<Node> enb, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId)
-{
-  NS_LOG_FUNCTION (this << enb << lteEnbNetDevice << cellId);
-
-  NS_ASSERT (enb == lteEnbNetDevice->GetNode ());
-
-  // add an IPv4 stack to the previously created eNB
-  InternetStackHelper internet;
-  internet.Install (enb);
-  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB after node creation: " << enb->GetObject<Ipv4> ()->GetNInterfaces ());
-
-  // create a point to point link between the new eNB and the SGW with
-  // the corresponding new NetDevices on each side  
-  NodeContainer enbSgwNodes;
-  enbSgwNodes.Add (m_sgwPgw);
-  enbSgwNodes.Add (enb);
-  PointToPointHelper p2ph;
-  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (m_s1uLinkDataRate));
-  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (m_s1uLinkMtu));
-  p2ph.SetChannelAttribute ("Delay", TimeValue (m_s1uLinkDelay));  
-  NetDeviceContainer enbSgwDevices = p2ph.Install (enb, m_sgwPgw);
-  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB after installing p2p dev: " << enb->GetObject<Ipv4> ()->GetNInterfaces ());  
-  Ptr<NetDevice> enbDev = enbSgwDevices.Get (0);
-  Ptr<NetDevice> sgwDev = enbSgwDevices.Get (1);
-  m_s1uIpv4AddressHelper.NewNetwork ();
-  Ipv4InterfaceContainer enbSgwIpIfaces = m_s1uIpv4AddressHelper.Assign (enbSgwDevices);
-  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB after assigning Ipv4 addr to S1 dev: " << enb->GetObject<Ipv4> ()->GetNInterfaces ());
-  
-  Ipv4Address enbAddress = enbSgwIpIfaces.GetAddress (0);
-  Ipv4Address sgwAddress = enbSgwIpIfaces.GetAddress (1);
-
-  // create S1-U socket for the ENB
-  Ptr<Socket> enbS1uSocket = Socket::CreateSocket (enb, TypeId::LookupByName ("ns3::UdpSocketFactory"));
-  int retval = enbS1uSocket->Bind (InetSocketAddress (enbAddress, m_gtpuUdpPort));
-  NS_ASSERT (retval == 0);
-  
-
-  // give PacketSocket powers to the eNB
-  //PacketSocketHelper packetSocket;
-  //packetSocket.Install (enb); 
-  
-  // create LTE socket for the ENB 
-  Ptr<Socket> enbLteSocket = Socket::CreateSocket (enb, TypeId::LookupByName ("ns3::PacketSocketFactory"));
-  PacketSocketAddress enbLteSocketBindAddress;
-  enbLteSocketBindAddress.SetSingleDevice (lteEnbNetDevice->GetIfIndex ());
-  enbLteSocketBindAddress.SetProtocol (Ipv4L3Protocol::PROT_NUMBER);
-  retval = enbLteSocket->Bind (enbLteSocketBindAddress);
-  NS_ASSERT (retval == 0);  
-  PacketSocketAddress enbLteSocketConnectAddress;
-  enbLteSocketConnectAddress.SetPhysicalAddress (Mac48Address::GetBroadcast ());
-  enbLteSocketConnectAddress.SetSingleDevice (lteEnbNetDevice->GetIfIndex ());
-  enbLteSocketConnectAddress.SetProtocol (Ipv4L3Protocol::PROT_NUMBER);
-  retval = enbLteSocket->Connect (enbLteSocketConnectAddress);
-  NS_ASSERT (retval == 0);  
-  
-
-  NS_LOG_INFO ("create EpcEnbApplication");
-  Ptr<EpcEnbApplication> enbApp = CreateObject<EpcEnbApplication> (enbLteSocket, enbS1uSocket, enbAddress, sgwAddress, cellId);
-  enb->AddApplication (enbApp);
-  NS_ASSERT (enb->GetNApplications () == 1);
-  NS_ASSERT_MSG (enb->GetApplication (0)->GetObject<EpcEnbApplication> () != 0, "cannot retrieve EpcEnbApplication");
-  NS_LOG_LOGIC ("enb: " << enb << ", enb->GetApplication (0): " << enb->GetApplication (0));
-
-  
-  NS_LOG_INFO ("Create EpcX2 entity");
-  Ptr<EpcX2> x2 = CreateObject<EpcX2> ();
-  enb->AggregateObject (x2);
-
-  NS_LOG_INFO ("connect S1-AP interface");
-  m_mme->AddEnb (cellId, enbAddress, enbApp->GetS1apSapEnb ());
-  m_sgwPgwApp->AddEnb (cellId, enbAddress, sgwAddress);
-  enbApp->SetS1apSapMme (m_mme->GetS1apSapMme ());
+  Object::DoDispose ();
 }
 
 
-void
-EpcHelper::AddX2Interface (Ptr<Node> enb1, Ptr<Node> enb2)
-{
-  NS_LOG_FUNCTION (this << enb1 << enb2);
-
-  // Create a point to point link between the two eNBs with
-  // the corresponding new NetDevices on each side
-  NodeContainer enbNodes;
-  enbNodes.Add (enb1);
-  enbNodes.Add (enb2);
-  PointToPointHelper p2ph;
-  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (m_x2LinkDataRate));
-  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (m_x2LinkMtu));
-  p2ph.SetChannelAttribute ("Delay", TimeValue (m_x2LinkDelay));
-  NetDeviceContainer enbDevices = p2ph.Install (enb1, enb2);
-  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB #1 after installing p2p dev: " << enb1->GetObject<Ipv4> ()->GetNInterfaces ());
-  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB #2 after installing p2p dev: " << enb2->GetObject<Ipv4> ()->GetNInterfaces ());
-  Ptr<NetDevice> enb1Dev = enbDevices.Get (0);
-  Ptr<NetDevice> enb2Dev = enbDevices.Get (1);
-
-  m_x2Ipv4AddressHelper.NewNetwork ();
-  Ipv4InterfaceContainer enbIpIfaces = m_x2Ipv4AddressHelper.Assign (enbDevices);
-  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB #1 after assigning Ipv4 addr to X2 dev: " << enb1->GetObject<Ipv4> ()->GetNInterfaces ());
-  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB #2 after assigning Ipv4 addr to X2 dev: " << enb2->GetObject<Ipv4> ()->GetNInterfaces ());
-
-  Ipv4Address enb1X2Address = enbIpIfaces.GetAddress (0);
-  Ipv4Address enb2X2Address = enbIpIfaces.GetAddress (1);
-
-  // Add X2 interface to both eNBs' X2 entities
-  Ptr<EpcX2> enb1X2 = enb1->GetObject<EpcX2> ();
-  Ptr<LteEnbNetDevice> enb1LteDev = enb1->GetDevice (0)->GetObject<LteEnbNetDevice> ();
-  uint16_t enb1CellId = enb1LteDev->GetCellId ();
-  NS_LOG_LOGIC ("LteEnbNetDevice #1 = " << enb1LteDev << " - CellId = " << enb1CellId);
-
-  Ptr<EpcX2> enb2X2 = enb2->GetObject<EpcX2> ();
-  Ptr<LteEnbNetDevice> enb2LteDev = enb2->GetDevice (0)->GetObject<LteEnbNetDevice> ();
-  uint16_t enb2CellId = enb2LteDev->GetCellId ();
-  NS_LOG_LOGIC ("LteEnbNetDevice #2 = " << enb2LteDev << " - CellId = " << enb2CellId);
-
-  enb1X2->AddX2Interface (enb1CellId, enb1X2Address, enb2CellId, enb2X2Address);
-  enb2X2->AddX2Interface (enb2CellId, enb2X2Address, enb1CellId, enb1X2Address);
-
-  enb1LteDev->GetRrc ()->AddX2Neighbour (enb2LteDev->GetCellId ());
-  enb2LteDev->GetRrc ()->AddX2Neighbour (enb1LteDev->GetCellId ());
-}
-
-
-void 
-EpcHelper::AddUe (Ptr<NetDevice> ueDevice, uint64_t imsi)
-{
-  NS_LOG_FUNCTION (this << imsi << ueDevice );
-  
-  m_mme->AddUe (imsi);
-  m_sgwPgwApp->AddUe (imsi);
-  
-
-}
-
-void
-EpcHelper::ActivateEpsBearer (Ptr<NetDevice> ueDevice, uint64_t imsi, Ptr<EpcTft> tft, EpsBearer bearer)
-{
-  NS_LOG_FUNCTION (this << ueDevice << imsi);
-
-  // we now retrieve the IPv4 address of the UE and notify it to the SGW;
-  // we couldn't do it before since address assignment is triggered by
-  // the user simulation program, rather than done by the EPC   
-  Ptr<Node> ueNode = ueDevice->GetNode (); 
-  Ptr<Ipv4> ueIpv4 = ueNode->GetObject<Ipv4> ();
-  NS_ASSERT_MSG (ueIpv4 != 0, "UEs need to have IPv4 installed before EPS bearers can be activated");
-  int32_t interface =  ueIpv4->GetInterfaceForDevice (ueDevice);
-  NS_ASSERT (interface >= 0);
-  NS_ASSERT (ueIpv4->GetNAddresses (interface) == 1);
-  Ipv4Address ueAddr = ueIpv4->GetAddress (interface, 0).GetLocal ();
-  NS_LOG_LOGIC (" UE IP address: " << ueAddr);  m_sgwPgwApp->SetUeAddress (imsi, ueAddr);
-  
-  m_mme->AddBearer (imsi, tft, bearer);
-  Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice> ();
-  if (ueLteDevice)
-    {
-      ueLteDevice->GetNas ()->ActivateEpsBearer (bearer, tft);
-    }
-}
-
-
-Ptr<Node>
-EpcHelper::GetPgwNode ()
-{
-  return m_sgwPgw;
-}
-
-
-Ipv4InterfaceContainer 
-EpcHelper::AssignUeIpv4Address (NetDeviceContainer ueDevices)
-{
-  return m_ueAddressHelper.Assign (ueDevices);
-}
-
-
-
-Ipv4Address
-EpcHelper::GetUeDefaultGatewayAddress ()
-{
-  // return the address of the tun device
-  return m_sgwPgw->GetObject<Ipv4> ()->GetAddress (1, 0).GetLocal ();
-}
-
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/lte/helper/epc-helper.h ns-3.19/src/lte/helper/epc-helper.h
--- ns-3.18.1/src/lte/helper/epc-helper.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/epc-helper.h	2013-12-20 09:44:51.000000000 -0800
@@ -1,6 +1,6 @@
 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2011-2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ * Copyright (c) 2011-2013 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -39,12 +39,11 @@
 class EpcMme;
 
 /**
- * \brief Helper class to handle the creation of the EPC entities and protocols.
+ * \brief Base helper class to handle the creation of the EPC entities.
  *
- * This Helper will create an EPC network topology comprising of a
- * single node that implements both the SGW and PGW functionality, and
- * is connected to all the eNBs in the simulation by means of the S1-U
- * interface. 
+ * This class provides the API for the implementation of helpers that
+ * allow to create EPC entities and the nodes and interfaces that host
+ * and connect them. 
  */
 class EpcHelper : public Object
 {
@@ -73,7 +72,7 @@
    * \param lteEnbNetDevice the LteEnbNetDevice of the eNB node
    * \param cellId ID of the eNB
    */
-  void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId);
+  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId) = 0;
 
   /** 
    * Notify the EPC of the existance of a new UE which might attach at a later time
@@ -81,7 +80,7 @@
    * \param ueLteDevice the UE device to be attached
    * \param imsi the unique identifier of the UE
    */
-  void AddUe (Ptr<NetDevice> ueLteDevice, uint64_t imsi);
+  virtual void AddUe (Ptr<NetDevice> ueLteDevice, uint64_t imsi) = 0;
 
   /** 
    * Add an X2 interface between two eNB
@@ -89,7 +88,7 @@
    * \param enbNode1 one eNB peer of the X2 interface
    * \param enbNode2 the other eNB peer of the X2 interface
    */
-  void AddX2Interface (Ptr<Node> enbNode1, Ptr<Node> enbNode2);
+  virtual void AddX2Interface (Ptr<Node> enbNode1, Ptr<Node> enbNode2) = 0;
 
   /** 
    * Activate an EPS bearer, setting up the corresponding S1-U tunnel.
@@ -102,7 +101,7 @@
    * \param tft the Traffic Flow Template of the new bearer
    * \param bearer struct describing the characteristics of the EPS bearer to be activated
    */
-  void ActivateEpsBearer (Ptr<NetDevice> ueLteDevice, uint64_t imsi, Ptr<EpcTft> tft, EpsBearer bearer);
+  virtual void ActivateEpsBearer (Ptr<NetDevice> ueLteDevice, uint64_t imsi, Ptr<EpcTft> tft, EpsBearer bearer) = 0;
 
 
   /** 
@@ -113,7 +112,7 @@
    * intended for this method is to allow the user to configure the Gi
    * interface of the PGW, i.e., to connect the PGW to the internet.
    */
-  Ptr<Node> GetPgwNode ();
+  virtual Ptr<Node> GetPgwNode () = 0;
 
   /** 
    * Assign IPv4 addresses to UE devices
@@ -122,66 +121,16 @@
    * 
    * \return the interface container, \see Ipv4AddressHelper::Assign() which has similar semantics
    */
-  Ipv4InterfaceContainer AssignUeIpv4Address (NetDeviceContainer ueDevices);
+  virtual Ipv4InterfaceContainer AssignUeIpv4Address (NetDeviceContainer ueDevices) = 0;
 
 
   /** 
    * 
    * \return the address of the Default Gateway to be used by UEs to reach the internet
    */
-  Ipv4Address GetUeDefaultGatewayAddress ();
+  virtual Ipv4Address GetUeDefaultGatewayAddress () = 0;
 
 
-
-private:
-
-  /**
-   * SGW-PGW network element
-   */
-
-  /** 
-   * helper to assign addresses to UE devices as well as to the TUN device of the SGW/PGW
-   */
-  Ipv4AddressHelper m_ueAddressHelper; 
-  
-  Ptr<Node> m_sgwPgw; 
-  Ptr<EpcSgwPgwApplication> m_sgwPgwApp;
-  Ptr<VirtualNetDevice> m_tunDevice;
-  Ptr<EpcMme> m_mme;
-
-  /**
-   * S1-U interfaces
-   */
-
-  /** 
-   * helper to assign addresses to S1-U NetDevices 
-   */
-  Ipv4AddressHelper m_s1uIpv4AddressHelper; 
-
-  DataRate m_s1uLinkDataRate;
-  Time     m_s1uLinkDelay;
-  uint16_t m_s1uLinkMtu;
-
-  /**
-   * UDP port where the GTP-U Socket is bound, fixed by the standard as 2152
-   */
-  uint16_t m_gtpuUdpPort;
-
-  /**
-   * Map storing for each IMSI the corresponding eNB NetDevice
-   * 
-   */
-  std::map<uint64_t, Ptr<NetDevice> > m_imsiEnbDeviceMap;
-  
-  /** 
-   * helper to assign addresses to X2 NetDevices 
-   */
-  Ipv4AddressHelper m_x2Ipv4AddressHelper;   
-
-  DataRate m_x2LinkDataRate;
-  Time     m_x2LinkDelay;
-  uint16_t m_x2LinkMtu;
-
 };
 
 
diff -Naur ns-3.18.1/src/lte/helper/lte-global-pathloss-database.cc ns-3.19/src/lte/helper/lte-global-pathloss-database.cc
--- ns-3.18.1/src/lte/helper/lte-global-pathloss-database.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/lte-global-pathloss-database.cc	2013-12-20 09:44:51.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("LteGlobalPathlossDatabase");
+NS_LOG_COMPONENT_DEFINE ("LteGlobalPathlossDatabase")
+  ;
 
 
 LteGlobalPathlossDatabase::~LteGlobalPathlossDatabase (void)
diff -Naur ns-3.18.1/src/lte/helper/lte-helper.cc ns-3.19/src/lte/helper/lte-helper.cc
--- ns-3.18.1/src/lte/helper/lte-helper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/lte-helper.cc	2013-12-20 09:44:51.000000000 -0800
@@ -43,6 +43,8 @@
 #include <ns3/lte-enb-net-device.h>
 #include <ns3/lte-ue-net-device.h>
 #include <ns3/ff-mac-scheduler.h>
+#include <ns3/lte-handover-algorithm.h>
+#include <ns3/lte-anr.h>
 #include <ns3/lte-rlc.h>
 #include <ns3/lte-rlc-um.h>
 #include <ns3/lte-rlc-am.h>
@@ -63,16 +65,18 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteHelper);
+NS_OBJECT_ENSURE_REGISTERED (LteHelper)
+  ;
 
 LteHelper::LteHelper (void)
-  :  m_fadingStreamsAssigned (false),
-     m_imsiCounter (0),
-     m_cellIdCounter (0)
+  : m_fadingStreamsAssigned (false),
+    m_imsiCounter (0),
+    m_cellIdCounter (0)
 {
   NS_LOG_FUNCTION (this);
   m_enbNetDeviceFactory.SetTypeId (LteEnbNetDevice::GetTypeId ());
   m_enbAntennaModelFactory.SetTypeId (IsotropicAntennaModel::GetTypeId ());
+  m_ueNetDeviceFactory.SetTypeId (LteUeNetDevice::GetTypeId ());
   m_ueAntennaModelFactory.SetTypeId (IsotropicAntennaModel::GetTypeId ());
   m_channelFactory.SetTypeId (MultiModelSpectrumChannel::GetTypeId ());
 }
@@ -145,7 +149,16 @@
                    "The allowed values for this attributes are the type names "
                    "of any class inheriting from ns3::FfMacScheduler.",
                    StringValue ("ns3::PfFfMacScheduler"),
-                   MakeStringAccessor (&LteHelper::SetSchedulerType, &LteHelper::GetSchedulerType),
+                   MakeStringAccessor (&LteHelper::SetSchedulerType,
+                                       &LteHelper::GetSchedulerType),
+                   MakeStringChecker ())
+    .AddAttribute ("HandoverAlgorithm",
+                   "The type of handover algorithm to be used for eNBs. "
+                   "The allowed values for this attributes are the type names "
+                   "of any class inheriting from ns3::HandoverAlgorithm.",
+                   StringValue ("ns3::NoOpHandoverAlgorithm"),
+                   MakeStringAccessor (&LteHelper::SetHandoverAlgorithmType,
+                                       &LteHelper::GetHandoverAlgorithmType),
                    MakeStringChecker ())
     .AddAttribute ("PathlossModel",
                    "The type of pathloss model to be used. "
@@ -168,6 +181,11 @@
                    BooleanValue (true), 
                    MakeBooleanAccessor (&LteHelper::m_useIdealRrc),
                    MakeBooleanChecker ())
+    .AddAttribute ("AnrEnabled",
+                   "Activate or deactivate Automatic Neighbour Relation function",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&LteHelper::m_isAnrEnabled),
+                   MakeBooleanChecker ())
   ;
   return tid;
 }
@@ -210,6 +228,27 @@
   m_schedulerFactory.Set (n, v);
 }
 
+std::string
+LteHelper::GetHandoverAlgorithmType () const
+{
+  return m_handoverAlgorithmFactory.GetTypeId ().GetName ();
+}
+
+void
+LteHelper::SetHandoverAlgorithmType (std::string type)
+{
+  NS_LOG_FUNCTION (this << type);
+  m_handoverAlgorithmFactory = ObjectFactory ();
+  m_handoverAlgorithmFactory.SetTypeId (type);
+}
+
+void
+LteHelper::SetHandoverAlgorithmAttribute (std::string n, const AttributeValue &v)
+{
+  NS_LOG_FUNCTION (this << n);
+  m_handoverAlgorithmFactory.Set (n, v);
+}
+
 
 void 
 LteHelper::SetPathlossModelType (std::string type) 
@@ -251,6 +290,13 @@
   m_enbAntennaModelFactory.Set (n, v);
 }
 
+void
+LteHelper::SetUeDeviceAttribute (std::string n, const AttributeValue &v)
+{
+  NS_LOG_FUNCTION (this);
+  m_ueNetDeviceFactory.Set (n, v);
+}
+
 void 
 LteHelper::SetUeAntennaModelType (std::string type)
 {
@@ -368,6 +414,7 @@
 
   Ptr<LteEnbMac> mac = CreateObject<LteEnbMac> ();
   Ptr<FfMacScheduler> sched = m_schedulerFactory.Create<FfMacScheduler> ();
+  Ptr<LteHandoverAlgorithm> handoverAlgorithm = m_handoverAlgorithmFactory.Create<LteHandoverAlgorithm> ();
   Ptr<LteEnbRrc> rrc = CreateObject<LteEnbRrc> ();
 
   if (m_useIdealRrc)
@@ -402,6 +449,9 @@
   mac->SetLteEnbCmacSapUser (rrc->GetLteEnbCmacSapUser ());
   rrc->SetLteMacSapProvider (mac->GetLteMacSapProvider ());
 
+  rrc->SetLteHandoverManagementSapProvider (handoverAlgorithm->GetLteHandoverManagementSapProvider ());
+  handoverAlgorithm->SetLteHandoverManagementSapUser (rrc->GetLteHandoverManagementSapUser ());
+
   mac->SetFfMacSchedSapProvider (sched->GetFfMacSchedSapProvider ());
   mac->SetFfMacCschedSapProvider (sched->GetFfMacCschedSapProvider ());
 
@@ -411,7 +461,6 @@
   phy->SetLteEnbPhySapUser (mac->GetLteEnbPhySapUser ());
   mac->SetLteEnbPhySapProvider (phy->GetLteEnbPhySapProvider ());
 
-
   phy->SetLteEnbCphySapUser (rrc->GetLteEnbCphySapUser ());
   rrc->SetLteEnbCphySapProvider (phy->GetLteEnbCphySapProvider ());
 
@@ -422,6 +471,15 @@
   dev->SetAttribute ("LteEnbMac", PointerValue (mac));
   dev->SetAttribute ("FfMacScheduler", PointerValue (sched));
   dev->SetAttribute ("LteEnbRrc", PointerValue (rrc)); 
+  dev->SetAttribute ("LteHandoverAlgorithm", PointerValue (handoverAlgorithm));
+
+  if (m_isAnrEnabled)
+    {
+      Ptr<LteAnr> anr = CreateObject<LteAnr> (cellId);
+      rrc->SetLteAnrSapProvider (anr->GetLteAnrSapProvider ());
+      anr->SetLteAnrSapUser (rrc->GetLteAnrSapUser ());
+      dev->SetAttribute ("LteAnr", PointerValue (anr));
+    }
 
   phy->SetDevice (dev);
   dlPhy->SetDevice (dev);
@@ -448,7 +506,6 @@
     {
       NS_LOG_WARN ("UL propagation model does not have a Frequency attribute");
     }
-  
 
   dev->Initialize ();
 
@@ -464,7 +521,7 @@
       // S1 SAPs
       rrc->SetS1SapProvider (enbApp->GetS1SapProvider ());
       enbApp->SetS1SapUser (rrc->GetS1SapUser ());
-      
+
       // X2 SAPs
       Ptr<EpcX2> x2 = n->GetObject<EpcX2> ();
       x2->SetEpcX2SapUser (rrc->GetEpcX2SapUser ());
@@ -493,7 +550,7 @@
 
   Ptr<LteInterferencePowerChunkProcessor> pInterf = Create<LteInterferencePowerChunkProcessor> (phy);
   dlPhy->AddInterferenceCtrlChunkProcessor (pInterf); // for RSRQ evaluation of UE Measurements
-  
+
   Ptr<LteCtrlSinrChunkProcessor> pCtrl = Create<LteCtrlSinrChunkProcessor> (phy->GetObject<LtePhy> (), dlPhy);
   dlPhy->AddCtrlSinrChunkProcessor (pCtrl);
 
@@ -517,20 +574,20 @@
   Ptr<LteUeRrc> rrc = CreateObject<LteUeRrc> ();
 
   if (m_useIdealRrc)
-    {      
-      Ptr<LteUeRrcProtocolIdeal> rrcProtocol = CreateObject<LteUeRrcProtocolIdeal> ();      
+    {
+      Ptr<LteUeRrcProtocolIdeal> rrcProtocol = CreateObject<LteUeRrcProtocolIdeal> ();
       rrcProtocol->SetUeRrc (rrc);
       rrc->AggregateObject (rrcProtocol);
       rrcProtocol->SetLteUeRrcSapProvider (rrc->GetLteUeRrcSapProvider ());
-      rrc->SetLteUeRrcSapUser (rrcProtocol->GetLteUeRrcSapUser ());      
+      rrc->SetLteUeRrcSapUser (rrcProtocol->GetLteUeRrcSapUser ());
     }
   else
     {
-      Ptr<LteUeRrcProtocolReal> rrcProtocol = CreateObject<LteUeRrcProtocolReal> ();      
+      Ptr<LteUeRrcProtocolReal> rrcProtocol = CreateObject<LteUeRrcProtocolReal> ();
       rrcProtocol->SetUeRrc (rrc);
       rrc->AggregateObject (rrcProtocol);
       rrcProtocol->SetLteUeRrcSapProvider (rrc->GetLteUeRrcSapProvider ());
-      rrc->SetLteUeRrcSapUser (rrcProtocol->GetLteUeRrcSapUser ());      
+      rrc->SetLteUeRrcSapUser (rrcProtocol->GetLteUeRrcSapUser ());
     }
 
   if (m_epcHelper != 0)
@@ -552,9 +609,17 @@
   phy->SetLteUeCphySapUser (rrc->GetLteUeCphySapUser ());
   rrc->SetLteUeCphySapProvider (phy->GetLteUeCphySapProvider ());
 
-  NS_ABORT_MSG_IF (m_imsiCounter >= 0xFFFFFFFF, "max num UEs exceeded");  
+  NS_ABORT_MSG_IF (m_imsiCounter >= 0xFFFFFFFF, "max num UEs exceeded");
   uint64_t imsi = ++m_imsiCounter;
-  Ptr<LteUeNetDevice> dev = CreateObject<LteUeNetDevice> (n, phy, mac, rrc, nas, imsi);
+
+  Ptr<LteUeNetDevice> dev = m_ueNetDeviceFactory.Create<LteUeNetDevice> ();
+  dev->SetNode (n);
+  dev->SetAttribute ("Imsi", UintegerValue (imsi));
+  dev->SetAttribute ("LteUePhy", PointerValue (phy));
+  dev->SetAttribute ("LteUeMac", PointerValue (mac));
+  dev->SetAttribute ("LteUeRrc", PointerValue (rrc));
+  dev->SetAttribute ("EpcUeNas", PointerValue (nas));
+
   phy->SetDevice (dev);
   dlPhy->SetDevice (dev);
   ulPhy->SetDevice (dev);
@@ -579,6 +644,47 @@
 
 
 void
+LteHelper::Attach (NetDeviceContainer ueDevices)
+{
+  NS_LOG_FUNCTION (this);
+  for (NetDeviceContainer::Iterator i = ueDevices.Begin (); i != ueDevices.End (); ++i)
+    {
+      Attach (*i);
+    }
+}
+
+void
+LteHelper::Attach (Ptr<NetDevice> ueDevice)
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_epcHelper == 0)
+    {
+      NS_FATAL_ERROR ("This function is not valid without properly configured EPC");
+    }
+
+  Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice> ();
+  if (ueLteDevice == 0)
+    {
+      NS_FATAL_ERROR ("The passed NetDevice must be an LteUeNetDevice");
+    }
+
+  // initiate cell selection
+  Ptr<EpcUeNas> ueNas = ueLteDevice->GetNas ();
+  NS_ASSERT (ueNas != 0);
+  uint16_t dlEarfcn = ueLteDevice->GetDlEarfcn ();
+  ueNas->StartCellSelection (dlEarfcn);
+
+  // instruct UE to immediately enter CONNECTED mode after camping
+  ueNas->Connect ();
+
+  // activate default EPS bearer
+  m_epcHelper->ActivateEpsBearer (ueDevice, ueLteDevice->GetImsi (),
+                                  EpcTft::Default (),
+                                  EpsBearer (EpsBearer::NGBR_VIDEO_TCP_DEFAULT));
+}
+
+void
 LteHelper::Attach (NetDeviceContainer ueDevices, Ptr<NetDevice> enbDevice)
 {
   NS_LOG_FUNCTION (this);
@@ -605,7 +711,7 @@
       // activate default EPS bearer
       m_epcHelper->ActivateEpsBearer (ueDevice, ueLteDevice->GetImsi (), EpcTft::Default (), EpsBearer (EpsBearer::NGBR_VIDEO_TCP_DEFAULT));
     }
-  
+
   // tricks needed for the simplified LTE-only simulations 
   if (m_epcHelper == 0)
     {
@@ -639,7 +745,7 @@
         {
           minDistance = distance;
           closestEnbDevice = *i;
-        }      
+        }
     }
   NS_ASSERT (closestEnbDevice != 0);
   Attach (ueDevice, closestEnbDevice);
@@ -661,8 +767,8 @@
 {
   NS_LOG_FUNCTION (this);
 
-  NS_ASSERT_MSG (m_epcHelper != 0, "dedicated EPS bearers cannot be set up when EPC is not used");
-  
+  NS_ASSERT_MSG (m_epcHelper != 0, "dedicated EPS bearers cannot be set up when the EPC is not used");
+
   uint64_t imsi = ueDevice->GetObject<LteUeNetDevice> ()->GetImsi ();
   m_epcHelper->ActivateEpsBearer (ueDevice, imsi, tft, bearer);
 }
@@ -702,8 +808,8 @@
   if ((!m_active) && (imsi == m_imsi))
     {
       Ptr<LteUeRrc> ueRrc = m_ueDevice->GetObject<LteUeNetDevice> ()->GetRrc ();
-      NS_ASSERT (ueRrc->GetState () == LteUeRrc::CONNECTED_NORMALLY);      
-      uint16_t rnti = ueRrc->GetRnti();
+      NS_ASSERT (ueRrc->GetState () == LteUeRrc::CONNECTED_NORMALLY);
+      uint16_t rnti = ueRrc->GetRnti ();
       Ptr<LteEnbNetDevice> enbLteDevice = m_ueDevice->GetObject<LteUeNetDevice> ()->GetTargetEnb ();
       Ptr<LteEnbRrc> enbRrc = enbLteDevice->GetObject<LteEnbNetDevice> ()->GetRrc ();
       NS_ASSERT (ueRrc->GetCellId () == enbLteDevice->GetCellId ());
@@ -719,14 +825,14 @@
       m_active = true;
     }
 }
-  
+
 
 void 
 LteHelper::ActivateDataRadioBearer (Ptr<NetDevice> ueDevice, EpsBearer bearer)
 {
   NS_LOG_FUNCTION (this << ueDevice);
-  NS_ASSERT_MSG (m_epcHelper == 0, "this method must not be used when EPC is being used");  
-  
+  NS_ASSERT_MSG (m_epcHelper == 0, "this method must not be used when the EPC is being used");
+
   // Normally it is the EPC that takes care of activating DRBs
   // when the UE gets connected. When the EPC is not used, we achieve
   // the same behavior by hooking a dedicated DRB activation function
@@ -738,7 +844,7 @@
   std::ostringstream path;
   path << "/NodeList/" << enbLteDevice->GetNode ()->GetId () 
        << "/DeviceList/" << enbLteDevice->GetIfIndex ()
-       << "/LteEnbRrc/ConnectionEstablished";  
+       << "/LteEnbRrc/ConnectionEstablished";
   Ptr<DrbActivator> arg = Create<DrbActivator> (ueDevice, bearer);
   Config::Connect (path.str (), MakeBoundCallback (&DrbActivator::ActivateCallback, arg));
 }
@@ -748,6 +854,8 @@
 {
   NS_LOG_FUNCTION (this);
 
+  NS_ASSERT_MSG (m_epcHelper != 0, "X2 interfaces cannot be set up when the EPC is not used");
+
   for (NodeContainer::Iterator i = enbNodes.Begin (); i != enbNodes.End (); ++i)
     {
       for (NodeContainer::Iterator j = i + 1; j != enbNodes.End (); ++j)
@@ -782,7 +890,7 @@
   uint16_t targetCellId = targetEnbDev->GetObject<LteEnbNetDevice> ()->GetCellId ();
   Ptr<LteEnbRrc> sourceRrc = sourceEnbDev->GetObject<LteEnbNetDevice> ()->GetRrc ();
   uint16_t rnti = ueDev->GetObject<LteUeNetDevice> ()->GetRrc ()->GetRnti ();
-  sourceRrc->SendHandoverRequest (rnti, targetCellId);  
+  sourceRrc->SendHandoverRequest (rnti, targetCellId);
 }
 
 
@@ -793,7 +901,7 @@
 LteHelper::ActivateDataRadioBearer (NetDeviceContainer ueDevices, EpsBearer bearer)
 {
   NS_LOG_FUNCTION (this);
-   for (NetDeviceContainer::Iterator i = ueDevices.Begin (); i != ueDevices.End (); ++i)
+  for (NetDeviceContainer::Iterator i = ueDevices.Begin (); i != ueDevices.End (); ++i)
     {
       ActivateDataRadioBearer (*i, bearer);
     }
diff -Naur ns-3.18.1/src/lte/helper/lte-helper.h ns-3.19/src/lte/helper/lte-helper.h
--- ns-3.18.1/src/lte/helper/lte-helper.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/lte-helper.h	2013-12-20 09:44:51.000000000 -0800
@@ -49,8 +49,8 @@
 class SpectrumPropagationLossModel;
 
 /**
- * Creation and configuration of LTE entities
- *
+ * \ingroup lte
+ * \brief Creation and configuration of LTE entities
  */
 class LteHelper : public Object
 {
@@ -113,6 +113,26 @@
   void SetSchedulerAttribute (std::string n, const AttributeValue &v);
 
   /**
+   *
+   * \param type the type of handover algorithm to be used for the eNBs
+   */
+  void SetHandoverAlgorithmType (std::string type);
+
+  /**
+   *
+   * \return the handover algorithm type
+   */
+  std::string GetHandoverAlgorithmType () const;
+
+  /**
+   * set an attribute for the handover algorithm to be created
+   *
+   * \param n the name of the attribute
+   * \param v the value of the attribute
+   */
+  void SetHandoverAlgorithmAttribute (std::string n, const AttributeValue &v);
+
+  /**
    * set an attribute for the LteEnbNetDevice to be created
    * 
    * \param n the name of the attribute
@@ -134,6 +154,14 @@
    */
   void SetEnbAntennaModelAttribute (std::string n, const AttributeValue &v);
 
+  /**
+   * set an attribute for the LteUeNetDevice to be created
+   *
+   * \param n the name of the attribute
+   * \param v the value of the attribute
+   */
+  void SetUeDeviceAttribute (std::string n, const AttributeValue &v);
+
   /** 
    * 
    * \param type the type of AntennaModel to be used for the UEs
@@ -161,6 +189,7 @@
    * \param v the value of the attribute
    */
   void SetSpectrumChannelAttribute (std::string n, const AttributeValue &v);
+
   /**
    * create a set of eNB devices
    *
@@ -180,40 +209,101 @@
   NetDeviceContainer InstallUeDevice (NodeContainer c);
 
   /**
-   * Attach a set of UE devices to a single eNB device
+   * \brief Enables automatic attachment of a set of UE devices to a suitable
+   *        cell using Idle mode initial cell selection procedure.
+   * \param ueDevices the set of UE devices to be attached
+   *
+   * By calling this, the UE will start the initial cell selection procedure at
+   * the beginning of simulation. In addition, the function also instructs each
+   * UE to immediately enter CONNECTED mode and activates the default EPS
+   * bearer.
    *
-   * \param ueDevices
-   * \param enbDevice
+   * If this function is called when the UE is in a situation where entering
+   * CONNECTED mode is not possible (e.g. before the simulation begin), then the
+   * UE will attempt to connect at the earliest possible time (e.g. after it
+   * camps to a suitable cell).
+   *
+   * Note that this function can only be used in EPC-enabled simulation.
    */
-  void Attach (NetDeviceContainer ueDevices, Ptr<NetDevice> enbDevice);
+  void Attach (NetDeviceContainer ueDevices);
 
   /**
-   * Attach a UE to the network
+   * \brief Enables automatic attachment of a UE device to a suitable cell
+   *        using Idle mode initial cell selection procedure.
+   * \param ueDevice the UE device to be attached
+   *
+   * By calling this, the UE will start the initial cell selection procedure at
+   * the beginning of simulation. In addition, the function also instructs the
+   * UE to immediately enter CONNECTED mode and activates the default EPS
+   * bearer.
    *
-   * Attach a UE device to the network via a given eNB, and activate the default EPS bearer.
+   * If this function is called when the UE is in a situation where entering
+   * CONNECTED mode is not possible (e.g. before the simulation begin), then the
+   * UE will attempt to connect at the earliest possible time (e.g. after it
+   * camps to a suitable cell).
    *
-   * \param ueDevice
-   * \param enbDevice
+   * Note that this function can only be used in EPC-enabled simulation.
+   */
+  void Attach (Ptr<NetDevice> ueDevice);
+
+  /**
+   * \brief Manual attachment of a set of UE devices to the network via a given
+   *        eNodeB.
+   * \param ueDevices the set of UE devices to be attached
+   * \param enbDevice the destination eNodeB device
+   *
+   * In addition, the function also instructs each UE to immediately enter
+   * CONNECTED mode and activates the default EPS bearer.
+   *
+   * The function can be used in both LTE-only and EPC-enabled simulations.
+   * Note that this function will disable Idle mode initial cell selection
+   * procedure.
+   */
+  void Attach (NetDeviceContainer ueDevices, Ptr<NetDevice> enbDevice);
+
+  /**
+   * \brief Manual attachment of a UE device to the network via a given eNodeB.
+   * \param ueDevice the UE device to be attached
+   * \param enbDevice the destination eNodeB device
+   *
+   * In addition, the function also instructs the UE to immediately enter
+   * CONNECTED mode and activates the default EPS bearer.
+   *
+   * The function can be used in both LTE-only and EPC-enabled simulations.
+   * Note that this function will disable Idle mode initial cell selection
+   * procedure.
    */
   void Attach (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
 
   /** 
-   * Attach each UE in a set to the closest (w.r.t. distance) eNB among those in a set.
+   * \brief Manual attachment of a set of UE devices to the network via the
+   *        closest eNodeB (with respect to distance) among those in the set.
+   * \param ueDevices the set of UE devices to be attached
+   * \param enbDevices the set of eNodeB devices to be considered
    * 
+   * This function finds among the eNodeB set the closest eNodeB for each UE,
+   * and then invokes manual attachment between the pair.
    * 
+   * Users are encouraged to use automatic attachment (Idle mode cell selection)
+   * instead of this function.
    * 
-   * \param ueDevices the set of UEs
-   * \param enbDevices the set of eNBs
+   * \sa LteHelper::Attach(NetDeviceContainer ueDevices);
    */
   void AttachToClosestEnb (NetDeviceContainer ueDevices, NetDeviceContainer enbDevices);
 
   /** 
-   * Attach an UE ito the closest (w.r.t. distance) eNB among those in a set
-   * Will call LteHelper::Attach () passing to it the single eNB
-   * instance which resulted to be the closest to the UE 
+   * \brief Manual attachment of a UE device to the network via the closest
+   *        eNodeB (with respect to distance) among those in the set.
+   * \param ueDevice the UE device to be attached
+   * \param enbDevices the set of eNodeB devices to be considered
+   *
+   * This function finds among the eNodeB set the closest eNodeB for the UE,
+   * and then invokes manual attachment between the pair.
    * 
-   * \param ueDevice the UE
-   * \param enbDevices the set of eNBs
+   * Users are encouraged to use automatic attachment (Idle mode cell selection)
+   * instead of this function.
+   *
+   * \sa LteHelper::Attach(Ptr<NetDevice> ueDevice);
    */
   void AttachToClosestEnb (Ptr<NetDevice> ueDevice, NetDeviceContainer enbDevices);
 
@@ -229,7 +319,7 @@
   /**
    * Activate a dedicated EPS bearer on a given UE device
    *
-   * \param ueDevices the set of UE devices
+   * \param ueDevice the UE device
    * \param bearer the characteristics of the bearer to be activated
    * \param tft the Traffic Flow Template that identifies the traffic to go on this bearer
    */
@@ -252,14 +342,19 @@
   void AddX2Interface (Ptr<Node> enbNode1, Ptr<Node> enbNode2);
 
   /**
-   * Trigger an X2-based handover of a UE between two eNBs
-   *
+   * \brief Manually trigger an X2-based handover of a UE between two eNBs at a
+   *        specific simulation time.
    * \param hoTime when the Handover is initiated
-   * \param ueDev the UE that hands off
-   * \param enbDev1 source eNB, originally the UE is attached to this eNB
-   * \param enbDev2 target eNB, the UE is finally connected to this eNB
+   * \param ueDev the UE that hands off, must be of the type LteUeNetDevice
+   * \param sourceEnbDev source eNB, must be of the type LteEnbNetDevice
+   *                     (originally the UE is attached to this eNB)
+   * \param targetEnbDev target eNB, must be of the type LteEnbNetDevice
+   *                     (the UE is finally connected to this eNB)
+   *
+   * \warning Requires the use of EPC mode. See SetEpcHelper() method.
    */
-  void HandoverRequest (Time hoTime, Ptr<NetDevice> ueDev, Ptr<NetDevice> sourceEnbDev, Ptr<NetDevice> targetEnbDev);
+  void HandoverRequest (Time hoTime, Ptr<NetDevice> ueDev,
+                        Ptr<NetDevice> sourceEnbDev, Ptr<NetDevice> targetEnbDev);
 
 
   /** 
@@ -285,12 +380,15 @@
   /** 
    * 
    * 
-   * \param type the fading model to be used
+   * \param model the fading model to be used
    */
   void SetFadingModel (std::string model);
 
   /**
    * set an attribute of the fading model
+   *
+   * \param n the name of the attribute
+   * \param v the value of the attribute
    */
   void SetFadingModelAttribute (std::string n, const AttributeValue &v);
 
@@ -323,7 +421,7 @@
    * Enable trace sinks for UL PHY layer
    */
   void EnableUlPhyTraces (void);
-  
+
   /**
    * Enable trace sinks for DL transmission PHY layer
    */
@@ -404,10 +502,34 @@
   virtual void DoInitialize (void);
 
 private:
+  /**
+   * \brief Create an eNodeB device (LteEnbNetDevice) on the given node.
+   * \param n the node where the device is to be installed
+   * \return pointer to the created device
+   */
   Ptr<NetDevice> InstallSingleEnbDevice (Ptr<Node> n);
+
+  /**
+   * \brief Create a UE device (LteUeNetDevice) on the given node.
+   * \param n the node where the device is to be installed
+   * \return pointer to the created device
+   */
   Ptr<NetDevice> InstallSingleUeDevice (Ptr<Node> n);
 
-  void DoHandoverRequest (Ptr<NetDevice> ueDev, Ptr<NetDevice> sourceEnbDev, Ptr<NetDevice> targetEnbDev);
+  /**
+   * \brief The actual function to trigger a manual handover.
+   * \param ueDev the UE that hands off, must be of the type LteUeNetDevice
+   * \param sourceEnbDev source eNB, must be of the type LteEnbNetDevice
+   *                     (originally the UE is attached to this eNB)
+   * \param targetEnbDev target eNB, must be of the type LteEnbNetDevice
+   *                     (the UE is finally connected to this eNB)
+   *
+   * This method is normally scheduled by HandoverRequest() to run at a specific
+   * time where a manual handover is desired by the simulation user.
+   */
+  void DoHandoverRequest (Ptr<NetDevice> ueDev,
+                          Ptr<NetDevice> sourceEnbDev,
+                          Ptr<NetDevice> targetEnbDev);
 
   Ptr<SpectrumChannel> m_downlinkChannel;
   Ptr<SpectrumChannel> m_uplinkChannel;
@@ -416,9 +538,11 @@
   Ptr<Object> m_uplinkPathlossModel;
 
   ObjectFactory m_schedulerFactory;
+  ObjectFactory m_handoverAlgorithmFactory;
   ObjectFactory m_propagationModelFactory;
   ObjectFactory m_enbNetDeviceFactory;
   ObjectFactory m_enbAntennaModelFactory;
+  ObjectFactory m_ueNetDeviceFactory;
   ObjectFactory m_ueAntennaModelFactory;
 
   ObjectFactory m_dlPathlossModelFactory;
@@ -445,6 +569,7 @@
   uint16_t m_cellIdCounter;
 
   bool m_useIdealRrc;
+  bool m_isAnrEnabled;
 };
 
 
diff -Naur ns-3.18.1/src/lte/helper/lte-hex-grid-enb-topology-helper.cc ns-3.19/src/lte/helper/lte-hex-grid-enb-topology-helper.cc
--- ns-3.18.1/src/lte/helper/lte-hex-grid-enb-topology-helper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/lte-hex-grid-enb-topology-helper.cc	2013-12-20 09:44:51.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteHexGridEnbTopologyHelper);
+NS_OBJECT_ENSURE_REGISTERED (LteHexGridEnbTopologyHelper)
+  ;
 
 LteHexGridEnbTopologyHelper::LteHexGridEnbTopologyHelper ()
 {
diff -Naur ns-3.18.1/src/lte/helper/lte-stats-calculator.cc ns-3.19/src/lte/helper/lte-stats-calculator.cc
--- ns-3.18.1/src/lte/helper/lte-stats-calculator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/lte-stats-calculator.cc	2013-12-20 09:44:51.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("LteStatsCalculator");
+NS_LOG_COMPONENT_DEFINE ("LteStatsCalculator")
+  ;
 
 LteStatsCalculator::LteStatsCalculator ()
   : m_dlOutputFilename (""),
diff -Naur ns-3.18.1/src/lte/helper/lte-stats-calculator.h ns-3.19/src/lte/helper/lte-stats-calculator.h
--- ns-3.18.1/src/lte/helper/lte-stats-calculator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/lte-stats-calculator.h	2013-12-20 09:44:51.000000000 -0800
@@ -51,6 +51,7 @@
 
   /**
    * Get the name of the file where the uplink statistics will be stored.
+   * @return the name of the file where the uplink statistics will be stored
    */
   std::string GetUlOutputFilename (void);
 
@@ -63,12 +64,14 @@
 
   /**
    * Get the name of the file where the downlink statistics will be stored.
+   * @return the name of the file where the downlink statistics will be stored
    */
   std::string GetDlOutputFilename (void);
 
   /**
    * Checks if there is an already stored IMSI for the given path
    * @param path Path in the attribute system to check
+   * @return true if the path exists, false otherwise
    */
   bool ExistsImsiPath (std::string path);
 
@@ -82,12 +85,14 @@
   /**
    * Retrieves the imsi information for the given path
    * @param path Path in the attribute system to get
+   * @return the IMSI associated with the given path
    */
   uint64_t GetImsiPath (std::string path);
 
   /**
    * Checks if there is an already stored cell id for the given path
    * @param path Path in the attribute system to check
+   * @return true if the path exists, false otherwise
    */
   bool ExistsCellIdPath (std::string path);
 
@@ -101,6 +106,7 @@
   /**
    * Retrieves the cell id information for the given path
    * @param path Path in the attribute system to get
+   * @return the cell ID associated with the given path
    */
   uint16_t GetCellIdPath (std::string path);
 
diff -Naur ns-3.18.1/src/lte/helper/mac-stats-calculator.cc ns-3.19/src/lte/helper/mac-stats-calculator.cc
--- ns-3.18.1/src/lte/helper/mac-stats-calculator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/mac-stats-calculator.cc	2013-12-20 09:44:51.000000000 -0800
@@ -25,9 +25,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("MacStatsCalculator");
+NS_LOG_COMPONENT_DEFINE ("MacStatsCalculator")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (MacStatsCalculator);
+NS_OBJECT_ENSURE_REGISTERED (MacStatsCalculator)
+  ;
 
 MacStatsCalculator::MacStatsCalculator ()
   : m_dlFirstWrite (true),
@@ -131,9 +133,9 @@
 
 void
 MacStatsCalculator::UlScheduling (uint16_t cellId, uint64_t imsi, uint32_t frameNo,
-                                  uint32_t subframeNo, uint16_t rnti,uint8_t mcs, uint16_t size)
+                                  uint32_t subframeNo, uint16_t rnti,uint8_t mcsTb, uint16_t size)
 {
-  NS_LOG_FUNCTION (this << cellId << imsi << frameNo << subframeNo << rnti << (uint32_t) mcs << size);
+  NS_LOG_FUNCTION (this << cellId << imsi << frameNo << subframeNo << rnti << (uint32_t) mcsTb << size);
   NS_LOG_INFO ("Write UL Mac Stats in " << GetUlOutputFilename ().c_str ());
 
   std::ofstream outFile;
@@ -165,7 +167,7 @@
   outFile << frameNo << "\t";
   outFile << subframeNo << "\t";
   outFile << rnti << "\t";
-  outFile << (uint32_t) mcs << "\t";
+  outFile << (uint32_t) mcsTb << "\t";
   outFile << size << std::endl;
   outFile.close ();
 }
diff -Naur ns-3.18.1/src/lte/helper/mac-stats-calculator.h ns-3.19/src/lte/helper/mac-stats-calculator.h
--- ns-3.18.1/src/lte/helper/mac-stats-calculator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/mac-stats-calculator.h	2013-12-20 09:44:51.000000000 -0800
@@ -53,9 +53,7 @@
    */
   virtual ~MacStatsCalculator ();
 
-  /**
-   * Inherited from ns3::Object
-   */
+  // Inherited from ns3::Object
   static TypeId GetTypeId (void);
 
   /**
@@ -67,6 +65,7 @@
 
   /**
    * Get the name of the file where the uplink statistics will be stored.
+   * @return the name of the file where the uplink statistics will be stored
    */
   std::string GetUlOutputFilename (void);
 
@@ -79,6 +78,7 @@
 
   /**
    * Get the name of the file where the downlink statistics will be stored.
+   * @return the name of the file where the downlink statistics will be stored
    */
   std::string GetDlOutputFilename (void);
 
@@ -108,7 +108,7 @@
    * @param sizeTb Size of transport block
    */
   void UlScheduling (uint16_t cellId, uint64_t imsi,uint32_t frameNo, uint32_t subframeNo,
-                     uint16_t rnti, uint8_t mcs, uint16_t sizeTb);
+                     uint16_t rnti, uint8_t mcsTb, uint16_t sizeTb);
 
   
   /** 
diff -Naur ns-3.18.1/src/lte/helper/phy-rx-stats-calculator.cc ns-3.19/src/lte/helper/phy-rx-stats-calculator.cc
--- ns-3.18.1/src/lte/helper/phy-rx-stats-calculator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/phy-rx-stats-calculator.cc	2013-12-20 09:44:51.000000000 -0800
@@ -27,9 +27,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("PhyRxStatsCalculator");
+NS_LOG_COMPONENT_DEFINE ("PhyRxStatsCalculator")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (PhyRxStatsCalculator);
+NS_OBJECT_ENSURE_REGISTERED (PhyRxStatsCalculator)
+  ;
 
 PhyRxStatsCalculator::PhyRxStatsCalculator ()
   : m_dlRxFirstWrite (true),
diff -Naur ns-3.18.1/src/lte/helper/phy-rx-stats-calculator.h ns-3.19/src/lte/helper/phy-rx-stats-calculator.h
--- ns-3.18.1/src/lte/helper/phy-rx-stats-calculator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/phy-rx-stats-calculator.h	2013-12-20 09:44:51.000000000 -0800
@@ -35,7 +35,7 @@
 /**
  * Takes care of storing the information generated at PHY layer regarding 
  * reception. Metrics saved are:
- *time\tframe\tsframe\tRNTI\tmcsTb1\tsizeTb1\tmcsTb2\tsizeTb2
+ *
  *   - Timestamp (in seconds)
  *   - Frame index
  *   - Subframe index
@@ -58,9 +58,7 @@
    */
   virtual ~PhyRxStatsCalculator ();
 
-  /**
-   * Inherited from ns3::Object
-   */
+  // Inherited from ns3::Object
   static TypeId GetTypeId (void);
 
   /**
@@ -72,6 +70,7 @@
 
   /**
    * Get the name of the file where the UL RX PHY statistics will be stored.
+   * @return the name of the file where the UL RX PHY statistics will be stored
    */
   std::string GetUlRxOutputFilename (void);
 
@@ -84,40 +83,19 @@
 
   /**
    * Get the name of the file where the DL RX PHY statistics will be stored.
+   * @return the name of the file where the DL RX PHY statistics will be stored
    */
   std::string GetDlRxOutputFilename (void);
 
   /**
    * Notifies the stats calculator that an downlink reception has occurred.
-   * @param cellId Cell ID of the attached Enb
-   * @param imsi IMSI of the scheduled UE
-   * @param frameNo Frame number
-   * @param subframeNo Subframe number
-   * @param rnti C-RNTI scheduled
-   * @param layer the layer (cw) of the transmission
-   * @param txMode the transmission Mode
-   * @param mcs MCS for transport block
-   * @param size Size of transport block
-   * @param rv the redundancy version (HARQ)
-   * @param ndi new data indicator flag
-   * @param correctness correctness of the TB received
+   * @param params Trace information regarding PHY reception stats
    */
   void DlPhyReception (PhyReceptionStatParameters params);
 
   /**
    * Notifies the stats calculator that an uplink reception has occurred.
-   * @param cellId Cell ID of the attached Enb
-   * @param imsi IMSI of the scheduled UE
-   * @param frameNo Frame number
-   * @param subframeNo Subframe number
-   * @param rnti C-RNTI scheduled
-   * @param layer the layer (cw) of the transmission
-   * @param txMode the transmission Mode
-   * @param mcs MCS for transport block
-   * @param size Size of transport block
-   * @param rv the redundancy version (HARQ)
-   * @param ndi new data indicator flag
-   * @param correctness correctness of the TB received
+   * @param params Trace information regarding PHY reception stats
    */
   void UlPhyReception (PhyReceptionStatParameters params);
 
diff -Naur ns-3.18.1/src/lte/helper/phy-stats-calculator.cc ns-3.19/src/lte/helper/phy-stats-calculator.cc
--- ns-3.18.1/src/lte/helper/phy-stats-calculator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/phy-stats-calculator.cc	2013-12-20 09:44:51.000000000 -0800
@@ -25,9 +25,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("PhyStatsCalculator");
+NS_LOG_COMPONENT_DEFINE ("PhyStatsCalculator")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (PhyStatsCalculator);
+NS_OBJECT_ENSURE_REGISTERED (PhyStatsCalculator)
+  ;
 
 PhyStatsCalculator::PhyStatsCalculator ()
   :  m_RsrpSinrFirstWrite (true),
diff -Naur ns-3.18.1/src/lte/helper/phy-stats-calculator.h ns-3.19/src/lte/helper/phy-stats-calculator.h
--- ns-3.18.1/src/lte/helper/phy-stats-calculator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/phy-stats-calculator.h	2013-12-20 09:44:51.000000000 -0800
@@ -63,20 +63,19 @@
    */
   virtual ~PhyStatsCalculator ();
 
-  /**
-   * Inherited from ns3::Object
-   */
+  // Inherited from ns3::Object
   static TypeId GetTypeId (void);
 
   /**
    * Set the name of the file where the RSRP/SINR statistics will be stored.
    *
-   * \param filename string with the name of the file
+   * @param filename string with the name of the file
    */
   void SetCurrentCellRsrpSinrFilename (std::string filename);
 
   /**
    * Get the name of the file where the RSRP/SINR statistics will be stored.
+   * @return the name of the file where the RSRP/SINR statistics will be stored
    */
   std::string GetCurrentCellRsrpSinrFilename  (void);
 
@@ -89,6 +88,7 @@
 
   /**
    * Get the name of the file where the UE SINR statistics will be stored.
+   * @return the name of the file where the UE SINR statistics will be stored
    */
   std::string GetUeSinrFilename (void);
 
@@ -101,6 +101,7 @@
 
   /**
    * Get the name of the file where the interference statistics will be stored.
+   * @return the name of the file where the interference statistics will be stored
    */
   std::string GetInterferenceFilename (void);
 
@@ -123,8 +124,6 @@
   void ReportUeSinr (uint16_t cellId, uint64_t imsi, uint16_t rnti, double sinrLinear);
   /**
    * Notifies the stats calculator that an interference report has occurred.
-   * @param imsi IMSI of the scheduled UE
-   * @param rnti C-RNTI scheduled
    * @param cellId Cell ID of the reported Enb
    * @param interference Measured interference for each RB
    */
diff -Naur ns-3.18.1/src/lte/helper/phy-tx-stats-calculator.cc ns-3.19/src/lte/helper/phy-tx-stats-calculator.cc
--- ns-3.18.1/src/lte/helper/phy-tx-stats-calculator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/phy-tx-stats-calculator.cc	2013-12-20 09:44:51.000000000 -0800
@@ -27,9 +27,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("PhyTxStatsCalculator");
+NS_LOG_COMPONENT_DEFINE ("PhyTxStatsCalculator")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (PhyTxStatsCalculator);
+NS_OBJECT_ENSURE_REGISTERED (PhyTxStatsCalculator)
+  ;
 
 PhyTxStatsCalculator::PhyTxStatsCalculator ()
   : m_dlTxFirstWrite (true),
diff -Naur ns-3.18.1/src/lte/helper/phy-tx-stats-calculator.h ns-3.19/src/lte/helper/phy-tx-stats-calculator.h
--- ns-3.18.1/src/lte/helper/phy-tx-stats-calculator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/phy-tx-stats-calculator.h	2013-12-20 09:44:51.000000000 -0800
@@ -37,7 +37,7 @@
 /**
  * Takes care of storing the information generated at PHY layer regarding 
  * transmission. Metrics saved are:
- *time\tframe\tsframe\tRNTI\tmcsTb1\tsizeTb1\tmcsTb2\tsizeTb2
+ *
  *   - Timestamp (in seconds)
  *   - Frame index
  *   - Subframe index
@@ -60,20 +60,19 @@
    */
   virtual ~PhyTxStatsCalculator ();
 
-  /**
-   * Inherited from ns3::Object
-   */
+  // Inherited from ns3::Object
   static TypeId GetTypeId (void);
 
   /**
    * Set the name of the file where the UL Tx PHY statistics will be stored.
    *
-   * \param outputFilename string with the name of the file
+   * @param outputFilename string with the name of the file
    */
   void SetUlTxOutputFilename (std::string outputFilename);
 
   /**
    * Get the name of the file where the UL RX PHY statistics will be stored.
+   * @return the name of the file where the UL RX PHY statistics will be stored
    */
   std::string GetUlTxOutputFilename (void);
 
@@ -86,38 +85,19 @@
 
   /**
    * Get the name of the file where the DL TX PHY statistics will be stored.
+   * @return the name of the file where the DL TX PHY statistics will be stored
    */
   std::string GetDlTxOutputFilename (void);
 
   /**
    * Notifies the stats calculator that an downlink trasmission has occurred.
-   * @param cellId Cell ID of the attached Enb
-   * @param imsi IMSI of the scheduled UE
-   * @param frameNo Frame number
-   * @param subframeNo Subframe number
-   * @param rnti C-RNTI scheduled
-   * @param layer the layer (cw) of the transmission
-   * @param txMode the transmission Mode
-   * @param mcs MCS for transport block
-   * @param size Size of transport block
-   * @param rv the redundancy version (HARQ)
-   * @param ndi new data indicator flag
+   * @param params Trace information regarding PHY transmission stats
    */
   void DlPhyTransmission (PhyTransmissionStatParameters params);
 
   /**
    * Notifies the stats calculator that an uplink trasmission has occurred.
-   * @param cellId Cell ID of the attached Enb
-   * @param imsi IMSI of the scheduled UE
-   * @param frameNo Frame number
-   * @param subframeNo Subframe number
-   * @param rnti C-RNTI scheduled
-   * @param layer the layer (cw) of the transmission
-   * @param txMode the transmission Mode
-   * @param mcs MCS for transport block
-   * @param size Size of transport block
-   * @param rv the redundancy version (HARQ)
-   * @param ndi new data indicator flag
+   * @param params Trace information regarding PHY transmission stats
    */
   void UlPhyTransmission (PhyTransmissionStatParameters params);
 
diff -Naur ns-3.18.1/src/lte/helper/point-to-point-epc-helper.cc ns-3.19/src/lte/helper/point-to-point-epc-helper.cc
--- ns-3.18.1/src/lte/helper/point-to-point-epc-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/helper/point-to-point-epc-helper.cc	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,346 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2013 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Jaume Nin <jnin@cttc.es>
+ *         Nicola Baldo <nbaldo@cttc.es>
+ *         Manuel Requena <manuel.requena@cttc.es>
+ */
+
+#include <ns3/point-to-point-epc-helper.h>
+#include <ns3/log.h>
+#include <ns3/inet-socket-address.h>
+#include <ns3/mac48-address.h>
+#include <ns3/eps-bearer.h>
+#include <ns3/ipv4-address.h>
+#include <ns3/internet-stack-helper.h>
+#include <ns3/point-to-point-helper.h>
+#include <ns3/packet-socket-helper.h>
+#include <ns3/packet-socket-address.h>
+#include <ns3/epc-enb-application.h>
+#include <ns3/epc-sgw-pgw-application.h>
+
+#include <ns3/lte-enb-rrc.h>
+#include <ns3/epc-x2.h>
+#include <ns3/lte-enb-net-device.h>
+#include <ns3/lte-ue-net-device.h>
+#include <ns3/epc-mme.h>
+#include <ns3/epc-ue-nas.h>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("PointToPointEpcHelper")
+  ;
+
+NS_OBJECT_ENSURE_REGISTERED (PointToPointEpcHelper)
+  ;
+
+
+PointToPointEpcHelper::PointToPointEpcHelper () 
+  : m_gtpuUdpPort (2152)  // fixed by the standard
+{
+  NS_LOG_FUNCTION (this);
+
+  // since we use point-to-point links for all S1-U links, 
+  // we use a /30 subnet which can hold exactly two addresses 
+  // (remember that net broadcast and null address are not valid)
+  m_s1uIpv4AddressHelper.SetBase ("10.0.0.0", "255.255.255.252");
+
+  m_x2Ipv4AddressHelper.SetBase ("12.0.0.0", "255.255.255.252");
+
+  // we use a /8 net for all UEs
+  m_ueAddressHelper.SetBase ("7.0.0.0", "255.0.0.0");
+  
+  // create SgwPgwNode
+  m_sgwPgw = CreateObject<Node> ();
+  InternetStackHelper internet;
+  internet.Install (m_sgwPgw);
+  
+  // create S1-U socket
+  Ptr<Socket> sgwPgwS1uSocket = Socket::CreateSocket (m_sgwPgw, TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  int retval = sgwPgwS1uSocket->Bind (InetSocketAddress (Ipv4Address::GetAny (), m_gtpuUdpPort));
+  NS_ASSERT (retval == 0);
+
+  // create TUN device implementing tunneling of user data over GTP-U/UDP/IP 
+  m_tunDevice = CreateObject<VirtualNetDevice> ();
+  // allow jumbo packets
+  m_tunDevice->SetAttribute ("Mtu", UintegerValue (30000));
+
+  // yes we need this
+  m_tunDevice->SetAddress (Mac48Address::Allocate ()); 
+
+  m_sgwPgw->AddDevice (m_tunDevice);
+  NetDeviceContainer tunDeviceContainer;
+  tunDeviceContainer.Add (m_tunDevice);
+  
+  // the TUN device is on the same subnet as the UEs, so when a packet
+  // addressed to an UE arrives at the intenet to the WAN interface of
+  // the PGW it will be forwarded to the TUN device. 
+  Ipv4InterfaceContainer tunDeviceIpv4IfContainer = m_ueAddressHelper.Assign (tunDeviceContainer);  
+
+  // create EpcSgwPgwApplication
+  m_sgwPgwApp = CreateObject<EpcSgwPgwApplication> (m_tunDevice, sgwPgwS1uSocket);
+  m_sgwPgw->AddApplication (m_sgwPgwApp);
+  
+  // connect SgwPgwApplication and virtual net device for tunneling
+  m_tunDevice->SetSendCallback (MakeCallback (&EpcSgwPgwApplication::RecvFromTunDevice, m_sgwPgwApp));
+
+  // Create MME and connect with SGW via S11 interface
+  m_mme = CreateObject<EpcMme> ();
+  m_mme->SetS11SapSgw (m_sgwPgwApp->GetS11SapSgw ());
+  m_sgwPgwApp->SetS11SapMme (m_mme->GetS11SapMme ());
+}
+
+PointToPointEpcHelper::~PointToPointEpcHelper ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+TypeId
+PointToPointEpcHelper::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::PointToPointEpcHelper")
+    .SetParent<EpcHelper> ()
+    .AddConstructor<PointToPointEpcHelper> ()
+    .AddAttribute ("S1uLinkDataRate", 
+                   "The data rate to be used for the next S1-U link to be created",
+                   DataRateValue (DataRate ("10Gb/s")),
+                   MakeDataRateAccessor (&PointToPointEpcHelper::m_s1uLinkDataRate),
+                   MakeDataRateChecker ())
+    .AddAttribute ("S1uLinkDelay", 
+                   "The delay to be used for the next S1-U link to be created",
+                   TimeValue (Seconds (0)),
+                   MakeTimeAccessor (&PointToPointEpcHelper::m_s1uLinkDelay),
+                   MakeTimeChecker ())
+    .AddAttribute ("S1uLinkMtu", 
+                   "The MTU of the next S1-U link to be created. Note that, because of the additional GTP/UDP/IP tunneling overhead, you need a MTU larger than the end-to-end MTU that you want to support.",
+                   UintegerValue (2000),
+                   MakeUintegerAccessor (&PointToPointEpcHelper::m_s1uLinkMtu),
+                   MakeUintegerChecker<uint16_t> ())
+    .AddAttribute ("X2LinkDataRate",
+                   "The data rate to be used for the next X2 link to be created",
+                   DataRateValue (DataRate ("10Gb/s")),
+                   MakeDataRateAccessor (&PointToPointEpcHelper::m_x2LinkDataRate),
+                   MakeDataRateChecker ())
+    .AddAttribute ("X2LinkDelay",
+                   "The delay to be used for the next X2 link to be created",
+                   TimeValue (Seconds (0)),
+                   MakeTimeAccessor (&PointToPointEpcHelper::m_x2LinkDelay),
+                   MakeTimeChecker ())
+    .AddAttribute ("X2LinkMtu",
+                   "The MTU of the next X2 link to be created. Note that, because of some big X2 messages, you need a big MTU.",
+                   UintegerValue (3000),
+                   MakeUintegerAccessor (&PointToPointEpcHelper::m_x2LinkMtu),
+                   MakeUintegerChecker<uint16_t> ())
+  ;
+  return tid;
+}
+
+void
+PointToPointEpcHelper::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+  m_tunDevice->SetSendCallback (MakeNullCallback<bool, Ptr<Packet>, const Address&, const Address&, uint16_t> ());
+  m_tunDevice = 0;
+  m_sgwPgwApp = 0;  
+  m_sgwPgw->Dispose ();
+}
+
+
+void
+PointToPointEpcHelper::AddEnb (Ptr<Node> enb, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << enb << lteEnbNetDevice << cellId);
+
+  NS_ASSERT (enb == lteEnbNetDevice->GetNode ());
+
+  // add an IPv4 stack to the previously created eNB
+  InternetStackHelper internet;
+  internet.Install (enb);
+  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB after node creation: " << enb->GetObject<Ipv4> ()->GetNInterfaces ());
+
+  // create a point to point link between the new eNB and the SGW with
+  // the corresponding new NetDevices on each side  
+  NodeContainer enbSgwNodes;
+  enbSgwNodes.Add (m_sgwPgw);
+  enbSgwNodes.Add (enb);
+  PointToPointHelper p2ph;
+  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (m_s1uLinkDataRate));
+  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (m_s1uLinkMtu));
+  p2ph.SetChannelAttribute ("Delay", TimeValue (m_s1uLinkDelay));  
+  NetDeviceContainer enbSgwDevices = p2ph.Install (enb, m_sgwPgw);
+  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB after installing p2p dev: " << enb->GetObject<Ipv4> ()->GetNInterfaces ());  
+  Ptr<NetDevice> enbDev = enbSgwDevices.Get (0);
+  Ptr<NetDevice> sgwDev = enbSgwDevices.Get (1);
+  m_s1uIpv4AddressHelper.NewNetwork ();
+  Ipv4InterfaceContainer enbSgwIpIfaces = m_s1uIpv4AddressHelper.Assign (enbSgwDevices);
+  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB after assigning Ipv4 addr to S1 dev: " << enb->GetObject<Ipv4> ()->GetNInterfaces ());
+  
+  Ipv4Address enbAddress = enbSgwIpIfaces.GetAddress (0);
+  Ipv4Address sgwAddress = enbSgwIpIfaces.GetAddress (1);
+
+  // create S1-U socket for the ENB
+  Ptr<Socket> enbS1uSocket = Socket::CreateSocket (enb, TypeId::LookupByName ("ns3::UdpSocketFactory"));
+  int retval = enbS1uSocket->Bind (InetSocketAddress (enbAddress, m_gtpuUdpPort));
+  NS_ASSERT (retval == 0);
+  
+
+  // give PacketSocket powers to the eNB
+  //PacketSocketHelper packetSocket;
+  //packetSocket.Install (enb); 
+  
+  // create LTE socket for the ENB 
+  Ptr<Socket> enbLteSocket = Socket::CreateSocket (enb, TypeId::LookupByName ("ns3::PacketSocketFactory"));
+  PacketSocketAddress enbLteSocketBindAddress;
+  enbLteSocketBindAddress.SetSingleDevice (lteEnbNetDevice->GetIfIndex ());
+  enbLteSocketBindAddress.SetProtocol (Ipv4L3Protocol::PROT_NUMBER);
+  retval = enbLteSocket->Bind (enbLteSocketBindAddress);
+  NS_ASSERT (retval == 0);  
+  PacketSocketAddress enbLteSocketConnectAddress;
+  enbLteSocketConnectAddress.SetPhysicalAddress (Mac48Address::GetBroadcast ());
+  enbLteSocketConnectAddress.SetSingleDevice (lteEnbNetDevice->GetIfIndex ());
+  enbLteSocketConnectAddress.SetProtocol (Ipv4L3Protocol::PROT_NUMBER);
+  retval = enbLteSocket->Connect (enbLteSocketConnectAddress);
+  NS_ASSERT (retval == 0);  
+  
+
+  NS_LOG_INFO ("create EpcEnbApplication");
+  Ptr<EpcEnbApplication> enbApp = CreateObject<EpcEnbApplication> (enbLteSocket, enbS1uSocket, enbAddress, sgwAddress, cellId);
+  enb->AddApplication (enbApp);
+  NS_ASSERT (enb->GetNApplications () == 1);
+  NS_ASSERT_MSG (enb->GetApplication (0)->GetObject<EpcEnbApplication> () != 0, "cannot retrieve EpcEnbApplication");
+  NS_LOG_LOGIC ("enb: " << enb << ", enb->GetApplication (0): " << enb->GetApplication (0));
+
+  
+  NS_LOG_INFO ("Create EpcX2 entity");
+  Ptr<EpcX2> x2 = CreateObject<EpcX2> ();
+  enb->AggregateObject (x2);
+
+  NS_LOG_INFO ("connect S1-AP interface");
+  m_mme->AddEnb (cellId, enbAddress, enbApp->GetS1apSapEnb ());
+  m_sgwPgwApp->AddEnb (cellId, enbAddress, sgwAddress);
+  enbApp->SetS1apSapMme (m_mme->GetS1apSapMme ());
+}
+
+
+void
+PointToPointEpcHelper::AddX2Interface (Ptr<Node> enb1, Ptr<Node> enb2)
+{
+  NS_LOG_FUNCTION (this << enb1 << enb2);
+
+  // Create a point to point link between the two eNBs with
+  // the corresponding new NetDevices on each side
+  NodeContainer enbNodes;
+  enbNodes.Add (enb1);
+  enbNodes.Add (enb2);
+  PointToPointHelper p2ph;
+  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (m_x2LinkDataRate));
+  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (m_x2LinkMtu));
+  p2ph.SetChannelAttribute ("Delay", TimeValue (m_x2LinkDelay));
+  NetDeviceContainer enbDevices = p2ph.Install (enb1, enb2);
+  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB #1 after installing p2p dev: " << enb1->GetObject<Ipv4> ()->GetNInterfaces ());
+  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB #2 after installing p2p dev: " << enb2->GetObject<Ipv4> ()->GetNInterfaces ());
+  Ptr<NetDevice> enb1Dev = enbDevices.Get (0);
+  Ptr<NetDevice> enb2Dev = enbDevices.Get (1);
+
+  m_x2Ipv4AddressHelper.NewNetwork ();
+  Ipv4InterfaceContainer enbIpIfaces = m_x2Ipv4AddressHelper.Assign (enbDevices);
+  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB #1 after assigning Ipv4 addr to X2 dev: " << enb1->GetObject<Ipv4> ()->GetNInterfaces ());
+  NS_LOG_LOGIC ("number of Ipv4 ifaces of the eNB #2 after assigning Ipv4 addr to X2 dev: " << enb2->GetObject<Ipv4> ()->GetNInterfaces ());
+
+  Ipv4Address enb1X2Address = enbIpIfaces.GetAddress (0);
+  Ipv4Address enb2X2Address = enbIpIfaces.GetAddress (1);
+
+  // Add X2 interface to both eNBs' X2 entities
+  Ptr<EpcX2> enb1X2 = enb1->GetObject<EpcX2> ();
+  Ptr<LteEnbNetDevice> enb1LteDev = enb1->GetDevice (0)->GetObject<LteEnbNetDevice> ();
+  uint16_t enb1CellId = enb1LteDev->GetCellId ();
+  NS_LOG_LOGIC ("LteEnbNetDevice #1 = " << enb1LteDev << " - CellId = " << enb1CellId);
+
+  Ptr<EpcX2> enb2X2 = enb2->GetObject<EpcX2> ();
+  Ptr<LteEnbNetDevice> enb2LteDev = enb2->GetDevice (0)->GetObject<LteEnbNetDevice> ();
+  uint16_t enb2CellId = enb2LteDev->GetCellId ();
+  NS_LOG_LOGIC ("LteEnbNetDevice #2 = " << enb2LteDev << " - CellId = " << enb2CellId);
+
+  enb1X2->AddX2Interface (enb1CellId, enb1X2Address, enb2CellId, enb2X2Address);
+  enb2X2->AddX2Interface (enb2CellId, enb2X2Address, enb1CellId, enb1X2Address);
+
+  enb1LteDev->GetRrc ()->AddX2Neighbour (enb2LteDev->GetCellId ());
+  enb2LteDev->GetRrc ()->AddX2Neighbour (enb1LteDev->GetCellId ());
+}
+
+
+void 
+PointToPointEpcHelper::AddUe (Ptr<NetDevice> ueDevice, uint64_t imsi)
+{
+  NS_LOG_FUNCTION (this << imsi << ueDevice );
+  
+  m_mme->AddUe (imsi);
+  m_sgwPgwApp->AddUe (imsi);
+  
+
+}
+
+void
+PointToPointEpcHelper::ActivateEpsBearer (Ptr<NetDevice> ueDevice, uint64_t imsi, Ptr<EpcTft> tft, EpsBearer bearer)
+{
+  NS_LOG_FUNCTION (this << ueDevice << imsi);
+
+  // we now retrieve the IPv4 address of the UE and notify it to the SGW;
+  // we couldn't do it before since address assignment is triggered by
+  // the user simulation program, rather than done by the EPC   
+  Ptr<Node> ueNode = ueDevice->GetNode (); 
+  Ptr<Ipv4> ueIpv4 = ueNode->GetObject<Ipv4> ();
+  NS_ASSERT_MSG (ueIpv4 != 0, "UEs need to have IPv4 installed before EPS bearers can be activated");
+  int32_t interface =  ueIpv4->GetInterfaceForDevice (ueDevice);
+  NS_ASSERT (interface >= 0);
+  NS_ASSERT (ueIpv4->GetNAddresses (interface) == 1);
+  Ipv4Address ueAddr = ueIpv4->GetAddress (interface, 0).GetLocal ();
+  NS_LOG_LOGIC (" UE IP address: " << ueAddr);  m_sgwPgwApp->SetUeAddress (imsi, ueAddr);
+  
+  m_mme->AddBearer (imsi, tft, bearer);
+  Ptr<LteUeNetDevice> ueLteDevice = ueDevice->GetObject<LteUeNetDevice> ();
+  if (ueLteDevice)
+    {
+      ueLteDevice->GetNas ()->ActivateEpsBearer (bearer, tft);
+    }
+}
+
+
+Ptr<Node>
+PointToPointEpcHelper::GetPgwNode ()
+{
+  return m_sgwPgw;
+}
+
+
+Ipv4InterfaceContainer 
+PointToPointEpcHelper::AssignUeIpv4Address (NetDeviceContainer ueDevices)
+{
+  return m_ueAddressHelper.Assign (ueDevices);
+}
+
+
+
+Ipv4Address
+PointToPointEpcHelper::GetUeDefaultGatewayAddress ()
+{
+  // return the address of the tun device
+  return m_sgwPgw->GetObject<Ipv4> ()->GetAddress (1, 0).GetLocal ();
+}
+
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/lte/helper/point-to-point-epc-helper.h ns-3.19/src/lte/helper/point-to-point-epc-helper.h
--- ns-3.18.1/src/lte/helper/point-to-point-epc-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/helper/point-to-point-epc-helper.h	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,135 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011-2013 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Jaume Nin <jnin@cttc.es>
+ *         Nicola Baldo <nbaldo@cttc.es>
+ *         Manuel Requena <manuel.requena@cttc.es>
+ */
+
+#ifndef POINT_TO_POINT_EPC_HELPER_H
+#define POINT_TO_POINT_EPC_HELPER_H
+
+#include <ns3/object.h>
+#include <ns3/ipv4-address-helper.h>
+#include <ns3/data-rate.h>
+#include <ns3/epc-tft.h>
+#include <ns3/eps-bearer.h>
+#include <ns3/epc-helper.h>
+
+namespace ns3 {
+
+class Node;
+class NetDevice;
+class VirtualNetDevice;
+class EpcSgwPgwApplication;
+class EpcX2;
+class EpcMme;
+
+/**
+ * \brief Create an EPC network with PointToPoint links
+ *
+ * This Helper will create an EPC network topology comprising of a
+ * single node that implements both the SGW and PGW functionality, and
+ * an MME node. The S1-U, X2-U and X2-C interfaces are realized over
+ * PointToPoint links. 
+ */
+class PointToPointEpcHelper : public EpcHelper
+{
+public:
+  
+  /** 
+   * Constructor
+   */
+  PointToPointEpcHelper ();
+
+  /** 
+   * Destructor
+   */  
+  virtual ~PointToPointEpcHelper ();
+  
+  // inherited from Object
+  static TypeId GetTypeId (void);
+  virtual void DoDispose ();
+
+  // inherited from EpcHelper
+  virtual void AddEnb (Ptr<Node> enbNode, Ptr<NetDevice> lteEnbNetDevice, uint16_t cellId);
+  virtual void AddUe (Ptr<NetDevice> ueLteDevice, uint64_t imsi);
+  virtual void AddX2Interface (Ptr<Node> enbNode1, Ptr<Node> enbNode2);
+  virtual void ActivateEpsBearer (Ptr<NetDevice> ueLteDevice, uint64_t imsi, Ptr<EpcTft> tft, EpsBearer bearer);
+  virtual Ptr<Node> GetPgwNode ();
+  virtual Ipv4InterfaceContainer AssignUeIpv4Address (NetDeviceContainer ueDevices);
+  virtual Ipv4Address GetUeDefaultGatewayAddress ();
+
+
+
+private:
+
+  /**
+   * SGW-PGW network element
+   */
+
+  /** 
+   * helper to assign addresses to UE devices as well as to the TUN device of the SGW/PGW
+   */
+  Ipv4AddressHelper m_ueAddressHelper; 
+  
+  Ptr<Node> m_sgwPgw; 
+  Ptr<EpcSgwPgwApplication> m_sgwPgwApp;
+  Ptr<VirtualNetDevice> m_tunDevice;
+  Ptr<EpcMme> m_mme;
+
+  /**
+   * S1-U interfaces
+   */
+
+  /** 
+   * helper to assign addresses to S1-U NetDevices 
+   */
+  Ipv4AddressHelper m_s1uIpv4AddressHelper; 
+
+  DataRate m_s1uLinkDataRate;
+  Time     m_s1uLinkDelay;
+  uint16_t m_s1uLinkMtu;
+
+  /**
+   * UDP port where the GTP-U Socket is bound, fixed by the standard as 2152
+   */
+  uint16_t m_gtpuUdpPort;
+
+  /**
+   * Map storing for each IMSI the corresponding eNB NetDevice
+   * 
+   */
+  std::map<uint64_t, Ptr<NetDevice> > m_imsiEnbDeviceMap;
+  
+  /** 
+   * helper to assign addresses to X2 NetDevices 
+   */
+  Ipv4AddressHelper m_x2Ipv4AddressHelper;   
+
+  DataRate m_x2LinkDataRate;
+  Time     m_x2LinkDelay;
+  uint16_t m_x2LinkMtu;
+
+};
+
+
+
+
+} // namespace ns3
+
+#endif // POINT_TO_POINT_EPC_HELPER_H
diff -Naur ns-3.18.1/src/lte/helper/radio-bearer-stats-calculator.cc ns-3.19/src/lte/helper/radio-bearer-stats-calculator.cc
--- ns-3.18.1/src/lte/helper/radio-bearer-stats-calculator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/radio-bearer-stats-calculator.cc	2013-12-20 09:44:51.000000000 -0800
@@ -29,9 +29,11 @@
 namespace ns3
 {
 
-NS_LOG_COMPONENT_DEFINE ("RadioBearerStatsCalculator");
+NS_LOG_COMPONENT_DEFINE ("RadioBearerStatsCalculator")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED ( RadioBearerStatsCalculator);
+NS_OBJECT_ENSURE_REGISTERED ( RadioBearerStatsCalculator)
+  ;
 
 RadioBearerStatsCalculator::RadioBearerStatsCalculator ()
   : m_firstWrite (true),
diff -Naur ns-3.18.1/src/lte/helper/radio-bearer-stats-calculator.h ns-3.19/src/lte/helper/radio-bearer-stats-calculator.h
--- ns-3.18.1/src/lte/helper/radio-bearer-stats-calculator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/radio-bearer-stats-calculator.h	2013-12-20 09:44:51.000000000 -0800
@@ -79,31 +79,32 @@
   virtual
   ~RadioBearerStatsCalculator ();
 
-  /**
-   * Inherited from ns3::Object
-   */
+  // Inherited from ns3::Object
   static TypeId GetTypeId (void);
   void DoDispose ();
 
   /**
    * Get the name of the file where the uplink statistics will be stored.
+   * @return the name of the file where the uplink statistics will be stored
    */
   std::string GetUlOutputFilename (void);
 
   /**
    * Get the name of the file where the downlink statistics will be stored.
+   * @return the name of the file where the downlink statistics will be stored
    */
   std::string GetDlOutputFilename (void);
 
   /**
    * Set the name of the file where the uplink PDCP statistics will be stored.
    *
-   * \param outputFilename string with the name of the file
+   * @param outputFilename string with the name of the file
    */
   void SetUlPdcpOutputFilename (std::string outputFilename);
 
   /**
    * Get the name of the file where the uplink PDCP statistics will be stored.
+   * @return the name of the file where the uplink PDCP statistics will be stored
    */
   std::string GetUlPdcpOutputFilename (void);
 
@@ -116,6 +117,7 @@
 
   /**
    * Get the name of the file where the downlink PDCP statistics will be stored.
+   * @return the name of the file where the downlink PDCP statistics will be stored
    */
   std::string GetDlPdcpOutputFilename (void);
 
diff -Naur ns-3.18.1/src/lte/helper/radio-environment-map-helper.cc ns-3.19/src/lte/helper/radio-environment-map-helper.cc
--- ns-3.18.1/src/lte/helper/radio-environment-map-helper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/helper/radio-environment-map-helper.cc	2013-12-20 09:44:51.000000000 -0800
@@ -46,7 +46,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (RadioEnvironmentMapHelper);
+NS_OBJECT_ENSURE_REGISTERED (RadioEnvironmentMapHelper)
+  ;
 
 RadioEnvironmentMapHelper::RadioEnvironmentMapHelper ()
 {
diff -Naur ns-3.18.1/src/lte/model/a2-a4-rsrq-handover-algorithm.cc ns-3.19/src/lte/model/a2-a4-rsrq-handover-algorithm.cc
--- ns-3.18.1/src/lte/model/a2-a4-rsrq-handover-algorithm.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/a2-a4-rsrq-handover-algorithm.cc	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,289 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Original work authors (from lte-enb-rrc.cc):
+ * - Nicola Baldo <nbaldo@cttc.es>
+ * - Marco Miozzo <mmiozzo@cttc.es>
+ * - Manuel Requena <manuel.requena@cttc.es>
+ *
+ * Converted to handover algorithm interface by:
+ * - Budiarto Herman <budiarto.herman@magister.fi>
+ */
+
+#include "a2-a4-rsrq-handover-algorithm.h"
+#include <ns3/log.h>
+#include <ns3/uinteger.h>
+
+NS_LOG_COMPONENT_DEFINE ("A2A4RsrqHandoverAlgorithm");
+
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (A2A4RsrqHandoverAlgorithm)
+  ;
+
+
+///////////////////////////////////////////
+// Handover Management SAP forwarder
+///////////////////////////////////////////
+
+
+A2A4RsrqHandoverAlgorithm::A2A4RsrqHandoverAlgorithm ()
+  : m_a2MeasId (0),
+    m_a4MeasId (0),
+    m_servingCellThreshold (30),
+    m_neighbourCellOffset (1),
+    m_handoverManagementSapUser (0)
+{
+  NS_LOG_FUNCTION (this);
+  m_handoverManagementSapProvider = new MemberLteHandoverManagementSapProvider<A2A4RsrqHandoverAlgorithm> (this);
+}
+
+
+A2A4RsrqHandoverAlgorithm::~A2A4RsrqHandoverAlgorithm ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+
+TypeId
+A2A4RsrqHandoverAlgorithm::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::A2A4RsrqHandoverAlgorithm")
+    .SetParent<LteHandoverAlgorithm> ()
+    .AddConstructor<A2A4RsrqHandoverAlgorithm> ()
+    .AddAttribute ("ServingCellThreshold",
+                   "If the RSRQ of the serving cell is worse than this threshold, "
+                   "neighbour cells are consider for handover",
+                   UintegerValue (30),
+                   MakeUintegerAccessor (&A2A4RsrqHandoverAlgorithm::m_servingCellThreshold),
+                   MakeUintegerChecker<uint8_t> (0, 34)) // RSRQ range is [0..34] as per Section 9.1.7 of 3GPP TS 36.133
+    .AddAttribute ("NeighbourCellOffset",
+                   "Minimum offset between serving and best neighbour cell to trigger the Handover",
+                   UintegerValue (1),
+                   MakeUintegerAccessor (&A2A4RsrqHandoverAlgorithm::m_neighbourCellOffset),
+                   MakeUintegerChecker<uint8_t> ())
+  ;
+  return tid;
+}
+
+
+void
+A2A4RsrqHandoverAlgorithm::SetLteHandoverManagementSapUser (LteHandoverManagementSapUser* s)
+{
+  NS_LOG_FUNCTION (this << s);
+  m_handoverManagementSapUser = s;
+}
+
+
+LteHandoverManagementSapProvider*
+A2A4RsrqHandoverAlgorithm::GetLteHandoverManagementSapProvider ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_handoverManagementSapProvider;
+}
+
+
+void
+A2A4RsrqHandoverAlgorithm::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+
+  NS_LOG_LOGIC (this << " requesting Event A2 measurements"
+                     << " (threshold=" << (uint16_t) m_servingCellThreshold << ")");
+  LteRrcSap::ReportConfigEutra reportConfigA2;
+  reportConfigA2.eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  reportConfigA2.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ;
+  reportConfigA2.threshold1.range = m_servingCellThreshold;
+  reportConfigA2.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRQ;
+  reportConfigA2.reportInterval = LteRrcSap::ReportConfigEutra::MS240;
+  m_a2MeasId = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfigA2);
+
+  NS_LOG_LOGIC (this << " requesting Event A4 measurements"
+                     << " (threshold=0)");
+  LteRrcSap::ReportConfigEutra reportConfigA4;
+  reportConfigA4.eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  reportConfigA4.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ;
+  reportConfigA4.threshold1.range = 0; // intentionally very low threshold
+  reportConfigA4.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRQ;
+  reportConfigA4.reportInterval = LteRrcSap::ReportConfigEutra::MS480;
+  m_a4MeasId = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfigA4);
+
+  LteHandoverAlgorithm::DoInitialize ();
+}
+
+
+void
+A2A4RsrqHandoverAlgorithm::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+  delete m_handoverManagementSapProvider;
+}
+
+
+void
+A2A4RsrqHandoverAlgorithm::DoReportUeMeas (uint16_t rnti,
+                                           LteRrcSap::MeasResults measResults)
+{
+  NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
+
+  if (measResults.measId == m_a2MeasId)
+    {
+      NS_ASSERT_MSG (measResults.rsrqResult <= m_servingCellThreshold,
+                     "Invalid UE measurement report");
+      EvaluateHandover (rnti, measResults.rsrqResult);
+    }
+  else if (measResults.measId == m_a4MeasId)
+    {
+      if (measResults.haveMeasResultNeighCells
+          && !measResults.measResultListEutra.empty ())
+        {
+          for (std::list <LteRrcSap::MeasResultEutra>::iterator it = measResults.measResultListEutra.begin ();
+               it != measResults.measResultListEutra.end ();
+               ++it)
+            {
+              NS_ASSERT_MSG (it->haveRsrqResult == true,
+                             "RSRQ measurement is missing from cellId " << it->physCellId);
+              UpdateNeighbourMeasurements (rnti, it->physCellId, it->rsrqResult);
+            }
+        }
+      else
+        {
+          NS_LOG_WARN (this << " Event A4 received without measurement results from neighbouring cells");
+        }
+    }
+  else
+    {
+      NS_LOG_WARN ("Ignoring measId " << (uint16_t) measResults.measId);
+    }
+
+} // end of DoReportUeMeas
+
+
+void
+A2A4RsrqHandoverAlgorithm::EvaluateHandover (uint16_t rnti,
+                                             uint8_t servingCellRsrq)
+{
+  NS_LOG_FUNCTION (this << rnti << (uint16_t) servingCellRsrq);
+
+  MeasurementTable_t::iterator it1;
+  it1 = m_neighbourCellMeasures.find (rnti);
+
+  if (it1 == m_neighbourCellMeasures.end ())
+    {
+      NS_LOG_WARN ("Skipping handover evaluation for RNTI " << rnti << " because neighbour cells information is not found");
+    }
+  else
+    {
+      // Find the best neighbour cell (eNB)
+      NS_LOG_LOGIC ("Number of neighbour cells = " << it1->second.size ());
+      uint16_t bestNeighbourCellId = 0;
+      uint8_t bestNeighbourRsrq = 0;
+      MeasurementRow_t::iterator it2;
+      for (it2 = it1->second.begin (); it2 != it1->second.end (); ++it2)
+        {
+          if ((it2->second->m_rsrq > bestNeighbourRsrq)
+              && IsValidNeighbour (it2->first))
+            {
+              bestNeighbourCellId = it2->first;
+              bestNeighbourRsrq = it2->second->m_rsrq;
+            }
+        }
+
+      // Trigger Handover, if needed
+      if (bestNeighbourCellId > 0)
+        {
+          NS_LOG_LOGIC ("Best neighbour cellId " << bestNeighbourCellId);
+
+          if ((bestNeighbourRsrq - servingCellRsrq) >= m_neighbourCellOffset)
+            {
+              NS_LOG_LOGIC ("Trigger Handover to cellId " << bestNeighbourCellId);
+              NS_LOG_LOGIC ("target cell RSRQ " << (uint16_t) bestNeighbourRsrq);
+              NS_LOG_LOGIC ("serving cell RSRQ " << (uint16_t) servingCellRsrq);
+
+              // Inform eNodeB RRC about handover
+              m_handoverManagementSapUser->TriggerHandover (rnti,
+                                                            bestNeighbourCellId);
+            }
+        }
+
+    } // end of else of if (it1 == m_neighbourCellMeasures.end ())
+
+} // end of EvaluateMeasurementReport
+
+
+bool
+A2A4RsrqHandoverAlgorithm::IsValidNeighbour (uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << cellId);
+
+  /**
+   * \todo In the future, this function can be expanded to validate whether the
+   *       neighbour cell is a valid target cell, e.g., taking into account the
+   *       NRT in ANR and whether it is a CSG cell with closed access.
+   */
+
+  return true;
+}
+
+
+void
+A2A4RsrqHandoverAlgorithm::UpdateNeighbourMeasurements (uint16_t rnti,
+                                                        uint16_t cellId,
+                                                        uint8_t rsrq)
+{
+  NS_LOG_FUNCTION (this << rnti << cellId << (uint16_t) rsrq);
+  MeasurementTable_t::iterator it1;
+  it1 = m_neighbourCellMeasures.find (rnti);
+
+  if (it1 == m_neighbourCellMeasures.end ())
+    {
+      // insert a new UE entry
+      MeasurementRow_t row;
+      std::pair<MeasurementTable_t::iterator, bool> ret;
+      ret = m_neighbourCellMeasures.insert (std::pair<uint16_t, MeasurementRow_t> (rnti, row));
+      NS_ASSERT (ret.second);
+      it1 = ret.first;
+    }
+
+  NS_ASSERT (it1 != m_neighbourCellMeasures.end ());
+  Ptr<UeMeasure> neighbourCellMeasures;
+  std::map<uint16_t, Ptr<UeMeasure> >::iterator it2;
+  it2 = it1->second.find (cellId);
+
+  if (it2 != it1->second.end ())
+    {
+      neighbourCellMeasures = it2->second;
+      neighbourCellMeasures->m_cellId = cellId;
+      neighbourCellMeasures->m_rsrp = 0;
+      neighbourCellMeasures->m_rsrq = rsrq;
+    }
+  else
+    {
+      // insert a new cell entry
+      neighbourCellMeasures = Create<UeMeasure> ();
+      neighbourCellMeasures->m_cellId = cellId;
+      neighbourCellMeasures->m_rsrp = 0;
+      neighbourCellMeasures->m_rsrq = rsrq;
+      it1->second[cellId] = neighbourCellMeasures;
+    }
+
+} // end of UpdateNeighbourMeasurements
+
+
+} // end of namespace ns3
diff -Naur ns-3.18.1/src/lte/model/a2-a4-rsrq-handover-algorithm.h ns-3.19/src/lte/model/a2-a4-rsrq-handover-algorithm.h
--- ns-3.18.1/src/lte/model/a2-a4-rsrq-handover-algorithm.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/a2-a4-rsrq-handover-algorithm.h	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,152 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Original work authors (from lte-enb-rrc.cc):
+ * - Nicola Baldo <nbaldo@cttc.es>
+ * - Marco Miozzo <mmiozzo@cttc.es>
+ * - Manuel Requena <manuel.requena@cttc.es>
+ *
+ * Converted to handover algorithm interface by:
+ * - Budiarto Herman <budiarto.herman@magister.fi>
+ */
+
+#ifndef A2_A4_RSRQ_HANDOVER_ALGORITHM_H
+#define A2_A4_RSRQ_HANDOVER_ALGORITHM_H
+
+#include <ns3/lte-handover-algorithm.h>
+#include <ns3/lte-handover-management-sap.h>
+#include <ns3/lte-rrc-sap.h>
+#include <ns3/simple-ref-count.h>
+#include <ns3/ptr.h>
+#include <map>
+
+namespace ns3 {
+
+
+/**
+ * \brief Handover algorithm implementation based on RSRQ measurements, Event
+ *        A2 and Event A4.
+ *
+ * Handover decision made by this algorithm is primarily based on Event A2
+ * measurements (serving cell's RSRQ becomes worse than threshold). When the
+ * event is triggered, the first condition of handover is fulfilled.
+ *
+ * Event A4 measurements (neighbour cell's RSRQ becomes better than threshold)
+ * are used to detect neighbouring cells and their respective RSRQ. When a
+ * neighbouring cell's RSRQ is higher than the serving cell's RSRQ by a certain
+ * offset, then the second condition of handover is fulfilled.
+ *
+ * When the first and second conditions above are fulfilled, the algorithm
+ * informs the eNodeB RRC to trigger a handover.
+ *
+ * The threshold for Event A2 can be configured in the `ServingCellThreshold`
+ * attribute. The offset used in the second condition can also be configured by
+ * setting the `NeighbourCellOffset` attribute.
+ *
+ * The following code snippet is an example of using and configuring the
+ * handover algorithm in a simulation program:
+ *
+ *     Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+ *
+ *     NodeContainer enbNodes;
+ *     // configure the nodes here...
+ *
+ *     lteHelper->SetHandoverAlgorithmType ("ns3::A2A4RsrqHandoverAlgorithm");
+ *     lteHelper->SetHandoverAlgorithmAttribute ("ServingCellThreshold",
+ *                                               UintegerValue (30));
+ *     lteHelper->SetHandoverAlgorithmAttribute ("NeighbourCellOffset",
+ *                                               UintegerValue (1));
+ *     NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice (enbNodes);
+ *
+ * \note Setting the handover algorithm type and attributes after the call to
+ *       LteHelper::InstallEnbDevice does not have any effect to the devices
+ *       that have already been installed.
+ */
+class A2A4RsrqHandoverAlgorithm : public LteHandoverAlgorithm
+{
+public:
+  /**
+   * \brief Creates an A2-A4-RSRQ handover algorithm instance.
+   */
+  A2A4RsrqHandoverAlgorithm ();
+
+  virtual ~A2A4RsrqHandoverAlgorithm ();
+
+  // inherited from Object
+  static TypeId GetTypeId ();
+
+  // inherited from LteHandoverAlgorithm
+  virtual void SetLteHandoverManagementSapUser (LteHandoverManagementSapUser* s);
+  virtual LteHandoverManagementSapProvider* GetLteHandoverManagementSapProvider ();
+
+  // let the forwarder class access the protected and private members
+  friend class MemberLteHandoverManagementSapProvider<A2A4RsrqHandoverAlgorithm>;
+
+protected:
+  // inherited from Object
+  virtual void DoInitialize ();
+  virtual void DoDispose ();
+
+  // inherited from LteHandoverAlgorithm as a Handover Management SAP implementation
+  void DoReportUeMeas (uint16_t rnti, LteRrcSap::MeasResults measResults);
+
+private:
+  // Internal methods
+  void EvaluateHandover (uint16_t rnti, uint8_t servingCellRsrq);
+  bool IsValidNeighbour (uint16_t cellId);
+  void UpdateNeighbourMeasurements (uint16_t rnti, uint16_t cellId,
+                                    uint8_t rsrq);
+
+  // The expected measurement identities
+  uint8_t m_a2MeasId;
+  uint8_t m_a4MeasId;
+
+  /**
+   * \brief Measurements reported by a UE for a cell ID.
+   *
+   * The values are quantized according 3GPP TS 36.133 section 9.1.4 and 9.1.7.
+   */
+  class UeMeasure : public SimpleRefCount<UeMeasure>
+  {
+  public:
+    uint16_t m_cellId;
+    uint8_t m_rsrp;
+    uint8_t m_rsrq;
+  };
+
+  //               cellId
+  typedef std::map<uint16_t, Ptr<UeMeasure> > MeasurementRow_t;
+  //               rnti
+  typedef std::map<uint16_t, MeasurementRow_t> MeasurementTable_t;
+  MeasurementTable_t m_neighbourCellMeasures;
+
+  // Class attributes
+  uint8_t m_servingCellThreshold;
+  uint8_t m_neighbourCellOffset;
+
+  // Handover Management SAPs
+  LteHandoverManagementSapUser* m_handoverManagementSapUser;
+  LteHandoverManagementSapProvider* m_handoverManagementSapProvider;
+
+}; // end of class A2A4RsrqHandoverAlgorithm
+
+
+} // end of namespace ns3
+
+
+#endif /* A2_A4_RSRQ_HANDOVER_ALGORITHM_H */
diff -Naur ns-3.18.1/src/lte/model/a3-rsrp-handover-algorithm.cc ns-3.19/src/lte/model/a3-rsrp-handover-algorithm.cc
--- ns-3.18.1/src/lte/model/a3-rsrp-handover-algorithm.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/a3-rsrp-handover-algorithm.cc	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,194 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#include "a3-rsrp-handover-algorithm.h"
+#include <ns3/log.h>
+#include <ns3/double.h>
+#include <ns3/lte-common.h>
+#include <list>
+
+NS_LOG_COMPONENT_DEFINE ("A3RsrpHandoverAlgorithm");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (A3RsrpHandoverAlgorithm)
+  ;
+
+
+A3RsrpHandoverAlgorithm::A3RsrpHandoverAlgorithm ()
+  : m_handoverManagementSapUser (0)
+{
+  NS_LOG_FUNCTION (this);
+  m_handoverManagementSapProvider = new MemberLteHandoverManagementSapProvider<A3RsrpHandoverAlgorithm> (this);
+}
+
+
+A3RsrpHandoverAlgorithm::~A3RsrpHandoverAlgorithm ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+
+TypeId
+A3RsrpHandoverAlgorithm::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::A3RsrpHandoverAlgorithm")
+    .SetParent<LteHandoverAlgorithm> ()
+    .AddConstructor<A3RsrpHandoverAlgorithm> ()
+    .AddAttribute ("Hysteresis",
+                   "Handover margin (hysteresis) in dB "
+                   "(rounded to the nearest multiple of 0.5 dB)",
+                   DoubleValue (3.0),
+                   MakeDoubleAccessor (&A3RsrpHandoverAlgorithm::m_hysteresisDb),
+                   MakeDoubleChecker<uint8_t> (0.0, 15.0)) // Hysteresis IE value range is [0..30] as per Section 6.3.5 of 3GPP TS 36.331
+    .AddAttribute ("TimeToTrigger",
+                   "Time during which neighbour cell's RSRP "
+                   "must continuously higher than serving cell's RSRP "
+                   "in order to trigger a handover",
+                   TimeValue (MilliSeconds (256)), // 3GPP time-to-trigger median value as per Section 6.3.5 of 3GPP TS 36.331
+                   MakeTimeAccessor (&A3RsrpHandoverAlgorithm::m_timeToTrigger),
+                   MakeTimeChecker ())
+  ;
+  return tid;
+}
+
+
+void
+A3RsrpHandoverAlgorithm::SetLteHandoverManagementSapUser (LteHandoverManagementSapUser* s)
+{
+  NS_LOG_FUNCTION (this << s);
+  m_handoverManagementSapUser = s;
+}
+
+
+LteHandoverManagementSapProvider*
+A3RsrpHandoverAlgorithm::GetLteHandoverManagementSapProvider ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_handoverManagementSapProvider;
+}
+
+
+void
+A3RsrpHandoverAlgorithm::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+
+  uint8_t hysteresisIeValue = EutranMeasurementMapping::ActualHysteresis2IeValue (m_hysteresisDb);
+  NS_LOG_LOGIC (this << " requesting Event A3 measurements"
+                     << " (hysteresis=" << (uint16_t) hysteresisIeValue << ")"
+                     << " (ttt=" << m_timeToTrigger.GetMilliSeconds () << ")");
+
+  LteRrcSap::ReportConfigEutra reportConfig;
+  reportConfig.eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  reportConfig.a3Offset = 0;
+  reportConfig.hysteresis = hysteresisIeValue;
+  reportConfig.timeToTrigger = m_timeToTrigger.GetMilliSeconds ();
+  reportConfig.reportOnLeave = false;
+  reportConfig.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRP;
+  reportConfig.reportInterval = LteRrcSap::ReportConfigEutra::MS1024;
+  m_measId = m_handoverManagementSapUser->AddUeMeasReportConfigForHandover (reportConfig);
+
+  LteHandoverAlgorithm::DoInitialize ();
+}
+
+
+void
+A3RsrpHandoverAlgorithm::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+  delete m_handoverManagementSapProvider;
+}
+
+
+void
+A3RsrpHandoverAlgorithm::DoReportUeMeas (uint16_t rnti,
+                                         LteRrcSap::MeasResults measResults)
+{
+  NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
+
+  if (measResults.measId != m_measId)
+    {
+      NS_LOG_WARN ("Ignoring measId " << (uint16_t) measResults.measId);
+    }
+  else
+    {
+      if (measResults.haveMeasResultNeighCells
+          && !measResults.measResultListEutra.empty ())
+        {
+          uint16_t bestNeighbourCellId = 0;
+          uint8_t bestNeighbourRsrp = -std::numeric_limits<double>::infinity ();
+
+          for (std::list <LteRrcSap::MeasResultEutra>::iterator it = measResults.measResultListEutra.begin ();
+               it != measResults.measResultListEutra.end ();
+               ++it)
+            {
+              if (it->haveRsrpResult)
+                {
+                  if ((bestNeighbourRsrp < it->rsrpResult)
+                      && IsValidNeighbour (it->physCellId))
+                    {
+                      bestNeighbourCellId = it->physCellId;
+                      bestNeighbourRsrp = it->rsrpResult;
+                    }
+                }
+              else
+                {
+                  NS_LOG_WARN ("RSRP measurement is missing from cell ID " << it->physCellId);
+                }
+            }
+
+          if (bestNeighbourCellId > 0)
+            {
+              NS_LOG_LOGIC ("Trigger Handover to cellId " << bestNeighbourCellId);
+              NS_LOG_LOGIC ("target cell RSRP " << (uint16_t) bestNeighbourRsrp);
+              NS_LOG_LOGIC ("serving cell RSRP " << (uint16_t) measResults.rsrpResult);
+
+              // Inform eNodeB RRC about handover
+              m_handoverManagementSapUser->TriggerHandover (rnti,
+                                                            bestNeighbourCellId);
+            }
+        }
+      else
+        {
+          NS_LOG_WARN (this << " Event A3 received without measurement results from neighbouring cells");
+        }
+    } // end of else of if (measResults.measId != m_measId)
+
+} // end of DoReportUeMeas
+
+
+bool
+A3RsrpHandoverAlgorithm::IsValidNeighbour (uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << cellId);
+
+  /**
+   * \todo In the future, this function can be expanded to validate whether the
+   *       neighbour cell is a valid target cell, e.g., taking into account the
+   *       NRT in ANR and whether it is a CSG cell with closed access.
+   */
+
+  return true;
+}
+
+
+} // end of namespace ns3
diff -Naur ns-3.18.1/src/lte/model/a3-rsrp-handover-algorithm.h ns-3.19/src/lte/model/a3-rsrp-handover-algorithm.h
--- ns-3.18.1/src/lte/model/a3-rsrp-handover-algorithm.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/a3-rsrp-handover-algorithm.h	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,114 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#ifndef A3_RSRP_HANDOVER_ALGORITHM_H
+#define A3_RSRP_HANDOVER_ALGORITHM_H
+
+#include <ns3/lte-handover-algorithm.h>
+#include <ns3/lte-handover-management-sap.h>
+#include <ns3/lte-rrc-sap.h>
+#include <ns3/nstime.h>
+
+namespace ns3 {
+
+
+/**
+ * \brief Implementation of the strongest cell handover algorithm, based on RSRP
+ *        measurements and Event A3.
+ *
+ * The algorithm utilizes Event A3 (Section 5.5.4.4 of 3GPP TS 36.331) UE
+ * measurements and the Reference Signal Reference Power (RSRP). It is defined
+ * as the event when the UE perceives that a neighbour cell's RSRP is better
+ * than the serving cell's RSRP.
+ *
+ * Handover margin (a.k.a. hysteresis) and time-to-trigger (TTT) can be
+ * configured to delay the event triggering. The values of these parameters
+ * apply to all attached UEs.
+ *
+ * The following code snippet is an example of using and configuring the
+ * handover algorithm in a simulation program:
+ *
+ *     Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+ *
+ *     NodeContainer enbNodes;
+ *     // configure the nodes here...
+ *
+ *     lteHelper->SetHandoverAlgorithmType ("ns3::A3RsrpHandoverAlgorithm");
+ *     lteHelper->SetHandoverAlgorithmAttribute ("Hysteresis",
+ *                                               DoubleValue (3.0));
+ *     lteHelper->SetHandoverAlgorithmAttribute ("TimeToTrigger",
+ *                                               TimeValue (MilliSeconds (256)));
+ *     NetDeviceContainer enbLteDevs = lteHelper->InstallEnbDevice (enbNodes);
+ *
+ * \note Setting the handover algorithm type and attributes after the call to
+ *       LteHelper::InstallEnbDevice does not have any effect to the devices
+ *       that have already been installed.
+ */
+class A3RsrpHandoverAlgorithm : public LteHandoverAlgorithm
+{
+public:
+  /**
+   * \brief Creates a strongest cell handover algorithm instance.
+   */
+  A3RsrpHandoverAlgorithm ();
+
+  virtual ~A3RsrpHandoverAlgorithm ();
+
+  // inherited from Object
+  static TypeId GetTypeId ();
+
+  // inherited from LteHandoverAlgorithm
+  virtual void SetLteHandoverManagementSapUser (LteHandoverManagementSapUser* s);
+  virtual LteHandoverManagementSapProvider* GetLteHandoverManagementSapProvider ();
+
+  // let the forwarder class access the protected and private members
+  friend class MemberLteHandoverManagementSapProvider<A3RsrpHandoverAlgorithm>;
+
+protected:
+  // inherited from Object
+  virtual void DoInitialize ();
+  virtual void DoDispose ();
+
+  // inherited from LteHandoverAlgorithm as a Handover Management SAP implementation
+  void DoReportUeMeas (uint16_t rnti, LteRrcSap::MeasResults measResults);
+
+private:
+  // Internal method
+  bool IsValidNeighbour (uint16_t cellId);
+
+  // The expected measurement identity
+  uint8_t m_measId;
+
+  // Class attributes
+  double m_hysteresisDb;
+  Time m_timeToTrigger;
+
+  // Handover Management SAPs
+  LteHandoverManagementSapUser* m_handoverManagementSapUser;
+  LteHandoverManagementSapProvider* m_handoverManagementSapProvider;
+
+}; // end of class A3RsrpHandoverAlgorithm
+
+
+} // end of namespace ns3
+
+
+#endif /* A3_RSRP_HANDOVER_ALGORITHM_H */
diff -Naur ns-3.18.1/src/lte/model/epc-enb-application.cc ns-3.19/src/lte/model/epc-enb-application.cc
--- ns-3.18.1/src/lte/model/epc-enb-application.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-enb-application.cc	2013-12-20 09:44:51.000000000 -0800
@@ -33,7 +33,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("EpcEnbApplication");
+NS_LOG_COMPONENT_DEFINE ("EpcEnbApplication")
+  ;
 
 
 EpcEnbApplication::EpsFlowId_t::EpsFlowId_t ()
diff -Naur ns-3.18.1/src/lte/model/epc-gtpu-header.cc ns-3.19/src/lte/model/epc-gtpu-header.cc
--- ns-3.18.1/src/lte/model/epc-gtpu-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-gtpu-header.cc	2013-12-20 09:44:51.000000000 -0800
@@ -30,7 +30,8 @@
  *        GTP-U-v1 Header
  ********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (GtpuHeader);
+NS_OBJECT_ENSURE_REGISTERED (GtpuHeader)
+  ;
 
 TypeId
 GtpuHeader::GetTypeId (void)
diff -Naur ns-3.18.1/src/lte/model/epc-mme.cc ns-3.19/src/lte/model/epc-mme.cc
--- ns-3.18.1/src/lte/model/epc-mme.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-mme.cc	2013-12-20 09:44:51.000000000 -0800
@@ -33,7 +33,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (EpcMme);
+NS_OBJECT_ENSURE_REGISTERED (EpcMme)
+  ;
 
 EpcMme::EpcMme ()
   : m_s11SapSgw (0)
diff -Naur ns-3.18.1/src/lte/model/epc-mme.h ns-3.19/src/lte/model/epc-mme.h
--- ns-3.18.1/src/lte/model/epc-mme.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-mme.h	2013-12-20 09:44:51.000000000 -0800
@@ -84,10 +84,10 @@
 
   /** 
    * Add a new ENB to the MME. 
-   * \param imsi the unique identifier of the UE
+   * \param ecgi E-UTRAN Cell Global ID, the unique identifier of the eNodeB
    * \param enbS1apSap the ENB side of the S1-AP SAP 
    */
-  void AddEnb (uint16_t egci, Ipv4Address enbS1UAddr, EpcS1apSapEnb* enbS1apSap); 
+  void AddEnb (uint16_t ecgi, Ipv4Address enbS1UAddr, EpcS1apSapEnb* enbS1apSap);
   
   /** 
    * Add a new UE to the MME. This is the equivalent of storing the UE
diff -Naur ns-3.18.1/src/lte/model/epc-s11-sap.h ns-3.19/src/lte/model/epc-s11-sap.h
--- ns-3.18.1/src/lte/model/epc-s11-sap.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-s11-sap.h	2013-12-20 09:44:51.000000000 -0800
@@ -99,7 +99,7 @@
   /** 
    * send a Create Session Response message
    * 
-   * \params msg the message
+   * \param msg the message
    */
   virtual void CreateSessionResponse (CreateSessionResponseMessage msg) = 0;
 
@@ -120,7 +120,7 @@
   /** 
    * send a Modify Bearer Response message
    * 
-   * \params msg the message
+   * \param msg the message
    */
   virtual void ModifyBearerResponse (ModifyBearerResponseMessage msg) = 0;
 
@@ -158,7 +158,7 @@
   /** 
    * send a Create Session Request message
    * 
-   * \params msg the message
+   * \param msg the message
    */
   virtual void CreateSessionRequest (CreateSessionRequestMessage msg) = 0;
 
@@ -174,7 +174,7 @@
   /** 
    * send a Modify Bearer Request message
    * 
-   * \params msg the message
+   * \param msg the message
    */
   virtual void ModifyBearerRequest (ModifyBearerRequestMessage msg) = 0;
 
diff -Naur ns-3.18.1/src/lte/model/epc-s1ap-sap.h ns-3.19/src/lte/model/epc-s1ap-sap.h
--- ns-3.18.1/src/lte/model/epc-s1ap-sap.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-s1ap-sap.h	2013-12-20 09:44:51.000000000 -0800
@@ -53,11 +53,11 @@
    * 
    * \param mmeUeS1Id in practice, we use the IMSI
    * \param enbUeS1Id in practice, we use the RNTI
-   * \param s-tmsi in practice, the imsi
+   * \param stmsi in practice, the imsi
    * \param ecgi in practice, the cell Id
    * 
    */
-  virtual void InitialUeMessage (uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t imsi, uint16_t ecgi) = 0;
+  virtual void InitialUeMessage (uint64_t mmeUeS1Id, uint16_t enbUeS1Id, uint64_t stmsi, uint16_t ecgi) = 0;
 
 
   /**
@@ -76,10 +76,12 @@
    * 
    * \param mmeUeS1Id in practice, we use the IMSI
    * \param enbUeS1Id in practice, we use the RNTI
-   * \param ecgi in practice, the cell Id
+   * \param erabSetupList
    * 
    */
-  virtual void InitialContextSetupResponse (uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ErabSetupItem> erabSetupList) = 0;
+  virtual void InitialContextSetupResponse (uint64_t mmeUeS1Id,
+                                            uint16_t enbUeS1Id,
+                                            std::list<ErabSetupItem> erabSetupList) = 0;
 
 
   /**
@@ -126,10 +128,12 @@
    * 
    * \param mmeUeS1Id in practice, we use the IMSI
    * \param enbUeS1Id in practice, we use the RNTI
-   * \param ecgi in practice, the cell Id
+   * \param erabToBeSetupList
    * 
    */
-  virtual void InitialContextSetupRequest (uint64_t mmeUeS1Id, uint16_t enbUeS1Id, std::list<ErabToBeSetupItem> erabToBeSetupList) = 0;
+  virtual void InitialContextSetupRequest (uint64_t mmeUeS1Id,
+                                           uint16_t enbUeS1Id,
+                                           std::list<ErabToBeSetupItem> erabToBeSetupList) = 0;
 
 
   /**
diff -Naur ns-3.18.1/src/lte/model/epc-sgw-pgw-application.cc ns-3.19/src/lte/model/epc-sgw-pgw-application.cc
--- ns-3.18.1/src/lte/model/epc-sgw-pgw-application.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-sgw-pgw-application.cc	2013-12-20 09:44:51.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("EpcSgwPgwApplication");
+NS_LOG_COMPONENT_DEFINE ("EpcSgwPgwApplication")
+  ;
 
 
 /////////////////////////
diff -Naur ns-3.18.1/src/lte/model/epc-sgw-pgw-application.h ns-3.19/src/lte/model/epc-sgw-pgw-application.h
--- ns-3.18.1/src/lte/model/epc-sgw-pgw-application.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-sgw-pgw-application.h	2013-12-20 09:44:51.000000000 -0800
@@ -130,7 +130,8 @@
    * Let the SGW be aware of a new eNB 
    * 
    * \param cellId the cell identifier
-   * \param enbAdd the address of the eNB
+   * \param enbAddr the address of the eNB
+   * \param sgwAddr the address of the SGW
    */
   void AddEnb (uint16_t cellId, Ipv4Address enbAddr, Ipv4Address sgwAddr);
 
diff -Naur ns-3.18.1/src/lte/model/epc-tft.cc ns-3.19/src/lte/model/epc-tft.cc
--- ns-3.18.1/src/lte/model/epc-tft.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-tft.cc	2013-12-20 09:44:51.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("EpcTft");
+NS_LOG_COMPONENT_DEFINE ("EpcTft")
+  ;
 
 std::ostream& operator<< (std::ostream& os, EpcTft::Direction& d)
 {
diff -Naur ns-3.18.1/src/lte/model/epc-tft.h ns-3.19/src/lte/model/epc-tft.h
--- ns-3.18.1/src/lte/model/epc-tft.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-tft.h	2013-12-20 09:44:51.000000000 -0800
@@ -124,7 +124,7 @@
   /** 
    * add a PacketFilter to the Traffic Flow Template
    * 
-   * \param the PacketFilter to be added
+   * \param f the PacketFilter to be added
    * 
    * \return the id( 0 <= id < 16) of the newly added filter, if the addition was successful. Will fail if you try to add more than 15 filters. This is to be compliant with TS 24.008.
    */
diff -Naur ns-3.18.1/src/lte/model/epc-ue-nas.cc ns-3.19/src/lte/model/epc-ue-nas.cc
--- ns-3.18.1/src/lte/model/epc-ue-nas.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-ue-nas.cc	2013-12-20 09:44:51.000000000 -0800
@@ -35,14 +35,14 @@
 
 
 
-const char* g_ueNasStateName[EpcUeNas::NUM_STATES] = 
-  {
-      "OFF",
-      "ATTACHING",
-      "IDLE_REGISTERED",
-      "CONNECTING_TO_EPC",
-      "ACTIVE "    
-  };
+const char* g_ueNasStateName[EpcUeNas::NUM_STATES] =
+{
+  "OFF",
+  "ATTACHING",
+  "IDLE_REGISTERED",
+  "CONNECTING_TO_EPC",
+  "ACTIVE"
+};
 
 std::string ToString (EpcUeNas::State s)
 {
@@ -52,10 +52,12 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (EpcUeNas);
+NS_OBJECT_ENSURE_REGISTERED (EpcUeNas)
+  ;
 
 EpcUeNas::EpcUeNas ()
   : m_state (OFF),
+    m_csgId (0),
     m_asSapProvider (0),
     m_bidCounter (0)
 {
@@ -73,7 +75,7 @@
 EpcUeNas::DoDispose ()
 {
   NS_LOG_FUNCTION (this);
-  delete m_asSapUser;  
+  delete m_asSapUser;
 }
 
 TypeId
@@ -92,41 +94,76 @@
 void 
 EpcUeNas::SetDevice (Ptr<NetDevice> dev)
 {
+  NS_LOG_FUNCTION (this << dev);
   m_device = dev;
 }
 
 void 
 EpcUeNas::SetImsi (uint64_t imsi)
 {
+  NS_LOG_FUNCTION (this << imsi);
   m_imsi = imsi;
 }
 
 void
+EpcUeNas::SetCsgId (uint32_t csgId)
+{
+  NS_LOG_FUNCTION (this << csgId);
+  m_csgId = csgId;
+  m_asSapProvider->SetCsgWhiteList (csgId);
+}
+
+uint32_t
+EpcUeNas::GetCsgId () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_csgId;
+}
+
+void
 EpcUeNas::SetAsSapProvider (LteAsSapProvider* s)
 {
+  NS_LOG_FUNCTION (this << s);
   m_asSapProvider = s;
 }
 
-LteAsSapUser* 
+LteAsSapUser*
 EpcUeNas::GetAsSapUser ()
 {
+  NS_LOG_FUNCTION (this);
   return m_asSapUser;
 }
 
-void 
+void
 EpcUeNas::SetForwardUpCallback (Callback <void, Ptr<Packet> > cb)
 {
+  NS_LOG_FUNCTION (this);
   m_forwardUpCallback = cb;
 }
 
+void
+EpcUeNas::StartCellSelection (uint16_t dlEarfcn)
+{
+  NS_LOG_FUNCTION (this << dlEarfcn);
+  m_asSapProvider->StartCellSelection (dlEarfcn);
+}
+
 void 
-EpcUeNas::Connect (uint16_t cellId, uint16_t earfcn)
+EpcUeNas::Connect ()
 {
   NS_LOG_FUNCTION (this);
 
-  // since RRC Idle Mode cell selection is not supported yet, we
+  // tell RRC to go into connected mode
+  m_asSapProvider->Connect ();
+}
+
+void
+EpcUeNas::Connect (uint16_t cellId, uint16_t dlEarfcn)
+{
+  NS_LOG_FUNCTION (this << cellId << dlEarfcn);
+
   // force the UE RRC to be camped on a specific eNB
-  m_asSapProvider->ForceCampedOnEnb (cellId, earfcn);
+  m_asSapProvider->ForceCampedOnEnb (cellId, dlEarfcn);
 
   // tell RRC to go into connected mode
   m_asSapProvider->Connect ();
@@ -165,7 +202,7 @@
 EpcUeNas::Send (Ptr<Packet> packet)
 {
   NS_LOG_FUNCTION (this << packet);
-  
+
   switch (m_state)
     {
     case ACTIVE:
@@ -181,15 +218,15 @@
           {
             m_asSapProvider->SendData (packet, bid); 
             return true;
-        }
+          }
       }
       break;
 
-    default:      
+    default:
       NS_LOG_WARN (this << " NAS OFF, discarding packet");
       return false;
       break;
-    }        
+    }
 }
 
 void 
@@ -203,13 +240,20 @@
 void 
 EpcUeNas::DoNotifyConnectionFailed ()
 {
-  NS_FATAL_ERROR ("connection failed, it should not happen with the current model");
+  NS_LOG_FUNCTION (this);
+
+  SwitchToState (OFF);
+  /**
+   * \todo Currently not implemented, action by NAS and upper layers after UE
+   *       fails to switch to CONNNECTED mode. Maybe a retry, or just stop here
+   *       and fire a trace to let user know.
+   */
 }
 
 void
 EpcUeNas::DoRecvData (Ptr<Packet> packet)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << packet);
   m_forwardUpCallback (packet);
 }
 
@@ -229,10 +273,17 @@
   m_tftClassifier.Add (tft, bid);
 }
 
+EpcUeNas::State
+EpcUeNas::GetState () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_state;
+}
+
 void 
 EpcUeNas::SwitchToState (State newState)
 {
-  NS_LOG_FUNCTION (this << newState);
+  NS_LOG_FUNCTION (this << ToString (newState));
   State oldState = m_state;
   m_state = newState;
   NS_LOG_INFO ("IMSI " << m_imsi << " NAS " << ToString (oldState) << " --> " << ToString (newState));
diff -Naur ns-3.18.1/src/lte/model/epc-ue-nas.h ns-3.19/src/lte/model/epc-ue-nas.h
--- ns-3.18.1/src/lte/model/epc-ue-nas.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-ue-nas.h	2013-12-20 09:44:51.000000000 -0800
@@ -64,36 +64,64 @@
    */
   void SetImsi (uint64_t imsi);
 
-  /** 
+  /**
+   *
+   * \param csgId Closed Subscriber Group identity
+   */
+  void SetCsgId (uint32_t csgId);
+
+  /**
+   *
+   * \return csgId Closed Subscriber Group identity
+   */
+  uint32_t GetCsgId () const;
+
+  /**
    * Set the AS SAP provider to interact with the NAS entity
-   * 
+   *
    * \param s the AS SAP provider
    */
   void SetAsSapProvider (LteAsSapProvider* s);
 
-  /** 
-   * 
-   * 
+  /**
+   *
+   *
    * \return the AS SAP user exported by this RRC
    */
   LteAsSapUser* GetAsSapUser ();
 
-  /** 
+  /**
    * set the callback used to forward data packets up the stack
-   * 
+   *
    * \param cb the callback
    */
   void SetForwardUpCallback (Callback <void, Ptr<Packet> > cb);
- 
-  /** 
-   * instruct the NAS to go to ACTIVE state, i.e., EMM Registered + ECM Connected
-   * Since RRC Idle Mode cell selection is not supported yet, we
-   * force the UE RRC to be camped on a specific eNB.
+
+  /**
+   * \brief Causes NAS to tell AS to find a suitable cell and camp to it.
+   *
+   * \param dlEarfcn the DL frequency of the eNB
+   */
+  void StartCellSelection (uint16_t dlEarfcn);
+
+  /**
+   * \brief Causes NAS to tell AS to go to ACTIVE state.
    * 
+   * The end result is equivalent with EMM Registered + ECM Connected states.
+   */
+  void Connect ();
+
+  /**
+   * \brief Causes NAS to tell AS to camp to a specific cell and go to ACTIVE
+   *        state.
    * \param cellId the id of the eNB to camp on
-   * \param earfcn the DL frequency of the eNB
+   * \param dlEarfcn the DL frequency of the eNB
+   *
+   * The end result is equivalent with EMM Registered + ECM Connected states.
+   * Since RRC Idle Mode cell selection is not supported yet, we force the UE
+   * RRC to be camped on a specific eNB.
    */
-  void Connect (uint16_t cellId, uint16_t earfcn);
+  void Connect (uint16_t cellId, uint16_t dlEarfcn);
  
   /** 
    * instruct the NAS to disconnect
@@ -126,18 +154,23 @@
    * 
    */
   enum State 
-    {
-      OFF = 0,
-      ATTACHING,
-      IDLE_REGISTERED,
-      CONNECTING_TO_EPC,
-      ACTIVE,
-      NUM_STATES
-    };
+  {
+    OFF = 0,
+    ATTACHING,
+    IDLE_REGISTERED,
+    CONNECTING_TO_EPC,
+    ACTIVE,
+    NUM_STATES
+  };
+
+  /**
+   * \return The current state
+   */
+  State GetState () const;
 
  
 private:
-  
+
   // LTE AS SAP methods
   void DoNotifyConnectionSuccessful ();
   void DoNotifyConnectionFailed ();
@@ -155,7 +188,9 @@
   Ptr<NetDevice> m_device;
 
   uint64_t m_imsi;
-  
+
+  uint32_t m_csgId;
+
   LteAsSapProvider* m_asSapProvider;
   LteAsSapUser* m_asSapUser;
 
diff -Naur ns-3.18.1/src/lte/model/epc-x2.cc ns-3.19/src/lte/model/epc-x2.cc
--- ns-3.18.1/src/lte/model/epc-x2.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-x2.cc	2013-12-20 09:44:51.000000000 -0800
@@ -80,7 +80,8 @@
 
 ///////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2)
+  ;
 
 EpcX2::EpcX2 ()
   : m_x2cUdpPort (4444),
diff -Naur ns-3.18.1/src/lte/model/epc-x2.h ns-3.19/src/lte/model/epc-x2.h
--- ns-3.18.1/src/lte/model/epc-x2.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-x2.h	2013-12-20 09:44:51.000000000 -0800
@@ -92,15 +92,20 @@
   void SetEpcX2SapUser (EpcX2SapUser * s);
 
   /**
-   * \param s the X2 SAP Provider interface offered by this EPC X2 entity
+   * \return the X2 SAP Provider interface offered by this EPC X2 entity
    */
   EpcX2SapProvider* GetEpcX2SapProvider ();
 
 
   /**
-   * \param s the X2 SAP Provider interface offered by this EPC X2 entity
+   * Add an X2 interface to this EPC X2 entity
+   * \param enb1CellId the cell ID of the current eNodeB
+   * \param enb1X2Address the address of the current eNodeB
+   * \param enb2CellId the cell ID of the neighbouring eNodeB
+   * \param enb2X2Address the address of the neighbouring eNodeB
    */
-  void AddX2Interface (uint16_t enb1CellId, Ipv4Address enb1X2Address, uint16_t enb2CellId, Ipv4Address enb2X2Address);
+  void AddX2Interface (uint16_t enb1CellId, Ipv4Address enb1X2Address,
+                       uint16_t enb2CellId, Ipv4Address enb2X2Address);
 
 
   /** 
diff -Naur ns-3.18.1/src/lte/model/epc-x2-header.cc ns-3.19/src/lte/model/epc-x2-header.cc
--- ns-3.18.1/src/lte/model/epc-x2-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/epc-x2-header.cc	2013-12-20 09:44:51.000000000 -0800
@@ -27,7 +27,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2Header);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2Header)
+  ;
 
 EpcX2Header::EpcX2Header ()
   : m_messageType (0xfa),
@@ -145,7 +146,8 @@
 
 /////////////////////////////////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2HandoverRequestHeader);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2HandoverRequestHeader)
+  ;
 
 EpcX2HandoverRequestHeader::EpcX2HandoverRequestHeader ()
   : m_numberOfIes (1 + 1 + 1 + 1),
@@ -433,7 +435,8 @@
 
 /////////////////////////////////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2HandoverRequestAckHeader);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2HandoverRequestAckHeader)
+  ;
 
 EpcX2HandoverRequestAckHeader::EpcX2HandoverRequestAckHeader ()
   : m_numberOfIes (1 + 1 + 1 + 1),
@@ -658,7 +661,8 @@
 
 /////////////////////////////////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2HandoverPreparationFailureHeader);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2HandoverPreparationFailureHeader)
+  ;
 
 EpcX2HandoverPreparationFailureHeader::EpcX2HandoverPreparationFailureHeader ()
   : m_numberOfIes (1 + 1 + 1),
@@ -783,7 +787,8 @@
 
 /////////////////////////////////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2SnStatusTransferHeader);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2SnStatusTransferHeader)
+  ;
 
 EpcX2SnStatusTransferHeader::EpcX2SnStatusTransferHeader ()
   : m_numberOfIes (3),
@@ -975,7 +980,8 @@
 
 /////////////////////////////////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2UeContextReleaseHeader);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2UeContextReleaseHeader)
+  ;
 
 EpcX2UeContextReleaseHeader::EpcX2UeContextReleaseHeader ()
   : m_numberOfIes (1 + 1),
@@ -1082,7 +1088,8 @@
 
 /////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2LoadInformationHeader);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2LoadInformationHeader)
+  ;
 
 EpcX2LoadInformationHeader::EpcX2LoadInformationHeader ()
   : m_numberOfIes (1),
@@ -1306,7 +1313,8 @@
 
 ////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (EpcX2ResourceStatusUpdateHeader);
+NS_OBJECT_ENSURE_REGISTERED (EpcX2ResourceStatusUpdateHeader)
+  ;
 
 EpcX2ResourceStatusUpdateHeader::EpcX2ResourceStatusUpdateHeader ()
   : m_numberOfIes (3),
diff -Naur ns-3.18.1/src/lte/model/eps-bearer-tag.cc ns-3.19/src/lte/model/eps-bearer-tag.cc
--- ns-3.18.1/src/lte/model/eps-bearer-tag.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/eps-bearer-tag.cc	2013-12-20 09:44:51.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (EpsBearerTag);
+NS_OBJECT_ENSURE_REGISTERED (EpsBearerTag)
+  ;
 
 TypeId
 EpsBearerTag::GetTypeId (void)
diff -Naur ns-3.18.1/src/lte/model/eps-bearer-tag.h ns-3.19/src/lte/model/eps-bearer-tag.h
--- ns-3.18.1/src/lte/model/eps-bearer-tag.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/eps-bearer-tag.h	2013-12-20 09:44:51.000000000 -0800
@@ -54,7 +54,7 @@
    *
    * @param rnti the value of the RNTI to set
    */
-  void SetRnti (uint16_t tid);
+  void SetRnti (uint16_t rnti);
 
   /**
    * Set the bearer id to the given value.
diff -Naur ns-3.18.1/src/lte/model/fdbet-ff-mac-scheduler.cc ns-3.19/src/lte/model/fdbet-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/fdbet-ff-mac-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/fdbet-ff-mac-scheduler.cc	2013-12-20 09:44:51.000000000 -0800
@@ -43,7 +43,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (FdBetFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (FdBetFfMacScheduler)
+  ;
 
 
 
@@ -650,6 +651,14 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -691,6 +700,44 @@
         }
       rbStart = rbStart + rbLen;
 
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -952,6 +999,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
   std::map <uint16_t, fdbetsFlowPerf_t>::iterator itFlow;
   std::map <uint16_t, double> estAveThr;                                // store expected average throughput for UE
   std::map <uint16_t, double>::iterator itMax = estAveThr.end ();
@@ -1381,20 +1438,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
-
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/fdmt-ff-mac-scheduler.cc ns-3.19/src/lte/model/fdmt-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/fdmt-ff-mac-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/fdmt-ff-mac-scheduler.cc	2013-12-20 09:44:51.000000000 -0800
@@ -43,7 +43,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (FdMtFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (FdMtFfMacScheduler)
+  ;
 
 
 
@@ -639,6 +640,13 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -680,6 +688,44 @@
         }
       rbStart = rbStart + rbLen;
 
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -941,6 +987,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
 
 
   for (int i = 0; i < rbgNum; i++)
@@ -1361,20 +1417,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
-
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/fdtbfq-ff-mac-scheduler.cc ns-3.19/src/lte/model/fdtbfq-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/fdtbfq-ff-mac-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/fdtbfq-ff-mac-scheduler.cc	2013-12-20 09:44:51.000000000 -0800
@@ -44,7 +44,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (FdTbfqFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (FdTbfqFfMacScheduler)
+  ;
 
 
 
@@ -694,6 +695,13 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -735,6 +743,44 @@
         }
       rbStart = rbStart + rbLen;
 
+            if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -996,6 +1042,15 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
 
   // update token pool, counter and bank size
   std::map <uint16_t, fdtbfqsFlowPerf_t>::iterator itStats;
@@ -1612,20 +1667,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
-
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/ff-mac-scheduler.cc ns-3.19/src/lte/model/ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/ff-mac-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/ff-mac-scheduler.cc	2013-12-20 09:44:51.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (FfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (FfMacScheduler)
+  ;
 
 
 FfMacScheduler::FfMacScheduler ()
diff -Naur ns-3.18.1/src/lte/model/lte-amc.cc ns-3.19/src/lte/model/lte-amc.cc
--- ns-3.18.1/src/lte/model/lte-amc.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/lte-amc.cc	2013-12-20 09:44:51.000000000 -0800
@@ -36,7 +36,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteAmc);
+NS_OBJECT_ENSURE_REGISTERED (LteAmc)
+  ;
 
 // from 3GPP R1-081483 "Conveying MCS and TB size via PDCCH"
 // file TBS_support.xls
diff -Naur ns-3.18.1/src/lte/model/lte-amc.h ns-3.19/src/lte/model/lte-amc.h
--- ns-3.18.1/src/lte/model/lte-amc.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/lte-amc.h	2013-12-20 09:44:51.000000000 -0800
@@ -86,9 +86,10 @@
    * \brief Create a message with CQI feedback
    * \param sinr the SpectrumValue vector of SINR for evaluating the CQI
    * \param rbgSize size of RB group (in RBs) for evaluating subband/wideband CQI
-   *
+   * \return a vector of CQI feedbacks
    */
-  /*static*/ std::vector<int> CreateCqiFeedbacks (const SpectrumValue& sinr, uint8_t rbgSize = 0);
+  /*static*/ std::vector<int> CreateCqiFeedbacks (const SpectrumValue& sinr,
+                                                  uint8_t rbgSize = 0);
 
   /**
    * \brief Get a proper CQI for the spectrale efficiency value.
diff -Naur ns-3.18.1/src/lte/model/lte-anr.cc ns-3.19/src/lte/model/lte-anr.cc
--- ns-3.18.1/src/lte/model/lte-anr.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/lte-anr.cc	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,264 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Original work authors (from lte-enb-rrc.cc):
+ * - Nicola Baldo <nbaldo@cttc.es>
+ * - Marco Miozzo <mmiozzo@cttc.es>
+ * - Manuel Requena <manuel.requena@cttc.es>
+ *
+ * Converted to ANR interface by:
+ * - Budiarto Herman <budiarto.herman@magister.fi>
+ */
+
+#include "lte-anr.h"
+#include <ns3/log.h>
+#include <ns3/uinteger.h>
+
+NS_LOG_COMPONENT_DEFINE ("LteAnr");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (LteAnr)
+  ;
+
+
+LteAnr::LteAnr (uint16_t servingCellId)
+  : m_anrSapUser (0),
+    m_threshold (0),
+    m_measId (0),
+    m_servingCellId (servingCellId)
+{
+  NS_LOG_FUNCTION (this << servingCellId);
+  m_anrSapProvider = new MemberLteAnrSapProvider<LteAnr> (this);
+}
+
+
+LteAnr::~LteAnr ()
+{
+  NS_LOG_FUNCTION (this << m_servingCellId);
+}
+
+
+TypeId
+LteAnr::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::LteAnr")
+    .SetParent<Object> ()
+    .AddAttribute ("Threshold",
+                   "Minimum RSRQ range value required for detecting a neighbour cell",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&LteAnr::m_threshold),
+                   MakeUintegerChecker<uint8_t> (0, 34)) // RSRQ range is [0..34] as per Section 9.1.7 of 3GPP TS 36.133
+  ;
+  return tid;
+}
+
+
+void
+LteAnr::AddNeighbourRelation (uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << m_servingCellId << cellId);
+
+  if (cellId == m_servingCellId)
+    {
+      NS_FATAL_ERROR ("Serving cell ID " << cellId << " may not be added into NRT");
+    }
+
+  if (m_neighbourRelationTable.find (cellId) != m_neighbourRelationTable.end ())
+    {
+      NS_FATAL_ERROR ("There is already an entry in the NRT for cell ID " << cellId);
+    }
+
+  NeighbourRelation_t neighbourRelation;
+  neighbourRelation.noRemove = true;
+  neighbourRelation.noHo = true;
+  neighbourRelation.noX2 = false;
+  neighbourRelation.detectedAsNeighbour = false;
+  m_neighbourRelationTable[cellId] = neighbourRelation;
+}
+
+
+void
+LteAnr::RemoveNeighbourRelation (uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << m_servingCellId << cellId);
+
+  NeighbourRelationTable_t::iterator it = m_neighbourRelationTable.find (cellId);
+  if (it != m_neighbourRelationTable.end ())
+    {
+      NS_FATAL_ERROR ("Cell ID " << cellId << " cannot be found in NRT");
+    }
+
+  m_neighbourRelationTable.erase (it);
+}
+
+
+void
+LteAnr::SetLteAnrSapUser (LteAnrSapUser* s)
+{
+  NS_LOG_FUNCTION (this << s);
+  m_anrSapUser = s;
+}
+
+
+LteAnrSapProvider*
+LteAnr::GetLteAnrSapProvider ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_anrSapProvider;
+}
+
+
+void
+LteAnr::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_LOG_LOGIC (this << " requesting Event A4 measurements"
+                     << " (threshold=" << (uint16_t) m_threshold << ")");
+  LteRrcSap::ReportConfigEutra reportConfig;
+  reportConfig.eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  reportConfig.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ;
+  reportConfig.threshold1.range = m_threshold;
+  reportConfig.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRQ;
+  reportConfig.reportInterval = LteRrcSap::ReportConfigEutra::MS480;
+  m_measId = m_anrSapUser->AddUeMeasReportConfigForAnr (reportConfig);
+}
+
+
+void
+LteAnr::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+  delete m_anrSapProvider;
+  m_neighbourRelationTable.clear ();
+}
+
+
+void
+LteAnr::DoReportUeMeas (LteRrcSap::MeasResults measResults)
+{
+  uint8_t measId = measResults.measId;
+  NS_LOG_FUNCTION (this << m_servingCellId << (uint16_t) measId);
+
+  if (measId != m_measId)
+    {
+      NS_LOG_WARN (this << " Skipping unexpected measurement identity " << (uint16_t) measId);
+    }
+  else
+    {
+      if (measResults.haveMeasResultNeighCells
+          && !(measResults.measResultListEutra.empty ()))
+        {
+          for (std::list <LteRrcSap::MeasResultEutra>::iterator it = measResults.measResultListEutra.begin ();
+               it != measResults.measResultListEutra.end ();
+               ++it)
+            {
+              // Keep new RSRQ value reported for the neighbour cell
+              NS_ASSERT_MSG (it->haveRsrqResult == true,
+                             "RSRQ measure missing for cellId " << it->physCellId);
+
+              // Update Neighbour Relation Table
+              NeighbourRelationTable_t::iterator itNrt = m_neighbourRelationTable.find (it->physCellId);
+              if (itNrt != m_neighbourRelationTable.end ())
+                {
+                  // Update neighbour relation entry
+                  NS_LOG_LOGIC (this << " updating NRT of cell " << m_servingCellId
+                                     << " with entry of cell " << it->physCellId);
+                  if (itNrt->second.noX2 == false)
+                    {
+                      NS_LOG_LOGIC (this << " enabling handover"
+                                         << " from cell " << m_servingCellId
+                                         << " to cell " << it->physCellId);
+                      itNrt->second.noHo = false;
+                    }
+                  itNrt->second.detectedAsNeighbour = true;
+                }
+              else
+                {
+                  // Discovered new neighbour
+                  NS_LOG_LOGIC (this << " inserting NRT of cell " << m_servingCellId
+                                     << " with newly discovered neighbouring cell "
+                                     << it->physCellId);
+                  NeighbourRelation_t neighbourRelation;
+                  neighbourRelation.noRemove = false;
+                  neighbourRelation.noHo = true;
+                  neighbourRelation.noX2 = true;
+                  neighbourRelation.detectedAsNeighbour = true;
+                  m_neighbourRelationTable[it->physCellId] = neighbourRelation;
+                }
+
+            } // end of for (it = measResults.measResultListEutra.begin ())
+
+        } // end of if (measResults.haveMeasResultNeighCells && !(measResults.measResultListEutra.empty ()))
+      else
+        {
+          NS_LOG_WARN (this << " Event A4 received without measurement results from neighbouring cells");
+          /// \todo Remove neighbours in the NRT.
+        }
+
+    } // end of else of if (measId != m_measId)
+
+} // end of DoReportUeMeas
+
+
+void
+LteAnr::DoAddNeighbourRelation (uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << cellId);
+  AddNeighbourRelation (cellId);
+}
+
+
+bool
+LteAnr::DoGetNoRemove (uint16_t cellId) const
+{
+  NS_LOG_FUNCTION (this << m_servingCellId << cellId);
+  return Find (cellId)->noRemove;
+}
+
+
+bool
+LteAnr::DoGetNoHo (uint16_t cellId) const
+{
+  NS_LOG_FUNCTION (this << m_servingCellId << cellId);
+  return Find (cellId)->noHo;
+}
+
+
+bool
+LteAnr::DoGetNoX2 (uint16_t cellId) const
+{
+  NS_LOG_FUNCTION (this << m_servingCellId << cellId);
+  return Find (cellId)->noX2;
+}
+
+
+const LteAnr::NeighbourRelation_t *
+LteAnr::Find (uint16_t cellId) const
+{
+  NeighbourRelationTable_t::const_iterator it = m_neighbourRelationTable.find (cellId);
+  if (it == m_neighbourRelationTable.end ())
+    {
+      NS_FATAL_ERROR ("Cell ID " << cellId << " cannot be found in NRT");
+    }
+  return &(it->second);
+}
+
+
+} // end of namespace ns3
+
diff -Naur ns-3.18.1/src/lte/model/lte-anr.h ns-3.19/src/lte/model/lte-anr.h
--- ns-3.18.1/src/lte/model/lte-anr.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/lte-anr.h	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,233 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011, 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Original work authors (from lte-enb-rrc.cc):
+ * - Nicola Baldo <nbaldo@cttc.es>
+ * - Marco Miozzo <mmiozzo@cttc.es>
+ * - Manuel Requena <manuel.requena@cttc.es>
+ *
+ * Converted to ANR interface by:
+ * - Budiarto Herman <budiarto.herman@magister.fi>
+ */
+
+#ifndef LTE_ANR_H
+#define LTE_ANR_H
+
+#include <ns3/object.h>
+#include <ns3/lte-rrc-sap.h>
+#include <ns3/lte-anr-sap.h>
+#include <map>
+
+namespace ns3 {
+
+
+class LteAnrSapProvider;
+class LteAnrSapUser;
+class LteNeighbourRelation;
+
+/**
+ * \brief Automatic Neighbour Relation function.
+ *
+ * ANR is a conceptually a list of neighbouring cells called the Neighbour
+ * Relation Table (NRT). ANR has the capability of automatically inserting new
+ * entries into NRT based on measurement reports obtained from the eNodeB RRC
+ * instance. Besides this, ANR also supports manual insertion and accepts
+ * queries for the NRT content.
+ *
+ * The LteHelper class automatically installs one ANR instance for each eNodeB
+ * RRC instance. When installed, ANR will assist the eNodeB RRC's handover
+ * function, e.g., by preventing an X2-based handover execution if there is no
+ * X2 interface to the target neighbour cell. If this is not desired, it can be
+ * disabled by the following code sample:
+ *
+ *     Config::SetDefault ("ns3::LteHelper::AnrEnabled", BooleanValue (false));
+ *     Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+ *
+ * The communication between an ANR instance and the eNodeB RRC instance is done
+ * through the *ANR SAP* interface. The ANR instance corresponds to the
+ * "provider" part of this interface, while the eNodeB RRC instance takes the
+ * role of the "user" part. The following code skeleton establishes the
+ * connection between both instances:
+ *
+ *     Ptr<LteEnbRrc> u = ...;
+ *     Ptr<LteAnr> p = ...;
+ *     u->SetLteAnrSapProvider (p->GetLteAnrSapProvider ());
+ *     p->SetLteAnrSapUser (u->GetLteAnrSapUser ());
+ *
+ * However, user rarely needs to use the above code, since it has already been
+ * taken care by LteHelper::InstallEnbDevice.
+ *
+ * The current ANR model is inspired from Section 22.3.2a and 22.3.3 of 3GPP
+ * TS 36.300.
+ *
+ * \sa SetLteAnrSapProvider, SetLteAnrSapUser
+ */
+class LteAnr : public Object
+{
+public:
+  /**
+   * \brief Creates an ANR instance.
+   * \param servingCellId the cell ID of the eNodeB instance whom this ANR
+   *                      instance is to be associated with
+   */
+  LteAnr (uint16_t servingCellId);
+  virtual ~LteAnr ();
+
+  // inherited from Object
+  static TypeId GetTypeId ();
+
+  /**
+   * \brief Provide an advance information about a related neighbouring cell
+   *        and add it as a new Neighbour Relation entry.
+   * \param cellId the cell ID of the new neighbour
+   *
+   * This function simulates the Neighbour Relation addition operation by
+   * network operations and maintenance, as depicted in Section 22.3.2a of
+   * 3GPP TS 36.300.
+   *
+   * An entry added by this function will have the NoRemove flag set to TRUE and
+   * the NoHo flag set to TRUE. Hence, the cell may not act as the target cell
+   * of a handover, unless a measurement report of the cell is received, which
+   * will update the NoHo flag to FALSE.
+   */
+  void AddNeighbourRelation (uint16_t cellId);
+
+  /**
+   * \brief Remove an existing Neighbour Relation entry.
+   * \param cellId the cell ID to be removed from the NRT
+   *
+   * This function simulates the Neighbour Relation removal operation by
+   * network operations and maintenance, as depicted in Section 22.3.2a of
+   * 3GPP TS 36.300.
+   */
+  void RemoveNeighbourRelation (uint16_t cellId);
+
+  /**
+   * \brief Set the "user" part of the ANR SAP interface that this ANR instance
+   *        will interact with.
+   * \param s a reference to the "user" part of the interface, typically a
+   *          member of an LteEnbRrc instance
+   */
+  virtual void SetLteAnrSapUser (LteAnrSapUser* s);
+
+  /**
+   * \brief Export the "provider" part of the ANR SAP interface.
+   * \return the reference to the "provider" part of the interface, typically to
+   *         be kept by an LteEnbRrc instance
+   */
+  virtual LteAnrSapProvider* GetLteAnrSapProvider ();
+
+  // let the forwarder class access the protected and private members
+  friend class MemberLteAnrSapProvider<LteAnr>;
+
+protected:
+  // inherited from Object
+  virtual void DoInitialize ();
+  virtual void DoDispose ();
+
+private:
+
+  // ANR SAP PROVIDER IMPLEMENTATION
+
+  /**
+   * \brief Implementation of LteAnrSapProvider::ReportUeMeas.
+   * \param measResults a single report of one measurement identity
+   */
+  void DoReportUeMeas (LteRrcSap::MeasResults measResults);
+
+  /**
+   * \brief Implementation of LteAnrSapProvider::AddNeighbourRelation.
+   * \param cellId the Physical Cell ID of the new neighbouring cell
+   */
+  void DoAddNeighbourRelation (uint16_t cellId);
+
+  /**
+   * \brief Implementation of LteAnrSapProvider::GetNoRemove.
+   * \param cellId the Physical Cell ID of the neighbouring cell of interest
+   * \return if true, the Neighbour Relation shall *not* be removed from the NRT
+   */
+  bool DoGetNoRemove (uint16_t cellId) const;
+
+  /**
+   * \brief Implementation of LteAnrSapProvider::GetNoHo.
+   * \param cellId the Physical Cell ID of the neighbouring cell of interest
+   * \return if true, the Neighbour Relation shall *not* be used by the eNodeB
+   *         for handover reasons
+   */
+  bool DoGetNoHo (uint16_t cellId) const;
+
+  /**
+   * \brief Implementation of LteAnrSapProvider::GetNoX2.
+   * \param cellId the Physical Cell ID of the neighbouring cell of interest
+   * \return if true, the Neighbour Relation shall *not* use an X2 interface in
+   *         order to initiate procedures towards the eNodeB parenting the
+   *         target cell
+   */
+  bool DoGetNoX2 (uint16_t cellId) const;
+
+  // ANR SAP
+
+  /**
+   * \brief Reference to the "provider" part of the ANR SAP interface, which is
+   *        automatically created when this class instantiates.
+   */
+  LteAnrSapProvider* m_anrSapProvider;
+
+  /**
+   * \brief Reference to the "user" part of the ANR SAP interface, which is
+   *        provided by the eNodeB RRC instance.
+   */
+  LteAnrSapUser* m_anrSapUser;
+
+  // ATTRIBUTE
+
+  /// The attribute Threshold.
+  uint8_t m_threshold;
+
+  /**
+   * \brief Neighbour Relation between two eNodeBs (serving eNodeB and neighbour
+   *        eNodeB).
+   */
+  struct NeighbourRelation_t
+  {
+    bool noRemove;
+    bool noHo;
+    bool noX2;
+    bool detectedAsNeighbour;
+  };
+
+  //               cellId
+  typedef std::map<uint16_t, NeighbourRelation_t> NeighbourRelationTable_t;
+
+  NeighbourRelationTable_t m_neighbourRelationTable;
+
+  // internal methods
+  const NeighbourRelation_t* Find (uint16_t cellId) const;
+
+  // The expected measurement identity
+  uint8_t m_measId;
+
+  uint16_t m_servingCellId;
+
+}; // end of class LteAnr
+
+
+} // end of namespace ns3
+
+
+#endif /* LTE_ANR_H */
diff -Naur ns-3.18.1/src/lte/model/lte-anr-sap.cc ns-3.19/src/lte/model/lte-anr-sap.cc
--- ns-3.18.1/src/lte/model/lte-anr-sap.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/lte-anr-sap.cc	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,38 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#include "lte-anr-sap.h"
+
+
+namespace ns3 {
+
+
+LteAnrSapProvider::~LteAnrSapProvider ()
+{
+}
+
+
+LteAnrSapUser::~LteAnrSapUser ()
+{
+}
+
+
+} // end of namespace ns3
diff -Naur ns-3.18.1/src/lte/model/lte-anr-sap.h ns-3.19/src/lte/model/lte-anr-sap.h
--- ns-3.18.1/src/lte/model/lte-anr-sap.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/lte-anr-sap.h	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,233 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#ifndef LTE_ANR_SAP_H
+#define LTE_ANR_SAP_H
+
+#include <ns3/lte-rrc-sap.h>
+
+namespace ns3 {
+
+
+/**
+ * \brief Service Access Point (SAP) offered by the ANR instance to the eNodeB
+ *        RRC instance.
+ *
+ * This is the *ANR SAP Provider*, i.e., the part of the SAP that contains the
+ * ANR (Automatic Neighbour Relation) methods called by the eNodeB RRC instance.
+ */
+class LteAnrSapProvider
+{
+public:
+  virtual ~LteAnrSapProvider ();
+
+  /**
+   * \brief Send a UE measurement report to the ANC instance.
+   * \param measResults a single report of one measurement identity
+   *
+   * The received measurement report is a result of the UE measurement
+   * configuration previously configured by calling
+   * LteAnrSapUser::AddUeMeasReportConfigForAnr. The report may be stored and
+   * utilized for the purpose of maintaining Neighbour Relation Table (NRT).
+   */
+  virtual void ReportUeMeas (LteRrcSap::MeasResults measResults) = 0;
+
+  /**
+   * \brief Add a new Neighbour Relation entry.
+   * \param cellId the Physical Cell ID of the new neighbouring cell
+   */
+  virtual void AddNeighbourRelation (uint16_t cellId) = 0;
+
+  /**
+   * \brief Get the value of *No Remove* field of a neighbouring cell from the
+   *        Neighbour Relation Table (NRT).
+   * \param cellId the Physical Cell ID of the neighbouring cell of interest
+   * \return if true, the Neighbour Relation shall *not* be removed from the NRT
+   */
+  virtual bool GetNoRemove (uint16_t cellId) const = 0;
+
+  /**
+   * \brief Get the value of *No HO* field of a neighbouring cell from the
+   *        Neighbour Relation Table (NRT).
+   * \param cellId the Physical Cell ID of the neighbouring cell of interest
+   * \return if true, the Neighbour Relation shall *not* be used by the eNodeB
+   *         for handover reasons
+   */
+  virtual bool GetNoHo (uint16_t cellId) const = 0;
+
+  /**
+   * \brief Get the value of *No X2* field of a neighbouring cell from the
+   *        Neighbour Relation Table (NRT).
+   * \param cellId the Physical Cell ID of the neighbouring cell of interest
+   * \return if true, the Neighbour Relation shall *not* use an X2 interface in
+   *         order to initiate procedures towards the eNodeB parenting the
+   *         target cell
+   */
+  virtual bool GetNoX2 (uint16_t cellId) const = 0;
+
+}; // end of class LteAnrSapProvider
+
+
+
+/**
+ * \brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
+ *        ANR instance.
+ *
+ * This is the *ANR SAP User*, i.e., the part of the SAP that contains the
+ * eNodeB RRC methods called by the ANR (Automatic Neighbour Relation) instance.
+ */
+class LteAnrSapUser
+{
+public:
+  virtual ~LteAnrSapUser ();
+
+  /**
+   * \brief Request a certain reporting configuration to be fulfilled by the UEs
+   *        attached to the eNodeB entity.
+   * \param reportConfig the UE measurement reporting configuration
+   * \return the measurement identity associated with this newly added
+   *         reporting configuration
+   *
+   * The eNodeB RRC entity is expected to configure the same reporting
+   * configuration in each of the attached UEs. When later in the simulation a
+   * UE measurement report is received from a UE as a result of this
+   * configuration, the eNodeB RRC entity shall forward this report to the ANC
+   * instance through the LteAnrSapProvider::ReportUeMeas SAP function.
+   *
+   * \note This function is only valid before the simulation begins.
+   */
+  virtual uint8_t AddUeMeasReportConfigForAnr (LteRrcSap::ReportConfigEutra reportConfig) = 0;
+
+}; // end of class LteAnrSapUser
+
+
+
+/**
+ * \brief Template for the implementation of the LteAnrSapProvider as a member
+ *        of an owner class of type C to which all methods are forwarded.
+ */
+template <class C>
+class MemberLteAnrSapProvider : public LteAnrSapProvider
+{
+public:
+  MemberLteAnrSapProvider (C* owner);
+
+  // inherited from LteAnrSapProvider
+  virtual void ReportUeMeas (LteRrcSap::MeasResults measResults);
+  virtual void AddNeighbourRelation (uint16_t cellId);
+  virtual bool GetNoRemove (uint16_t cellId) const;
+  virtual bool GetNoHo (uint16_t cellId) const;
+  virtual bool GetNoX2 (uint16_t cellId) const;
+
+private:
+  MemberLteAnrSapProvider ();
+  C* m_owner;
+
+}; // end of class MemberLteAnrSapProvider
+
+
+template <class C>
+MemberLteAnrSapProvider<C>::MemberLteAnrSapProvider (C* owner)
+  : m_owner (owner)
+{
+}
+
+
+template <class C>
+void
+MemberLteAnrSapProvider<C>::ReportUeMeas (LteRrcSap::MeasResults measResults)
+{
+  m_owner->DoReportUeMeas (measResults);
+}
+
+
+template <class C>
+void
+MemberLteAnrSapProvider<C>::AddNeighbourRelation (uint16_t cellId)
+{
+  m_owner->DoAddNeighbourRelation (cellId);
+}
+
+
+template <class C>
+bool
+MemberLteAnrSapProvider<C>::GetNoRemove (uint16_t cellId) const
+{
+  return m_owner->DoGetNoRemove (cellId);
+}
+
+
+template <class C>
+bool
+MemberLteAnrSapProvider<C>::GetNoHo (uint16_t cellId) const
+{
+  return m_owner->DoGetNoHo (cellId);
+}
+
+
+template <class C>
+bool
+MemberLteAnrSapProvider<C>::GetNoX2 (uint16_t cellId) const
+{
+  return m_owner->DoGetNoX2 (cellId);
+}
+
+
+
+/**
+ * \brief Template for the implementation of the LteAnrSapUser as a member of an
+ *        owner class of type C to which all methods are forwarded.
+ */
+template <class C>
+class MemberLteAnrSapUser : public LteAnrSapUser
+{
+public:
+  MemberLteAnrSapUser (C* owner);
+
+  // inherited from LteAnrSapUser
+  virtual uint8_t AddUeMeasReportConfigForAnr (LteRrcSap::ReportConfigEutra reportConfig);
+
+private:
+  MemberLteAnrSapUser ();
+  C* m_owner;
+
+}; // end of class MemberLteAnrSapUser
+
+
+template <class C>
+MemberLteAnrSapUser<C>::MemberLteAnrSapUser (C* owner)
+  : m_owner (owner)
+{
+}
+
+
+template <class C>
+uint8_t
+MemberLteAnrSapUser<C>::AddUeMeasReportConfigForAnr (LteRrcSap::ReportConfigEutra reportConfig)
+{
+  return m_owner->DoAddUeMeasReportConfigForAnr (reportConfig);
+}
+
+
+} // end of namespace ns3
+
+
+#endif /* LTE_ANR_SAP_H */
diff -Naur ns-3.18.1/src/lte/model/lte-asn1-header.cc ns-3.19/src/lte/model/lte-asn1-header.cc
--- ns-3.18.1/src/lte/model/lte-asn1-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/lte-asn1-header.cc	2013-12-20 09:44:51.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Asn1Header);
+NS_OBJECT_ENSURE_REGISTERED (Asn1Header)
+  ;
 
 TypeId
 Asn1Header::GetTypeId (void)
diff -Naur ns-3.18.1/src/lte/model/lte-as-sap.h ns-3.19/src/lte/model/lte-as-sap.h
--- ns-3.18.1/src/lte/model/lte-as-sap.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/lte/model/lte-as-sap.h	2013-12-20 09:44:51.000000000 -0800
@@ -33,7 +33,7 @@
 /**
  * This class implements the Access Stratum (AS) Service Access Point
  * (SAP), i.e., the interface between the EpcUeNas and the LteUeRrc.
- * In particular, this class implements the  
+ * In particular, this class implements the
  * Provider part of the SAP, i.e., the methods exported by the
  * LteUeRrc and called by the EpcUeNas.
  * 
@@ -43,24 +43,42 @@
 public:
   virtual ~LteAsSapProvider ();
 
-  /** 
-   * Force the RRC to stay camped on a certain eNB
-   * 
-   * \param enbDevice the eNB device (wild hack, might go away in
-   * future versions)
-   * \param cellId the Cell ID identifying the eNB
-   */
-  virtual void ForceCampedOnEnb (uint16_t cellId, uint16_t earfcn) = 0;
-  
-  /** 
-   * Tell the RRC to go into Connected Mode
-   * 
+  /**
+   * \brief Set the selected Closed Subscriber Group subscription list to be
+   *        used for cell selection.
+   *
+   * \param csgId identity of the subscribed CSG
+   */
+  virtual void SetCsgWhiteList (uint32_t csgId) = 0;
+
+  /**
+   * \brief Initiate Idle mode cell selection procedure.
+   *
+   * \param dlEarfcn the downlink carrier frequency (EARFCN)
+   */
+  virtual void StartCellSelection (uint16_t dlEarfcn) = 0;
+
+  /** 
+   * \brief Force the RRC entity to stay camped on a certain eNodeB.
+   *
+   * \param cellId the cell ID identifying the eNodeB
+   * \param dlEarfcn the downlink carrier frequency (EARFCN)
+   */
+  virtual void ForceCampedOnEnb (uint16_t cellId, uint16_t dlEarfcn) = 0;
+
+  /**
+   * \brief Tell the RRC entity to enter Connected mode.
+   *
+   * If this function is called when the UE is in a situation where connecting
+   * is not possible (e.g. before the simulation begin), then the UE will
+   * attempt to connect at the earliest possible time (e.g. after it camps to a
+   * suitable cell).
    */
   virtual void Connect (void) = 0;
 
   /** 
-   * Send a data packet
-   * 
+   * \brief Send a data packet.
+   *
    * \param packet the packet
    * \param bid the EPS bearer ID
    */
@@ -68,13 +86,13 @@
 
 
   /** 
-   * Tell the RRC to release the connection
-   * 
+   * \brief Tell the RRC entity to release the connection.
+   *
    */
   virtual void Disconnect () = 0;
 
 };
-  
+
 
 /**
  * This class implements the Access Stratum (AS) Service Access Point
@@ -88,15 +106,15 @@
 {
 public:
   virtual ~LteAsSapUser ();
-  
+
   /** 
-   * Notify the NAS that RRC Connection Establishment was successful
+   * \brief Notify the NAS that RRC Connection Establishment was successful.
    * 
    */
   virtual void NotifyConnectionSuccessful () = 0;
 
   /** 
-   * Notify the NAS that RRC Connection Establishment failed
+   * \brief Notify the NAS that RRC Connection Establishment failed.
    * 
    */
   virtual void NotifyConnectionFailed () = 0;
@@ -114,9 +132,9 @@
    * \param packet the packet
    */
   virtual void RecvData (Ptr<Packet> packet) = 0;
-  
+
 };
-  
+
 
 
 
@@ -132,8 +150,10 @@
   MemberLteAsSapProvider (C* owner);
 
   // inherited from LteAsSapProvider
+  virtual void SetCsgWhiteList (uint32_t csgId);
+  virtual void StartCellSelection (uint16_t dlEarfcn);
+  virtual void ForceCampedOnEnb (uint16_t cellId, uint16_t dlEarfcn);
   virtual void Connect (void);
-  virtual void ForceCampedOnEnb (uint16_t cellId, uint16_t earfcn);
   virtual void SendData (Ptr<Packet> packet, uint8_t bid);
   virtual void Disconnect ();
 
@@ -154,12 +174,25 @@
 }
 
 template <class C>
-void 
-MemberLteAsSapProvider<C>::ForceCampedOnEnb (uint16_t cellId, uint16_t earfcn)
+void
+MemberLteAsSapProvider<C>::SetCsgWhiteList (uint32_t csgId)
 {
-  m_owner->DoForceCampedOnEnb (cellId, earfcn);
+  m_owner->DoSetCsgWhiteList (csgId);
 }
 
+template <class C>
+void
+MemberLteAsSapProvider<C>::StartCellSelection (uint16_t dlEarfcn)
+{
+  m_owner->DoStartCellSelection (dlEarfcn);
+}
+
+template <class C>
+void
+MemberLteAsSapProvider<C>::ForceCampedOnEnb (uint16_t cellId, uint16_t dlEarfcn)
+{
+  m_owner->DoForceCampedOnEnb (cellId, dlEarfcn);
+}
 
 template <class C>
 void 
diff -Naur ns-3.18.1/src/lte/model/lte-common.cc ns-3.19/src/lte/model/lte-common.cc
--- ns-3.18.1/src/lte/model/lte-common.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-common.cc	2013-12-20 09:44:51.000000000 -0800
@@ -128,14 +128,14 @@
 
 
 uint32_t BufferSizeLevelBsrTable[64] = {
-  
+
   0, 10, 12, 14, 17, 19, 22, 26, 31, 36, 42, 49, 57, 67, 78, 91, 
   107, 125, 146, 171, 200, 234, 274, 321, 376, 440, 515, 603, 
   706, 826, 967, 1132, 1326, 1552, 1817, 2127, 2490, 2915, 3413,
   3995, 4677, 5476, 6411, 7505, 8787, 10287, 12043, 14099, 16507,
   19325, 22624, 26487, 31009, 36304, 42502, 49759, 58255,
   68201, 79846, 93749, 109439, 128125, 150000, 150000
-  
+
 };
 
 uint32_t
@@ -161,7 +161,7 @@
           index++;
         }
     }
-    
+
   return (index);
 }
 
@@ -210,7 +210,7 @@
 EutranMeasurementMapping::Dbm2RsrpRange (double dbm)
 {
   // 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
-  double range = std::min( std::max (std::floor(dbm + 141), 0.0), 97.0);
+  double range = std::min (std::max (std::floor (dbm + 141), 0.0), 97.0);
   return (uint8_t) range;
 }
 
@@ -242,5 +242,100 @@
   return RsrqRange2Db (Db2RsrqRange (v));
 }
 
+double
+EutranMeasurementMapping::IeValue2ActualHysteresis (uint8_t hysteresisIeValue)
+{
+  if (hysteresisIeValue > 30)
+    {
+      NS_FATAL_ERROR ("The value " << (uint16_t) hysteresisIeValue
+                                   << " is out of the allowed range (0..30)"
+                                   << " for Hysteresis IE value");
+    }
+
+  double actual = static_cast<double> (hysteresisIeValue) * 0.5;
+  NS_ASSERT (actual >= 0.0);
+  NS_ASSERT (actual <= 15.0);
+  return actual;
+}
+
+uint8_t
+EutranMeasurementMapping::ActualHysteresis2IeValue (double hysteresisDb)
+{
+  if ((hysteresisDb < 0.0) || (hysteresisDb > 15.0))
+    {
+      NS_FATAL_ERROR ("The value " << hysteresisDb
+                                   << " is out of the allowed range (0..15) dB"
+                                   << " for hysteresis");
+    }
+
+  uint8_t ieValue = lround (hysteresisDb * 2.0);
+  NS_ASSERT (ieValue <= 30);
+  return ieValue;
+}
+
+double
+EutranMeasurementMapping::IeValue2ActualA3Offset (int8_t a3OffsetIeValue)
+{
+  if ((a3OffsetIeValue < -30) || (a3OffsetIeValue > 30))
+    {
+      NS_FATAL_ERROR ("The value " << (int16_t) a3OffsetIeValue
+                                   << " is out of the allowed range (-30..30)"
+                                   << " for a3-Offset IE value");
+    }
+
+  double actual = static_cast<double> (a3OffsetIeValue) * 0.5;
+  NS_ASSERT (actual >= -15.0);
+  NS_ASSERT (actual <= 15.0);
+  return actual;
+}
+
+int8_t
+EutranMeasurementMapping::ActualA3Offset2IeValue (double a3OffsetDb)
+{
+  if ((a3OffsetDb < -15.0) || (a3OffsetDb > 15.0))
+    {
+      NS_FATAL_ERROR ("The value " << a3OffsetDb
+                                   << " is out of the allowed range (-15..15) dB"
+                                   << " for A3 Offset");
+    }
+
+  int8_t ieValue = lround (a3OffsetDb * 2.0);
+  NS_ASSERT (ieValue >= -30);
+  NS_ASSERT (ieValue <= 30);
+  return ieValue;
+}
+
+double
+EutranMeasurementMapping::IeValue2ActualQRxLevMin (int8_t qRxLevMinIeValue)
+{
+  if ((qRxLevMinIeValue < -70) || (qRxLevMinIeValue > -22))
+    {
+      NS_FATAL_ERROR ("The value " << (int16_t) qRxLevMinIeValue
+                                   << " is out of the allowed range (-70..-22)"
+                                   << " for Q-RxLevMin IE value");
+    }
+
+  double actual = static_cast<double> (qRxLevMinIeValue) * 2;
+  NS_ASSERT (actual >= -140.0);
+  NS_ASSERT (actual <= -44.0);
+  return actual;
+}
+
+double
+EutranMeasurementMapping::IeValue2ActualQQualMin (int8_t qQualMinIeValue)
+{
+  if ((qQualMinIeValue < -34) || (qQualMinIeValue > -3))
+    {
+      NS_FATAL_ERROR ("The value " << (int16_t) qQualMinIeValue
+                                   << " is out of the allowed range (-34..-3)"
+                                   << " for Q-QualMin IE value");
+    }
+
+  double actual = static_cast<double> (qQualMinIeValue);
+  NS_ASSERT (actual >= -34.0);
+  NS_ASSERT (actual <= -3.0);
+  return actual;
+}
+
 }; // namespace ns3
 
diff -Naur ns-3.18.1/src/lte/model/lte-common.h ns-3.19/src/lte/model/lte-common.h
--- ns-3.18.1/src/lte/model/lte-common.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-common.h	2013-12-20 09:44:51.000000000 -0800
@@ -76,12 +76,12 @@
   * Srs Configuration index for UE specific SRS, see section 8.2 of TS 36.213
   */
   uint16_t  m_srsConfigurationIndex;
-  
-  public:
-    LteUeConfig_t ();
-    
-    friend bool operator == (const LteUeConfig_t &a, const LteUeConfig_t &b);
-    friend bool operator < (const LteUeConfig_t &a, const LteUeConfig_t &b);
+
+public:
+  LteUeConfig_t ();
+
+  friend bool operator == (const LteUeConfig_t &a, const LteUeConfig_t &b);
+  friend bool operator < (const LteUeConfig_t &a, const LteUeConfig_t &b);
 };
 
 
@@ -95,24 +95,22 @@
 
   //static const double MIN_FP_S11DOT3_VALUE = -4096;
 
-
 };
 
 class BufferSizeLevelBsr
 {
-  
-  public:
-    static uint32_t BsrId2BufferSize (uint8_t val);
-    static uint8_t BufferSize2BsrId (uint32_t val);
-    
-    static int  m_bufferSizeLevelBsr[64];
-    
-    
+
+public:
+  static uint32_t BsrId2BufferSize (uint8_t val);
+  static uint8_t BufferSize2BsrId (uint32_t val);
+
+  static int  m_bufferSizeLevelBsr[64];
+
 };
 
 class TransmissionModesLayers
 {
-  public:
+public:
   static uint8_t TxMode2LayerNum (uint8_t txMode);
 };
 
@@ -120,31 +118,31 @@
 struct PhyTransmissionStatParameters
 {
   int64_t  m_timestamp; // in millisecond
-  uint16_t m_cellId;
-  uint64_t m_imsi;
-  uint16_t m_rnti;
-  uint8_t  m_txMode;
-  uint8_t  m_layer;
-  uint8_t  m_mcs;
-  uint16_t m_size;
-  uint8_t  m_rv;
-  uint8_t  m_ndi;
+  uint16_t m_cellId;  ///< Cell ID of the attached Enb
+  uint64_t m_imsi;    ///< IMSI of the scheduled UE
+  uint16_t m_rnti;    ///< C-RNTI scheduled
+  uint8_t  m_txMode;  ///< the transmission Mode
+  uint8_t  m_layer;   ///< the layer (cw) of the transmission
+  uint8_t  m_mcs;     ///< MCS for transport block
+  uint16_t m_size;    ///< Size of transport block
+  uint8_t  m_rv;      ///< the redundancy version (HARQ)
+  uint8_t  m_ndi;     ///< new data indicator flag
 };
 
 
 struct PhyReceptionStatParameters
 {
   int64_t  m_timestamp; // in millisecond
-  uint16_t m_cellId;
-  uint64_t m_imsi;
-  uint16_t m_rnti;
-  uint8_t  m_txMode;
-  uint8_t  m_layer;
-  uint8_t  m_mcs;
-  uint16_t m_size;
-  uint8_t  m_rv;
-  uint8_t  m_ndi;
-  uint8_t  m_correctness;
+  uint16_t m_cellId;       ///< Cell ID of the attached Enb
+  uint64_t m_imsi;         ///< IMSI of the scheduled UE
+  uint16_t m_rnti;         ///< C-RNTI scheduled
+  uint8_t  m_txMode;       ///< the transmission Mode
+  uint8_t  m_layer;        ///< the layer (cw) of the transmission
+  uint8_t  m_mcs;          ///< MCS for transport block
+  uint16_t m_size;         ///< Size of transport block
+  uint8_t  m_rv;           ///< the redundancy version (HARQ)
+  uint8_t  m_ndi;          ///< new data indicator flag
+  uint8_t  m_correctness;  ///< correctness of the TB received
 };
 
 
@@ -158,7 +156,7 @@
 public:
   /** 
    * converts an RSRP range to dBm as per 
-   * 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping  
+   * 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
    *
    * \param range the RSRP range value
    * 
@@ -168,7 +166,7 @@
 
   /** 
    * convert an RSRP value in dBm to the corresponding range as per 
-   * 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping 
+   * 3GPP TS 36.133 section 9.1.4 RSRP Measurement Report Mapping
    * 
    * \param dbm the RSRP value in dBm
    * 
@@ -194,7 +192,7 @@
    * 
    * \return the corresponding range
    */
-  static uint8_t Db2RsrqRange (double db);  
+  static uint8_t Db2RsrqRange (double db);
 
   /** 
    * Quantize an RSRP value according to the measurement mapping of TS 36.133
@@ -212,9 +210,81 @@
    * 
    * \return the quantized RSRQ value in dB
    */
-  static double QuantizeRsrq(double v);
+  static double QuantizeRsrq (double v);
 
-};
+  /**
+   * \brief Returns the actual value of a hysteresis parameter.
+   * \param hysteresisIeValue IE value of hysteresis
+   * \return actual value in dB, which is IE value * 0.5 dB
+   *
+   * As per section 6.3.5 of 3GPP TS 36.331.
+   *
+   * The allowed values for hysteresis IE value are between 0 and 30.
+   *
+   * \sa LteRrcSap::ReportConfigEutra
+   */
+  static double IeValue2ActualHysteresis (uint8_t hysteresisIeValue);
+
+  /**
+   * \brief Returns the IE value of hysteresis.
+   * \param hysteresisDb actual hysteresis value in dB
+   * \return IE value of hysteresis in dB, which is actual value * 2, rounded
+   *         to the nearest integer
+   *
+   * The allowed values for hysteresis are between 0 and 15 dB.
+   *
+   * \sa LteRrcSap::ReportConfigEutra
+   */
+  static uint8_t ActualHysteresis2IeValue (double hysteresisDb);
+
+  /**
+   * \brief Returns the actual value of an a3-Offset parameter.
+   * \param a3OffsetIeValue IE value of a3-Offset
+   * \return actual value in dB, which is IE value * 0.5 dB
+   *
+   * As per section 6.3.5 of 3GPP TS 36.331.
+   *
+   * The allowed values for a3-Offset IE value are between -30 and 30.
+   *
+   * \sa LteRrcSap::ReportConfigEutra
+   */
+  static double IeValue2ActualA3Offset (int8_t a3OffsetIeValue);
+
+  /**
+   * \brief Returns the IE value of a3-Offset.
+   * \param a3OffsetDb actual A3 Offset value in dB
+   * \return IE value of a3-Offset in dB, which is actual value * 2, rounded
+   *         to the nearest integer
+   *
+   * The allowed values for A3 Offset are between -15 and 15 dB.
+   *
+   * \sa LteRrcSap::ReportConfigEutra
+   */
+  static int8_t ActualA3Offset2IeValue (double a3OffsetDb);
+
+  /**
+   * \brief Returns the actual value of an Q-RxLevMin parameter.
+   * \param qRxLevMinIeValue IE value of Q-RxLevMin
+   * \return Q-RxLevMin actual value in dBm, which is IE value * 2 dBm
+   *
+   * As per section 6.3.4 of 3GPP TS 36.331.
+   *
+   * \sa LteRrcSap::CellSelectionInfo
+   */
+  static double IeValue2ActualQRxLevMin (int8_t qRxLevMinIeValue);
+
+  /**
+   * \brief Returns the actual value of an Q-QualMin parameter.
+   * \param qQualMinIeValue IE value of Q-QualMin
+   * \return Q-QualMin actual value in dB, which is IE value dB
+   *
+   * As per section 6.3.4 of 3GPP TS 36.331.
+   *
+   * \sa LteRrcSap::CellSelectionInfo
+   */
+  static double IeValue2ActualQQualMin (int8_t qQualMinIeValue);
+
+}; // end of class EutranMeasurementMapping
 
 }; // namespace ns3
 
diff -Naur ns-3.18.1/src/lte/model/lte-control-messages.cc ns-3.19/src/lte/model/lte-control-messages.cc
--- ns-3.18.1/src/lte/model/lte-control-messages.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-control-messages.cc	2013-12-20 09:44:51.000000000 -0800
@@ -258,11 +258,33 @@
 }
 
 
+// ----------------------------------------------------------------------------------------------------------
+
+
+
+Sib1LteControlMessage::Sib1LteControlMessage (void)
+{
+  SetMessageType (LteControlMessage::SIB1);
+}
+
+
+void
+Sib1LteControlMessage::SetSib1 (LteRrcSap::SystemInformationBlockType1 sib1)
+{
+  m_sib1 = sib1;
+}
+
+LteRrcSap::SystemInformationBlockType1
+Sib1LteControlMessage::GetSib1 () const
+{
+  return m_sib1;
+}
 
 
 // ---------------------------------------------------------------------------
 
 
+
 DlHarqFeedbackLteControlMessage::DlHarqFeedbackLteControlMessage (void)
 {
   SetMessageType (LteControlMessage::DL_HARQ);
diff -Naur ns-3.18.1/src/lte/model/lte-control-messages.h ns-3.19/src/lte/model/lte-control-messages.h
--- ns-3.18.1/src/lte/model/lte-control-messages.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-control-messages.h	2013-12-20 09:44:51.000000000 -0800
@@ -22,8 +22,10 @@
 #ifndef LTE_CONTROL_MESSAGES_H
 #define LTE_CONTROL_MESSAGES_H
 
-#include "ns3/ptr.h"
-#include "ns3/simple-ref-count.h"
+#include <ns3/ptr.h>
+#include <ns3/simple-ref-count.h>
+#include <ns3/ff-mac-common.h>
+#include <ns3/lte-rrc-sap.h>
 #include <list>
 
 namespace ns3 {
@@ -58,6 +60,7 @@
     RACH_PREAMBLE, // Random Access Preamble
     RAR, // Random Access Response
     MIB, // Master Information Block
+    SIB1, // System Information Block Type 1
   };
 
   LteControlMessage (void);
@@ -77,24 +80,10 @@
 private:
   MessageType m_type;
 };
-} // namespace ns3
-
-#endif /* LTE_CONTROL_MESSAGES_H */
-
-
 
 
 // -----------------------------------------------------------------------
 
-
-#ifndef DL_DCI_LTE_CONTROL_MESSAGES_H
-#define DL_DCI_LTE_CONTROL_MESSAGES_H
-
-#include <ns3/object.h>
-#include <ns3/ff-mac-common.h>
-
-namespace ns3 {
-
 /**
  * \ingroup lte
  * The Downlink Data Control Indicator messages defines the RB allocation for the
@@ -118,26 +107,13 @@
   */
   DlDciListElement_s GetDci (void);
 
-
 private:
   DlDciListElement_s m_dci;
 };
-} // namespace ns3
-
-#endif /* DL_DCI_LTE_CONTROL_MESSAGES_H */
 
 
 // ---------------------------------------------------------------------------
 
-
-#ifndef UL_DCI_LTE_CONTROL_MESSAGES_H
-#define UL_DCI_LTE_CONTROL_MESSAGES_H
-
-#include <ns3/object.h>
-#include <ns3/ff-mac-common.h>
-
-namespace ns3 {
-
 /**
  * \ingroup lte
  * The Uplink Data Control Indicator messages defines the RB allocation for the
@@ -161,30 +137,13 @@
   */
   UlDciListElement_s GetDci (void);
 
-
 private:
   UlDciListElement_s m_dci;
 };
-} // namespace ns3
-
-#endif /* UL_DCI_LTE_CONTROL_MESSAGES_H */
-
 
 
 // ---------------------------------------------------------------------------
 
-
-
-#ifndef DLCQI_LTE_CONTROL_MESSAGES_H
-#define DLCQI_LTE_CONTROL_MESSAGES_H
-
-#include <ns3/object.h>
-#include <ns3/ff-mac-common.h>
-
-namespace ns3 {
-
-class LteNetDevice;
-
 /**
  * \ingroup lte
  * The downlink CqiLteControlMessage defines an ideal list of
@@ -208,27 +167,13 @@
   */
   CqiListElement_s GetDlCqi (void);
 
-
 private:
   CqiListElement_s m_dlCqi;
 };
-} // namespace ns3
-
-#endif /* DLCQI_LTE_CONTROL_MESSAGES_H */
 
 
 // ---------------------------------------------------------------------------
 
-#ifndef BSR_LTE_CONTROL_MESSAGES_H
-#define BSR_LTE_CONTROL_MESSAGES_H
-
-#include <ns3/object.h>
-#include <ns3/ff-mac-common.h>
-
-namespace ns3 {
-
-class LteNetDevice;
-
 /**
  * \ingroup lte
  * The uplink BsrLteControlMessage defines the specific
@@ -244,7 +189,7 @@
   * \brief add a BSR feedback record into the message.
   * \param bsr the BSR feedback
   */
-  void SetBsr (MacCeListElement_s ulcqi);
+  void SetBsr (MacCeListElement_s bsr);
 
   /**
   * \brief Get BSR informations
@@ -252,28 +197,14 @@
   */
   MacCeListElement_s GetBsr (void);
 
-
 private:
   MacCeListElement_s m_bsr;
 
-
 };
 
-} // namespace ns3
-
-#endif /* BSR_LTE_CONTROL_MESSAGES_H */
-
 
 // ---------------------------------------------------------------------------
 
-#ifndef DL_HARQ_LTE_CONTROL_MESSAGES_H
-#define DL_HARQ_LTE_CONTROL_MESSAGES_H
-
-#include <ns3/object.h>
-#include <ns3/ff-mac-common.h>
-
-namespace ns3 {
-
 /**
  * \ingroup lte
  * The downlink DlHarqFeedbackLteControlMessage defines the specific
@@ -287,7 +218,7 @@
 
   /**
   * \brief add a DL HARQ feedback record into the message.
-  * \param DlInfoListElement_s the dl HARQ feedback
+  * \param m the DL HARQ feedback
   */
   void SetDlHarqFeedback (DlInfoListElement_s m);
 
@@ -297,26 +228,13 @@
   */
   DlInfoListElement_s GetDlHarqFeedback (void);
 
-
 private:
   DlInfoListElement_s m_dlInfoListElement;
 
-
 };
-} // namespace ns3
-
-#endif /* DL_HARQ_LTE_CONTROL_MESSAGES_H */
-
-
-#ifndef RACH_PREAMBLE_LTE_CONTROL_MESSAGES_H
-#define RACH_PREAMBLE_LTE_CONTROL_MESSAGES_H
-
-#include <ns3/object.h>
-#include <ns3/ff-mac-common.h>
 
-namespace ns3 {
 
-class LteNetDevice;
+// ---------------------------------------------------------------------------
 
 /**
  * \ingroup lte
@@ -327,12 +245,11 @@
 {
 public:
   RachPreambleLteControlMessage (void);
-
   
   /** 
    * Set the Random Access Preamble Identifier (RAPID), see 3GPP TS 36.321 6.2.2
    *
-   * \param rapid
+   * \param rapid the RAPID
    */
   void SetRapId (uint32_t rapid);
   
@@ -343,26 +260,12 @@
   uint32_t GetRapId () const;
 
 private:
-  
   uint32_t m_rapId;
 
-
 };
 
-} // namespace ns3
-
-#endif  // RACH_PREAMBLE_LTE_CONTROL_MESSAGES_H
 
-
-#ifndef RAR_LTE_CONTROL_MESSAGES_H
-#define RAR_LTE_CONTROL_MESSAGES_H
-
-#include <ns3/object.h>
-#include <ns3/ff-mac-common.h>
-
-namespace ns3 {
-
-class LteNetDevice;
+// ---------------------------------------------------------------------------
 
 /**
  * \ingroup lte
@@ -414,54 +317,92 @@
    * \return a const iterator to the end of the RAR list
    */
   std::list<Rar>::const_iterator RarListEnd () const;
-  
-  
+
 private:
-  
   std::list<Rar> m_rarList;
   uint16_t m_raRnti;
 
 };
 
-} // namespace ns3
 
-#endif  // RAR_LTE_CONTROL_MESSAGES_H
+// ---------------------------------------------------------------------------
 
+/**
+ * \ingroup lte
+ * \brief Abstract model for broadcasting the Master Information Block (MIB)
+ *        within the control channel (BCCH).
+ *
+ * MIB is transmitted by eNodeB RRC and received by UE RRC at every radio frame,
+ * i.e., every 10 milliseconds.
+ *
+ * \sa LteEnbRrc::ConfigureCell, LteEnbPhy::StartFrame,
+ *     LteUeRrc::DoRecvMasterInformationBlock
+ */
+class MibLteControlMessage : public LteControlMessage
+{
+public:
+  /**
+   * \brief Create a new instance of MIB control message.
+   */
+  MibLteControlMessage (void);
 
+  /**
+   * \brief Replace the MIB content of this control message.
+   * \param mib the desired MIB content
+   */
+  void SetMib (LteRrcSap::MasterInformationBlock mib);
 
+  /**
+   * \brief Retrieve the MIB content from this control message.
+   * \return the current MIB content that this control message holds
+   */
+  LteRrcSap::MasterInformationBlock GetMib () const;
 
-#ifndef MIB_LTE_CONTROL_MESSAGES_H
-#define MIB_LTE_CONTROL_MESSAGES_H
+private:
+  LteRrcSap::MasterInformationBlock m_mib;
 
-#include <ns3/object.h>
-#include <ns3/ff-mac-common.h>
-#include <ns3/lte-rrc-sap.h>
+}; // end of class MibLteControlMessage
 
-namespace ns3 {
 
-class LteNetDevice;
+// ---------------------------------------------------------------------------
 
 /**
  * \ingroup lte
+ * \brief Abstract model for broadcasting the System Information Block Type 1
+ *        (SIB1) within the control channel (BCCH).
+ *
+ * SIB1 is transmitted by eNodeB RRC and received by UE RRC at the 6th subframe
+ * of every odd-numbered radio frame, i.e., every 20 milliseconds.
  *
- * abstract model for broadcasting the Master Information Block
+ * \sa LteEnbRrc::SetSystemInformationBlockType1, LteEnbPhy::StartSubFrame,
+ *     LteUeRrc::DoRecvSystemInformationBlockType1
  */
-class MibLteControlMessage : public LteControlMessage
+class Sib1LteControlMessage : public LteControlMessage
 {
 public:
+  /**
+   * \brief Create a new instance of SIB1 control message.
+   */
+  Sib1LteControlMessage (void);
 
-  MibLteControlMessage (void);
+  /**
+   * \brief Replace the SIB1 content of this control message.
+   * \param sib1 the desired SIB1 content
+   */
+  void SetSib1 (LteRrcSap::SystemInformationBlockType1 sib1);
 
-  void SetMib (LteRrcSap::MasterInformationBlock mib);
+  /**
+   * \brief Retrieve the SIB1 content from this control message.
+   * \return the current SIB1 content that this control message holds
+   */
+  LteRrcSap::SystemInformationBlockType1 GetSib1 () const;
 
-  LteRrcSap::MasterInformationBlock GetMib () const;
-  
 private:
-  
-  LteRrcSap::MasterInformationBlock m_mib;
+  LteRrcSap::SystemInformationBlockType1 m_sib1;
+
+}; // end of class Sib1LteControlMessage
 
-};
 
 } // namespace ns3
 
-#endif  // MIB_LTE_CONTROL_MESSAGES_H
+#endif  // LTE_CONTROL_MESSAGES_H
diff -Naur ns-3.18.1/src/lte/model/lte-enb-cphy-sap.h ns-3.19/src/lte/model/lte-enb-cphy-sap.h
--- ns-3.18.1/src/lte/model/lte-enb-cphy-sap.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-cphy-sap.h	2013-12-20 09:44:51.000000000 -0800
@@ -83,19 +83,25 @@
    * \param rnti the RNTI of the user
    * \param txMode the transmissionMode of the user
    */
-  virtual void SetTransmissionMode (uint16_t  rnti, uint8_t txMode) = 0;
+  virtual void SetTransmissionMode (uint16_t rnti, uint8_t txMode) = 0;
 
   /**
    * \param rnti the RNTI of the user
-   * \param txMode the SRS Configuration Index of the user
+   * \param srsCi the SRS Configuration Index of the user
    */
-  virtual void SetSrsConfigurationIndex (uint16_t  rnti, uint16_t srsCi) = 0;
+  virtual void SetSrsConfigurationIndex (uint16_t rnti, uint16_t srsCi) = 0;
 
   /** 
    * 
    * \param mib the Master Information Block to be sent on the BCH
    */
   virtual void SetMasterInformationBlock (LteRrcSap::MasterInformationBlock mib) = 0;
+
+  /**
+   *
+   * \param sib1 the System Information Block Type 1 to be sent on the BCH
+   */
+  virtual void SetSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 sib1) = 0;
 };
 
 
@@ -137,6 +143,7 @@
   virtual void SetTransmissionMode (uint16_t  rnti, uint8_t txMode);
   virtual void SetSrsConfigurationIndex (uint16_t  rnti, uint16_t srsCi);
   virtual void SetMasterInformationBlock (LteRrcSap::MasterInformationBlock mib);
+  virtual void SetSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 sib1);
   
 private:
   MemberLteEnbCphySapProvider ();
@@ -211,6 +218,13 @@
   m_owner->DoSetMasterInformationBlock (mib);
 }
 
+template <class C>
+void
+MemberLteEnbCphySapProvider<C>::SetSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 sib1)
+{
+  m_owner->DoSetSystemInformationBlockType1 (sib1);
+}
+
 
 
 /**
diff -Naur ns-3.18.1/src/lte/model/lte-enb-mac.cc ns-3.19/src/lte/model/lte-enb-mac.cc
--- ns-3.18.1/src/lte/model/lte-enb-mac.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-mac.cc	2013-12-20 09:44:51.000000000 -0800
@@ -43,7 +43,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (LteEnbMac);
+NS_OBJECT_ENSURE_REGISTERED (LteEnbMac)
+  ;
 
 
 
diff -Naur ns-3.18.1/src/lte/model/lte-enb-mac.h ns-3.19/src/lte/model/lte-enb-mac.h
--- ns-3.18.1/src/lte/model/lte-enb-mac.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-mac.h	2013-12-20 09:44:51.000000000 -0800
@@ -133,7 +133,7 @@
 
   /**
   * \brief Receive a CE element containing the buffer status report
-  * \param msg the BSR message
+  * \param bsr the BSR message
   */
   void ReceiveBsrMessage  (MacCeListElement_s bsr);
 
diff -Naur ns-3.18.1/src/lte/model/lte-enb-net-device.cc ns-3.19/src/lte/model/lte-enb-net-device.cc
--- ns-3.18.1/src/lte/model/lte-enb-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-net-device.cc	2013-12-20 09:44:51.000000000 -0800
@@ -38,6 +38,8 @@
 #include <ns3/lte-ue-net-device.h>
 #include <ns3/lte-enb-phy.h>
 #include <ns3/ff-mac-scheduler.h>
+#include <ns3/lte-handover-algorithm.h>
+#include <ns3/lte-anr.h>
 #include <ns3/ipv4-l3-protocol.h>
 #include <ns3/abort.h>
 #include <ns3/log.h>
@@ -46,7 +48,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED ( LteEnbNetDevice);
+NS_OBJECT_ENSURE_REGISTERED ( LteEnbNetDevice)
+  ;
 
 TypeId LteEnbNetDevice::GetTypeId (void)
 {
@@ -60,6 +63,16 @@
                    PointerValue (),
                    MakePointerAccessor (&LteEnbNetDevice::m_rrc),
                    MakePointerChecker <LteEnbRrc> ())
+    .AddAttribute ("LteHandoverAlgorithm",
+                   "The handover algorithm associated to this EnbNetDevice",
+                   PointerValue (),
+                   MakePointerAccessor (&LteEnbNetDevice::m_handoverAlgorithm),
+                   MakePointerChecker <LteHandoverAlgorithm> ())
+    .AddAttribute ("LteAnr",
+                   "The automatic neighbour relation function associated to this EnbNetDevice",
+                   PointerValue (),
+                   MakePointerAccessor (&LteEnbNetDevice::m_anr),
+                   MakePointerChecker <LteAnr> ())
     .AddAttribute ("LteEnbMac",
                    "The MAC associated to this EnbNetDevice",
                    PointerValue (),
@@ -104,11 +117,28 @@
                    UintegerValue (18100),
                    MakeUintegerAccessor (&LteEnbNetDevice::m_ulEarfcn),
                    MakeUintegerChecker<uint16_t> (18000, 24599))
+    .AddAttribute ("CsgId",
+                   "The Closed Subscriber Group (CSG) identity that this eNodeB belongs to",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&LteEnbNetDevice::SetCsgId,
+                                         &LteEnbNetDevice::GetCsgId),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("CsgIndication",
+                   "If true, only UEs which are members of the CSG (i.e. same CSG ID) "
+                   "can gain access to the eNodeB, therefore enforcing closed access mode. "
+                   "Otherwise, the eNodeB operates as a non-CSG cell and implements open access mode.",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&LteEnbNetDevice::SetCsgIndication,
+                                        &LteEnbNetDevice::GetCsgIndication),
+                   MakeBooleanChecker ())
   ;
   return tid;
 }
 
 LteEnbNetDevice::LteEnbNetDevice ()
+  : m_isConstructed (false),
+    m_isConfigured (false),
+    m_anr (0)
 {
   NS_LOG_FUNCTION (this);
 }
@@ -132,6 +162,15 @@
   m_rrc->Dispose ();
   m_rrc = 0;
 
+  m_handoverAlgorithm->Dispose ();
+  m_handoverAlgorithm = 0;
+
+  if (m_anr != 0)
+    {
+      m_anr->Dispose ();
+      m_anr = 0;
+    }
+
   m_phy->Dispose ();
   m_phy = 0;
 
@@ -141,21 +180,17 @@
 
 
 Ptr<LteEnbMac>
-LteEnbNetDevice::GetMac (void) const
+LteEnbNetDevice::GetMac () const
 {
-  NS_LOG_FUNCTION (this);
   return m_mac;
 }
 
-
 Ptr<LteEnbPhy>
-LteEnbNetDevice::GetPhy (void) const
+LteEnbNetDevice::GetPhy () const
 {
-  NS_LOG_FUNCTION (this);
   return m_phy;
 }
 
-
 Ptr<LteEnbRrc>
 LteEnbNetDevice::GetRrc () const
 {
@@ -177,6 +212,7 @@
 void 
 LteEnbNetDevice::SetUlBandwidth (uint8_t bw)
 { 
+  NS_LOG_FUNCTION (this << uint16_t (bw));
   switch (bw)
     { 
     case 6:
@@ -203,6 +239,7 @@
 void 
 LteEnbNetDevice::SetDlBandwidth (uint8_t bw)
 {
+  NS_LOG_FUNCTION (this << uint16_t (bw));
   switch (bw)
     { 
     case 6:
@@ -229,6 +266,7 @@
 void 
 LteEnbNetDevice::SetDlEarfcn (uint16_t earfcn)
 { 
+  NS_LOG_FUNCTION (this << earfcn);
   m_dlEarfcn = earfcn;
 }
 
@@ -241,20 +279,55 @@
 void 
 LteEnbNetDevice::SetUlEarfcn (uint16_t earfcn)
 { 
+  NS_LOG_FUNCTION (this << earfcn);
   m_ulEarfcn = earfcn;
 }
 
+uint32_t
+LteEnbNetDevice::GetCsgId () const
+{
+  return m_csgId;
+}
+
+void
+LteEnbNetDevice::SetCsgId (uint32_t csgId)
+{
+  NS_LOG_FUNCTION (this << csgId);
+  m_csgId = csgId;
+  UpdateConfig (); // propagate the change to RRC level
+}
+
+bool
+LteEnbNetDevice::GetCsgIndication () const
+{
+  return m_csgIndication;
+}
+
+void
+LteEnbNetDevice::SetCsgIndication (bool csgIndication)
+{
+  NS_LOG_FUNCTION (this << csgIndication);
+  m_csgIndication = csgIndication;
+  UpdateConfig (); // propagate the change to RRC level
+}
+
 
 void 
 LteEnbNetDevice::DoInitialize (void)
 {
-
+  NS_LOG_FUNCTION (this);
+  m_isConstructed = true;
   UpdateConfig ();
   m_phy->Initialize ();
   m_mac->Initialize ();
   m_rrc->Initialize ();
-}
+  m_handoverAlgorithm->Initialize ();
 
+  if (m_anr != 0)
+    {
+      m_anr->Initialize ();
+    }
+}
 
 
 bool
@@ -266,16 +339,33 @@
 }
 
 
-
-
 void
 LteEnbNetDevice::UpdateConfig (void)
 {
   NS_LOG_FUNCTION (this);
 
-  m_rrc->ConfigureCell (m_ulBandwidth, m_dlBandwidth, m_ulEarfcn, m_dlEarfcn, m_cellId);
-  m_rrc->SetCellId (m_cellId);
-
+  if (m_isConstructed)
+    {
+      if (!m_isConfigured)
+        {
+          NS_LOG_LOGIC (this << " Configure cell " << m_cellId);
+          // we have to make sure that this function is called only once
+          m_rrc->ConfigureCell (m_ulBandwidth, m_dlBandwidth, m_ulEarfcn, m_dlEarfcn, m_cellId);
+          m_isConfigured = true;
+        }
+
+      NS_LOG_LOGIC (this << " Updating SIB1 of cell " << m_cellId
+                         << " with CSG ID " << m_csgId
+                         << " and CSG indication " << m_csgIndication);
+      m_rrc->SetCsgId (m_csgId, m_csgIndication);
+    }
+  else
+    {
+      /*
+       * Lower layers are not ready yet, so do nothing now and expect
+       * ``DoInitialize`` to re-invoke this function.
+       */
+    }
 }
 
 
diff -Naur ns-3.18.1/src/lte/model/lte-enb-net-device.h ns-3.19/src/lte/model/lte-enb-net-device.h
--- ns-3.18.1/src/lte/model/lte-enb-net-device.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-net-device.h	2013-12-20 09:44:51.000000000 -0800
@@ -40,6 +40,8 @@
 class LteEnbMac;
 class LteEnbRrc;
 class FfMacScheduler;
+class LteHandoverAlgorithm;
+class LteAnr;
 
 
 /**
@@ -106,7 +108,7 @@
   uint16_t GetDlEarfcn () const;
 
   /** 
-   * \param bw the downlink carrier frequency (EARFCN)
+   * \param earfcn the downlink carrier frequency (EARFCN)
    */
   void SetDlEarfcn (uint16_t earfcn);
 
@@ -116,10 +118,54 @@
   uint16_t GetUlEarfcn () const;
 
   /** 
-   * \param bw the uplink carrier frequency (EARFCN)
+   * \param earfcn the uplink carrier frequency (EARFCN)
    */
   void SetUlEarfcn (uint16_t earfcn);
 
+  /**
+   * \brief Returns the CSG ID of the eNodeB.
+   * \return the Closed Subscriber Group identity
+   * \sa LteEnbNetDevice::SetCsgId
+   */
+  uint32_t GetCsgId () const;
+
+  /**
+   * \brief Associate the eNodeB device with a particular CSG.
+   * \param csgId the intended Closed Subscriber Group identity
+   *
+   * CSG identity is a number identifying a Closed Subscriber Group which the
+   * cell belongs to. eNodeB is associated with a single CSG identity.
+   *
+   * The same CSG identity can also be associated to several UEs, which is
+   * equivalent as enlisting these UEs as the members of this particular CSG.
+   *
+   * \sa LteEnbNetDevice::SetCsgIndication
+   */
+  void SetCsgId (uint32_t csgId);
+
+  /**
+   * \brief Returns the CSG indication flag of the eNodeB.
+   * \return the CSG indication flag
+   * \sa LteEnbNetDevice::SetCsgIndication
+   */
+  bool GetCsgIndication () const;
+
+  /**
+   * \brief Enable or disable the CSG indication flag.
+   * \param csgIndication if TRUE, only CSG members are allowed to access this
+   *                      cell
+   *
+   * When the CSG indication field is set to TRUE, only UEs which are members of
+   * the CSG (i.e. same CSG ID) can gain access to the eNodeB, therefore
+   * enforcing closed access mode. Otherwise, the eNodeB operates as a non-CSG
+   * cell and implements open access mode.
+   *
+   * \note This restriction only applies to initial cell selection and
+   *       EPC-enabled simulation.
+   *
+   * \sa LteEnbNetDevice::SetCsgIndication
+   */
+  void SetCsgIndication (bool csgIndication);
 
 protected:
   // inherited from Object
@@ -127,16 +173,20 @@
 
 
 private:
+  bool m_isConstructed;
+  bool m_isConfigured;
 
   /**
-   * Several attributes (e.g., the bandwidth) are exported as
-   * attributes of the LteEnbNetDevice from a user perspective,  but
-   * are actually used also in other modules as well (the RRC, the
-   * PHY, the scheduler...). This methods takes care of updating the
-   * configuration of all modules so that their copy of the attribute
-   * values is in sync with the one in the LteEnbNetDevice.
+   * \brief Propagate attributes and configuration to sub-modules.
+   *
+   * Several attributes (e.g., the bandwidth) are exported as the attributes of
+   * the LteEnbNetDevice from a user perspective, but are actually used also in
+   * other sub-modules (the RRC, the PHY, the scheduler, etc.). This method
+   * takes care of updating the configuration of all these sub-modules so that
+   * their copy of attribute values are in sync with the one in
+   * the LteEnbNetDevice.
    */
-  void UpdateConfig (void);
+  void UpdateConfig ();
 
   Ptr<LteEnbMac> m_mac;
 
@@ -146,6 +196,10 @@
 
   Ptr<FfMacScheduler> m_scheduler;
 
+  Ptr<LteHandoverAlgorithm> m_handoverAlgorithm;
+
+  Ptr<LteAnr> m_anr;
+
   uint16_t m_cellId; /**< Cell Identifer. Part of the CGI, see TS 29.274, section 8.21.1  */
 
   uint8_t m_dlBandwidth; /**< downlink bandwidth in RBs */
@@ -154,7 +208,10 @@
   uint16_t m_dlEarfcn;  /**< downlink carrier frequency */
   uint16_t m_ulEarfcn;  /**< uplink carrier frequency */
 
-};
+  uint16_t m_csgId;
+  bool m_csgIndication;
+
+}; // end of class LteEnbNetDevice
 
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/lte/model/lte-enb-phy.cc ns-3.19/src/lte/model/lte-enb-phy.cc
--- ns-3.18.1/src/lte/model/lte-enb-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-phy.cc	2013-12-20 09:44:51.000000000 -0800
@@ -49,7 +49,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteEnbPhy);
+NS_OBJECT_ENSURE_REGISTERED (LteEnbPhy)
+  ;
 
 // duration of the data part of a subframe in DL
 // = 0.001 / 14 * 11 (fixed to 11 symbols) -1ns as margin to avoid overlapping simulator events
@@ -525,6 +526,21 @@
   NS_LOG_FUNCTION (this);
 
   ++m_nrSubFrames;
+
+  /*
+   * Send SIB1 at 6th subframe of every odd-numbered radio frame. This is
+   * equivalent with Section 5.2.1.2 of 3GPP TS 36.331, where it is specified
+   * "repetitions are scheduled in subframe #5 of all other radio frames for
+   * which SFN mod 2 = 0," except that 3GPP counts frames and subframes starting
+   * from 0, while ns-3 counts starting from 1.
+   */
+  if ((m_nrSubFrames == 6) && ((m_nrFrames % 2) == 1))
+    {
+      Ptr<Sib1LteControlMessage> msg = Create<Sib1LteControlMessage> ();
+      msg->SetSib1 (m_sib1);
+      m_controlMessagesQueue.at (0).push_back (msg);
+    }
+
   if (m_srsPeriodicity>0)
     { 
       // might be 0 in case the eNB has no UEs attached
@@ -973,6 +989,14 @@
 }
 
 
+void
+LteEnbPhy::DoSetSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 sib1)
+{
+  NS_LOG_FUNCTION (this);
+  m_sib1 = sib1;
+}
+
+
 void
 LteEnbPhy::SetHarqPhyModule (Ptr<LteHarqPhy> harq)
 {
diff -Naur ns-3.18.1/src/lte/model/lte-enb-phy.h ns-3.19/src/lte/model/lte-enb-phy.h
--- ns-3.18.1/src/lte/model/lte-enb-phy.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-phy.h	2013-12-20 09:44:51.000000000 -0800
@@ -95,7 +95,7 @@
   void SetLteEnbCphySapUser (LteEnbCphySapUser* s);
 
   /**
-   * \param pw the transmission power in dBm
+   * \param pow the transmission power in dBm
    */
   void SetTxPower (double pow);
 
@@ -106,7 +106,7 @@
 
 
   /**
-   * \param pw the noise figure in dB
+   * \param pow the noise figure in dB
    */
   void SetNoiseFigure (double pow);
 
@@ -178,6 +178,7 @@
   * \brief Create the UL CQI feedback from SINR values perceived at
   * the physical layer with the PUSCH signal received from eNB
   * \param sinr SINR values vector
+  * \return UL CQI feedback in the format usable by an FF MAC scheduler
   */
   FfMacSchedSapProvider::SchedUlCqiInfoReqParameters CreatePuschCqiReport (const SpectrumValue& sinr);
   
@@ -185,6 +186,7 @@
   * \brief Create the UL CQI feedback from SINR values perceived at
   * the physical layer with the SRS signal received from eNB
   * \param sinr SINR values vector
+  * \return UL CQI feedback in the format usable by an FF MAC scheduler
   */
   FfMacSchedSapProvider::SchedUlCqiInfoReqParameters CreateSrsCqiReport (const SpectrumValue& sinr);
 
@@ -242,7 +244,7 @@
   virtual void GenerateCtrlCqiReport (const SpectrumValue& sinr);
   virtual void GenerateDataCqiReport (const SpectrumValue& sinr);
   virtual void ReportInterference (const SpectrumValue& interf);
-  virtual void ReportRsReceivedPower (const SpectrumValue& interf);
+  virtual void ReportRsReceivedPower (const SpectrumValue& power);
 
 
 
@@ -264,6 +266,7 @@
   void DoSetTransmissionMode (uint16_t  rnti, uint8_t txMode);
   void DoSetSrsConfigurationIndex (uint16_t  rnti, uint16_t srcCi);  
   void DoSetMasterInformationBlock (LteRrcSap::MasterInformationBlock mib);
+  void DoSetSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 sib1);
 
   // LteEnbPhySapProvider forwarded methods
   void DoSendMacPdu (Ptr<Packet> p);  
@@ -301,6 +304,7 @@
   uint16_t m_currentSrsOffset;
 
   LteRrcSap::MasterInformationBlock m_mib;
+  LteRrcSap::SystemInformationBlockType1 m_sib1;
 
   Ptr<LteHarqPhy> m_harqPhyModule;
 
diff -Naur ns-3.18.1/src/lte/model/lte-enb-rrc.cc ns-3.19/src/lte/model/lte-enb-rrc.cc
--- ns-3.18.1/src/lte/model/lte-enb-rrc.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-rrc.cc	2013-12-20 09:44:51.000000000 -0800
@@ -15,36 +15,32 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Nicola Baldo <nbaldo@cttc.es>
- *         Marco Miozzo <mmiozzo@cttc.es>
- *         Manuel Requena <manuel.requena@cttc.es>
+ * Authors: Nicola Baldo <nbaldo@cttc.es>
+ *          Marco Miozzo <mmiozzo@cttc.es>
+ *          Manuel Requena <manuel.requena@cttc.es>
  */
 
-#include "ns3/fatal-error.h"
-#include "ns3/log.h"
-#include "ns3/abort.h"
-#include "ns3/pointer.h"
-#include "ns3/object-map.h"
-#include "ns3/object-factory.h"
-#include "ns3/simulator.h"
-
 #include "lte-enb-rrc.h"
 
-#include "lte-enb-net-device.h"
-#include "lte-radio-bearer-info.h"
-#include "eps-bearer-tag.h"
-#include "ff-mac-csched-sap.h"
-#include "epc-enb-s1-sap.h"
-
-#include "lte-rlc.h"
-#include "lte-rlc-tm.h"
-#include "lte-rlc-um.h"
-#include "lte-rlc-am.h"
-#include "lte-pdcp.h"
-#include "lte-pdcp-sap.h"
-
+#include <ns3/fatal-error.h>
+#include <ns3/log.h>
+#include <ns3/abort.h>
+
+#include <ns3/pointer.h>
+#include <ns3/object-map.h>
+#include <ns3/object-factory.h>
 #include <ns3/simulator.h>
 
+#include <ns3/lte-radio-bearer-info.h>
+#include <ns3/eps-bearer-tag.h>
+#include <ns3/packet.h>
+
+#include <ns3/lte-rlc.h>
+#include <ns3/lte-rlc-tm.h>
+#include <ns3/lte-rlc-um.h>
+#include <ns3/lte-rlc-am.h>
+#include <ns3/lte-pdcp.h>
+
 
 
 
@@ -54,10 +50,13 @@
 namespace ns3 {
 
 
-// ///////////////////////////
+///////////////////////////////////////////
 // CMAC SAP forwarder
-// ///////////////////////////
+///////////////////////////////////////////
 
+/**
+ * \brief Class for forwarding CMAC SAP User functions.
+ */
 class EnbRrcMemberLteEnbCmacSapUser : public LteEnbCmacSapUser
 {
 public:
@@ -95,19 +94,25 @@
 }
 
 
+
+///////////////////////////////////////////
+// UeManager
+///////////////////////////////////////////
+
+
 const char* g_ueManagerStateName[UeManager::NUM_STATES] = 
-  {
-    "INITIAL_RANDOM_ACCESS",
-    "CONNECTION_SETUP",
-    "CONNECTION_REJECTED",
-    "CONNECTED_NORMALLY",
-    "CONNECTION_RECONFIGURATION",
-    "CONNECTION_REESTABLISHMENT",
-    "HANDOVER_PREPARATION",
-    "HANDOVER_JOINING",
-    "HANDOVER_PATH_SWITCH",
-    "HANDOVER_LEAVING",
-  };
+{
+  "INITIAL_RANDOM_ACCESS",
+  "CONNECTION_SETUP",
+  "CONNECTION_REJECTED",
+  "CONNECTED_NORMALLY",
+  "CONNECTION_RECONFIGURATION",
+  "CONNECTION_REESTABLISHMENT",
+  "HANDOVER_PREPARATION",
+  "HANDOVER_JOINING",
+  "HANDOVER_PATH_SWITCH",
+  "HANDOVER_LEAVING",
+};
 
 std::string ToString (UeManager::State s)
 {
@@ -115,13 +120,8 @@
 }
 
 
-
-///////////////////////////////////////////
-// UeManager 
-///////////////////////////////////////////
-
-
-NS_OBJECT_ENSURE_REGISTERED (UeManager);
+NS_OBJECT_ENSURE_REGISTERED (UeManager)
+  ;
 
 
 UeManager::UeManager ()
@@ -248,19 +248,14 @@
 
     case HANDOVER_JOINING:
       m_handoverJoiningTimeout = Simulator::Schedule (m_rrc->m_handoverJoiningTimeoutDuration, 
-                                                 &LteEnbRrc::HandoverJoiningTimeout, 
-                                                 m_rrc, m_rnti);
+                                                      &LteEnbRrc::HandoverJoiningTimeout,
+                                                      m_rrc, m_rnti);
       break;      
 
     default:
       NS_FATAL_ERROR ("unexpected state " << ToString (m_state));
-      break;      
-    }  
-
-  m_servingCellMeasures = CreateObject<UeMeasure> ();
-  m_servingCellMeasures->m_cellId = m_rrc->m_cellId;
-  m_servingCellMeasures->m_rsrp = 0;
-  m_servingCellMeasures->m_rsrq = 0;
+      break;
+    }
 
 }
 
@@ -281,7 +276,6 @@
       m_rrc->m_x2uTeidInfoMap.erase (it->second->m_gtpTeid);
     }
 
-  m_servingCellMeasures = 0;
 }
 
 TypeId UeManager::GetTypeId (void)
@@ -310,7 +304,7 @@
     .AddTraceSource ("StateTransition",
                      "fired upon every UE state transition seen by the UeManager at the eNB RRC",
                      MakeTraceSourceAccessor (&UeManager::m_stateTransitionTrace))
-    ;
+  ;
   return tid;
 }
 
@@ -490,8 +484,8 @@
       // a previous reconfiguration still ongoing, we need to wait for it to be finished
       m_pendingRrcConnectionReconfiguration = true;
       break;
-      
-    case CONNECTED_NORMALLY:      
+
+    case CONNECTED_NORMALLY:
       {
         m_pendingRrcConnectionReconfiguration = false;
         LteRrcSap::RrcConnectionReconfiguration msg = BuildRrcConnectionReconfiguration ();
@@ -499,21 +493,21 @@
         RecordDataRadioBearersToBeStarted ();
         SwitchToState (CONNECTION_RECONFIGURATION);
       }
-      break;      
-      
+      break;
+
     default:
       NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state));
-      break;      
+      break;
     }
 }
 
 void 
 UeManager::PrepareHandover (uint16_t cellId)
-{  
-  NS_LOG_FUNCTION (this << cellId);  
+{
+  NS_LOG_FUNCTION (this << cellId);
   switch (m_state)
     {
-    case CONNECTED_NORMALLY:      
+    case CONNECTED_NORMALLY:
       {
         m_targetCellId = cellId;
         EpcX2SapProvider::HandoverRequestParams params;
@@ -529,14 +523,14 @@
         LteRrcSap::HandoverPreparationInfo hpi;
         hpi.asConfig.sourceUeIdentity = m_rnti;
         hpi.asConfig.sourceDlCarrierFreq = m_rrc->m_dlEarfcn;
-        hpi.asConfig.sourceMeasConfig = BuildMeasConfig ();
+        hpi.asConfig.sourceMeasConfig = m_rrc->m_ueMeasConfig;
         hpi.asConfig.sourceRadioResourceConfig = GetRadioResourceConfigForHandoverPreparationInfo ();
         hpi.asConfig.sourceMasterInformationBlock.dlBandwidth = m_rrc->m_dlBandwidth;
         hpi.asConfig.sourceMasterInformationBlock.systemFrameNumber = 0;
-        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = 0;
+        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = m_rrc->m_sib1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity;
         hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.cellIdentity = m_rrc->m_cellId;
-        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIndication = 0;
-        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity = 0;
+        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIndication = m_rrc->m_sib1.cellAccessRelatedInfo.csgIndication;
+        hpi.asConfig.sourceSystemInformationBlockType1.cellAccessRelatedInfo.csgIdentity = m_rrc->m_sib1.cellAccessRelatedInfo.csgIdentity;
         LteEnbCmacSapProvider::RachConfig rc = m_rrc->m_cmacSapProvider->GetRachConfig ();
         hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles;
         hpi.asConfig.sourceSystemInformationBlockType2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax = rc.preambleTransMax;
@@ -558,7 +552,7 @@
       
     default:
       NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state));
-      break;      
+      break;
     }
 
 }
@@ -583,8 +577,8 @@
   SwitchToState (HANDOVER_LEAVING);
   m_handoverLeavingTimeout = Simulator::Schedule (m_rrc->m_handoverLeavingTimeoutDuration, 
                                                   &LteEnbRrc::HandoverLeavingTimeout, 
-                                                  m_rrc, m_rnti);  
-  NS_ASSERT (handoverCommand.haveMobilityControlInfo);  
+                                                  m_rrc, m_rnti);
+  NS_ASSERT (handoverCommand.haveMobilityControlInfo);
   m_rrc->m_handoverStartTrace (m_imsi, m_rrc->m_cellId, m_rnti, handoverCommand.mobilityControlInfo.targetPhysCellId);
 
   EpcX2SapProvider::SnStatusTransferParams sst;
@@ -628,7 +622,7 @@
 UeManager::SendData (uint8_t bid, Ptr<Packet> p)
 {
   NS_LOG_FUNCTION (this << p << (uint16_t) bid);
-   switch (m_state)
+  switch (m_state)
     {
     case INITIAL_RANDOM_ACCESS:
     case CONNECTION_SETUP:
@@ -926,8 +920,9 @@
 void 
 UeManager::RecvMeasurementReport (LteRrcSap::MeasurementReport msg)
 {
-  NS_LOG_FUNCTION (this);
-  NS_LOG_LOGIC ("measId " << (uint16_t) msg.measResults.measId
+  uint8_t measId = msg.measResults.measId;
+  NS_LOG_FUNCTION (this << (uint16_t) measId);
+  NS_LOG_LOGIC ("measId " << (uint16_t) measId
                 << " haveMeasResultNeighCells " << msg.measResults.haveMeasResultNeighCells
                 << " measResultListEutra " << msg.measResults.measResultListEutra.size ());
   NS_LOG_LOGIC ("serving cellId " << m_rrc->m_cellId
@@ -943,124 +938,25 @@
                     << " RSRQ " << (it->haveRsrqResult ? (uint16_t) it->rsrqResult : 255));
     }
 
-  m_rrc->m_recvMeasurementReportTrace (m_imsi, m_rrc->m_cellId, m_rnti, msg);
-
-  // Just these two measId are supported
-  NS_ASSERT_MSG ((msg.measResults.measId == 1) || (msg.measResults.measId == 2),
-                 "Measure identity is unknown");
-
-  /// Event A2 (Serving becomes worse than threshold)
-  if (msg.measResults.measId == 1)
-    {
-      // Keep new RSRQ value reported for the serving cell
-      m_servingCellMeasures->m_rsrq = msg.measResults.rsrqResult;
-      m_servingCellMeasures->m_rsrp = msg.measResults.rsrpResult;
-
-      // Serving cell is worse than a handover threshold.
-      // This handover threshold is independent from the event A2 threshold
-      if (m_servingCellMeasures->m_rsrq <= m_rrc->m_servingCellHandoverThreshold)
-        {
-          // Find the best neighbour cell (eNB)
-          Ptr<UeMeasure> bestNeighbour = 0;
-          uint8_t bestNeighbourRsrq = 0;
-          NS_LOG_LOGIC ("Number of neighbour cells = " << m_neighbourCellMeasures.size ());
-          for (std::map <uint16_t, Ptr<UeMeasure> >::iterator it = m_neighbourCellMeasures.begin ();
-               it != m_neighbourCellMeasures.end ();
-               ++it)
-            {
-              if (it->second->m_rsrq > bestNeighbourRsrq)
-                {
-                  Ptr<NeighbourRelation> neighbourRelation = m_rrc->m_neighbourRelationTable[it->second->m_cellId];
-                  if ((neighbourRelation->m_noHo == false) &&
-                      (neighbourRelation->m_noX2 == false))
-                    {
-                      bestNeighbour = it->second;
-                      bestNeighbourRsrq = it->second->m_rsrq;
-                    }
-                }
-            }
-
-          // Trigger Handover, if needed
-          if (bestNeighbour)
-            {
-              uint16_t targetCellId = bestNeighbour->m_cellId;
-              NS_LOG_LOGIC ("Best neighbour cellId " << targetCellId);
-              if ( (bestNeighbour->m_rsrq - m_servingCellMeasures->m_rsrq >= m_rrc->m_neighbourCellHandoverOffset) &&
-                   (m_state == CONNECTED_NORMALLY) )
-                {
-                  NS_LOG_LOGIC ("Trigger Handover to cellId " << targetCellId);
-                  NS_LOG_LOGIC ("target cell RSRQ " << (uint16_t) bestNeighbour->m_rsrq);
-                  NS_LOG_LOGIC ("serving cell RSRQ " << (uint16_t) m_servingCellMeasures->m_rsrq);
-                  PrepareHandover (targetCellId);
-                }
-            }
-        }
+  if ((m_rrc->m_handoverManagementSapProvider != 0)
+      && (m_rrc->m_handoverMeasIds.find (measId) != m_rrc->m_handoverMeasIds.end ()))
+    {
+      // this measurement was requested by the handover algorithm
+      m_rrc->m_handoverManagementSapProvider->ReportUeMeas (m_rnti,
+                                                            msg.measResults);
     }
-  /// Event A4 (Neighbour becomes better than threshold)
-  else if (msg.measResults.measId == 2)
+
+  if ((m_rrc->m_anrSapProvider != 0)
+      && (m_rrc->m_anrMeasIds.find (measId) != m_rrc->m_anrMeasIds.end ()))
     {
-      // Update the NRT
-      if (msg.measResults.haveMeasResultNeighCells && ! (msg.measResults.measResultListEutra.empty ()))
-        {
-          for (std::list <LteRrcSap::MeasResultEutra>::iterator it = msg.measResults.measResultListEutra.begin ();
-               it != msg.measResults.measResultListEutra.end ();
-               ++it)
-            {
-              // Keep new RSRQ value reported for the neighbour cell
-              NS_ASSERT_MSG (it->haveRsrqResult == true, "RSRQ measure missing for cellId " << it->physCellId);
+      // this measurement was requested by the ANR function
+      m_rrc->m_anrSapProvider->ReportUeMeas (msg.measResults);
+    }
 
-              // Update Neighbour Relation Table
-              if (m_rrc->m_neighbourRelationTable.find (it->physCellId) != m_rrc->m_neighbourRelationTable.end ())
-                {
-                  // Update neighbour info
-                  Ptr<NeighbourRelation> neighbourRelation = m_rrc->m_neighbourRelationTable[it->physCellId];
-                  NS_ASSERT_MSG (neighbourRelation->m_physCellId == it->physCellId,
-                                 "Wrong cellId " << neighbourRelation->m_physCellId);
-
-                  if (neighbourRelation->m_noX2 == false)
-                    {
-                      neighbourRelation->m_noHo = false;
-                    }
-                  neighbourRelation->m_detectedAsNeighbour = true;
-                }
-              else // new neighbour
-                {
-                  Ptr<NeighbourRelation> neighbourRelation = CreateObject <NeighbourRelation> ();
-                  neighbourRelation->m_physCellId = it->physCellId;
-                  neighbourRelation->m_noRemove = false;
-                  neighbourRelation->m_noHo = true;
-                  neighbourRelation->m_noX2 = true;
-                  neighbourRelation->m_detectedAsNeighbour = true;
-                  m_rrc->m_neighbourRelationTable[it->physCellId] = neighbourRelation;
-                }
+  // fire a trace source
+  m_rrc->m_recvMeasurementReportTrace (m_imsi, m_rrc->m_cellId, m_rnti, msg);
 
-              // Update measure info of the neighbour cell
-              Ptr<UeMeasure> neighbourCellMeasures;
-              if (m_neighbourCellMeasures.find (it->physCellId) != m_neighbourCellMeasures.end ())
-                {
-                  neighbourCellMeasures = m_neighbourCellMeasures[it->physCellId];
-                  neighbourCellMeasures->m_cellId = it->physCellId;
-                  neighbourCellMeasures->m_rsrq = it->rsrqResult;
-                  neighbourCellMeasures->m_rsrp = 0;
-                }
-              else
-                {
-                  neighbourCellMeasures = CreateObject <UeMeasure> ();
-                  neighbourCellMeasures->m_cellId = it->physCellId;
-                  neighbourCellMeasures->m_rsrq = it->rsrqResult;
-                  neighbourCellMeasures->m_rsrp = 0;
-                  m_neighbourCellMeasures[it->physCellId] = neighbourCellMeasures;
-                }
-            }
-        }
-      else
-        {
-           NS_LOG_LOGIC ("WARNING");
-//            NS_ASSERT_MSG ("Event A4 received without measure results for neighbour cells");
-           // TODO Remove neighbours in the neighbourCellMeasures table
-        }
-    }
-}
+} // end of UeManager::RecvMeasurementReport
 
 
 // methods forwarded from CMAC SAP
@@ -1099,19 +995,19 @@
 
 
 uint16_t
-UeManager::GetRnti (void)
+UeManager::GetRnti (void) const
 {
   return m_rnti;
 }
 
 uint64_t
-UeManager::GetImsi (void)
+UeManager::GetImsi (void) const
 {
   return m_imsi;
 }
 
 uint16_t
-UeManager::GetSrsConfigurationIndex (void)
+UeManager::GetSrsConfigurationIndex (void) const
 {
   return m_physicalConfigDedicated.soundingRsUlConfigDedicated.srsConfigIndex;
 }
@@ -1136,7 +1032,7 @@
 }
 
 UeManager::State
-UeManager::GetState (void)
+UeManager::GetState (void) const
 {
   return m_state;
 }
@@ -1195,78 +1091,11 @@
   msg.radioResourceConfigDedicated = BuildRadioResourceConfigDedicated ();
   msg.haveMobilityControlInfo = false;
   msg.haveMeasConfig = true;
-  msg.measConfig = BuildMeasConfig ();
+  msg.measConfig = m_rrc->m_ueMeasConfig;
 
   return msg;
 }
 
-LteRrcSap::MeasConfig
-UeManager::BuildMeasConfig ()
-{
-  // Just intra-frequency measurements are supported,
-  // so just one measurement object is created
-  LteRrcSap::MeasObjectToAddMod measObject;
-  measObject.measObjectId = 1;
-  measObject.measObjectEutra.carrierFreq = m_rrc->m_dlEarfcn;
-  measObject.measObjectEutra.allowedMeasBandwidth = m_rrc->m_dlBandwidth;
-  measObject.measObjectEutra.presenceAntennaPort1 = false;
-  measObject.measObjectEutra.neighCellConfig = 0;
-  measObject.measObjectEutra.offsetFreq = 0;
-  measObject.measObjectEutra.haveCellForWhichToReportCGI = false;
-
-  // Just event A2 and event A4 are supported
-  LteRrcSap::ReportConfigToAddMod reportConfigA2;
-  reportConfigA2.reportConfigId = 1;
-  reportConfigA2.reportConfigEutra.triggerType = LteRrcSap::ReportConfigEutra::EVENT;
-  reportConfigA2.reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
-  reportConfigA2.reportConfigEutra.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ;
-  reportConfigA2.reportConfigEutra.threshold1.range = m_rrc->m_eventA2Threshold;
-  reportConfigA2.reportConfigEutra.hysteresis = 0;
-  reportConfigA2.reportConfigEutra.timeToTrigger = 0;
-  reportConfigA2.reportConfigEutra.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRQ;
-  reportConfigA2.reportConfigEutra.reportQuantity = LteRrcSap::ReportConfigEutra::SAME_AS_TRIGGER_QUANTITY; 
-  reportConfigA2.reportConfigEutra.maxReportCells = LteRrcSap::MaxReportCells;
-  reportConfigA2.reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::MS480;
-  reportConfigA2.reportConfigEutra.reportAmount = 255;
-
-  LteRrcSap::ReportConfigToAddMod reportConfigA4;
-  reportConfigA4.reportConfigId = 2;
-  reportConfigA4.reportConfigEutra.triggerType = LteRrcSap::ReportConfigEutra::EVENT;
-  reportConfigA4.reportConfigEutra.eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
-  reportConfigA4.reportConfigEutra.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ;
-  reportConfigA4.reportConfigEutra.threshold1.range = m_rrc->m_eventA4Threshold;
-  reportConfigA4.reportConfigEutra.hysteresis = 0;
-  reportConfigA4.reportConfigEutra.timeToTrigger = 0;
-  reportConfigA4.reportConfigEutra.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRQ;
-  reportConfigA4.reportConfigEutra.reportQuantity = LteRrcSap::ReportConfigEutra::SAME_AS_TRIGGER_QUANTITY; 
-  reportConfigA4.reportConfigEutra.maxReportCells = LteRrcSap::MaxReportCells;
-  reportConfigA4.reportConfigEutra.reportInterval = LteRrcSap::ReportConfigEutra::MS480;
-  reportConfigA4.reportConfigEutra.reportAmount = 255;
-
-  LteRrcSap::MeasIdToAddMod measId[2];
-  measId[0].measId = 1;
-  measId[0].measObjectId = 1;
-  measId[0].reportConfigId = 1;
-  measId[1].measId = 2;
-  measId[1].measObjectId = 1;
-  measId[1].reportConfigId = 2;
-
-  LteRrcSap::MeasConfig measConfig;
-  measConfig.measObjectToAddModList.push_back (measObject);
-  measConfig.reportConfigToAddModList.push_back (reportConfigA2);
-  measConfig.reportConfigToAddModList.push_back (reportConfigA4);
-  measConfig.measIdToAddModList.push_back (measId[0]);
-  measConfig.measIdToAddModList.push_back (measId[1]);
-  measConfig.haveQuantityConfig = true;
-  measConfig.quantityConfig.filterCoefficientRSRP = 4; // default = fc4 (See TS 36.331)
-  measConfig.quantityConfig.filterCoefficientRSRQ = 4; // default = fc4 (See TS 36.331)
-  measConfig.haveMeasGapConfig = false;
-  measConfig.haveSmeasure = false;
-  measConfig.haveSpeedStatePars = false;
-
-  return measConfig;
-}
-
 LteRrcSap::RadioResourceConfigDedicated
 UeManager::BuildRadioResourceConfigDedicated ()
 {
@@ -1345,10 +1174,11 @@
 void 
 UeManager::SwitchToState (State newState)
 {
-  NS_LOG_FUNCTION (this << newState);
+  NS_LOG_FUNCTION (this << ToString (newState));
   State oldState = m_state;
   m_state = newState;
-  NS_LOG_INFO ("IMSI " << m_imsi << " RNTI " << m_rnti << " UeManager " << ToString (oldState) << " --> " << ToString (newState));
+  NS_LOG_INFO (this << "IMSI " << m_imsi << " RNTI " << m_rnti << " UeManager "
+                    << ToString (oldState) << " --> " << ToString (newState));
   m_stateTransitionTrace (m_imsi, m_rrc->m_cellId, m_rnti, oldState, newState);
   
   switch (newState)
@@ -1385,16 +1215,19 @@
 }
 
 
-  
-// ///////////////////////////
+
+///////////////////////////////////////////
 // eNB RRC methods
-// ///////////////////////////
+///////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (LteEnbRrc);
+NS_OBJECT_ENSURE_REGISTERED (LteEnbRrc)
+  ;
 
 LteEnbRrc::LteEnbRrc ()
   : m_x2SapProvider (0),
     m_cmacSapProvider (0),
+    m_handoverManagementSapProvider (0),
+    m_anrSapProvider (0),
     m_rrcSapUser (0),
     m_macSapProvider (0),
     m_s1SapProvider (0),
@@ -1407,12 +1240,12 @@
 {
   NS_LOG_FUNCTION (this);
   m_cmacSapUser = new EnbRrcMemberLteEnbCmacSapUser (this);
+  m_handoverManagementSapUser = new MemberLteHandoverManagementSapUser<LteEnbRrc> (this);
+  m_anrSapUser = new MemberLteAnrSapUser<LteEnbRrc> (this);
   m_rrcSapProvider = new MemberLteEnbRrcSapProvider<LteEnbRrc> (this);
   m_x2SapUser = new EpcX2SpecificEpcX2SapUser<LteEnbRrc> (this);
   m_s1SapUser = new MemberEpcEnbS1SapUser<LteEnbRrc> (this);
   m_cphySapUser = new MemberLteEnbCphySapUser<LteEnbRrc> (this);
-
- 
 }
 
 
@@ -1428,6 +1261,8 @@
   NS_LOG_FUNCTION (this);
   m_ueMap.clear ();
   delete m_cmacSapUser;
+  delete m_handoverManagementSapUser;
+  delete m_anrSapUser;
   delete m_rrcSapProvider;
   delete m_x2SapUser;
   delete m_s1SapUser;
@@ -1446,10 +1281,10 @@
                    MakeObjectMapAccessor (&LteEnbRrc::m_ueMap),
                    MakeObjectMapChecker<UeManager> ())
     .AddAttribute ("DefaultTransmissionMode",
-                  "The default UEs' transmission mode (0: SISO)",
-                  UintegerValue (0),  // default tx-mode
-                  MakeUintegerAccessor (&LteEnbRrc::m_defaultTransmissionMode),
-                  MakeUintegerChecker<uint8_t> ())
+                   "The default UEs' transmission mode (0: SISO)",
+                   UintegerValue (0),  // default tx-mode
+                   MakeUintegerAccessor (&LteEnbRrc::m_defaultTransmissionMode),
+                   MakeUintegerChecker<uint8_t> ())
     .AddAttribute ("EpsBearerToRlcMapping", 
                    "Specify which type of RLC will be used for each type of EPS bearer. ",
                    EnumValue (RLC_SM_ALWAYS),
@@ -1460,65 +1295,85 @@
                                     PER_BASED,     "PacketErrorRateBased"))
     .AddAttribute ("SystemInformationPeriodicity",
                    "The interval for sending system information (Time value)",
-                   TimeValue (MilliSeconds (80)),  
+                   TimeValue (MilliSeconds (80)),
                    MakeTimeAccessor (&LteEnbRrc::m_systemInformationPeriodicity),
                    MakeTimeChecker ())
+
+    // SRS related attributes
     .AddAttribute ("SrsPeriodicity",
                    "The SRS periodicity in milliseconds",
-                   UintegerValue (40),  
+                   UintegerValue (40),
                    MakeUintegerAccessor (&LteEnbRrc::SetSrsPeriodicity, 
                                          &LteEnbRrc::GetSrsPeriodicity),
                    MakeUintegerChecker<uint32_t> ())
+
+    // Timeout related attributes
     .AddAttribute ("ConnectionTimeoutDuration",
                    "After a RA attempt, if no RRC Connection Request is received before this time, the UE context is destroyed. Must account for reception of RAR and transmission of RRC CONNECTION REQUEST over UL GRANT.",
-                   TimeValue (MilliSeconds (15)),  
+                   TimeValue (MilliSeconds (15)),
                    MakeTimeAccessor (&LteEnbRrc::m_connectionTimeoutDuration),
                    MakeTimeChecker ())
     .AddAttribute ("ConnectionRejectedTimeoutDuration",
                    "Time to wait between sending a RRC CONNECTION REJECT and destroying the UE context",
-                   TimeValue (MilliSeconds (30)),  
+                   TimeValue (MilliSeconds (30)),
                    MakeTimeAccessor (&LteEnbRrc::m_connectionRejectedTimeoutDuration),
                    MakeTimeChecker ())
     .AddAttribute ("HandoverJoiningTimeoutDuration",
                    "After accepting a handover request, if no RRC Connection Reconfiguration Completed is received before this time, the UE context is destroyed. Must account for reception of X2 HO REQ ACK by source eNB, transmission of the Handover Command, non-contention-based random access and reception of the RRC Connection Reconfiguration Completed message.",
-                   TimeValue (MilliSeconds (200)),  
+                   TimeValue (MilliSeconds (200)),
                    MakeTimeAccessor (&LteEnbRrc::m_handoverJoiningTimeoutDuration),
                    MakeTimeChecker ())
     .AddAttribute ("HandoverLeavingTimeoutDuration",
                    "After issuing a Handover Command, if neither RRC Connection Reestablishment nor X2 UE Context Release has been previously received, the UE context is destroyed.",
-                   TimeValue (MilliSeconds (500)),  
+                   TimeValue (MilliSeconds (500)),
                    MakeTimeAccessor (&LteEnbRrc::m_handoverLeavingTimeoutDuration),
                    MakeTimeChecker ())
-   .AddAttribute ("AdmitHandoverRequest",
+
+    // Cell selection related attribute
+   .AddAttribute ("QRxLevMin",
+                  "One of information transmitted within the SIB1 message, "
+                  "indicating the required minimum RSRP level that any UE must "
+                  "receive from this cell before it is allowed to camp to this "
+                  "cell. The default value -70 corresponds to -140 dBm and is "
+                  "the lowest possible value as defined by Section 6.3.4 of "
+                  "3GPP TS 36.133. This restriction, however, only applies to "
+                  "initial cell selection and EPC-enabled simulation.",
+                  TypeId::ATTR_GET | TypeId::ATTR_CONSTRUCT,
+                  IntegerValue (-70),
+                  MakeIntegerAccessor (&LteEnbRrc::m_qRxLevMin),
+                  MakeIntegerChecker<int8_t> (-70, -22))
+
+    // Handover related attributes
+    .AddAttribute ("AdmitHandoverRequest",
                    "Whether to admit an X2 handover request from another eNB",
-                   BooleanValue (true),  
+                   BooleanValue (true),
                    MakeBooleanAccessor (&LteEnbRrc::m_admitHandoverRequest),
-                   MakeBooleanChecker ()) 
-   .AddAttribute ("AdmitRrcConnectionRequest",
-                   "Whether to admit a connection request from a Ue",
-                   BooleanValue (true),  
+                   MakeBooleanChecker ())
+    .AddAttribute ("AdmitRrcConnectionRequest",
+                   "Whether to admit a connection request from a UE",
+                   BooleanValue (true),
                    MakeBooleanAccessor (&LteEnbRrc::m_admitRrcConnectionRequest),
                    MakeBooleanChecker ())
-    .AddAttribute ("EventA2Threshold",
-                   "Threshold of the event A2 (Serving becomes worse than threshold)",
-                   UintegerValue (34),
-                   MakeUintegerAccessor (&LteEnbRrc::m_eventA2Threshold),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("EventA4Threshold",
-                   "Threshold of the event A4 (Neighbour becomes better than threshold)",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&LteEnbRrc::m_eventA4Threshold),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("ServingCellHandoverThreshold",
-                   "If serving cell is worse than this threshold, neighbour cells are consider for Handover",
-                   UintegerValue (15),
-                   MakeUintegerAccessor (&LteEnbRrc::m_servingCellHandoverThreshold),
-                   MakeUintegerChecker<uint8_t> ())
-    .AddAttribute ("NeighbourCellHandoverOffset",
-                   "Minimum offset between serving and best neighbour cell to trigger the Handover",
-                   UintegerValue (1),
-                   MakeUintegerAccessor (&LteEnbRrc::m_neighbourCellHandoverOffset),
-                   MakeUintegerChecker<uint8_t> ())
+
+    // UE measurements related attributes
+    .AddAttribute ("RsrpFilterCoefficient",
+                   "Determines the strength of smoothing effect induced by "
+                   "layer 3 filtering of RSRP in all attached UE; "
+                   "if set to 0, no layer 3 filtering is applicable",
+                   // i.e. the variable k in 3GPP TS 36.331 section 5.5.3.2
+                   UintegerValue (4),
+                   MakeUintegerAccessor (&LteEnbRrc::m_rsrpFilterCoefficient),
+                   MakeUintegerChecker<uint8_t> (0))
+    .AddAttribute ("RsrqFilterCoefficient",
+                   "Determines the strength of smoothing effect induced by "
+                   "layer 3 filtering of RSRQ in all attached UE; "
+                   "if set to 0, no layer 3 filtering is applicable",
+                   // i.e. the variable k in 3GPP TS 36.331 section 5.5.3.2
+                   UintegerValue (4),
+                   MakeUintegerAccessor (&LteEnbRrc::m_rsrqFilterCoefficient),
+                   MakeUintegerChecker<uint8_t> (0))
+
+    // Trace sources
     .AddTraceSource ("NewUeContext",
                      "trace fired upon creation of a new UE context",
                      MakeTraceSourceAccessor (&LteEnbRrc::m_newUeContextTrace))
@@ -1570,6 +1425,34 @@
 }
 
 void
+LteEnbRrc::SetLteHandoverManagementSapProvider (LteHandoverManagementSapProvider * s)
+{
+  NS_LOG_FUNCTION (this << s);
+  m_handoverManagementSapProvider = s;
+}
+
+LteHandoverManagementSapUser*
+LteEnbRrc::GetLteHandoverManagementSapUser ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_handoverManagementSapUser;
+}
+
+void
+LteEnbRrc::SetLteAnrSapProvider (LteAnrSapProvider * s)
+{
+  NS_LOG_FUNCTION (this << s);
+  m_anrSapProvider = s;
+}
+
+LteAnrSapUser*
+LteEnbRrc::GetLteAnrSapUser ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_anrSapUser;
+}
+
+void
 LteEnbRrc::SetLteEnbRrcSapUser (LteEnbRrcSapUser * s)
 {
   NS_LOG_FUNCTION (this << s);
@@ -1622,15 +1505,105 @@
 {
   NS_LOG_FUNCTION (this << (uint32_t) rnti);
   NS_ASSERT (0 != rnti);
-  std::map<uint16_t, Ptr<UeManager> >::iterator it = m_ueMap.find (rnti);  
+  std::map<uint16_t, Ptr<UeManager> >::iterator it = m_ueMap.find (rnti);
   NS_ASSERT_MSG (it != m_ueMap.end (), "RNTI " << rnti << " not found in eNB with cellId " << m_cellId);
   return it->second;
 }
 
-void
-LteEnbRrc::ConfigureCell (uint8_t ulBandwidth, uint8_t dlBandwidth, uint16_t ulEarfcn, uint16_t dlEarfcn, uint16_t cellId)
+uint8_t
+LteEnbRrc::AddUeMeasReportConfig (LteRrcSap::ReportConfigEutra config)
 {
   NS_LOG_FUNCTION (this);
+
+  // SANITY CHECK
+
+  NS_ASSERT_MSG (m_ueMeasConfig.measIdToAddModList.size () == m_ueMeasConfig.reportConfigToAddModList.size (),
+                 "Measurement identities and reporting configuration should not have different quantity");
+
+  if (Simulator::Now () != Seconds (0))
+    {
+      NS_FATAL_ERROR ("AddUeMeasReportConfig may not be called after the simulation has run");
+    }
+
+  // INPUT VALIDATION
+
+  switch (config.triggerQuantity)
+    {
+    case LteRrcSap::ReportConfigEutra::RSRP:
+      if ((config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A5)
+          && (config.threshold2.choice != LteRrcSap::ThresholdEutra::THRESHOLD_RSRP))
+        {
+          NS_FATAL_ERROR ("The given triggerQuantity (RSRP) does not match with the given threshold2.choice");
+        }
+
+      if (((config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A1)
+           || (config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A2)
+           || (config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A4)
+           || (config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A5))
+          && (config.threshold1.choice != LteRrcSap::ThresholdEutra::THRESHOLD_RSRP))
+        {
+          NS_FATAL_ERROR ("The given triggerQuantity (RSRP) does not match with the given threshold1.choice");
+        }
+      break;
+
+    case LteRrcSap::ReportConfigEutra::RSRQ:
+      if ((config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A5)
+          && (config.threshold2.choice != LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ))
+        {
+          NS_FATAL_ERROR ("The given triggerQuantity (RSRQ) does not match with the given threshold2.choice");
+        }
+
+      if (((config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A1)
+           || (config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A2)
+           || (config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A4)
+           || (config.eventId == LteRrcSap::ReportConfigEutra::EVENT_A5))
+          && (config.threshold1.choice != LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ))
+        {
+          NS_FATAL_ERROR ("The given triggerQuantity (RSRQ) does not match with the given threshold1.choice");
+        }
+      break;
+
+    default:
+      NS_FATAL_ERROR ("unsupported triggerQuantity");
+      break;
+    }
+
+  if (config.purpose != LteRrcSap::ReportConfigEutra::REPORT_STRONGEST_CELLS)
+    {
+      NS_FATAL_ERROR ("Only REPORT_STRONGEST_CELLS purpose is supported");
+    }
+
+  if (config.reportQuantity != LteRrcSap::ReportConfigEutra::BOTH)
+    {
+      NS_LOG_WARN ("reportQuantity = BOTH will be used instead of the given reportQuantity");
+    }
+
+  uint8_t nextId = m_ueMeasConfig.reportConfigToAddModList.size () + 1;
+
+  // create the reporting configuration
+  LteRrcSap::ReportConfigToAddMod reportConfig;
+  reportConfig.reportConfigId = nextId;
+  reportConfig.reportConfigEutra = config;
+
+  // create the measurement identity
+  LteRrcSap::MeasIdToAddMod measId;
+  measId.measId = nextId;
+  measId.measObjectId = 1;
+  measId.reportConfigId = nextId;
+
+  // add both to the list of UE measurement configuration
+  m_ueMeasConfig.reportConfigToAddModList.push_back (reportConfig);
+  m_ueMeasConfig.measIdToAddModList.push_back (measId);
+
+  return nextId;
+}
+
+void
+LteEnbRrc::ConfigureCell (uint8_t ulBandwidth, uint8_t dlBandwidth,
+                          uint16_t ulEarfcn, uint16_t dlEarfcn, uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) ulBandwidth << (uint16_t) dlBandwidth
+                        << ulEarfcn << dlEarfcn << cellId);
   NS_ASSERT (!m_configured);
   m_cmacSapProvider->ConfigureMac (ulBandwidth, dlBandwidth);
   m_cphySapProvider->SetBandwidth (ulBandwidth, dlBandwidth);
@@ -1641,13 +1614,54 @@
   m_ulBandwidth = ulBandwidth;
   m_cellId = cellId;
   m_cphySapProvider->SetCellId (cellId);
+
+  /*
+   * Initializing the list of UE measurement configuration (m_ueMeasConfig).
+   * Only intra-frequency measurements are supported, so only one measurement
+   * object is created.
+   */
+
+  LteRrcSap::MeasObjectToAddMod measObject;
+  measObject.measObjectId = 1;
+  measObject.measObjectEutra.carrierFreq = m_dlEarfcn;
+  measObject.measObjectEutra.allowedMeasBandwidth = m_dlBandwidth;
+  measObject.measObjectEutra.presenceAntennaPort1 = false;
+  measObject.measObjectEutra.neighCellConfig = 0;
+  measObject.measObjectEutra.offsetFreq = 0;
+  measObject.measObjectEutra.haveCellForWhichToReportCGI = false;
+
+  m_ueMeasConfig.measObjectToAddModList.push_back (measObject);
+  m_ueMeasConfig.haveQuantityConfig = true;
+  m_ueMeasConfig.quantityConfig.filterCoefficientRSRP = m_rsrpFilterCoefficient;
+  m_ueMeasConfig.quantityConfig.filterCoefficientRSRQ = m_rsrqFilterCoefficient;
+  m_ueMeasConfig.haveMeasGapConfig = false;
+  m_ueMeasConfig.haveSmeasure = false;
+  m_ueMeasConfig.haveSpeedStatePars = false;
+
+  // Enabling MIB transmission
   LteRrcSap::MasterInformationBlock mib;
   mib.dlBandwidth = m_dlBandwidth;
   m_cphySapProvider->SetMasterInformationBlock (mib);
-  m_configured = true;
 
-  // the first time System Information is sent
+  // Enabling SIB1 transmission with default values
+  m_sib1.cellAccessRelatedInfo.cellIdentity = cellId;
+  m_sib1.cellAccessRelatedInfo.csgIndication = false;
+  m_sib1.cellAccessRelatedInfo.csgIdentity = 0;
+  m_sib1.cellAccessRelatedInfo.plmnIdentityInfo.plmnIdentity = 0; // not used
+  m_sib1.cellSelectionInfo.qQualMin = -34; // not used, set as minimum value
+  m_sib1.cellSelectionInfo.qRxLevMin = m_qRxLevMin; // set as minimum value
+  m_cphySapProvider->SetSystemInformationBlockType1 (m_sib1);
+
+  /*
+   * Enabling transmission of other SIB. The first time System Information is
+   * transmitted is arbitrarily assumed to be at +0.016s, and then it will be
+   * regularly transmitted every 80 ms by default (set the
+   * SystemInformationPeriodicity attribute to configure this).
+   */
   Simulator::Schedule (MilliSeconds (16), &LteEnbRrc::SendSystemInformation, this);
+
+  m_configured = true;
+
 }
 
 
@@ -1655,6 +1669,10 @@
 LteEnbRrc::SetCellId (uint16_t cellId)
 {
   m_cellId = cellId;
+
+  // update SIB1 too
+  m_sib1.cellAccessRelatedInfo.cellIdentity = cellId;
+  m_cphySapProvider->SetSystemInformationBlockType1 (m_sib1);
 }
 
 bool
@@ -1667,7 +1685,7 @@
   NS_ASSERT_MSG (found, "no EpsBearerTag found in packet to be sent");
   Ptr<UeManager> ueManager = GetUeManager (tag.GetRnti ());
   ueManager->SendData (tag.GetBid (), packet);
-  
+
   return true;
 }
 
@@ -1736,8 +1754,7 @@
 LteEnbRrc::DoRecvRrcConnectionRequest (uint16_t rnti, LteRrcSap::RrcConnectionRequest msg)
 {
   NS_LOG_FUNCTION (this << rnti);
-  
-    GetUeManager (rnti)->RecvRrcConnectionRequest (msg);
+  GetUeManager (rnti)->RecvRrcConnectionRequest (msg);
 }
 
 void
@@ -2016,6 +2033,67 @@
 }
 
 
+uint8_t
+LteEnbRrc::DoAddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig)
+{
+  NS_LOG_FUNCTION (this);
+  uint8_t measId = AddUeMeasReportConfig (reportConfig);
+  m_handoverMeasIds.insert (measId);
+  return measId;
+}
+
+void
+LteEnbRrc::DoTriggerHandover (uint16_t rnti, uint16_t targetCellId)
+{
+  NS_LOG_FUNCTION (this << rnti << targetCellId);
+
+  bool isHandoverAllowed = true;
+
+  if (m_anrSapProvider != 0)
+    {
+      // ensure that proper neighbour relationship exists between source and target cells
+      bool noHo = m_anrSapProvider->GetNoHo (targetCellId);
+      bool noX2 = m_anrSapProvider->GetNoX2 (targetCellId);
+      NS_LOG_DEBUG (this << " cellId=" << m_cellId
+                         << " targetCellId=" << targetCellId
+                         << " NRT.NoHo=" << noHo << " NRT.NoX2=" << noX2);
+
+      if (noHo || noX2)
+        {
+          isHandoverAllowed = false;
+          NS_LOG_LOGIC (this << " handover to cell " << targetCellId
+                             << " is not allowed by ANR");
+        }
+    }
+
+  Ptr<UeManager> ueManager = GetUeManager (rnti);
+  NS_ASSERT_MSG (ueManager != 0, "Cannot find UE context with RNTI " << rnti);
+
+  if (ueManager->GetState () != UeManager::CONNECTED_NORMALLY)
+    {
+      isHandoverAllowed = false;
+      NS_LOG_LOGIC (this << " handover is not allowed because the UE"
+                         << " rnti=" << rnti << " is in "
+                         << ToString (ueManager->GetState ()) << " state");
+    }
+
+  if (isHandoverAllowed)
+    {
+      // initiate handover execution
+      ueManager->PrepareHandover (targetCellId);
+    }
+}
+
+uint8_t
+LteEnbRrc::DoAddUeMeasReportConfigForAnr (LteRrcSap::ReportConfigEutra reportConfig)
+{
+  NS_LOG_FUNCTION (this);
+  uint8_t measId = AddUeMeasReportConfig (reportConfig);
+  m_anrMeasIds.insert (measId);
+  return measId;
+}
+
+
 
 uint16_t
 LteEnbRrc::AddUe (UeManager::State state)
@@ -2030,7 +2108,7 @@
       if ((rnti != 0) && (m_ueMap.find (rnti) == m_ueMap.end ()))
         {
           found = true;
-          break;        
+          break;
         }
     }
 
@@ -2060,7 +2138,7 @@
     }
   // need to do this after UeManager has been deleted
   RemoveSrsConfigurationIndex (srsCi); 
- }
+}
 
 TypeId
 LteEnbRrc::GetRlcType (EpsBearer bearer)
@@ -2100,17 +2178,21 @@
 void
 LteEnbRrc::AddX2Neighbour (uint16_t cellId)
 {
-  NS_LOG_FUNCTION (cellId);
-  NS_ASSERT_MSG (m_neighbourRelationTable.find (cellId) == m_neighbourRelationTable.end (),
-                 "There is already an entry in the Neighbour Relation Table for cellId " << cellId);
-
-  Ptr<NeighbourRelation> neighbourRelation = CreateObject <NeighbourRelation> ();
-  neighbourRelation->m_physCellId = cellId;
-  neighbourRelation->m_noRemove = true;
-  neighbourRelation->m_noHo = true;
-  neighbourRelation->m_noX2 = false;
-  neighbourRelation->m_detectedAsNeighbour = false;
-  m_neighbourRelationTable[cellId] = neighbourRelation;
+  NS_LOG_FUNCTION (this << cellId);
+
+  if (m_anrSapProvider != 0)
+    {
+      m_anrSapProvider->AddNeighbourRelation (cellId);
+    }
+}
+
+void
+LteEnbRrc::SetCsgId (uint32_t csgId, bool csgIndication)
+{
+  NS_LOG_FUNCTION (this << csgId << csgIndication);
+  m_sib1.cellAccessRelatedInfo.csgIdentity = csgId;
+  m_sib1.cellAccessRelatedInfo.csgIndication = csgIndication;
+  m_cphySapProvider->SetSystemInformationBlockType1 (m_sib1);
 }
 
 
@@ -2236,14 +2318,17 @@
 void
 LteEnbRrc::SendSystemInformation ()
 {
-//   NS_LOG_FUNCTION (this);
-  // for simplicity, we use the same periodicity for all sibs
-  // note that in real systems the periodicy of each sibs could be different
+  // NS_LOG_FUNCTION (this);
+
+  /*
+   * For simplicity, we use the same periodicity for all SIBs. Note that in real
+   * systems the periodicy of each SIBs could be different.
+   */
   LteRrcSap::SystemInformation si;
   si.haveSib2 = true;
   si.sib2.freqInfo.ulCarrierFreq = m_ulEarfcn;
   si.sib2.freqInfo.ulBandwidth = m_ulBandwidth;
-  
+
   LteEnbCmacSapProvider::RachConfig rc = m_cmacSapProvider->GetRachConfig ();
   LteRrcSap::RachConfigCommon rachConfigCommon;
   rachConfigCommon.preambleInfo.numberOfRaPreambles = rc.numberOfRaPreambles;
@@ -2255,5 +2340,6 @@
   Simulator::Schedule (m_systemInformationPeriodicity, &LteEnbRrc::SendSystemInformation, this);
 }
 
+
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/lte/model/lte-enb-rrc.h ns-3.19/src/lte/model/lte-enb-rrc.h
--- ns-3.18.1/src/lte/model/lte-enb-rrc.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-enb-rrc.h	2013-12-20 09:44:51.000000000 -0800
@@ -25,17 +25,20 @@
 
 #include <ns3/nstime.h>
 #include <ns3/object.h>
-#include <ns3/packet.h>
+#include <ns3/traced-callback.h>
+#include <ns3/event-id.h>
+
 #include <ns3/lte-enb-cmac-sap.h>
 #include <ns3/lte-mac-sap.h>
 #include <ns3/ff-mac-sched-sap.h>
+#include <ns3/ff-mac-csched-sap.h>
 #include <ns3/lte-pdcp-sap.h>
 #include <ns3/epc-x2-sap.h>
 #include <ns3/epc-enb-s1-sap.h>
+#include <ns3/lte-handover-management-sap.h>
 #include <ns3/lte-enb-cphy-sap.h>
 #include <ns3/lte-rrc-sap.h>
-#include <ns3/traced-callback.h>
-#include <ns3/event-id.h>
+#include <ns3/lte-anr-sap.h>
 
 #include <map>
 #include <set>
@@ -45,38 +48,10 @@
 class LteRadioBearerInfo;
 class LteSignalingRadioBearerInfo;
 class LteDataRadioBearerInfo;
-class EpcEnbS1SapUser;
-class EpcEnbS1SapProvider;
-class LteUeRrc;
 class LteEnbRrc;
+class Packet;
 
 
-/**
- * Neighbour Relation between two eNBs (serving eNB and neighbour eNB)
- * See XXXXX for more info
- */
-class NeighbourRelation : public Object
-{
-public:
-  uint16_t  m_physCellId;
-  bool      m_noRemove;
-  bool      m_noHo;
-  bool      m_noX2;
-  bool      m_detectedAsNeighbour;
-};
-
-/**
- * Measurements reported by a UE for a cellId
- * The values are quantized according 3GPP TS XXXXX
- */
-class UeMeasure : public Object
-{
-public:
-  uint16_t  m_cellId;
-  uint8_t   m_rsrp;
-  uint8_t   m_rsrq;
-};
-
 
 /**
  * Manages all the radio bearer information possessed by the ENB RRC for a single UE
@@ -94,19 +69,19 @@
    * 
    */
   enum State
-    {
-      INITIAL_RANDOM_ACCESS = 0,
-      CONNECTION_SETUP,
-      CONNECTION_REJECTED,
-      CONNECTED_NORMALLY,
-      CONNECTION_RECONFIGURATION,
-      CONNECTION_REESTABLISHMENT,
-      HANDOVER_PREPARATION,
-      HANDOVER_JOINING,
-      HANDOVER_PATH_SWITCH,
-      HANDOVER_LEAVING,
-      NUM_STATES
-    };
+  {
+    INITIAL_RANDOM_ACCESS = 0,
+    CONNECTION_SETUP,
+    CONNECTION_REJECTED,
+    CONNECTED_NORMALLY,
+    CONNECTION_RECONFIGURATION,
+    CONNECTION_REESTABLISHMENT,
+    HANDOVER_PREPARATION,
+    HANDOVER_JOINING,
+    HANDOVER_PATH_SWITCH,
+    HANDOVER_LEAVING,
+    NUM_STATES
+  };
 
   UeManager ();
  
@@ -260,21 +235,31 @@
    */
   void RecvUeContextRelease (EpcX2SapUser::UeContextReleaseParams params); 
 
-  // methods forwarded from RRC SAP
+
+  // METHODS FORWARDED FROM ENB RRC SAP ///////////////////////////////////////
+
+  /// Part of the RRC protocol. Implement the LteEnbRrcSapProvider::CompleteSetupUe interface.
   void CompleteSetupUe (LteEnbRrcSapProvider::CompleteSetupUeParameters params);
+  /// Part of the RRC protocol. Implement the LteEnbRrcSapProvider::RecvRrcConnectionRequest interface.
   void RecvRrcConnectionRequest (LteRrcSap::RrcConnectionRequest msg);
+  /// Part of the RRC protocol. Implement the LteEnbRrcSapProvider::RecvRrcConnectionSetupCompleted interface.
   void RecvRrcConnectionSetupCompleted (LteRrcSap::RrcConnectionSetupCompleted msg);
+  /// Part of the RRC protocol. Implement the LteEnbRrcSapProvider::RecvRrcConnectionReconfigurationCompleted interface.
   void RecvRrcConnectionReconfigurationCompleted (LteRrcSap::RrcConnectionReconfigurationCompleted msg);
+  /// Part of the RRC protocol. Implement the LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentRequest interface.
   void RecvRrcConnectionReestablishmentRequest (LteRrcSap::RrcConnectionReestablishmentRequest msg);
+  /// Part of the RRC protocol. Implement the LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentComplete interface.
   void RecvRrcConnectionReestablishmentComplete (LteRrcSap::RrcConnectionReestablishmentComplete msg);
+  /// Part of the RRC protocol. Implement the LteEnbRrcSapProvider::RecvMeasurementReport interface.
   void RecvMeasurementReport (LteRrcSap::MeasurementReport msg);
 
 
-  // methods forwarded from CMAC SAP
+  // METHODS FORWARDED FROM ENB CMAC SAP //////////////////////////////////////
+
   void CmacUeConfigUpdateInd (LteEnbCmacSapUser::UeConfig cmacParams);
 
+  // METHODS FORWARDED FROM ENB PDCP SAP //////////////////////////////////////
 
-  // methods forwarded from PDCP SAP
   void DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters params);
   
   /** 
@@ -282,19 +267,19 @@
    * \return the RNTI, i.e., an UE identifier that is unique within
    * the cell
    */
-  uint16_t GetRnti (void);
+  uint16_t GetRnti (void) const;
 
   /** 
    *
    * \return the IMSI, i.e., a globally unique UE identifier
    */
-  uint64_t GetImsi (void);
+  uint64_t GetImsi (void) const;
 
   /** 
    * 
    * \return the SRS Configuration Index
    */
-  uint16_t GetSrsConfigurationIndex (void);  
+  uint16_t GetSrsConfigurationIndex (void) const;
 
   /** 
    * Set the SRS configuration index and do the necessary reconfiguration
@@ -307,7 +292,7 @@
    * 
    * \return the current state
    */
-  State GetState ();
+  State GetState () const;
 
 
 private:
@@ -341,7 +326,7 @@
    * current configuration
    */
   LteRrcSap::RrcConnectionReconfiguration BuildRrcConnectionReconfiguration ();
-  
+
   /** 
    * 
    * \return a RadioResourceConfigDedicated struct built based on the
@@ -351,14 +336,6 @@
 
   /** 
    * 
-   * \return a MeasConfig struct built based on the
-   * current configuration
-   */
-  LteRrcSap::MeasConfig BuildMeasConfig ();
-
-
-  /** 
-   * 
    * \return a newly allocated identifier for a new RRC transaction
    */
   uint8_t GetNewRrcTransactionIdentifier ();
@@ -438,13 +415,10 @@
   EventId m_handoverJoiningTimeout;
   EventId m_handoverLeavingTimeout;
 
-  Ptr<UeMeasure> m_servingCellMeasures;
-  //       cellid
-  std::map<uint16_t, Ptr<UeMeasure> > m_neighbourCellMeasures;
-
 };
 
 
+
 /**
  * \ingroup lte
  * 
@@ -454,6 +428,8 @@
 {
 
   friend class EnbRrcMemberLteEnbCmacSapUser;
+  friend class MemberLteHandoverManagementSapUser<LteEnbRrc>;
+  friend class MemberLteAnrSapUser<LteEnbRrc>;
   friend class MemberLteEnbRrcSapProvider<LteEnbRrc>;
   friend class MemberEpcEnbS1SapUser<LteEnbRrc>;
   friend class EpcX2SpecificEpcX2SapUser<LteEnbRrc>;
@@ -507,6 +483,36 @@
 
 
   /**
+   * set the Handover Management SAP this RRC should interact with
+   *
+   * \param s the Handover Management SAP Provider to be used by this RRC
+   */
+  void SetLteHandoverManagementSapProvider (LteHandoverManagementSapProvider * s);
+
+  /**
+   * Get the Handover Management SAP offered by this RRC
+   * \return s the Handover Management SAP User interface offered to the
+   *           handover algorithm by this RRC
+   */
+  LteHandoverManagementSapUser* GetLteHandoverManagementSapUser ();
+
+
+  /**
+   * set the ANR SAP this RRC should interact with
+   *
+   * \param s the ANR SAP Provider to be used by this RRC
+   */
+  void SetLteAnrSapProvider (LteAnrSapProvider * s);
+
+  /**
+   * Get the ANR SAP offered by this RRC
+   * \return s the ANR SAP User interface offered to the ANR instance by this
+   *           RRC
+   */
+  LteAnrSapUser* GetLteAnrSapUser ();
+
+
+  /**
    * set the RRC SAP this RRC should interact with
    *
    * \param s the RRC SAP User to be used by this RRC
@@ -568,20 +574,50 @@
   Ptr<UeManager> GetUeManager (uint16_t rnti);
 
   /**
-   * configure cell-specific parameters
+   * \brief Add a new UE measurement reporting configuration
+   * \param config the new reporting configuration
+   * \return the measurement ID (measId) referring to the newly added
+   *         reporting configuration
+   *
+   * Assuming intra-frequency environment, the new measurement reporting
+   * configuration will be automatically associated to the only measurement
+   * object (i.e., a new measurement identity will be automatically created).
    *
+   * Can only be called before the start of simulation.
+   */
+  uint8_t AddUeMeasReportConfig (LteRrcSap::ReportConfigEutra config);
+
+  /**
+   * \brief Configure cell-specific parameters.
    * \param ulBandwidth the uplink bandwidth in number of RB
    * \param dlBandwidth the downlink bandwidth in number of RB
    * \param ulEarfcn the UL EARFCN
    * \param dlEarfcn the DL EARFCN
    * \param cellId the ID of the cell
+   *
+   * Configure cell-specific parameters and propagate them to lower layers.
+   * The parameters include bandwidth, EARFCN (E-UTRA Absolute Radio Frequency
+   * Channel Number), and cell ID.
+   *
+   * In addition to parameter configuration, this function also performs several
+   * other tasks:
+   *  - Initializing UE measurement (i.e. measurement object and quantity
+   *    configuration), which is expected to be further configured through
+   *    `LteEnbRrc::AddUeMeasReportConfig`;
+   *  - Enabling MIB (Master Information Block) broadcast transmission
+   *  - Enabling SIB (System Information Block) broadcast transmission
+   *
+   * Typically runs when the eNodeB NetDevice is installed, for instance by
+   * `LteHelper::InstallEnbDevice` (i.e. before the simulation starts).
+   *
+   * \warning Raises an error when executed more than once.
    */
   void ConfigureCell (uint8_t ulBandwidth,
                       uint8_t dlBandwidth,
                       uint16_t ulEarfcn, 
                       uint16_t dlEarfcn,
                       uint16_t cellId);
-  
+
   /** 
    * set the cell id of this eNB
    * 
@@ -603,7 +639,6 @@
   /** 
    * set the callback used to forward data packets up the stack
    * 
-   * \param void 
    * \param cb 
    */
   void SetForwardUpCallback (Callback <void, Ptr<Packet> > cb);
@@ -646,8 +681,8 @@
    * by sending a handover request to the target eNB over the X2
    * interface 
    *
-   * \param imsi the id of the UE to be handed over 
-   * \param cellId the id of the target eNB
+   * \param rnti the ID of the UE to be handed over
+   * \param cellId the ID of the target eNB
    */
   void SendHandoverRequest (uint16_t rnti, uint16_t cellId);
 
@@ -663,21 +698,30 @@
 private:
 
 
-  // methods forwarded from RRC SAP
-  
+  // RRC SAP methods
+
+  /// Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::CompleteSetupUe interface to UeManager::CompleteSetupUe
   void DoCompleteSetupUe (uint16_t rnti, LteEnbRrcSapProvider::CompleteSetupUeParameters params);
+  /// Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvRrcConnectionRequest interface to UeManager::RecvRrcConnectionRequest
   void DoRecvRrcConnectionRequest (uint16_t rnti, LteRrcSap::RrcConnectionRequest msg);
+  /// Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvRrcConnectionSetupCompleted interface to UeManager::RecvRrcConnectionSetupCompleted
   void DoRecvRrcConnectionSetupCompleted (uint16_t rnti, LteRrcSap::RrcConnectionSetupCompleted msg);
+  /// Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvRrcConnectionReconfigurationCompleted interface to UeManager::RecvRrcConnectionReconfigurationCompleted
   void DoRecvRrcConnectionReconfigurationCompleted (uint16_t rnti, LteRrcSap::RrcConnectionReconfigurationCompleted msg);
+  /// Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentRequest interface to UeManager::RecvRrcConnectionReestablishmentRequest
   void DoRecvRrcConnectionReestablishmentRequest (uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentRequest msg);
+  /// Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvRrcConnectionReestablishmentComplete interface to UeManager::RecvRrcConnectionReestablishmentComplete
   void DoRecvRrcConnectionReestablishmentComplete (uint16_t rnti, LteRrcSap::RrcConnectionReestablishmentComplete msg);
+  /// Part of the RRC protocol. Forwarding LteEnbRrcSapProvider::RecvMeasurementReport interface to UeManager::RecvMeasurementReport
   void DoRecvMeasurementReport (uint16_t rnti, LteRrcSap::MeasurementReport msg);
 
-
   // S1 SAP methods
+
   void DoDataRadioBearerSetupRequest (EpcEnbS1SapUser::DataRadioBearerSetupRequestParameters params);
-  void DoPathSwitchRequestAcknowledge (EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters params);       
+  void DoPathSwitchRequestAcknowledge (EpcEnbS1SapUser::PathSwitchRequestAcknowledgeParameters params);
+
   // X2 SAP methods
+
   void DoRecvHandoverRequest (EpcX2SapUser::HandoverRequestParams params);
   void DoRecvHandoverRequestAck (EpcX2SapUser::HandoverRequestAckParams params);
   void DoRecvHandoverPreparationFailure (EpcX2SapUser::HandoverPreparationFailureParams params);
@@ -687,12 +731,21 @@
   void DoRecvResourceStatusUpdate (EpcX2SapUser::ResourceStatusUpdateParams params);
   void DoRecvUeData (EpcX2SapUser::UeDataParams params);
 
-
   // CMAC SAP methods
+
   uint16_t DoAllocateTemporaryCellRnti ();
   void DoNotifyLcConfigResult (uint16_t rnti, uint8_t lcid, bool success);
   void DoRrcConfigurationUpdateInd (LteEnbCmacSapUser::UeConfig params);
-  
+
+  // Handover Management SAP methods
+
+  uint8_t DoAddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig);
+  void DoTriggerHandover (uint16_t rnti, uint16_t targetCellId);
+
+  // ANR SAP methods
+
+  uint8_t DoAddUeMeasReportConfigForAnr (LteRrcSap::ReportConfigEutra reportConfig);
+
 
   // Internal methods
 
@@ -730,7 +783,7 @@
   /** 
    * Add a neighbour with an X2 interface
    *
-   * \param cellid neighbouring cell id
+   * \param cellId neighbouring cell id
    */
   void AddX2Neighbour (uint16_t cellId);
 
@@ -746,6 +799,27 @@
    */
   uint32_t GetSrsPeriodicity () const;
 
+  /**
+   * \brief Associate this RRC entity with a particular CSG information.
+   * \param csgId the intended Closed Subscriber Group identity
+   * \param csgIndication if TRUE, only CSG members are allowed to access the
+   *                      cell
+   *
+   * CSG identity is a number identifying a Closed Subscriber Group which the
+   * cell belongs to. eNodeB is associated with a single CSG identity.
+   *
+   * The same CSG identity can also be associated to several UEs, which is
+   * equivalent as enlisting these UEs as the members of this particular CSG.
+   * When the CSG indication field is set to TRUE, only UEs which are members of
+   * the CSG (i.e. same CSG ID) can gain access to the eNodeB, therefore
+   * enforcing closed access mode. Otherwise, the eNodeB operates as a non-CSG
+   * cell and implements open access mode.
+   *
+   * This restriction only applies to initial cell selection and EPC-enabled
+   * simulation.
+   */
+  void SetCsgId (uint32_t csgId, bool csgIndication);
+
 private:
 
   /** 
@@ -804,6 +878,12 @@
   LteEnbCmacSapUser* m_cmacSapUser;
   LteEnbCmacSapProvider* m_cmacSapProvider;
 
+  LteHandoverManagementSapUser* m_handoverManagementSapUser;
+  LteHandoverManagementSapProvider* m_handoverManagementSapProvider;
+
+  LteAnrSapUser* m_anrSapUser;
+  LteAnrSapProvider* m_anrSapProvider;
+
   LteEnbRrcSapUser* m_rrcSapUser;
   LteEnbRrcSapProvider* m_rrcSapProvider;
 
@@ -823,46 +903,57 @@
   uint16_t m_ulBandwidth;
   uint16_t m_lastAllocatedRnti;
 
-  std::map<uint16_t, Ptr<UeManager> > m_ueMap;  
+  /// the System Information Block Type 1 that is currently broadcasted over BCH
+  LteRrcSap::SystemInformationBlockType1 m_sib1;
+
+  std::map<uint16_t, Ptr<UeManager> > m_ueMap;
+
+  /**
+   * \brief List of measurement configuration which are active in every UE
+   *        attached to this eNodeB instance.
+   */
+  LteRrcSap::MeasConfig m_ueMeasConfig;
+
+  std::set<uint8_t> m_handoverMeasIds;
+  std::set<uint8_t> m_anrMeasIds;
 
   struct X2uTeidInfo
   {
     uint16_t rnti;
     uint8_t drbid;
   };
-    
+
   //       TEID      RNTI, DRBID
-  std::map<uint32_t, X2uTeidInfo> m_x2uTeidInfoMap; 
-  
+  std::map<uint32_t, X2uTeidInfo> m_x2uTeidInfoMap;
+
   uint8_t m_defaultTransmissionMode;
 
   enum LteEpsBearerToRlcMapping_t m_epsBearerToRlcMapping;
 
   Time m_systemInformationPeriodicity;
-  
+
   // SRS related attributes
   uint16_t m_srsCurrentPeriodicityId;
   std::set<uint16_t> m_ueSrsConfigurationIndexSet;
   uint16_t m_lastAllocatedConfigurationIndex;
   bool m_reconfigureUes;
 
+  // Cell selection related attribute
+  int8_t m_qRxLevMin;
+
   // Handover related attributes
   bool m_admitHandoverRequest;
   bool m_admitRrcConnectionRequest;
-  uint8_t m_eventA2Threshold;
-  uint8_t m_eventA4Threshold;
-  uint8_t m_servingCellHandoverThreshold;
-  uint8_t m_neighbourCellHandoverOffset;
+
+  // UE measurements related attributes
+  uint8_t m_rsrpFilterCoefficient;
+  uint8_t m_rsrqFilterCoefficient;
 
   // timeouts
   Time m_connectionTimeoutDuration;
   Time m_connectionRejectedTimeoutDuration;
   Time m_handoverJoiningTimeoutDuration;
-  Time m_handoverLeavingTimeoutDuration;  
-
-  //       cellid
-  std::map<uint16_t, Ptr<NeighbourRelation> > m_neighbourRelationTable;
-
+  Time m_handoverLeavingTimeoutDuration;
 
   //             cellid    rnti   
   TracedCallback<uint16_t, uint16_t> m_newUeContextTrace;
diff -Naur ns-3.18.1/src/lte/model/lte-handover-algorithm.cc ns-3.19/src/lte/model/lte-handover-algorithm.cc
--- ns-3.18.1/src/lte/model/lte-handover-algorithm.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/lte-handover-algorithm.cc	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,60 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#include "lte-handover-algorithm.h"
+#include <ns3/log.h>
+
+NS_LOG_COMPONENT_DEFINE ("LteHandoverAlgorithm");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (LteHandoverAlgorithm)
+  ;
+
+
+LteHandoverAlgorithm::LteHandoverAlgorithm ()
+{
+}
+
+
+LteHandoverAlgorithm::~LteHandoverAlgorithm ()
+{
+}
+
+
+TypeId
+LteHandoverAlgorithm::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::LteHandoverAlgorithm")
+    .SetParent<Object> ()
+  ;
+  return tid;
+}
+
+
+void
+LteHandoverAlgorithm::DoDispose ()
+{
+}
+
+
+
+} // end of namespace ns3
diff -Naur ns-3.18.1/src/lte/model/lte-handover-algorithm.h ns-3.19/src/lte/model/lte-handover-algorithm.h
--- ns-3.18.1/src/lte/model/lte-handover-algorithm.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/lte-handover-algorithm.h	2013-12-20 09:44:51.000000000 -0800
@@ -0,0 +1,111 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#ifndef LTE_HANDOVER_ALGORITHM_H
+#define LTE_HANDOVER_ALGORITHM_H
+
+#include <ns3/object.h>
+#include <ns3/lte-rrc-sap.h>
+
+namespace ns3 {
+
+
+class LteHandoverManagementSapUser;
+class LteHandoverManagementSapProvider;
+
+
+/**
+ * \brief The abstract base class of a handover algorithm that operates using
+ *        the Handover Management SAP interface.
+ *
+ * Handover algorithm receives measurement reports from an eNode RRC instance
+ * and tells the eNodeB RRC instance when to do a handover.
+ *
+ * This class is an abstract class intended to be inherited by subclasses that
+ * implement its virtual methods. By inheriting from this abstract class, the
+ * subclasses gain the benefits of being compatible with the LteEnbNetDevice
+ * class, being accessible using namespace-based access through ns-3 Config
+ * subsystem, and being installed and configured by LteHelper class (see
+ * LteHelper::SetHandoverAlgorithmType and
+ * LteHelper::SetHandoverAlgorithmAttribute methods).
+ *
+ * The communication with the eNodeB RRC instance is done through the *Handover
+ * Management SAP* interface. The handover algorithm instance corresponds to the
+ * "provider" part of this interface, while the eNodeB RRC instance takes the
+ * role of the "user" part. The following code skeleton establishes the
+ * connection between both instances:
+ *
+ *     Ptr<LteEnbRrc> u = ...;
+ *     Ptr<LteHandoverAlgorithm> p = ...;
+ *     u->SetLteHandoverManagementSapProvider (p->GetLteHandoverManagementSapProvider ());
+ *     p->SetLteHandoverManagementSapUser (u->GetLteHandoverManagementSapUser ());
+ *
+ * However, user rarely needs to use the above code, since it has already been
+ * taken care by LteHelper::InstallEnbDevice.
+ *
+ * \sa LteHandoverManagementSapProvider, LteHandoverManagementSapUser
+ */
+class LteHandoverAlgorithm : public Object
+{
+public:
+  LteHandoverAlgorithm ();
+  virtual ~LteHandoverAlgorithm ();
+
+  // inherited from Object
+  static TypeId GetTypeId ();
+
+  /**
+   * \brief Set the "user" part of the Handover Management SAP interface that
+   *        this handover algorithm instance will interact with.
+   * \param s a reference to the "user" part of the interface, typically a
+   *          member of an LteEnbRrc instance
+   */
+  virtual void SetLteHandoverManagementSapUser (LteHandoverManagementSapUser* s) = 0;
+
+  /**
+   * \brief Export the "provider" part of the Handover Management SAP interface.
+   * \return the reference to the "provider" part of the interface, typically to
+   *         be kept by an LteEnbRrc instance
+   */
+  virtual LteHandoverManagementSapProvider* GetLteHandoverManagementSapProvider () = 0;
+
+protected:
+
+  // inherited from Object
+  virtual void DoDispose ();
+
+  // HANDOVER MANAGEMENT SAP PROVIDER IMPLEMENTATION
+
+  /**
+   * \brief Implementation of LteHandoverManagementSapProvider::ReportUeMeas.
+   * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+   *             where the report originates from
+   * \param measResults a single report of one measurement identity
+   */
+  virtual void DoReportUeMeas (uint16_t rnti, LteRrcSap::MeasResults measResults) = 0;
+
+}; // end of class LteHandoverAlgorithm
+
+
+} // end of namespace ns3
+
+
+#endif /* LTE_HANDOVER_ALGORITHM_H */
diff -Naur ns-3.18.1/src/lte/model/lte-handover-management-sap.cc ns-3.19/src/lte/model/lte-handover-management-sap.cc
--- ns-3.18.1/src/lte/model/lte-handover-management-sap.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/lte-handover-management-sap.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,37 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#include "lte-handover-management-sap.h"
+
+namespace ns3 {
+
+
+LteHandoverManagementSapProvider::~LteHandoverManagementSapProvider ()
+{
+}
+
+
+LteHandoverManagementSapUser::~LteHandoverManagementSapUser ()
+{
+}
+
+
+} // end of namespace ns3
diff -Naur ns-3.18.1/src/lte/model/lte-handover-management-sap.h ns-3.19/src/lte/model/lte-handover-management-sap.h
--- ns-3.18.1/src/lte/model/lte-handover-management-sap.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/lte-handover-management-sap.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,194 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#ifndef LTE_HANDOVER_MANAGEMENT_SAP_H
+#define LTE_HANDOVER_MANAGEMENT_SAP_H
+
+#include <ns3/lte-rrc-sap.h>
+
+namespace ns3 {
+
+
+/**
+ * \brief Service Access Point (SAP) offered by the handover algorithm instance
+ *        to the eNodeB RRC instance.
+ *
+ * This is the *Handover Management SAP Provider*, i.e., the part of the SAP
+ * that contains the handover algorithm methods called by the eNodeB RRC
+ * instance.
+ */
+class LteHandoverManagementSapProvider
+{
+public:
+  virtual ~LteHandoverManagementSapProvider ();
+
+  /**
+   * \brief Send a UE measurement report to handover algorithm.
+   * \param rnti Radio Network Temporary Identity, an integer identifying the UE
+   *             where the report originates from
+   * \param measResults a single report of one measurement identity
+   *
+   * The received measurement report is a result of the UE measurement
+   * configuration previously configured by calling
+   * LteHandoverManagementSapUser::AddUeMeasReportConfigForHandover. The report
+   * may be stored and utilised for the purpose of making handover decision.
+   */
+  virtual void ReportUeMeas (uint16_t rnti,
+                             LteRrcSap::MeasResults measResults) = 0;
+
+}; // end of class LteHandoverManagementSapProvider
+
+
+/**
+ * \brief Service Access Point (SAP) offered by the eNodeB RRC instance to the
+ *        handover algorithm instance.
+ *
+ * This is the *Handover Management SAP User*, i.e., the part of the SAP that
+ * contains the eNodeB RRC methods called by the handover algorithm instance.
+ */
+class LteHandoverManagementSapUser
+{
+public:
+  virtual ~LteHandoverManagementSapUser ();
+
+  /**
+   * \brief Request a certain reporting configuration to be fulfilled by the UEs
+   *        attached to the eNodeB entity.
+   * \param reportConfig the UE measurement reporting configuration
+   * \return the measurement identity associated with this newly added
+   *         reporting configuration
+   *
+   * The eNodeB RRC entity is expected to configure the same reporting
+   * configuration in each of the attached UEs. When later in the simulation a
+   * UE measurement report is received from a UE as a result of this
+   * configuration, the eNodeB RRC entity shall forward this report to the
+   * handover algorithm through the LteHandoverManagementSapProvider::ReportUeMeas
+   * SAP function.
+   *
+   * \note This function is only valid before the simulation begins.
+   */
+  virtual uint8_t AddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig) = 0;
+
+  /**
+   * \brief Instruct the eNodeB RRC entity to prepare a handover.
+   * \param rnti Radio Network Temporary Identity, an integer identifying the
+   *             UE which shall perform the handover
+   * \param targetCellId the cell ID of the target eNodeB
+   *
+   * This function is used by the handover algorithm entity when a handover
+   * decision has been reached.
+   *
+   * The process to produce the decision is up to the implementation of handover
+   * algorithm. It is typically based on the reported UE measurements, which are
+   * received through the LteHandoverManagementSapProvider::ReportUeMeas function.
+   */
+  virtual void TriggerHandover (uint16_t rnti, uint16_t targetCellId) = 0;
+
+}; // end of class LteHandoverManagementSapUser
+
+
+
+/**
+ * \brief Template for the implementation of the LteHandoverManagementSapProvider
+ *        as a member of an owner class of type C to which all methods are
+ *        forwarded.
+ */
+template <class C>
+class MemberLteHandoverManagementSapProvider : public LteHandoverManagementSapProvider
+{
+public:
+  MemberLteHandoverManagementSapProvider (C* owner);
+
+  // inherited from LteHandoverManagemenrSapProvider
+  virtual void ReportUeMeas (uint16_t rnti, LteRrcSap::MeasResults measResults);
+
+private:
+  MemberLteHandoverManagementSapProvider ();
+  C* m_owner;
+
+}; // end of class MemberLteHandoverManagementSapProvider
+
+
+template <class C>
+MemberLteHandoverManagementSapProvider<C>::MemberLteHandoverManagementSapProvider (C* owner)
+  : m_owner (owner)
+{
+}
+
+
+template <class C>
+void
+MemberLteHandoverManagementSapProvider<C>::ReportUeMeas (uint16_t rnti, LteRrcSap::MeasResults measResults)
+{
+  m_owner->DoReportUeMeas (rnti, measResults);
+}
+
+
+
+/**
+ * \brief Template for the implementation of the LteHandoverManagementSapUser
+ *        as a member of an owner class of type C to which all methods are
+ *        forwarded.
+ */
+template <class C>
+class MemberLteHandoverManagementSapUser : public LteHandoverManagementSapUser
+{
+public:
+  MemberLteHandoverManagementSapUser (C* owner);
+
+  // inherited from LteHandoverManagementSapUser
+  virtual uint8_t AddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig);
+  virtual void TriggerHandover (uint16_t rnti, uint16_t targetCellId);
+
+private:
+  MemberLteHandoverManagementSapUser ();
+  C* m_owner;
+
+}; // end of class MemberLteAnrSapUser
+
+
+template <class C>
+MemberLteHandoverManagementSapUser<C>::MemberLteHandoverManagementSapUser (C* owner)
+  : m_owner (owner)
+{
+}
+
+
+template <class C>
+uint8_t
+MemberLteHandoverManagementSapUser<C>::AddUeMeasReportConfigForHandover (LteRrcSap::ReportConfigEutra reportConfig)
+{
+  return m_owner->DoAddUeMeasReportConfigForHandover (reportConfig);
+}
+
+
+template <class C>
+void
+MemberLteHandoverManagementSapUser<C>::TriggerHandover (uint16_t rnti, uint16_t targetCellId)
+{
+  return m_owner->DoTriggerHandover (rnti, targetCellId);
+}
+
+
+} // end of namespace ns3
+
+
+#endif /* LTE_HANDOVER_MANAGEMENT_SAP_H */
diff -Naur ns-3.18.1/src/lte/model/lte-harq-phy.cc ns-3.19/src/lte/model/lte-harq-phy.cc
--- ns-3.18.1/src/lte/model/lte-harq-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-harq-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-//NS_OBJECT_ENSURE_REGISTERED (LteHarqPhy);
+//NS_OBJECT_ENSURE_REGISTERED (LteHarqPhy)
+//  ;
 
 
 LteHarqPhy::LteHarqPhy ()
diff -Naur ns-3.18.1/src/lte/model/lte-harq-phy.h ns-3.19/src/lte/model/lte-harq-phy.h
--- ns-3.18.1/src/lte/model/lte-harq-phy.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-harq-phy.h	2013-12-20 09:44:50.000000000 -0800
@@ -88,8 +88,8 @@
   /**
   * \brief Return the info of the HARQ procId in case of retranmissions
   * for UL (asynchronous)
+  * \param rnti the RNTI of the transmitter
   * \param harqProcId the HARQ proc id
-  * \param layer layer no. (for MIMO spatail multiplexing)
   * \return the vector of the info related to HARQ proc Id
   */
   HarqProcessInfoList_t GetHarqProcessInfoUl (uint16_t rnti, uint8_t harqProcId);
diff -Naur ns-3.18.1/src/lte/model/lte-mi-error-model.cc ns-3.19/src/lte/model/lte-mi-error-model.cc
--- ns-3.18.1/src/lte/model/lte-mi-error-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-mi-error-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -328,62 +328,72 @@
   
   double MI;
   double MIsum = 0.0;
+  SpectrumValue sinrCopy = sinr;
   
   for (uint32_t i = 0; i < map.size (); i++)
     {
-      SpectrumValue sinrCopy = sinr;
       double sinrLin = sinrCopy[map.at (i)];
       if (mcs <= MI_QPSK_MAX_ID) // QPSK
         {
-          int tr = 0;
-          while ((tr<MI_MAP_QPSK_SIZE)&&(MI_map_qpsk_axis[tr] < sinrLin))
-            {
-              tr++;
-            }
+
           if (sinrLin > MI_map_qpsk_axis[MI_MAP_QPSK_SIZE-1])
             {
               MI = 1;
             }
           else 
-            {
-              NS_ASSERT_MSG (tr<MI_MAP_QPSK_SIZE, "MI map out of data");
-              MI = MI_map_qpsk[tr];
+            { 
+              // since the values in MI_map_qpsk_axis are uniformly spaced, we have
+              // index = ((sinrLin - value[0]) / (value[SIZE-1] - value[0])) * (SIZE-1)
+              // the scaling coefficient is always the same, so we use a static const
+              // to speed up the calculation
+              static const double scalingCoeffQpsk = 
+                (MI_MAP_QPSK_SIZE - 1) / (MI_map_qpsk_axis[MI_MAP_QPSK_SIZE-1] - MI_map_qpsk_axis[0]);
+              double sinrIndexDouble = (sinrLin -  MI_map_qpsk_axis[0]) * scalingCoeffQpsk + 1;
+              uint32_t sinrIndex = std::max(0.0, std::floor (sinrIndexDouble));
+              NS_ASSERT_MSG (sinrIndex < MI_MAP_QPSK_SIZE, "MI map out of data");
+              MI = MI_map_qpsk[sinrIndex];
             }
         }
       else
         {
           if (mcs > MI_QPSK_MAX_ID && mcs <= MI_16QAM_MAX_ID )	// 16-QAM
             {
-              int tr = 0;
-              while ((tr<MI_MAP_16QAM_SIZE)&&(MI_map_16qam_axis[tr] < sinrLin))
-                {
-                  tr++;
-                }
               if (sinrLin > MI_map_16qam_axis[MI_MAP_16QAM_SIZE-1])
                 {
                   MI = 1;
                 }
               else 
                 {
-                  NS_ASSERT_MSG (tr<MI_MAP_16QAM_SIZE, "MI map out of data");
-                  MI = MI_map_16qam[tr];
+                  // since the values in MI_map_16QAM_axis are uniformly spaced, we have
+                  // index = ((sinrLin - value[0]) / (value[SIZE-1] - value[0])) * (SIZE-1)
+                  // the scaling coefficient is always the same, so we use a static const
+                  // to speed up the calculation
+                  static const double scalingCoeff16qam = 
+                    (MI_MAP_16QAM_SIZE - 1) / (MI_map_16qam_axis[MI_MAP_16QAM_SIZE-1] - MI_map_16qam_axis[0]);
+                  double sinrIndexDouble = (sinrLin -  MI_map_16qam_axis[0]) * scalingCoeff16qam + 1;
+                  uint32_t sinrIndex = std::max(0.0, std::floor (sinrIndexDouble));
+                  NS_ASSERT_MSG (sinrIndex < MI_MAP_16QAM_SIZE, "MI map out of data");
+                  MI = MI_map_16qam[sinrIndex];
                 }
             }
           else // 64-QAM
             {
-              int tr = 0;
-              while ((tr<MI_MAP_64QAM_SIZE)&&(MI_map_64qam_axis[tr] < sinrLin))
-                {
-                  tr++;
-                }
               if (sinrLin > MI_map_64qam_axis[MI_MAP_64QAM_SIZE-1])
                 {
                   MI = 1;
                 }
               else
                 {
-                  NS_ASSERT_MSG (tr<MI_MAP_64QAM_SIZE, "MI map out of data");
-                  MI = MI_map_64qam[tr];
+                  // since the values in MI_map_64QAM_axis are uniformly spaced, we have
+                  // index = ((sinrLin - value[0]) / (value[SIZE-1] - value[0])) * (SIZE-1)
+                  // the scaling coefficient is always the same, so we use a static const
+                  // to speed up the calculation
+                  static const double scalingCoeff64qam = 
+                    (MI_MAP_64QAM_SIZE - 1) / (MI_map_64qam_axis[MI_MAP_64QAM_SIZE-1] - MI_map_64qam_axis[0]);
+                  double sinrIndexDouble = (sinrLin -  MI_map_64qam_axis[0]) * scalingCoeff64qam + 1;
+                  uint32_t sinrIndex = std::max(0.0, std::floor (sinrIndexDouble));
+                  NS_ASSERT_MSG (sinrIndex < MI_MAP_64QAM_SIZE, "MI map out of data");
+                  MI = MI_map_64qam[sinrIndex];
                 }
             }
         }
diff -Naur ns-3.18.1/src/lte/model/lte-mi-error-model.h ns-3.19/src/lte/model/lte-mi-error-model.h
--- ns-3.18.1/src/lte/model/lte-mi-error-model.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-mi-error-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -82,8 +82,8 @@
   static double Mib (const SpectrumValue& sinr, const std::vector<int>& map, uint8_t mcs);
   /** 
    * \brief map the mmib (mean mutual information per bit) for different MCS
-   * \param mmib mean mutual information per bit of a code-block
-   * \param mcs the MCS
+   * \param mib mean mutual information per bit of a code-block
+   * \param ecrId Effective Code Rate ID
    * \param cbSize the size of the CB
    * \return the code block error rate
    */
diff -Naur ns-3.18.1/src/lte/model/lte-net-device.cc ns-3.19/src/lte/model/lte-net-device.cc
--- ns-3.18.1/src/lte/model/lte-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED ( LteNetDevice);
+NS_OBJECT_ENSURE_REGISTERED ( LteNetDevice)
+  ;
 
 ////////////////////////////////
 // LteNetDevice
diff -Naur ns-3.18.1/src/lte/model/lte-pdcp.cc ns-3.19/src/lte/model/lte-pdcp.cc
--- ns-3.18.1/src/lte/model/lte-pdcp.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-pdcp.cc	2013-12-20 09:44:50.000000000 -0800
@@ -61,7 +61,8 @@
 
 ///////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (LtePdcp);
+NS_OBJECT_ENSURE_REGISTERED (LtePdcp)
+  ;
 
 LtePdcp::LtePdcp ()
   : m_pdcpSapUser (0),
diff -Naur ns-3.18.1/src/lte/model/lte-pdcp.h ns-3.19/src/lte/model/lte-pdcp.h
--- ns-3.18.1/src/lte/model/lte-pdcp.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-pdcp.h	2013-12-20 09:44:50.000000000 -0800
@@ -68,7 +68,7 @@
   /**
    *
    *
-   * \param s the PDCP SAP Provider interface offered to the RRC by this LTE_PDCP
+   * \return the PDCP SAP Provider interface offered to the RRC by this LTE_PDCP
    */
   LtePdcpSapProvider* GetLtePdcpSapProvider ();
 
@@ -82,7 +82,7 @@
   /**
    *
    *
-   * \param s the RLC SAP User interface offered to the RLC by this LTE_PDCP
+   * \return the RLC SAP User interface offered to the RLC by this LTE_PDCP
    */
   LteRlcSapUser* GetLteRlcSapUser ();
 
diff -Naur ns-3.18.1/src/lte/model/lte-pdcp-header.cc ns-3.19/src/lte/model/lte-pdcp-header.cc
--- ns-3.18.1/src/lte/model/lte-pdcp-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-pdcp-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LtePdcpHeader);
+NS_OBJECT_ENSURE_REGISTERED (LtePdcpHeader)
+  ;
 
 LtePdcpHeader::LtePdcpHeader ()
   : m_dcBit (0xff),
diff -Naur ns-3.18.1/src/lte/model/lte-pdcp-tag.cc ns-3.19/src/lte/model/lte-pdcp-tag.cc
--- ns-3.18.1/src/lte/model/lte-pdcp-tag.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-pdcp-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PdcpTag);
+NS_OBJECT_ENSURE_REGISTERED (PdcpTag)
+  ;
 
 PdcpTag::PdcpTag ()
   : m_senderTimestamp (Seconds (0))
diff -Naur ns-3.18.1/src/lte/model/lte-pdcp-tag.h ns-3.19/src/lte/model/lte-pdcp-tag.h
--- ns-3.18.1/src/lte/model/lte-pdcp-tag.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-pdcp-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -56,6 +56,7 @@
 
   /**
    * Get the instant when the PDCP delivers the PDU to the MAC SAP provider
+   * @return the sender timestamp
    */
   Time  GetSenderTimestamp (void) const;
 
diff -Naur ns-3.18.1/src/lte/model/lte-phy.cc ns-3.19/src/lte/model/lte-phy.cc
--- ns-3.18.1/src/lte/model/lte-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -33,7 +33,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (LtePhy);
+NS_OBJECT_ENSURE_REGISTERED (LtePhy)
+  ;
 
 
 LtePhy::LtePhy ()
diff -Naur ns-3.18.1/src/lte/model/lte-phy.h ns-3.19/src/lte/model/lte-phy.h
--- ns-3.18.1/src/lte/model/lte-phy.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-phy.h	2013-12-20 09:44:50.000000000 -0800
@@ -121,13 +121,6 @@
   void DoDispose ();
 
   /**
-   * \brief Receive SendLteControlMessage (PDCCH map, CQI feedbacks) using the ideal control channel
-   * \param msg the Ideal Control Message to receive
-   */
-//   virtual void ReceiveLteControlMessage (Ptr<LteControlMessage> msg) = 0;
-
-
-  /**
    * \param tti transmission time interval
    */
   void SetTti (double tti);
@@ -188,7 +181,7 @@
    * 
    * \param sinr the SINR vs frequency measured by the device
    */
-  virtual void  GenerateCtrlCqiReport (const SpectrumValue& sinr) = 0;
+  virtual void GenerateCtrlCqiReport (const SpectrumValue& sinr) = 0;
   
   /** 
   * generate a CQI report based on the given SINR of Data frame
@@ -196,25 +189,25 @@
   * 
   * \param sinr the SINR vs frequency measured by the device
   */
-  virtual void  GenerateDataCqiReport (const SpectrumValue& sinr) = 0;
+  virtual void GenerateDataCqiReport (const SpectrumValue& sinr) = 0;
 
   /**
   * generate a report based on the linear interference and noise power
   * perceived during DATA frame
   * NOTE: used only by eNB 
   *
-  * \param sinr the interference + noise power measured by the device
+  * \param interf the interference + noise power measured by the device
   */
-  virtual void ReportInterference (const SpectrumValue& power) = 0;
+  virtual void ReportInterference (const SpectrumValue& interf) = 0;
 
   /**
   * generate a report based on the linear RS power perceived during CTRL 
   * frame
   * NOTE: used only by UE for evaluating RSRP
   *
-  * \param sinr the RS power measured by the device
+  * \param power the RS power measured by the device
   */
-  virtual void ReportRsReceivedPower (const SpectrumValue& interf) = 0;
+  virtual void ReportRsReceivedPower (const SpectrumValue& power) = 0;
 
 
 
diff -Naur ns-3.18.1/src/lte/model/lte-phy-tag.cc ns-3.19/src/lte/model/lte-phy-tag.cc
--- ns-3.18.1/src/lte/model/lte-phy-tag.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-phy-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LtePhyTag);
+NS_OBJECT_ENSURE_REGISTERED (LtePhyTag)
+  ;
 
 TypeId
 LtePhyTag::GetTypeId (void)
diff -Naur ns-3.18.1/src/lte/model/lte-radio-bearer-info.cc ns-3.19/src/lte/model/lte-radio-bearer-info.cc
--- ns-3.18.1/src/lte/model/lte-radio-bearer-info.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-radio-bearer-info.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteRadioBearerInfo);
+NS_OBJECT_ENSURE_REGISTERED (LteRadioBearerInfo)
+  ;
 
 LteRadioBearerInfo::LteRadioBearerInfo (void)
 {
diff -Naur ns-3.18.1/src/lte/model/lte-radio-bearer-tag.cc ns-3.19/src/lte/model/lte-radio-bearer-tag.cc
--- ns-3.18.1/src/lte/model/lte-radio-bearer-tag.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-radio-bearer-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteRadioBearerTag);
+NS_OBJECT_ENSURE_REGISTERED (LteRadioBearerTag)
+  ;
 
 TypeId
 LteRadioBearerTag::GetTypeId (void)
diff -Naur ns-3.18.1/src/lte/model/lte-radio-bearer-tag.h ns-3.19/src/lte/model/lte-radio-bearer-tag.h
--- ns-3.18.1/src/lte/model/lte-radio-bearer-tag.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-radio-bearer-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -57,7 +57,7 @@
    *
    * @param rnti the value of the RNTI to set
    */
-  void SetRnti (uint16_t tid);
+  void SetRnti (uint16_t rnti);
 
   /**
    * Set the LC id to the given value.
@@ -71,7 +71,7 @@
   *
   * @param layer the value of the layer to set
   */
-  void SetLayer (uint8_t lcid);
+  void SetLayer (uint8_t layer);
 
 
   virtual void Serialize (TagBuffer i) const;
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-am.cc ns-3.19/src/lte/model/lte-rlc-am.cc
--- ns-3.18.1/src/lte/model/lte-rlc-am.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-am.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteRlcAm);
+NS_OBJECT_ENSURE_REGISTERED (LteRlcAm)
+  ;
 
 LteRlcAm::LteRlcAm ()
 {
@@ -93,6 +94,14 @@
                    TimeValue (MilliSeconds (100)),
                    MakeTimeAccessor (&LteRlcAm::m_pollRetransmitTimerValue),
                    MakeTimeChecker ())
+    .AddAttribute ("TxOpportunityForRetxAlwaysBigEnough",
+                   "If true, always pretend that the size of a TxOpportunity is big enough "
+                   "for retransmission. If false (default and realistic behavior), no retx "
+                   "is performed unless the corresponding TxOpportunity is big enough.",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&LteRlcAm::m_txOpportunityForRetxAlwaysBigEnough),
+                   MakeBooleanChecker ())
+
     ;
   return tid;
 }
@@ -211,7 +220,8 @@
 
       Ptr<Packet> packet = m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->Copy ();
 
-      if ( packet->GetSize () <= bytes )
+      if (( packet->GetSize () <= bytes )
+          || m_txOpportunityForRetxAlwaysBigEnough)
         {
           LteRlcAmHeader rlcAmHeader;
           packet->PeekHeader (rlcAmHeader);
@@ -258,7 +268,8 @@
       uint16_t vta = m_vtA.GetValue ();
       Ptr<Packet> packet = m_txedBuffer.at (vta)->Copy ();
 
-      if ( packet->GetSize () <= bytes )
+      if (( packet->GetSize () <= bytes )
+          || m_txOpportunityForRetxAlwaysBigEnough)
         {
           NS_LOG_INFO ("Move SN = " << vta << " to retxBuffer");
           m_retxBuffer.at (vta).m_pdu = m_txedBuffer.at (vta)->Copy ();
@@ -962,12 +973,22 @@
       NS_LOG_INFO ("ackSn     = " << ackSn);
       NS_LOG_INFO ("VT(A)     = " << m_vtA);
       NS_LOG_INFO ("VT(S)     = " << m_vtS);
+
+      m_vtA.SetModulusBase (m_vtA);
+      m_vtS.SetModulusBase (m_vtA);
+      ackSn.SetModulusBase (m_vtA);
       while (m_vtA < ackSn && m_vtA < m_vtS)
         {
 //           NS_LOG_INFO ("seqNumber = " << seqNumber);
 //           NS_LOG_INFO ("m_txedBuffer( VT(A) ).size = " << m_txedBuffer.size ());
 
           uint16_t seqNumberValue = m_vtA.GetValue ();
+          if (m_pollRetransmitTimer.IsRunning () 
+              && (seqNumberValue == m_pollSn.GetValue ()))
+            {
+              m_pollRetransmitTimer.Cancel ();
+            }
+
           if (m_txedBuffer.at (seqNumberValue))
             {
               NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from txedBuffer");
@@ -985,6 +1006,9 @@
             }
 
           m_vtA++;
+          m_vtA.SetModulusBase (m_vtA);
+          m_vtS.SetModulusBase (m_vtA);
+          ackSn.SetModulusBase (m_vtA);
         }
 
       NS_LOG_INFO ("New VT(A) = " << m_vtA);
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-am.h ns-3.19/src/lte/model/lte-rlc-am.h
--- ns-3.18.1/src/lte/model/lte-rlc-am.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-am.h	2013-12-20 09:44:50.000000000 -0800
@@ -150,6 +150,8 @@
   uint16_t m_maxRetxThreshold;  /// \todo How these parameters are configured???
   uint16_t m_pollPdu;
   uint16_t m_pollByte;
+  
+  bool m_txOpportunityForRetxAlwaysBigEnough;
 
   /**
    * SDU Reassembling state
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-am-header.cc ns-3.19/src/lte/model/lte-rlc-am-header.cc
--- ns-3.18.1/src/lte/model/lte-rlc-am-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-am-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteRlcAmHeader);
+NS_OBJECT_ENSURE_REGISTERED (LteRlcAmHeader)
+  ;
 
 LteRlcAmHeader::LteRlcAmHeader ()
   : m_headerLength (0),
diff -Naur ns-3.18.1/src/lte/model/lte-rlc.cc ns-3.19/src/lte/model/lte-rlc.cc
--- ns-3.18.1/src/lte/model/lte-rlc.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc.cc	2013-12-20 09:44:50.000000000 -0800
@@ -81,7 +81,8 @@
 
 ///////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (LteRlc);
+NS_OBJECT_ENSURE_REGISTERED (LteRlc)
+  ;
 
 LteRlc::LteRlc ()
   : m_rlcSapUser (0),
@@ -167,7 +168,8 @@
 
 ////////////////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (LteRlcSm);
+NS_OBJECT_ENSURE_REGISTERED (LteRlcSm)
+  ;
 
 LteRlcSm::LteRlcSm ()
 {
diff -Naur ns-3.18.1/src/lte/model/lte-rlc.h ns-3.19/src/lte/model/lte-rlc.h
--- ns-3.18.1/src/lte/model/lte-rlc.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc.h	2013-12-20 09:44:50.000000000 -0800
@@ -81,7 +81,7 @@
   /**
    *
    *
-   * \param s the RLC SAP Provider interface offered to the PDCP by this LTE_RLC
+   * \return the RLC SAP Provider interface offered to the PDCP by this LTE_RLC
    */
   LteRlcSapProvider* GetLteRlcSapProvider ();
 
@@ -95,7 +95,7 @@
   /**
    *
    *
-   * \param s the MAC SAP User interface offered to the MAC by this LTE_RLC
+   * \return the MAC SAP User interface offered to the MAC by this LTE_RLC
    */
   LteMacSapUser* GetLteMacSapUser ();
 
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-header.cc ns-3.19/src/lte/model/lte-rlc-header.cc
--- ns-3.18.1/src/lte/model/lte-rlc-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteRlcHeader);
+NS_OBJECT_ENSURE_REGISTERED (LteRlcHeader)
+  ;
 
 LteRlcHeader::LteRlcHeader ()
   : m_headerLength (0),
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-sdu-status-tag.cc ns-3.19/src/lte/model/lte-rlc-sdu-status-tag.cc
--- ns-3.18.1/src/lte/model/lte-rlc-sdu-status-tag.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-sdu-status-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteRlcSduStatusTag);
+NS_OBJECT_ENSURE_REGISTERED (LteRlcSduStatusTag)
+  ;
 
 LteRlcSduStatusTag::LteRlcSduStatusTag ()
 {
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-tag.cc ns-3.19/src/lte/model/lte-rlc-tag.cc
--- ns-3.18.1/src/lte/model/lte-rlc-tag.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RlcTag);
+NS_OBJECT_ENSURE_REGISTERED (RlcTag)
+  ;
 
 RlcTag::RlcTag ()
   : m_senderTimestamp (Seconds (0))
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-tag.h ns-3.19/src/lte/model/lte-rlc-tag.h
--- ns-3.18.1/src/lte/model/lte-rlc-tag.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -55,6 +55,7 @@
 
   /**
    * Get the instant when the RLC delivers the PDU to the MAC SAP provider
+   * @return the sender timestamp
    */
   Time  GetSenderTimestamp (void) const
   {
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-tm.cc ns-3.19/src/lte/model/lte-rlc-tm.cc
--- ns-3.18.1/src/lte/model/lte-rlc-tm.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-tm.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteRlcTm);
+NS_OBJECT_ENSURE_REGISTERED (LteRlcTm)
+  ;
 
 LteRlcTm::LteRlcTm ()
   : m_maxTxBufferSize (0),
@@ -130,7 +131,6 @@
 
   if (bytes < packet->GetSize ())
     {
-      // Stingy MAC: Header fix part is 2 bytes, we need more bytes for the data
       NS_LOG_WARN ("TX opportunity too small = " << bytes << " (PDU size: " << packet->GetSize () << ")");
       return;
     }
diff -Naur ns-3.18.1/src/lte/model/lte-rlc-um.cc ns-3.19/src/lte/model/lte-rlc-um.cc
--- ns-3.18.1/src/lte/model/lte-rlc-um.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rlc-um.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteRlcUm);
+NS_OBJECT_ENSURE_REGISTERED (LteRlcUm)
+  ;
 
 LteRlcUm::LteRlcUm ()
   : m_maxTxBufferSize (10 * 1024),
diff -Naur ns-3.18.1/src/lte/model/lte-rrc-protocol-ideal.cc ns-3.19/src/lte/model/lte-rrc-protocol-ideal.cc
--- ns-3.18.1/src/lte/model/lte-rrc-protocol-ideal.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rrc-protocol-ideal.cc	2013-12-20 09:44:50.000000000 -0800
@@ -39,7 +39,8 @@
 
 const Time RRC_IDEAL_MSG_DELAY = MilliSeconds (0); 
 
-NS_OBJECT_ENSURE_REGISTERED (LteUeRrcProtocolIdeal);
+NS_OBJECT_ENSURE_REGISTERED (LteUeRrcProtocolIdeal)
+  ;
 
 LteUeRrcProtocolIdeal::LteUeRrcProtocolIdeal ()
   :  m_ueRrcSapProvider (0),
@@ -206,7 +207,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (LteEnbRrcProtocolIdeal);
+NS_OBJECT_ENSURE_REGISTERED (LteEnbRrcProtocolIdeal)
+  ;
 
 LteEnbRrcProtocolIdeal::LteEnbRrcProtocolIdeal ()
   :  m_enbRrcSapProvider (0)
@@ -323,50 +325,6 @@
 }
 
 void 
-LteEnbRrcProtocolIdeal::DoSendMasterInformationBlock (LteRrcSap::MasterInformationBlock msg)
-{
-  NS_LOG_FUNCTION (this);
-  for (std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it = m_enbRrcSapProviderMap.begin ();
-       it != m_enbRrcSapProviderMap.end ();
-       ++it)
-    {
-      Simulator::Schedule (RRC_IDEAL_MSG_DELAY, 
-                           &LteUeRrcSapProvider::RecvMasterInformationBlock,
-                           it->second, 
-                           msg);
-    }
-}
-
-void 
-LteEnbRrcProtocolIdeal::DoSendSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 msg)
-{
-  NS_LOG_FUNCTION (this << m_cellId);
- // walk list of all nodes to get UEs with this cellId
-  Ptr<LteUeRrc> ueRrc;
-  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
-    {
-      Ptr<Node> node = *i;
-      int nDevs = node->GetNDevices ();
-      for (int j = 0; j < nDevs; ++j)
-        {
-          Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
-          if (ueDev != 0)
-            {
-              NS_LOG_LOGIC ("considering UE " << ueDev->GetImsi ());
-              Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();              
-              if (ueRrc->GetCellId () == m_cellId)
-                {       
-                  Simulator::Schedule (RRC_IDEAL_MSG_DELAY, 
-                                       &LteUeRrcSapProvider::RecvSystemInformationBlockType1,
-                                       ueRrc->GetLteUeRrcSapProvider (), 
-                                       msg);          
-                }             
-            }
-        }
-    } 
-}
-
-void 
 LteEnbRrcProtocolIdeal::DoSendSystemInformation (LteRrcSap::SystemInformation msg)
 {
   NS_LOG_FUNCTION (this << m_cellId);
diff -Naur ns-3.18.1/src/lte/model/lte-rrc-protocol-ideal.h ns-3.19/src/lte/model/lte-rrc-protocol-ideal.h
--- ns-3.18.1/src/lte/model/lte-rrc-protocol-ideal.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rrc-protocol-ideal.h	2013-12-20 09:44:50.000000000 -0800
@@ -116,8 +116,6 @@
   // methods forwarded from LteEnbRrcSapUser
   void DoSetupUe (uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params);
   void DoRemoveUe (uint16_t rnti);
-  void DoSendMasterInformationBlock (LteRrcSap::MasterInformationBlock msg);
-  void DoSendSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 msg);
   void DoSendSystemInformation (LteRrcSap::SystemInformation msg);
   void SendSystemInformation (LteRrcSap::SystemInformation msg);
   void DoSendRrcConnectionSetup (uint16_t rnti, LteRrcSap::RrcConnectionSetup msg);
diff -Naur ns-3.18.1/src/lte/model/lte-rrc-protocol-real.cc ns-3.19/src/lte/model/lte-rrc-protocol-real.cc
--- ns-3.18.1/src/lte/model/lte-rrc-protocol-real.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rrc-protocol-real.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,8 @@
 
 const Time RRC_REAL_MSG_DELAY = MilliSeconds (0); 
 
-NS_OBJECT_ENSURE_REGISTERED (LteUeRrcProtocolReal);
+NS_OBJECT_ENSURE_REGISTERED (LteUeRrcProtocolReal)
+  ;
 
 LteUeRrcProtocolReal::LteUeRrcProtocolReal ()
   :  m_ueRrcSapProvider (0),
@@ -350,7 +351,8 @@
     }
 }
 
-NS_OBJECT_ENSURE_REGISTERED (LteEnbRrcProtocolReal);
+NS_OBJECT_ENSURE_REGISTERED (LteEnbRrcProtocolReal)
+  ;
 
 LteEnbRrcProtocolReal::LteEnbRrcProtocolReal ()
   :  m_enbRrcSapProvider (0)
@@ -503,50 +505,6 @@
 }
 
 void 
-LteEnbRrcProtocolReal::DoSendMasterInformationBlock (LteRrcSap::MasterInformationBlock msg)
-{
-  NS_LOG_FUNCTION (this);
-  for (std::map<uint16_t, LteUeRrcSapProvider*>::const_iterator it = m_enbRrcSapProviderMap.begin ();
-       it != m_enbRrcSapProviderMap.end ();
-       ++it)
-    {
-      Simulator::Schedule (RRC_REAL_MSG_DELAY, 
-                           &LteUeRrcSapProvider::RecvMasterInformationBlock,
-                           it->second, 
-                           msg);
-    }
-}
-
-void 
-LteEnbRrcProtocolReal::DoSendSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 msg)
-{
-  NS_LOG_FUNCTION (this << m_cellId);
-  // walk list of all nodes to get UEs with this cellId
-  Ptr<LteUeRrc> ueRrc;
-  for (NodeList::Iterator i = NodeList::Begin (); i != NodeList::End (); ++i)
-    {
-      Ptr<Node> node = *i;
-      int nDevs = node->GetNDevices ();
-      for (int j = 0; j < nDevs; ++j)
-        {
-          Ptr<LteUeNetDevice> ueDev = node->GetDevice (j)->GetObject <LteUeNetDevice> ();
-          if (ueDev != 0)
-            {
-              NS_LOG_LOGIC ("considering UE " << ueDev->GetImsi ());
-              Ptr<LteUeRrc> ueRrc = ueDev->GetRrc ();
-              if (ueRrc->GetCellId () == m_cellId)
-                {
-                  Simulator::Schedule (RRC_REAL_MSG_DELAY, 
-                                       &LteUeRrcSapProvider::RecvSystemInformationBlockType1,
-                                       ueRrc->GetLteUeRrcSapProvider (), 
-                                       msg);
-                }
-            }
-        }
-    } 
-}
-
-void 
 LteEnbRrcProtocolReal::DoSendSystemInformation (LteRrcSap::SystemInformation msg)
 {
   NS_LOG_FUNCTION (this << m_cellId);
diff -Naur ns-3.18.1/src/lte/model/lte-rrc-protocol-real.h ns-3.19/src/lte/model/lte-rrc-protocol-real.h
--- ns-3.18.1/src/lte/model/lte-rrc-protocol-real.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rrc-protocol-real.h	2013-12-20 09:44:50.000000000 -0800
@@ -128,8 +128,6 @@
   // methods forwarded from LteEnbRrcSapUser
   void DoSetupUe (uint16_t rnti, LteEnbRrcSapUser::SetupUeParameters params);
   void DoRemoveUe (uint16_t rnti);
-  void DoSendMasterInformationBlock (LteRrcSap::MasterInformationBlock msg);
-  void DoSendSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 msg);
   void DoSendSystemInformation (LteRrcSap::SystemInformation msg);
   void SendSystemInformation (LteRrcSap::SystemInformation msg);
   void DoSendRrcConnectionSetup (uint16_t rnti, LteRrcSap::RrcConnectionSetup msg);
diff -Naur ns-3.18.1/src/lte/model/lte-rrc-sap.cc ns-3.19/src/lte/model/lte-rrc-sap.cc
--- ns-3.18.1/src/lte/model/lte-rrc-sap.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rrc-sap.cc	2013-12-20 09:44:50.000000000 -0800
@@ -18,7 +18,7 @@
  * Author: Nicola Baldo <nbaldo@cttc.es>
  */
 
-#include "ns3/lte-rrc-sap.h"
+#include "lte-rrc-sap.h"
 
 namespace ns3 {
 
@@ -26,4 +26,25 @@
 {
 }
 
+LteRrcSap::ReportConfigEutra::ReportConfigEutra ()
+{
+  triggerType = EVENT;
+  eventId = EVENT_A1;
+  threshold1.choice = ThresholdEutra::THRESHOLD_RSRP;
+  threshold1.range = 0;
+  threshold2.choice = ThresholdEutra::THRESHOLD_RSRP;
+  threshold2.range = 0;
+  reportOnLeave = false;
+  a3Offset = 0;
+  hysteresis = 0;
+  timeToTrigger = 0;
+  purpose = REPORT_STRONGEST_CELLS;
+  triggerQuantity = RSRP;
+  reportQuantity = BOTH;
+  maxReportCells = MaxReportCells;
+  reportInterval = MS480;
+  reportAmount = 255;
+}
+
+
 } // namespace ns3
diff -Naur ns-3.18.1/src/lte/model/lte-rrc-sap.h ns-3.19/src/lte/model/lte-rrc-sap.h
--- ns-3.18.1/src/lte/model/lte-rrc-sap.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-rrc-sap.h	2013-12-20 09:44:50.000000000 -0800
@@ -38,16 +38,20 @@
 class Packet;
 
 /**
- * Class holding definition common to all Ue/Enb SAP
- * Users/Providers. See 3GPP TS 36.331 for reference. 
+ * \ingroup lte
+ *
+ * \brief Class holding definition common to all UE/eNodeB SAP Users/Providers.
+ *
+ * See 3GPP TS 36.331 for reference.
+ *
  * Note that only those values that are (expected to be) used by the
  * ns-3 model are mentioned here. The naming of the variables that are
  * defined here is the same of 36.331, except for removal of "-" and
  * conversion to CamelCase or ALL_CAPS where needed in order to follow
- * the ns-3 coding style. Due to the 1-to-1 mapping with TS 36.331, 
+ * the ns-3 coding style. Due to the 1-to-1 mapping with TS 36.331,
  * detailed doxygen documentation is omitted, so please refer to
  * 36.331 for the meaning of these data structures / fields.
- * 
+ *
  */
 class LteRrcSap
 {
@@ -73,6 +77,12 @@
     uint32_t csgIdentity;
   };
 
+  struct CellSelectionInfo
+  {
+    int8_t qRxLevMin; ///< INTEGER (-70..-22), actual value = IE value * 2 [dBm].
+    int8_t qQualMin; ///< INTEGER (-34..-3), actual value = IE value [dB].
+  };
+
   struct FreqInfo
   {
     uint16_t ulCarrierFreq;
@@ -225,16 +235,26 @@
     uint8_t cellForWhichToReportCGI;
   };
 
+  /**
+   * \brief Threshold for event evaluation.
+   *
+   * For RSRP-based threshold, the actual value is (value - 140) dBm. While for
+   * RSRQ-based threshold, the actual value is (value - 40) / 2 dB. This is in
+   * accordance with section 9.1.4 and 9.1.7 of 3GPP TS 36.133.
+   *
+   * \sa ns3::EutranMeasurementMapping
+   */
   struct ThresholdEutra
   {
     enum
     {
-      THRESHOLD_RSRP,
-      THRESHOLD_RSRQ
+      THRESHOLD_RSRP, ///< RSRP is used for the threshold.
+      THRESHOLD_RSRQ ///< RSRQ is used for the threshold.
     } choice;
-    uint8_t range;
+    uint8_t range; ///< Value range used in RSRP/RSRQ threshold.
   };
 
+  /// Specifies criteria for triggering of an E-UTRA measurement reporting event.
   struct ReportConfigEutra
   {
     enum
@@ -245,34 +265,50 @@
 
     enum
     {
-      EVENT_A1,
-      EVENT_A2,
-      EVENT_A3,
-      EVENT_A4,
-      EVENT_A5
-    } eventId;
-    ThresholdEutra threshold1; // used for A1, A2, A4, A5
-    ThresholdEutra threshold2; // used for A5
-    bool reportOnLeave; // used for A3
-    int8_t a3Offset; // used for A3
+      EVENT_A1, ///< Event A1: Serving becomes better than absolute threshold.
+      EVENT_A2, ///< Event A2: Serving becomes worse than absolute threshold.
+      EVENT_A3, ///< Event A3: Neighbour becomes amount of offset better than PCell.
+      EVENT_A4, ///< Event A4: Neighbour becomes better than absolute threshold.
+      EVENT_A5 ///< Event A5: PCell becomes worse than absolute `threshold1` AND Neighbour becomes better than another absolute `threshold2`.
+
+    } eventId; ///< Choice of E-UTRA event triggered reporting criteria.
+
+    ThresholdEutra threshold1; ///< Threshold for event A1, A2, A4, and A5.
+    ThresholdEutra threshold2; ///< Threshold for event A5.
+
+    /// Indicates whether or not the UE shall initiate the measurement reporting procedure when the leaving condition is met for a cell in `cellsTriggeredList`, as specified in 5.5.4.1 of 3GPP TS 36.331.
+    bool reportOnLeave;
+
+    /// Offset value for Event A3. An integer between -30 and 30. The actual value is (value * 0.5) dB.
+    int8_t a3Offset;
+
+    /// Parameter used within the entry and leave condition of an event triggered reporting condition. The actual value is (value * 0.5) dB.
     uint8_t hysteresis;
+
+    /// Time during which specific criteria for the event needs to be met in order to trigger a measurement report.
     uint16_t timeToTrigger;
+
     enum
     {
       REPORT_STRONGEST_CELLS,
       REPORT_CGI
     } purpose;
+
     enum
     {
-      RSRP,
-      RSRQ
-    } triggerQuantity;
+      RSRP, ///< Reference Signal Received Power
+      RSRQ ///< Reference Signal Received Quality
+    } triggerQuantity; ///< The quantities used to evaluate the triggering condition for the event, see 3GPP TS 36.214.
+
     enum
     {
       SAME_AS_TRIGGER_QUANTITY,
-      BOTH
-    } reportQuantity;
+      BOTH ///< Both the RSRP and RSRQ quantities are to be included in the measurement report.
+    } reportQuantity; ///< The quantities to be included in the measurement report, always assumed to be BOTH.
+
+    /// Maximum number of cells, excluding the serving cell, to be included in the measurement report.
     uint8_t maxReportCells;
+
     enum
     {
       MS120,
@@ -291,9 +327,14 @@
       SPARE3,
       SPARE2,
       SPARE1
-    } reportInterval;
+    } reportInterval; ///< Indicates the interval between periodical reports.
+
+    /// Number of measurement reports applicable, always assumed to be infinite.
     uint8_t reportAmount;
-  };
+
+    ReportConfigEutra ();
+
+  }; // end of struct ReportConfigEutra
 
   struct MeasObjectToAddMod
   {
@@ -424,6 +465,7 @@
   struct SystemInformationBlockType1
   {
     CellAccessRelatedInfo cellAccessRelatedInfo;
+    CellSelectionInfo cellSelectionInfo;
   };
 
   struct SystemInformationBlockType2
@@ -558,10 +600,10 @@
 
 
 /**
- * Service Access Point (SAP) used by the UE RRC to send messages to
- * the eNB. Each method defined in this class correspond to the
- * transmission of a message that is defined in section 6.2.2 of TS
- * 36.331.
+ * \brief Part of the RRC protocol. This Service Access Point (SAP) is used by
+ *        the UE RRC to send messages to the eNB. Each method defined in this
+ *        class corresponds to the transmission of a message that is defined in
+ *        Section 6.2.2 of TS 36.331.
  */
 class LteUeRrcSapUser : public LteRrcSap
 {
@@ -573,20 +615,63 @@
   };
 
   virtual void Setup (SetupParameters params) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionRequest message to the serving eNodeB
+   *        during an RRC connection establishment procedure
+   *        (Section 5.3.3 of TS 36.331).
+   * \param msg the message
+   */
   virtual void SendRrcConnectionRequest (RrcConnectionRequest msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionSetupComplete_ message to the serving eNodeB
+   *        during an RRC connection establishment procedure
+   *        (Section 5.3.3 of TS 36.331).
+   * \param msg the message
+   */
   virtual void SendRrcConnectionSetupCompleted (RrcConnectionSetupCompleted msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionReconfigurationComplete_ message to the serving eNodeB
+   *        during an RRC connection reconfiguration procedure
+   *        (Section 5.3.5 of TS 36.331).
+   * \param msg the message
+   */
   virtual void SendRrcConnectionReconfigurationCompleted (RrcConnectionReconfigurationCompleted msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionReestablishmentRequest_ message to the serving eNodeB
+   *        during an RRC connection re-establishment procedure
+   *        (Section 5.3.7 of TS 36.331).
+   * \param msg the message
+   */
   virtual void SendRrcConnectionReestablishmentRequest (RrcConnectionReestablishmentRequest msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionReestablishmentComplete_ message to the serving eNodeB
+   *        during an RRC connection re-establishment procedure
+   *        (Section 5.3.7 of TS 36.331).
+   * \param msg the message
+   */
   virtual void SendRrcConnectionReestablishmentComplete (RrcConnectionReestablishmentComplete msg) = 0;
+
+  /**
+   * \brief Send a _MeasurementReport_ message to the serving eNodeB
+   *        during a measurement reporting procedure
+   *        (Section 5.5.5 of TS 36.331).
+   * \param msg the message
+   */
   virtual void SendMeasurementReport (MeasurementReport msg) = 0;
+
 };
 
 
 /**
- * Service Access Point (SAP) used to let the UE RRC receive a message
- * from the eNB RRC. Each method defined in this class correspond to
- * the reception of a message that is defined in section 6.2.2 of TS
- * 36.331.
+ * \brief Part of the RRC protocol. This Service Access Point (SAP) is used to
+ *        let the UE RRC receive a message from the eNB RRC. Each method defined
+ *        in this class corresponds to the reception of a message that is
+ *        defined in Section 6.2.2 of TS 36.331.
  */
 class LteUeRrcSapProvider : public LteRrcSap
 {
@@ -598,24 +683,71 @@
   };
 
   virtual void CompleteSetup (CompleteSetupParameters params) = 0;
-  virtual void RecvMasterInformationBlock (MasterInformationBlock msg) = 0;
-  virtual void RecvSystemInformationBlockType1 (SystemInformationBlockType1 msg) = 0;
+
+  /**
+   * \brief Receive a _SystemInformation_ message from the serving eNodeB
+   *        during a system information acquisition procedure
+   *        (Section 5.2.2 of TS 36.331).
+   * \param msg the message
+   */
   virtual void RecvSystemInformation (SystemInformation msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionSetup_ message from the serving eNodeB
+   *        during an RRC connection establishment procedure
+   *        (Section 5.3.3 of TS 36.331).
+   * \param msg the message
+   */
   virtual void RecvRrcConnectionSetup (RrcConnectionSetup msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionReconfiguration_ message from the serving eNodeB
+   *        during an RRC connection reconfiguration procedure
+   *        (Section 5.3.5 of TS 36.331).
+   * \param msg the message
+   */
   virtual void RecvRrcConnectionReconfiguration (RrcConnectionReconfiguration msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionReestablishment_ message from the serving eNodeB
+   *        during an RRC connection re-establishment procedure
+   *        (Section 5.3.7 of TS 36.331).
+   * \param msg the message
+   */
   virtual void RecvRrcConnectionReestablishment (RrcConnectionReestablishment msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionReestablishmentReject_ message from the serving eNodeB
+   *        during an RRC connection re-establishment procedure
+   *        (Section 5.3.7 of TS 36.331).
+   * \param msg the message
+   */
   virtual void RecvRrcConnectionReestablishmentReject (RrcConnectionReestablishmentReject msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionRelease_ message from the serving eNodeB
+   *        during an RRC connection release procedure
+   *        (Section 5.3.8 of TS 36.331).
+   * \param msg the message
+   */
   virtual void RecvRrcConnectionRelease (RrcConnectionRelease msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionReject_ message from the serving eNodeB
+   *        during an RRC connection establishment procedure
+   *        (Section 5.3.3 of TS 36.331).
+   * \param msg the message
+   */
   virtual void RecvRrcConnectionReject (RrcConnectionReject msg) = 0;
 
 };
 
 
 /**
- * Service Access Point (SAP) used by the eNB RRC to send messages to
- * the UE RC.  Each method defined in this class correspond to
- * the transmission of a message that is defined in section 6.2.2 of TS
- * 36.331.
+ * \brief Part of the RRC protocol. This Service Access Point (SAP) is used by
+ *        the eNB RRC to send messages to the UE RRC.  Each method defined in
+ *        this class corresponds to the transmission of a message that is
+ *        defined in Section 6.2.2 of TS 36.331.
  */
 class LteEnbRrcSapUser : public LteRrcSap
 {
@@ -628,14 +760,69 @@
 
   virtual void SetupUe (uint16_t rnti, SetupUeParameters params) = 0;
   virtual void RemoveUe (uint16_t rnti) = 0;
-  virtual void SendSystemInformationBlockType1 (SystemInformationBlockType1 msg) = 0;
+
+  /**
+   * \brief Send a _SystemInformation_ message to all attached UEs
+   *        during a system information acquisition procedure
+   *        (Section 5.2.2 of TS 36.331).
+   * \param msg the message
+   */
   virtual void SendSystemInformation (SystemInformation msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionSetup_ message to a UE
+   *        during an RRC connection establishment procedure
+   *        (Section 5.3.3 of TS 36.331).
+   * \param rnti the RNTI of the destination UE
+   * \param msg the message
+   */
   virtual void SendRrcConnectionSetup (uint16_t rnti, RrcConnectionSetup msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionReconfiguration_ message to a UE
+   *        during an RRC connection reconfiguration procedure
+   *        (Section 5.3.5 of TS 36.331).
+   * \param rnti the RNTI of the destination UE
+   * \param msg the message
+   */
   virtual void SendRrcConnectionReconfiguration (uint16_t rnti, RrcConnectionReconfiguration msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionReestablishment_ message to a UE
+   *        during an RRC connection re-establishment procedure
+   *        (Section 5.3.7 of TS 36.331).
+   * \param rnti the RNTI of the destination UE
+   * \param msg the message
+   */
   virtual void SendRrcConnectionReestablishment (uint16_t rnti, RrcConnectionReestablishment msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionReestablishmentReject_ message to a UE
+   *        during an RRC connection re-establishment procedure
+   *        (Section 5.3.7 of TS 36.331).
+   * \param rnti the RNTI of the destination UE
+   * \param msg the message
+   */
   virtual void SendRrcConnectionReestablishmentReject (uint16_t rnti, RrcConnectionReestablishmentReject msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionRelease_ message to a UE
+   *        during an RRC connection release procedure
+   *        (Section 5.3.8 of TS 36.331).
+   * \param rnti the RNTI of the destination UE
+   * \param msg the message
+   */
   virtual void SendRrcConnectionRelease (uint16_t rnti, RrcConnectionRelease msg) = 0;
+
+  /**
+   * \brief Send an _RRCConnectionReject_ message to a UE
+   *        during an RRC connection establishment procedure
+   *        (Section 5.3.3 of TS 36.331).
+   * \param rnti the RNTI of the destination UE
+   * \param msg the message
+   */
   virtual void SendRrcConnectionReject (uint16_t rnti, RrcConnectionReject msg) = 0;
+
   virtual Ptr<Packet> EncodeHandoverPreparationInformation (HandoverPreparationInfo msg) = 0;
   virtual HandoverPreparationInfo DecodeHandoverPreparationInformation (Ptr<Packet> p) = 0;
   virtual Ptr<Packet> EncodeHandoverCommand (RrcConnectionReconfiguration msg) = 0;
@@ -645,10 +832,10 @@
 
 
 /**
- * Service Access Point (SAP) used to let the eNB RRC receive a
- * message from a UE RRC.  Each method defined in this class correspond to
- * the reception of a message that is defined in section 6.2.2 of TS
- * 36.331.
+ * \brief Part of the RRC protocol. This Service Access Point (SAP) is used to
+ *        let the eNB RRC receive a message from a UE RRC.  Each method defined
+ *        in this class corresponds to the reception of a message that is
+ *        defined in Section 6.2.2 of TS 36.331.
  */
 class LteEnbRrcSapProvider : public LteRrcSap
 {
@@ -660,11 +847,64 @@
   };
 
   virtual void CompleteSetupUe (uint16_t rnti, CompleteSetupUeParameters params) = 0;
-  virtual void RecvRrcConnectionRequest (uint16_t rnti, RrcConnectionRequest msg) = 0;
-  virtual void RecvRrcConnectionSetupCompleted (uint16_t rnti, RrcConnectionSetupCompleted msg) = 0;
-  virtual void RecvRrcConnectionReconfigurationCompleted (uint16_t rnti, RrcConnectionReconfigurationCompleted msg) = 0;
-  virtual void RecvRrcConnectionReestablishmentRequest (uint16_t rnti, RrcConnectionReestablishmentRequest msg) = 0;
-  virtual void RecvRrcConnectionReestablishmentComplete (uint16_t rnti, RrcConnectionReestablishmentComplete msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionRequest_ message from a UE
+   *        during an RRC connection establishment procedure
+   *        (Section 5.3.3 of TS 36.331).
+   * \param rnti the RNTI of UE which sent the message
+   * \param msg the message
+   */
+  virtual void RecvRrcConnectionRequest (uint16_t rnti,
+                                         RrcConnectionRequest msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionSetupComplete_ message from a UE
+   *        during an RRC connection establishment procedure
+   *        (Section 5.3.3 of TS 36.331).
+   * \param rnti the RNTI of UE which sent the message
+   * \param msg the message
+   */
+  virtual void RecvRrcConnectionSetupCompleted (uint16_t rnti,
+                                                RrcConnectionSetupCompleted msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionReconfigurationComplete_ message from a UE
+   *        during an RRC connection reconfiguration procedure
+   *        (Section 5.3.5 of TS 36.331).
+   * \param rnti the RNTI of UE which sent the message
+   * \param msg the message
+   */
+  virtual void RecvRrcConnectionReconfigurationCompleted (uint16_t rnti,
+                                                          RrcConnectionReconfigurationCompleted msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionReestablishmentRequest_ message from a UE
+   *        during an RRC connection re-establishment procedure
+   *        (Section 5.3.7 of TS 36.331).
+   * \param rnti the RNTI of UE which sent the message
+   * \param msg the message
+   */
+  virtual void RecvRrcConnectionReestablishmentRequest (uint16_t rnti,
+                                                        RrcConnectionReestablishmentRequest msg) = 0;
+
+  /**
+   * \brief Receive an _RRCConnectionReestablishmentComplete_ message from a UE
+   *        during an RRC connection re-establishment procedure
+   *        (Section 5.3.7 of TS 36.331).
+   * \param rnti the RNTI of UE which sent the message
+   * \param msg the message
+   */
+  virtual void RecvRrcConnectionReestablishmentComplete (uint16_t rnti,
+                                                         RrcConnectionReestablishmentComplete msg) = 0;
+
+  /**
+   * \brief Receive a _MeasurementReport_ message from a UE
+   *        during a measurement reporting procedure
+   *        (Section 5.5.5 of TS 36.331).
+   * \param rnti the RNTI of UE which sent the message
+   * \param msg the message
+   */
   virtual void RecvMeasurementReport (uint16_t rnti, MeasurementReport msg) = 0;
 
 };
@@ -777,8 +1017,6 @@
 
   // methods inherited from LteUeRrcSapProvider go here
   virtual void CompleteSetup (CompleteSetupParameters params);
-  virtual void RecvMasterInformationBlock (MasterInformationBlock msg);
-  virtual void RecvSystemInformationBlockType1 (SystemInformationBlockType1 msg);
   virtual void RecvSystemInformation (SystemInformation msg);
   virtual void RecvRrcConnectionSetup (RrcConnectionSetup msg);
   virtual void RecvRrcConnectionReconfiguration (RrcConnectionReconfiguration msg);
@@ -812,20 +1050,6 @@
 
 template <class C>
 void
-MemberLteUeRrcSapProvider<C>::RecvMasterInformationBlock (MasterInformationBlock msg)
-{
-  Simulator::ScheduleNow (&C::DoRecvMasterInformationBlock, m_owner, msg);
-}
-
-template <class C>
-void
-MemberLteUeRrcSapProvider<C>::RecvSystemInformationBlockType1 (SystemInformationBlockType1 msg)
-{
-  Simulator::ScheduleNow (&C::DoRecvSystemInformationBlockType1, m_owner, msg);
-}
-
-template <class C>
-void
 MemberLteUeRrcSapProvider<C>::RecvSystemInformation (SystemInformation msg)
 {
   Simulator::ScheduleNow (&C::DoRecvSystemInformation, m_owner, msg);
@@ -889,8 +1113,6 @@
 
   virtual void SetupUe (uint16_t rnti, SetupUeParameters params);
   virtual void RemoveUe (uint16_t rnti);
-  virtual void SendMasterInformationBlock (MasterInformationBlock msg);
-  virtual void SendSystemInformationBlockType1 (SystemInformationBlockType1 msg);
   virtual void SendSystemInformation (SystemInformation msg);
   virtual void SendRrcConnectionSetup (uint16_t rnti, RrcConnectionSetup msg);
   virtual void SendRrcConnectionReconfiguration (uint16_t rnti, RrcConnectionReconfiguration msg);
@@ -934,20 +1156,6 @@
 }
 
 template <class C>
-void
-MemberLteEnbRrcSapUser<C>::SendMasterInformationBlock (MasterInformationBlock msg)
-{
-  m_owner->DoSendMasterInformationBlock (msg);
-}
-
-template <class C>
-void
-MemberLteEnbRrcSapUser<C>::SendSystemInformationBlockType1 (SystemInformationBlockType1 msg)
-{
-  m_owner->DoSendSystemInformationBlockType1 (msg);
-}
-
-template <class C>
 void
 MemberLteEnbRrcSapUser<C>::SendSystemInformation (SystemInformation msg)
 {
diff -Naur ns-3.18.1/src/lte/model/lte-spectrum-phy.cc ns-3.19/src/lte/model/lte-spectrum-phy.cc
--- ns-3.18.1/src/lte/model/lte-spectrum-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-spectrum-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -110,10 +110,12 @@
   return ( (a.m_rnti < b.m_rnti) || ( (a.m_rnti == b.m_rnti) && (a.m_layer < b.m_layer) ) );
 }
 
-NS_OBJECT_ENSURE_REGISTERED (LteSpectrumPhy);
+NS_OBJECT_ENSURE_REGISTERED (LteSpectrumPhy)
+  ;
 
 LteSpectrumPhy::LteSpectrumPhy ()
   : m_state (IDLE),
+    m_cellId (0),
   m_transmissionMode (0),
   m_layersNum (1)
 {
diff -Naur ns-3.18.1/src/lte/model/lte-spectrum-phy.h ns-3.19/src/lte/model/lte-spectrum-phy.h
--- ns-3.18.1/src/lte/model/lte-spectrum-phy.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-spectrum-phy.h	2013-12-20 09:44:50.000000000 -0800
@@ -227,7 +227,7 @@
   * Start a transmission of control frame in DL
   *
   *
-  * @param ctrlMsgList the burst of contrl messages to be transmitted
+  * @param ctrlMsgList the burst of control messages to be transmitted
   * @param pss the flag for transmitting the primary synchronization signal
   *
   * @return true if an error occurred and the transmission was not
@@ -239,9 +239,6 @@
   /**
   * Start a transmission of control frame in UL
   *
-  *
-  * @param pb the burst of control messages to be transmitted
-  *
   * @return true if an error occurred and the transmission was not
   * started, false otherwise.
   */
@@ -250,7 +247,7 @@
 
   /**
    * set the callback for the end of a TX, as part of the
-   * interconnections betweenthe PHY and the MAC
+   * interconnections between the PHY and the MAC
    *
    * @param c the callback
    */
@@ -258,7 +255,7 @@
 
   /**
    * set the callback for the end of a RX in error, as part of the
-   * interconnections betweenthe PHY and the MAC
+   * interconnections between the PHY and the MAC
    *
    * @param c the callback
    */
@@ -266,7 +263,7 @@
 
   /**
    * set the callback for the successful end of a RX, as part of the
-   * interconnections betweenthe PHY and the MAC
+   * interconnections between the PHY and the MAC
    *
    * @param c the callback
    */
@@ -274,7 +271,7 @@
   
   /**
   * set the callback for the successful end of a RX ctrl frame, as part 
-  * of the interconnections betweenthe LteSpectrumPhy and the PHY
+  * of the interconnections between the LteSpectrumPhy and the PHY
   *
   * @param c the callback
   */
@@ -282,7 +279,7 @@
   
   /**
   * set the callback for the erroneous end of a RX ctrl frame, as part 
-  * of the interconnections betweenthe LteSpectrumPhy and the PHY
+  * of the interconnections between the LteSpectrumPhy and the PHY
   *
   * @param c the callback
   */
@@ -298,7 +295,7 @@
 
   /**
   * set the callback for the DL HARQ feedback as part of the 
-  * interconnections betweenthe LteSpectrumPhy and the PHY
+  * interconnections between the LteSpectrumPhy and the PHY
   *
   * @param c the callback
   */
@@ -306,7 +303,7 @@
 
   /**
   * set the callback for the UL HARQ feedback as part of the
-  * interconnections betweenthe LteSpectrumPhy and the PHY
+  * interconnections between the LteSpectrumPhy and the PHY
   *
   * @param c the callback
   */
@@ -330,7 +327,7 @@
   *
   *
   * \param p the new LteSinrChunkProcessor to be added to the RS power 
-  * \processing chain
+  *          processing chain
   */
   void AddRsPowerChunkProcessor (Ptr<LteSinrChunkProcessor> p);
   
@@ -342,7 +339,7 @@
   void AddDataSinrChunkProcessor (Ptr<LteSinrChunkProcessor> p);
 
   /**
-  *  LteSinrChunkProcessor devoted to evaluate intefrerence + noise power 
+  *  LteSinrChunkProcessor devoted to evaluate interference + noise power
   *  in control symbols of the subframe
   *
   * \param p the new LteSinrChunkProcessor to be added to the data processing chain
@@ -350,7 +347,7 @@
   void AddInterferenceCtrlChunkProcessor (Ptr<LteSinrChunkProcessor> p);
 
   /**
-  *  LteSinrChunkProcessor devoted to evaluate intefrerence + noise power
+  *  LteSinrChunkProcessor devoted to evaluate interference + noise power
   *  in data symbols of the subframe
   *
   * \param p the new LteSinrChunkProcessor to be added to the data processing chain
diff -Naur ns-3.18.1/src/lte/model/lte-spectrum-value-helper.h ns-3.19/src/lte/model/lte-spectrum-value-helper.h
--- ns-3.18.1/src/lte/model/lte-spectrum-value-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-spectrum-value-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -102,12 +102,15 @@
    * \param earfcn the carrier frequency (EARFCN) of the transmission
    * \param bandwidth the Transmission Bandwidth Configuration in
    * number of resource blocks
-   * \param txPower the total power in dBm over the whole bandwidth
-   * \param ActiveRbs the list of Active Resource Blocks (PRBs)
+   * \param powerTx the total power in dBm over the whole bandwidth
+   * \param activeRbs the list of Active Resource Blocks (PRBs)
    *
    * \return a pointer to a newly allocated SpectrumValue representing the TX Power Spectral Density in W/Hz for each Resource Block
    */
-  static Ptr<SpectrumValue> CreateTxPowerSpectralDensity (uint16_t earfcn, uint8_t bandwidth, double powerTx, std::vector <int> activeRbs);
+  static Ptr<SpectrumValue> CreateTxPowerSpectralDensity (uint16_t earfcn,
+                                                          uint8_t bandwidth,
+                                                          double powerTx,
+                                                          std::vector <int> activeRbs);
 
 
   /**
diff -Naur ns-3.18.1/src/lte/model/lte-ue-cphy-sap.h ns-3.19/src/lte/model/lte-ue-cphy-sap.h
--- ns-3.18.1/src/lte/model/lte-ue-cphy-sap.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-ue-cphy-sap.h	2013-12-20 09:44:50.000000000 -0800
@@ -53,24 +53,66 @@
    */
   virtual void Reset () = 0;
 
-  /** 
-   * tell the PHY to synchronize with a given eNB for communication purposes
-   * 
-   * \param cellId the ID of the eNB
-   * \param dlEarfcn  the carrier frequency (EARFCN) in downlink
+  /**
+   * \brief Tell the PHY entity to listen to PSS from surrounding cells and
+   *        measure the RSRP.
+   * \param dlEarfcn the downlink carrier frequency (EARFCN) to listen to
+   *
+   * This function will instruct this PHY instance to listen to the DL channel
+   * over the bandwidth of 6 RB at the frequency associated with the given
+   * EARFCN.
+   *
+   * After this, it will start receiving Primary Synchronization Signal (PSS)
+   * and periodically returning measurement reports to RRC via
+   * LteUeCphySapUser::ReportUeMeasurements function.
    */
-  virtual void SyncronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn) = 0;
-  
+  virtual void StartCellSearch (uint16_t dlEarfcn) = 0;
+
   /**
-   * \param dlBandwidth the DL bandwidth in PRBs
+   * \brief Tell the PHY entity to synchronize with a given eNodeB over the
+   *        currently active EARFCN for communication purposes.
+   * \param cellId the ID of the eNodeB to synchronize with
+   *
+   * By synchronizing, the PHY will start receiving various information
+   * transmitted by the eNodeB. For instance, when receiving system information,
+   * the message will be relayed to RRC via
+   * LteUeCphySapUser::RecvMasterInformationBlock and
+   * LteUeCphySapUser::RecvSystemInformationBlockType1 functions.
+   *
+   * Initially, the PHY will be configured to listen to 6 RBs of BCH.
+   * LteUeCphySapProvider::SetDlBandwidth can be called afterwards to increase
+   * the bandwidth.
+   */
+  virtual void SynchronizeWithEnb (uint16_t cellId) = 0;
+
+  /**
+   * \brief Tell the PHY entity to align to the given EARFCN and synchronize
+   *        with a given eNodeB for communication purposes.
+   * \param cellId the ID of the eNodeB to synchronize with
+   * \param dlEarfcn the downlink carrier frequency (EARFCN)
+   *
+   * By synchronizing, the PHY will start receiving various information
+   * transmitted by the eNodeB. For instance, when receiving system information,
+   * the message will be relayed to RRC via
+   * LteUeCphySapUser::RecvMasterInformationBlock and
+   * LteUeCphySapUser::RecvSystemInformationBlockType1 functions.
+   *
+   * Initially, the PHY will be configured to listen to 6 RBs of BCH.
+   * LteUeCphySapProvider::SetDlBandwidth can be called afterwards to increase
+   * the bandwidth.
+   */
+  virtual void SynchronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn) = 0;
+
+  /**
+   * \param dlBandwidth the DL bandwidth in number of PRBs
    */
   virtual void SetDlBandwidth (uint8_t dlBandwidth) = 0;
 
   /** 
-   * Configure uplink (normally done after reception of SIB2)
+   * \brief Configure uplink (normally done after reception of SIB2)
    * 
-   * \param ulEarfcn the carrier frequency (EARFCN) in uplink
-   * \param ulBandwidth the UL bandwidth in PRBs
+   * \param ulEarfcn the uplink carrier frequency (EARFCN)
+   * \param ulBandwidth the UL bandwidth in number of PRBs
    */
   virtual void ConfigureUplink (uint16_t ulEarfcn, uint8_t ulBandwidth) = 0;
 
@@ -86,9 +128,9 @@
   virtual void SetTransmissionMode (uint8_t txMode) = 0;
 
   /**
-   * \param txMode the transmissionMode of the user
+   * \param srcCi the SRS configuration index
    */
-  virtual void SetSrsConfigurationIndex (uint16_t   srcCi) = 0;
+  virtual void SetSrsConfigurationIndex (uint16_t srcCi) = 0;
 
 };
 
@@ -102,40 +144,59 @@
 class LteUeCphySapUser
 {
 public:
-  
+
   /** 
    * destructor
    */
   virtual ~LteUeCphySapUser ();
 
-  
+
   /**
    * Parameters of the ReportUeMeasurements primitive: RSRP [dBm] and RSRQ [dB]
    * See section 5.1.1 and 5.1.3 of TS 36.214
    */
   struct UeMeasurementsElement
-    {
-      uint16_t m_cellId;
-      double m_rsrp;  // [dBm]
-      double m_rsrq;  // [dB]
-    };
+  {
+    uint16_t m_cellId;
+    double m_rsrp;  // [dBm]
+    double m_rsrq;  // [dB]
+  };
+
   struct UeMeasurementsParameters
-    {
-      std::vector <struct UeMeasurementsElement> m_ueMeasurementsList;
-    };
+  {
+    std::vector <struct UeMeasurementsElement> m_ueMeasurementsList;
+  };
 
 
-  /** 
+  /**
+   * \brief Relay an MIB message from the PHY entity to the RRC layer.
+   * \param cellId the ID of the eNodeB where the message originates from
+   * \param mib the Master Information Block message
    * 
-   * \param mib the Master Information Block received on the BCH
+   * This function is typically called after PHY receives an MIB message over
+   * the BCH.
    */
-  virtual void RecvMasterInformationBlock (LteRrcSap::MasterInformationBlock mib) = 0;
+  virtual void RecvMasterInformationBlock (uint16_t cellId,
+                                           LteRrcSap::MasterInformationBlock mib) = 0;
 
   /**
+   * \brief Relay an SIB1 message from the PHY entity to the RRC layer.
+   * \param cellId the ID of the eNodeB where the message originates from
+   * \param sib1 the System Information Block Type 1 message
    *
-   * \param params the structure containing the vector of cellId, SRSP and RSRQ
+   * This function is typically called after PHY receives an SIB1 message over
+   * the BCH.
+   */
+  virtual void RecvSystemInformationBlockType1 (uint16_t cellId,
+                                                LteRrcSap::SystemInformationBlockType1 sib1) = 0;
+
+  /**
+   * \brief Send a report of RSRP and RSRQ values perceived from PSS by the PHY
+   *        entity (after applying layer-1 filtering) to the RRC layer.
+   * \param params the structure containing a vector of cellId, RSRP and RSRQ
    */
   virtual void ReportUeMeasurements (UeMeasurementsParameters params) = 0;
+
 };
 
 
@@ -154,8 +215,10 @@
 
   // inherited from LteUeCphySapProvider
   virtual void Reset ();
-  virtual void SyncronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn);  
-  virtual void SetDlBandwidth (uint8_t ulBandwidth);
+  virtual void StartCellSearch (uint16_t dlEarfcn);
+  virtual void SynchronizeWithEnb (uint16_t cellId);
+  virtual void SynchronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn);
+  virtual void SetDlBandwidth (uint8_t dlBandwidth);
   virtual void ConfigureUplink (uint16_t ulEarfcn, uint8_t ulBandwidth);
   virtual void SetRnti (uint16_t rnti);
   virtual void SetTransmissionMode (uint8_t txMode);
@@ -185,14 +248,28 @@
 }
 
 template <class C>
-void 
-MemberLteUeCphySapProvider<C>::SyncronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn)
+void
+MemberLteUeCphySapProvider<C>::StartCellSearch (uint16_t dlEarfcn)
 {
-  m_owner->DoSyncronizeWithEnb (cellId, dlEarfcn);
+  m_owner->DoStartCellSearch (dlEarfcn);
 }
 
 template <class C>
-void 
+void
+MemberLteUeCphySapProvider<C>::SynchronizeWithEnb (uint16_t cellId)
+{
+  m_owner->DoSynchronizeWithEnb (cellId);
+}
+
+template <class C>
+void
+MemberLteUeCphySapProvider<C>::SynchronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn)
+{
+  m_owner->DoSynchronizeWithEnb (cellId, dlEarfcn);
+}
+
+template <class C>
+void
 MemberLteUeCphySapProvider<C>::SetDlBandwidth (uint8_t dlBandwidth)
 {
   m_owner->DoSetDlBandwidth (dlBandwidth);
@@ -240,8 +317,10 @@
   MemberLteUeCphySapUser (C* owner);
 
   // methods inherited from LteUeCphySapUser go here
-  virtual void RecvMasterInformationBlock (LteRrcSap::MasterInformationBlock mib);
-
+  virtual void RecvMasterInformationBlock (uint16_t cellId,
+                                           LteRrcSap::MasterInformationBlock mib);
+  virtual void RecvSystemInformationBlockType1 (uint16_t cellId,
+                                                LteRrcSap::SystemInformationBlockType1 sib1);
   virtual void ReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params);
 
 private:
@@ -262,9 +341,18 @@
 
 template <class C> 
 void 
-MemberLteUeCphySapUser<C>::RecvMasterInformationBlock (LteRrcSap::MasterInformationBlock mib)
+MemberLteUeCphySapUser<C>::RecvMasterInformationBlock (uint16_t cellId,
+                                                       LteRrcSap::MasterInformationBlock mib)
+{
+  m_owner->DoRecvMasterInformationBlock (cellId, mib);
+}
+
+template <class C>
+void
+MemberLteUeCphySapUser<C>::RecvSystemInformationBlockType1 (uint16_t cellId,
+                                                            LteRrcSap::SystemInformationBlockType1 sib1)
 {
-  m_owner->DoRecvMasterInformationBlock (mib);
+  m_owner->DoRecvSystemInformationBlockType1 (cellId, sib1);
 }
 
 template <class C>
diff -Naur ns-3.18.1/src/lte/model/lte-ue-mac.cc ns-3.19/src/lte/model/lte-ue-mac.cc
--- ns-3.18.1/src/lte/model/lte-ue-mac.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-ue-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -41,7 +41,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LteUeMac);
+NS_OBJECT_ENSURE_REGISTERED (LteUeMac)
+  ;
 
 
 ///////////////////////////////////////////////////////////
@@ -339,6 +340,10 @@
       std::map <uint8_t, LcInfo>::iterator lcInfoMapIt;
       lcInfoMapIt = m_lcInfoMap.find (lcid);
       NS_ASSERT (lcInfoMapIt !=  m_lcInfoMap.end ());
+      NS_ASSERT_MSG ((lcid != 0) || (((*it).second.txQueueSize == 0)
+                                     && ((*it).second.retxQueueSize == 0)
+                                     && ((*it).second.statusPduSize == 0)),
+                     "BSR should not be used for LCID 0");
       uint8_t lcg = lcInfoMapIt->second.lcConfig.logicalChannelGroup;
       queue.at (lcg) += ((*it).second.txQueueSize + (*it).second.retxQueueSize + (*it).second.statusPduSize);
     }
@@ -411,6 +416,21 @@
   // preambles are sent no one is received, so there is no need
   // for contention resolution
   m_cmacSapUser->NotifyRandomAccessSuccessful ();
+  // trigger tx opportunity for Message 3 over LC 0
+  // this is needed since Message 3's UL GRANT is in the RAR, not in UL-DCIs
+  const uint8_t lc0Lcid = 0;
+  std::map <uint8_t, LcInfo>::iterator lc0InfoIt = m_lcInfoMap.find (lc0Lcid);
+  NS_ASSERT (lc0InfoIt != m_lcInfoMap.end ());
+  std::map <uint8_t, LteMacSapProvider::ReportBufferStatusParameters>::iterator lc0BsrIt
+    = m_ulBsrReceived.find (lc0Lcid);
+  if ((lc0BsrIt != m_ulBsrReceived.end ())
+      && (lc0BsrIt->second.txQueueSize > 0))
+    {
+      NS_ASSERT_MSG (raResponse.m_grant.m_tbSize > lc0BsrIt->second.txQueueSize, 
+                     "segmentation of Message 3 is not allowed");
+      lc0InfoIt->second.macSapUser->NotifyTxOpportunity (raResponse.m_grant.m_tbSize, 0, 0); 
+      lc0BsrIt->second.txQueueSize = 0;
+    }
 }
 
 void 
diff -Naur ns-3.18.1/src/lte/model/lte-ue-net-device.cc ns-3.19/src/lte/model/lte-ue-net-device.cc
--- ns-3.18.1/src/lte/model/lte-ue-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-ue-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -48,7 +48,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED ( LteUeNetDevice);
+NS_OBJECT_ENSURE_REGISTERED ( LteUeNetDevice)
+  ;
 
 
 TypeId LteUeNetDevice::GetTypeId (void)
@@ -57,6 +58,12 @@
     tid =
     TypeId ("ns3::LteUeNetDevice")
     .SetParent<LteNetDevice> ()
+    .AddConstructor<LteUeNetDevice> ()
+    .AddAttribute ("EpcUeNas",
+                   "The NAS associated to this UeNetDevice",
+                   PointerValue (),
+                   MakePointerAccessor (&LteUeNetDevice::m_nas),
+                   MakePointerChecker <EpcUeNas> ())
     .AddAttribute ("LteUeRrc",
                    "The RRC associated to this UeNetDevice",
                    PointerValue (),
@@ -74,10 +81,25 @@
                    MakePointerChecker <LteUePhy> ())
     .AddAttribute ("Imsi",
                    "International Mobile Subscriber Identity assigned to this UE",
-                   TypeId::ATTR_GET,
-                   UintegerValue (0), // not used because the attribute is read-only
+                   UintegerValue (0),
                    MakeUintegerAccessor (&LteUeNetDevice::m_imsi),
                    MakeUintegerChecker<uint64_t> ())
+    .AddAttribute ("DlEarfcn",
+                   "Downlink E-UTRA Absolute Radio Frequency Channel Number (EARFCN) "
+                   "as per 3GPP 36.101 Section 5.7.3. ",
+                   UintegerValue (100),
+                   MakeUintegerAccessor (&LteUeNetDevice::SetDlEarfcn,
+                                         &LteUeNetDevice::GetDlEarfcn),
+                   MakeUintegerChecker<uint16_t> (0, 6149))
+    .AddAttribute ("CsgId",
+                   "The Closed Subscriber Group (CSG) identity that this UE is associated with, "
+                   "i.e., giving the UE access to cells which belong to this particular CSG. "
+                   "This restriction only applies to initial cell selection and EPC-enabled simulation. "
+                   "This does not revoke the UE's access to non-CSG cells. ",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&LteUeNetDevice::SetCsgId,
+                                         &LteUeNetDevice::GetCsgId),
+                   MakeUintegerChecker<uint32_t> ())
   ;
 
   return tid;
@@ -85,21 +107,9 @@
 
 
 LteUeNetDevice::LteUeNetDevice (void)
+  : m_isConstructed (false)
 {
   NS_LOG_FUNCTION (this);
-  NS_FATAL_ERROR ("This constructor should not be called");
-}
-
-
-  LteUeNetDevice::LteUeNetDevice (Ptr<Node> node, Ptr<LteUePhy> phy, Ptr<LteUeMac> mac, Ptr<LteUeRrc> rrc, Ptr<EpcUeNas> nas, uint64_t imsi)
-{
-  NS_LOG_FUNCTION (this);
-  m_phy = phy;
-  m_mac = mac;
-  m_rrc = rrc;
-  m_nas = nas;
-  SetNode (node);
-  m_imsi = imsi;
 }
 
 LteUeNetDevice::~LteUeNetDevice (void)
@@ -127,9 +137,22 @@
 LteUeNetDevice::UpdateConfig (void)
 {
   NS_LOG_FUNCTION (this);
-  m_nas->SetImsi (m_imsi);
-  m_rrc->SetImsi (m_imsi);
-  
+
+  if (m_isConstructed)
+    {
+      NS_LOG_LOGIC (this << " Updating configuration: IMSI " << m_imsi
+                         << " CSG ID " << m_csgId);
+      m_nas->SetImsi (m_imsi);
+      m_rrc->SetImsi (m_imsi);
+      m_nas->SetCsgId (m_csgId); // this also handles propagation to RRC
+    }
+  else
+    {
+      /*
+       * NAS and RRC instances are not be ready yet, so do nothing now and
+       * expect ``DoInitialize`` to re-invoke this function.
+       */
+    }
 }
 
 
@@ -171,6 +194,35 @@
   return m_imsi;
 }
 
+uint16_t
+LteUeNetDevice::GetDlEarfcn () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_dlEarfcn;
+}
+
+void
+LteUeNetDevice::SetDlEarfcn (uint16_t earfcn)
+{
+  NS_LOG_FUNCTION (this << earfcn);
+  m_dlEarfcn = earfcn;
+}
+
+uint32_t
+LteUeNetDevice::GetCsgId () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_csgId;
+}
+
+void
+LteUeNetDevice::SetCsgId (uint32_t csgId)
+{
+  NS_LOG_FUNCTION (this << csgId);
+  m_csgId = csgId;
+  UpdateConfig (); // propagate the change down to NAS and RRC
+}
+
 void
 LteUeNetDevice::SetTargetEnb (Ptr<LteEnbNetDevice> enb)
 {
@@ -190,6 +242,7 @@
 LteUeNetDevice::DoInitialize (void)
 {
   NS_LOG_FUNCTION (this);
+  m_isConstructed = true;
   UpdateConfig ();
   m_phy->Initialize ();
   m_mac->Initialize ();
diff -Naur ns-3.18.1/src/lte/model/lte-ue-net-device.h ns-3.19/src/lte/model/lte-ue-net-device.h
--- ns-3.18.1/src/lte/model/lte-ue-net-device.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-ue-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -55,43 +55,65 @@
   static TypeId GetTypeId (void);
 
   LteUeNetDevice (void);
-  /**
-   * \brief Create an UE net device
-   * \param node the node to which the device belongs
-   * \param phy the PHY entity
-   * \param mac the MAC entity
-   * \param rrc the RRC entity
-   * \param nas the NAS entity
-   * \param imsi the unique UE identifier
-   * 
-   */
-  LteUeNetDevice (Ptr<Node> node, Ptr<LteUePhy> phy, Ptr<LteUeMac> mac, Ptr<LteUeRrc> rrc, Ptr<EpcUeNas> nas, uint64_t imsi);
-
   virtual ~LteUeNetDevice (void);
   virtual void DoDispose ();
 
 
   // inherited from NetDevice
   virtual bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
-  
+
 
   Ptr<LteUeMac> GetMac (void) const;
 
-  Ptr<LteUeRrc> GetRrc () const ;
+  Ptr<LteUeRrc> GetRrc () const;
 
   Ptr<LteUePhy> GetPhy (void) const;
-  
+
   Ptr<EpcUeNas> GetNas (void) const;
 
   uint64_t GetImsi () const;
 
- 
+  /**
+   * \return the downlink carrier frequency (EARFCN)
+   *
+   * Note that real-life handset typically supports more than one EARFCN, but
+   * the sake of simplicity we assume only one EARFCN is supported.
+   */
+  uint16_t GetDlEarfcn () const;
+
+  /**
+   * \param earfcn the downlink carrier frequency (EARFCN)
+   *
+   * Note that real-life handset typically supports more than one EARFCN, but
+   * the sake of simplicity we assume only one EARFCN is supported.
+   */
+  void SetDlEarfcn (uint16_t earfcn);
+
+  /**
+   * \brief Returns the CSG ID the UE is currently a member of.
+   * \return the Closed Subscriber Group identity
+   */
+  uint32_t GetCsgId () const;
+
+  /**
+   * \brief Enlist the UE device as a member of a particular CSG.
+   * \param csgId the intended Closed Subscriber Group identity
+   *
+   * UE is associated with a single CSG identity, and thus becoming a member of
+   * this particular CSG. As a result, the UE may gain access to cells which
+   * belong to this CSG. This does not revoke the UE's access to non-CSG cells.
+   *
+   * \note This restriction only applies to initial cell selection and
+   *       EPC-enabled simulation.
+   */
+  void SetCsgId (uint32_t csgId);
+
   /**
    * \brief Set the targer eNB where the UE is registered
    * \param enb
    */
   void SetTargetEnb (Ptr<LteEnbNetDevice> enb);
-  
+
   /**
    * \brief Get the targer eNB where the UE is registered
    * \return the pointer to the enb
@@ -105,16 +127,18 @@
 
 
 private:
+  bool m_isConstructed;
 
   /**
-   * Some attributes are exported as
-   * attributes of the LteUeNetDevice from a user perspective,  but
-   * are actually used also in other modules as well (the RRC, the
-   * PHY...). This methods takes care of updating the
-   * configuration of all modules so that their copy of the attribute
-   * values is in sync with the one in the LteUeNetDevice.
+   * \brief Propagate attributes and configuration to sub-modules.
+   *
+   * Several attributes (e.g., the IMSI) are exported as the attributes of the
+   * LteUeNetDevice from a user perspective, but are actually used also in other
+   * sub-modules (the RRC, the PHY, etc.). This method takes care of updating
+   * the configuration of all these sub-modules so that their copy of attribute
+   * values are in sync with the one in the LteUeNetDevice.
    */
-  void UpdateConfig (void);
+  void UpdateConfig ();
 
   Ptr<LteEnbNetDevice> m_targetEnb;
 
@@ -124,8 +148,12 @@
   Ptr<EpcUeNas> m_nas;
 
   uint64_t m_imsi;
-  
-};
+
+  uint16_t m_dlEarfcn; /**< downlink carrier frequency */
+
+  uint32_t m_csgId;
+
+}; // end of class LteUeNetDevice
 
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/lte/model/lte-ue-phy.cc ns-3.19/src/lte/model/lte-ue-phy.cc
--- ns-3.18.1/src/lte/model/lte-ue-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-ue-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -106,8 +106,20 @@
 // LteUePhy methods
 ////////////////////////////////////////
 
+const char* g_uePhyStateName[LteUePhy::NUM_STATES] =
+{
+  "CELL_SEARCH",
+  "SYNCHRONIZED"
+};
+
+std::string ToString (LteUePhy::State s)
+{
+  return std::string (g_uePhyStateName[s]);
+}
 
-NS_OBJECT_ENSURE_REGISTERED (LteUePhy);
+
+NS_OBJECT_ENSURE_REGISTERED (LteUePhy)
+  ;
 
 
 LteUePhy::LteUePhy ()
@@ -118,10 +130,11 @@
 
 LteUePhy::LteUePhy (Ptr<LteSpectrumPhy> dlPhy, Ptr<LteSpectrumPhy> ulPhy)
   : LtePhy (dlPhy, ulPhy),
-    m_p10CqiPeriocity (MilliSeconds (1)),  // ideal behavior  
+    m_p10CqiPeriocity (MilliSeconds (1)),  // ideal behavior
     m_a30CqiPeriocity (MilliSeconds (1)),  // ideal behavior
     m_uePhySapUser (0),
     m_ueCphySapUser (0),
+    m_state (CELL_SEARCH),
     m_subframeNo (0),
     m_rsReceivedPowerUpdated (false),
     m_rsInterferencePowerUpdated (false),
@@ -134,7 +147,7 @@
   m_uePhySapProvider = new UeMemberLteUePhySapProvider (this);
   m_ueCphySapProvider = new MemberLteUeCphySapProvider<LteUePhy> (this);
   m_macChTtiDelay = UL_PUSCH_TTIS_DELAY;
-  
+
   NS_ASSERT_MSG (Simulator::Now ().GetNanoSeconds () == 0,
                  "Cannot create UE devices after simulation started");
   Simulator::ScheduleNow (&LteUePhy::SubframeIndication, this, 1, 1);
@@ -185,40 +198,40 @@
                                        &LteUePhy::GetNoiseFigure),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("TxMode1Gain",
-                  "Transmission mode 1 gain in dB",
-                  DoubleValue (0.0),
-                   MakeDoubleAccessor (&LteUePhy::SetTxMode1Gain                       ),
-                  MakeDoubleChecker<double> ())
+                   "Transmission mode 1 gain in dB",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&LteUePhy::SetTxMode1Gain),
+                   MakeDoubleChecker<double> ())
     .AddAttribute ("TxMode2Gain",
-                    "Transmission mode 2 gain in dB",
-                    DoubleValue (4.2),
-                   MakeDoubleAccessor (&LteUePhy::SetTxMode2Gain                       ),
-                    MakeDoubleChecker<double> ())
+                   "Transmission mode 2 gain in dB",
+                   DoubleValue (4.2),
+                   MakeDoubleAccessor (&LteUePhy::SetTxMode2Gain),
+                   MakeDoubleChecker<double> ())
     .AddAttribute ("TxMode3Gain",
-                    "Transmission mode 3 gain in dB",
-                    DoubleValue (-2.8),
-                   MakeDoubleAccessor (&LteUePhy::SetTxMode3Gain                       ),
-                    MakeDoubleChecker<double> ())
+                   "Transmission mode 3 gain in dB",
+                   DoubleValue (-2.8),
+                   MakeDoubleAccessor (&LteUePhy::SetTxMode3Gain),
+                   MakeDoubleChecker<double> ())
     .AddAttribute ("TxMode4Gain",
-                    "Transmission mode 4 gain in dB",
-                    DoubleValue (0.0),
-                   MakeDoubleAccessor (&LteUePhy::SetTxMode4Gain                       ),
-                    MakeDoubleChecker<double> ())
+                   "Transmission mode 4 gain in dB",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&LteUePhy::SetTxMode4Gain),
+                   MakeDoubleChecker<double> ())
     .AddAttribute ("TxMode5Gain",
-                  "Transmission mode 5 gain in dB",
-                  DoubleValue (0.0),
-                   MakeDoubleAccessor (&LteUePhy::SetTxMode5Gain                       ),
-                  MakeDoubleChecker<double> ())
+                   "Transmission mode 5 gain in dB",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&LteUePhy::SetTxMode5Gain),
+                   MakeDoubleChecker<double> ())
     .AddAttribute ("TxMode6Gain",
-                    "Transmission mode 6 gain in dB",
-                    DoubleValue (0.0),
-                   MakeDoubleAccessor (&LteUePhy::SetTxMode6Gain                       ),
-                    MakeDoubleChecker<double> ())
+                   "Transmission mode 6 gain in dB",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&LteUePhy::SetTxMode6Gain),
+                   MakeDoubleChecker<double> ())
     .AddAttribute ("TxMode7Gain",
-                  "Transmission mode 7 gain in dB",
-                  DoubleValue (0.0),
-                   MakeDoubleAccessor (&LteUePhy::SetTxMode7Gain                       ),
-                  MakeDoubleChecker<double> ())
+                   "Transmission mode 7 gain in dB",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&LteUePhy::SetTxMode7Gain),
+                   MakeDoubleChecker<double> ())
     .AddTraceSource ("ReportCurrentCellRsrpSinr",
                      "RSRP and SINR statistics.",
                      MakeTraceSourceAccessor (&LteUePhy::m_reportCurrentCellRsrpSinrTrace))
@@ -243,18 +256,21 @@
                    MakePointerAccessor (&LteUePhy::GetUlSpectrumPhy),
                    MakePointerChecker <LteSpectrumPhy> ())
     .AddAttribute ("RsrqUeMeasThreshold",
-                  "Receive threshold for PSS on RSRQ [dB]",
-                  DoubleValue (-1000.0),
-                   MakeDoubleAccessor (&LteUePhy::m_pssReceptionThreshold                    ),
-                  MakeDoubleChecker<double> ())
+                   "Receive threshold for PSS on RSRQ [dB]",
+                   DoubleValue (-1000.0),
+                   MakeDoubleAccessor (&LteUePhy::m_pssReceptionThreshold),
+                   MakeDoubleChecker<double> ())
     .AddAttribute ("UeMeasurementsFilterPeriod",
-                  "Time period for reporting UE measurements (default 200 ms.) ",
-                  TimeValue (MilliSeconds (200)),
-                  MakeTimeAccessor (&LteUePhy::m_ueMeasurementsFilterPeriod),
-                  MakeTimeChecker ())
+                   "Time period for reporting UE measurements (default 200 ms.) ",
+                   TimeValue (MilliSeconds (200)),
+                   MakeTimeAccessor (&LteUePhy::m_ueMeasurementsFilterPeriod),
+                   MakeTimeChecker ())
     .AddTraceSource ("ReportUeMeasurements",
                      "Report UE measurements RSRP (dBm) and RSRQ (dB).",
                      MakeTraceSourceAccessor (&LteUePhy::m_reportUeMeasurements))
+    .AddTraceSource ("StateTransition",
+                     "Trace fired upon every UE PHY state transition",
+                     MakeTraceSourceAccessor (&LteUePhy::m_stateTransitionTrace))
   ;
   return tid;
 }
@@ -408,34 +424,33 @@
 {
   NS_LOG_FUNCTION (this);
 
-  if ((!(m_dlConfigured && m_ulConfigured)) || (m_rnti == 0))
-    {
-      // abort method, the UE is still not registered
-      m_pssList.clear ();
-      return;
-    }
+  NS_ASSERT (m_state != CELL_SEARCH);
+  NS_ASSERT (m_cellId > 0);
 
-  // check periodic wideband CQI
-  if (Simulator::Now () > m_p10CqiLast + m_p10CqiPeriocity)
+  if (m_dlConfigured && m_ulConfigured && (m_rnti > 0))
     {
-      Ptr<LteUeNetDevice> thisDevice = GetDevice ()->GetObject<LteUeNetDevice> ();
-      Ptr<DlCqiLteControlMessage> msg = CreateDlCqiFeedbackMessage (sinr);
-      if (msg)
+      // check periodic wideband CQI
+      if (Simulator::Now () > m_p10CqiLast + m_p10CqiPeriocity)
         {
-          DoSendLteControlMessage (msg);
+          Ptr<LteUeNetDevice> thisDevice = GetDevice ()->GetObject<LteUeNetDevice> ();
+          Ptr<DlCqiLteControlMessage> msg = CreateDlCqiFeedbackMessage (sinr);
+          if (msg)
+            {
+              DoSendLteControlMessage (msg);
+            }
+          m_p10CqiLast = Simulator::Now ();
         }
-      m_p10CqiLast = Simulator::Now ();
-    }
-  // check aperiodic high-layer configured subband CQI
-  if  (Simulator::Now () > m_a30CqiLast + m_a30CqiPeriocity)
-    {
-      Ptr<LteUeNetDevice> thisDevice = GetDevice ()->GetObject<LteUeNetDevice> ();
-      Ptr<DlCqiLteControlMessage> msg = CreateDlCqiFeedbackMessage (sinr);
-      if (msg)
+      // check aperiodic high-layer configured subband CQI
+      if  (Simulator::Now () > m_a30CqiLast + m_a30CqiPeriocity)
         {
-          DoSendLteControlMessage (msg);
+          Ptr<LteUeNetDevice> thisDevice = GetDevice ()->GetObject<LteUeNetDevice> ();
+          Ptr<DlCqiLteControlMessage> msg = CreateDlCqiFeedbackMessage (sinr);
+          if (msg)
+            {
+              DoSendLteControlMessage (msg);
+            }
+          m_a30CqiLast = Simulator::Now ();
         }
-      m_a30CqiLast = Simulator::Now ();
     }
 
   // Generate PHY trace
@@ -472,20 +487,22 @@
       m_rsrpSinrSampleCounter = 0;
     }
 
-  // Generate UE Measurements for upper layers
   if (m_pssReceived)
     {
+      // measure instantaneous RSRQ now
       NS_ASSERT_MSG (m_rsInterferencePowerUpdated, " RS interference power info obsolete");
-      // PSSs received
-      NS_LOG_DEBUG (this << " Process PSS RNTI " << m_rnti << " cellId " << m_cellId << " PSS num " << m_pssList.size ());
+
       std::list <PssElement>::iterator itPss = m_pssList.begin ();
       while (itPss != m_pssList.end ())
         {
-          uint8_t rbNum = 0;
+          uint16_t rbNum = 0;
           double rsrqSum = 0.0;
-          Values::const_iterator itIntN = m_rsIntereferencePower.ConstValuesBegin ();
+
+          Values::const_iterator itIntN = m_rsInterferencePower.ConstValuesBegin ();
           Values::const_iterator itPj = m_rsReceivedPower.ConstValuesBegin ();
-          for (itPj = m_rsReceivedPower.ConstValuesBegin (); itPj != m_rsReceivedPower.ConstValuesEnd (); itIntN++, itPj++)
+          for (itPj = m_rsReceivedPower.ConstValuesBegin ();
+               itPj != m_rsReceivedPower.ConstValuesEnd ();
+               itIntN++, itPj++)
             {
               rbNum++;
               // convert PSD [W/Hz] to linear power [W] for the single RE
@@ -493,43 +510,31 @@
               double intPowerTxW = ((*itPj) * 180000.0) / 12.0;
               rsrqSum += (2 * (noisePowerTxW + intPowerTxW));
             }
+
           NS_ASSERT (rbNum == (*itPss).nRB);
-          double rsrp_dBm = 10 * log10 (1000 * ((*itPss).pssPsdSum / (double)rbNum));
           double rsrq_dB = 10 * log10 ((*itPss).pssPsdSum / rsrqSum);
 
           if (rsrq_dB > m_pssReceptionThreshold)
             {
-              // report UE Measurements to upper layers
-              NS_LOG_INFO (this << " PSS received from CellId " << (*itPss).cellId << " has RSRP " << rsrp_dBm << " and RSRQ " << rsrq_dB << " RBnum " << (uint16_t)rbNum);
+              NS_LOG_INFO (this << " PSS RNTI " << m_rnti << " cellId " << m_cellId
+                                << " has RSRQ " << rsrq_dB << " and RBnum " << rbNum);
               // store measurements
-              std::map <uint16_t, UeMeasurementsElement>::iterator itMeasMap =  m_UeMeasurementsMap.find ((*itPss).cellId);
-              if (itMeasMap == m_UeMeasurementsMap.end ())
-                {
-                  // insert new entry
-                  UeMeasurementsElement newEl;
-                  newEl.rsrpSum = rsrp_dBm;
-                  newEl.rsrpNum = 1;
-                  newEl.rsrqSum = rsrq_dB;
-                  newEl.rsrqNum = 1;
-                  m_UeMeasurementsMap.insert (std::pair <uint16_t, UeMeasurementsElement> ((*itPss).cellId, newEl));
-                }
-              else
-                {
-                  (*itMeasMap).second.rsrpSum += rsrp_dBm;
-                  (*itMeasMap).second.rsrpNum++;
-                  (*itMeasMap).second.rsrqSum += rsrq_dB;
-                  (*itMeasMap).second.rsrqNum++;
-                }
-
+              std::map <uint16_t, UeMeasurementsElement>::iterator itMeasMap;
+              itMeasMap = m_ueMeasurementsMap.find ((*itPss).cellId);
+              NS_ASSERT (itMeasMap != m_ueMeasurementsMap.end ());
+              (*itMeasMap).second.rsrqSum += rsrq_dB;
+              (*itMeasMap).second.rsrqNum++;
             }
+
           itPss++;
-        }
-        m_pssList.clear ();
-    }
 
+        } // end of while (itPss != m_pssList.end ())
 
-  
-}
+      m_pssList.clear ();
+
+    } // end of if (m_pssReceived)
+
+} // end of void LteUePhy::GenerateCtrlCqiReport (const SpectrumValue& sinr)
 
 void
 LteUePhy::GenerateDataCqiReport (const SpectrumValue& sinr)
@@ -542,7 +547,7 @@
 {
   NS_LOG_FUNCTION (this << interf);
   m_rsInterferencePowerUpdated = true;
-  m_rsIntereferencePower = interf; 
+  m_rsInterferencePower = interf;
 }
 
 void
@@ -550,7 +555,7 @@
 {
   NS_LOG_FUNCTION (this << power);
   m_rsReceivedPowerUpdated = true;
-  m_rsReceivedPower = power;  
+  m_rsReceivedPower = power;
 }
 
 
@@ -559,7 +564,7 @@
 LteUePhy::CreateDlCqiFeedbackMessage (const SpectrumValue& sinr)
 {
   NS_LOG_FUNCTION (this);
-  
+
 
   // apply transmission mode gain
   NS_ASSERT (m_transmissionMode < m_txModeGain.size ());
@@ -573,7 +578,7 @@
   if (Simulator::Now () > m_p10CqiLast + m_p10CqiPeriocity)
     {
       cqi = m_amc->CreateCqiFeedbacks (newSinr, m_dlBandwidth);
-      
+
       int nLayer = TransmissionModesLayers::TxMode2LayerNum (m_transmissionMode);
       int nbSubChannels = cqi.size ();
       double cqiSum = 0.0;
@@ -660,27 +665,41 @@
 {
   NS_LOG_FUNCTION (this << Simulator::Now ());
   NS_LOG_DEBUG (this << " Report UE Measurements ");
+
   LteUeCphySapUser::UeMeasurementsParameters ret;
+
   std::map <uint16_t, UeMeasurementsElement>::iterator it;
-  for (it = m_UeMeasurementsMap.begin (); it != m_UeMeasurementsMap.end (); it++)
+  for (it = m_ueMeasurementsMap.begin (); it != m_ueMeasurementsMap.end (); it++)
     {
       double avg_rsrp = (*it).second.rsrpSum / (double)(*it).second.rsrpNum;
       double avg_rsrq = (*it).second.rsrqSum / (double)(*it).second.rsrqNum;
-      NS_LOG_DEBUG (this << " CellId " << (*it).first << " RSRP " << avg_rsrp << " (nSamples " << (*it).second.rsrpNum << ") RSRQ " << avg_rsrq << " (nSamples " << (*it).second.rsrpNum << ")");
+      /*
+       * In CELL_SEARCH state, this may result in avg_rsrq = 0/0 = -nan.
+       * UE RRC must take this into account when receiving measurement reports.
+       * TODO remove this shortcoming by calculating RSRQ during CELL_SEARCH
+       */
+      NS_LOG_DEBUG (this << " CellId " << (*it).first
+                         << " RSRP " << avg_rsrp
+                         << " (nSamples " << (uint16_t)(*it).second.rsrpNum << ")"
+                         << " RSRQ " << avg_rsrq
+                         << " (nSamples " << (uint16_t)(*it).second.rsrqNum << ")");
+
       LteUeCphySapUser::UeMeasurementsElement newEl;
       newEl.m_cellId = (*it).first;
       newEl.m_rsrp = avg_rsrp;
       newEl.m_rsrq = avg_rsrq;
       ret.m_ueMeasurementsList.push_back (newEl);
+
       // report to UE measurements trace
-      m_reportUeMeasurements (m_rnti, m_cellId, avg_rsrp, avg_rsrq, ((*it).first == m_cellId ? 1 : 0));
+      m_reportUeMeasurements (m_rnti, (*it).first, avg_rsrp, avg_rsrq, ((*it).first == m_cellId ? 1 : 0));
     }
-  m_ueCphySapUser-> ReportUeMeasurements(ret);
-  m_UeMeasurementsMap.clear ();
-  Simulator::Schedule (m_ueMeasurementsFilterPeriod, &LteUePhy::ReportUeMeasurements, this);
-}
 
+  // report to RRC
+  m_ueCphySapUser->ReportUeMeasurements (ret);
 
+  m_ueMeasurementsMap.clear ();
+  Simulator::Schedule (m_ueMeasurementsFilterPeriod, &LteUePhy::ReportUeMeasurements, this);
+}
 
 void
 LteUePhy::DoSendLteControlMessage (Ptr<LteControlMessage> msg)
@@ -708,7 +727,7 @@
 LteUePhy::ReceiveLteControlMessageList (std::list<Ptr<LteControlMessage> > msgList)
 {
   NS_LOG_FUNCTION (this);
-  
+
   std::list<Ptr<LteControlMessage> >::iterator it;
   for (it = msgList.begin (); it != msgList.end(); it++)
   {
@@ -760,7 +779,7 @@
     }
     else if (msg->GetMessageType () == LteControlMessage::UL_DCI) 
     {
-      // set the uplink bandwidht according to the UL-CQI
+      // set the uplink bandwidth according to the UL-CQI
       Ptr<UlDciLteControlMessage> msg2 = DynamicCast<UlDciLteControlMessage> (msg);
       UlDciListElement_s dci = msg2->GetDci ();
       if (dci.m_rnti != m_rnti)
@@ -828,8 +847,16 @@
     else if (msg->GetMessageType () == LteControlMessage::MIB) 
       {
         NS_LOG_INFO ("received MIB");
+        NS_ASSERT (m_cellId > 0);
         Ptr<MibLteControlMessage> msg2 = DynamicCast<MibLteControlMessage> (msg);
-        m_ueCphySapUser->RecvMasterInformationBlock (msg2->GetMib ());
+        m_ueCphySapUser->RecvMasterInformationBlock (m_cellId, msg2->GetMib ());
+      }
+    else if (msg->GetMessageType () == LteControlMessage::SIB1)
+      {
+        NS_LOG_INFO ("received SIB1");
+        NS_ASSERT (m_cellId > 0);
+        Ptr<Sib1LteControlMessage> msg2 = DynamicCast<Sib1LteControlMessage> (msg);
+        m_ueCphySapUser->RecvSystemInformationBlockType1 (m_cellId, msg2->GetSib1 ());
       }
     else
     {
@@ -847,14 +874,7 @@
 LteUePhy::ReceivePss (uint16_t cellId, Ptr<SpectrumValue> p)
 {
   NS_LOG_FUNCTION (this << cellId << (*p));
-  if (!m_dlConfigured)
-    {
-      // LteUePhy not yet configured -> skip measurement
-      return;
-    }
-  m_pssReceived = true;
-  PssElement el;
-  el.cellId = cellId;
+
   double sum = 0.0;
   uint16_t nRB = 0;
   Values::const_iterator itPi;
@@ -865,10 +885,43 @@
       sum += powerTxW;
       nRB++;
     }
+
+  // measure instantaneous RSRP now
+  double rsrp_dBm = 10 * log10 (1000 * (sum / (double)nRB));
+  NS_LOG_INFO (this << " PSS RNTI " << m_rnti << " cellId " << m_cellId
+                    << " has RSRP " << rsrp_dBm << " and RBnum " << nRB);
+  // note that m_pssReceptionThreshold does not apply here
+
+  // store measurements
+  std::map <uint16_t, UeMeasurementsElement>::iterator itMeasMap = m_ueMeasurementsMap.find (cellId);
+  if (itMeasMap == m_ueMeasurementsMap.end ())
+    {
+      // insert new entry
+      UeMeasurementsElement newEl;
+      newEl.rsrpSum = rsrp_dBm;
+      newEl.rsrpNum = 1;
+      newEl.rsrqSum = 0;
+      newEl.rsrqNum = 0;
+      m_ueMeasurementsMap.insert (std::pair <uint16_t, UeMeasurementsElement> (cellId, newEl));
+    }
+  else
+    {
+      (*itMeasMap).second.rsrpSum += rsrp_dBm;
+      (*itMeasMap).second.rsrpNum++;
+    }
+
+  /*
+   * Collect the PSS for later processing in GenerateCtrlCqiReport()
+   * (to be called from ChunkProcessor after RX is finished).
+   */
+  m_pssReceived = true;
+  PssElement el;
+  el.cellId = cellId;
   el.pssPsdSum = sum;
   el.nRB = nRB;
   m_pssList.push_back (el);
-}
+
+} // end of void LteUePhy::ReceivePss (uint16_t cellId, Ptr<SpectrumValue> p)
 
 
 void
@@ -884,17 +937,17 @@
   NS_LOG_FUNCTION (this << frameNo << subframeNo);
 
   NS_ASSERT_MSG (frameNo > 0, "the SRS index check code assumes that frameNo starts at 1");
-  
+
   // refresh internal variables
   m_rsReceivedPowerUpdated = false;
   m_rsInterferencePowerUpdated = false;
   m_pssReceived = false;
-  
+
   if (m_ulConfigured)
     {
       // update uplink transmission mask according to previous UL-CQIs
       SetSubChannelsForTransmission (m_subChannelsForTransmissionQueue.at (0));
-   
+
       // shift the queue
       for (uint8_t i = 1; i < m_macChTtiDelay; i++)
         {
@@ -926,7 +979,7 @@
         }
       else
         {
-      // send only PUCCH (ideal: fake null bandwidth signal)
+          // send only PUCCH (ideal: fake null bandwidth signal)
           if (ctrlMsg.size ()>0)
             {
               NS_LOG_LOGIC (this << " UE - start TX PUCCH (NO PUSCH)");
@@ -953,9 +1006,10 @@
     }
   
   // schedule next subframe indication
-  Simulator::Schedule (Seconds (GetTti ()), &LteUePhy::SubframeIndication, this, frameNo, subframeNo);  
+  Simulator::Schedule (Seconds (GetTti ()), &LteUePhy::SubframeIndication, this, frameNo, subframeNo);
 }
-  
+
+
 void
 LteUePhy::SendSrs ()
 {
@@ -976,7 +1030,7 @@
 LteUePhy::DoReset ()
 {
   NS_LOG_FUNCTION (this);
-  
+
   m_rnti = 0;
   m_transmissionMode = 0;
   m_srsPeriodicity = 0;
@@ -1005,25 +1059,47 @@
   m_sendSrsEvent.Cancel ();
   m_downlinkSpectrumPhy->Reset ();
   m_uplinkSpectrumPhy->Reset ();
+
+} // end of void LteUePhy::DoReset ()
+
+void
+LteUePhy::DoStartCellSearch (uint16_t dlEarfcn)
+{
+  NS_LOG_FUNCTION (this << dlEarfcn);
+  m_dlEarfcn = dlEarfcn;
+  DoSetDlBandwidth (6); // configure DL for receiving PSS
+  SwitchToState (CELL_SEARCH);
 }
 
 void
-LteUePhy::DoSyncronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn)
+LteUePhy::DoSynchronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn)
+{
+  NS_LOG_FUNCTION (this << cellId << dlEarfcn);
+  m_dlEarfcn = dlEarfcn;
+  DoSynchronizeWithEnb (cellId);
+}
+
+void
+LteUePhy::DoSynchronizeWithEnb (uint16_t cellId)
 {
   NS_LOG_FUNCTION (this << cellId);
+
+  if (cellId == 0)
+    {
+      NS_FATAL_ERROR ("Cell ID shall not be zero");
+    }
+
   m_cellId = cellId;
-  m_dlEarfcn = dlEarfcn;
   m_downlinkSpectrumPhy->SetCellId (cellId);
   m_uplinkSpectrumPhy->SetCellId (cellId);
 
-  // configure DL for receing the BCH with the minimum bandwith
-  m_dlBandwidth = 6;
-  Ptr<SpectrumValue> noisePsd = LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (m_dlEarfcn, m_dlBandwidth, m_noiseFigure);
-  m_downlinkSpectrumPhy->SetNoisePowerSpectralDensity (noisePsd);
-  m_downlinkSpectrumPhy->GetChannel ()->AddRx (m_downlinkSpectrumPhy);  
-  
+  // configure DL for receiving the BCH with the minimum bandwidth
+  DoSetDlBandwidth (6);
+
   m_dlConfigured = false;
   m_ulConfigured = false;
+
+  SwitchToState (SYNCHRONIZED);
 }
 
 void
@@ -1048,10 +1124,10 @@
               break;
             }
         }
-  
+
       Ptr<SpectrumValue> noisePsd = LteSpectrumValueHelper::CreateNoisePowerSpectralDensity (m_dlEarfcn, m_dlBandwidth, m_noiseFigure);
       m_downlinkSpectrumPhy->SetNoisePowerSpectralDensity (noisePsd);
-      m_downlinkSpectrumPhy->GetChannel ()->AddRx (m_downlinkSpectrumPhy);  
+      m_downlinkSpectrumPhy->GetChannel ()->AddRx (m_downlinkSpectrumPhy);
     }
   m_dlConfigured = true;
 }
@@ -1186,4 +1262,25 @@
 }
 
 
+LteUePhy::State
+LteUePhy::GetState () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_state;
+}
+
+
+void
+LteUePhy::SwitchToState (State newState)
+{
+  NS_LOG_FUNCTION (this << newState);
+  State oldState = m_state;
+  m_state = newState;
+  NS_LOG_INFO (this << " cellId=" << m_cellId << " rnti=" << m_rnti
+                    << " UePhy " << ToString (oldState)
+                    << " --> " << ToString (newState));
+  m_stateTransitionTrace (m_cellId, m_rnti, oldState, newState);
+}
+
+
 } // namespace ns3
diff -Naur ns-3.18.1/src/lte/model/lte-ue-phy.h ns-3.19/src/lte/model/lte-ue-phy.h
--- ns-3.18.1/src/lte/model/lte-ue-phy.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-ue-phy.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,7 @@
 #include <ns3/lte-ue-cphy-sap.h>
 #include <ns3/ptr.h>
 #include <ns3/lte-amc.h>
+#include <set>
 
 
 namespace ns3 {
@@ -54,6 +55,16 @@
 
 public:
   /**
+   * \brief The states of the UE PHY entity
+   */
+  enum State
+  {
+    CELL_SEARCH = 0,
+    SYNCHRONIZED,
+    NUM_STATES
+  };
+
+  /**
    * @warning the default constructor should not be used
    */
   LteUePhy ();
@@ -98,7 +109,7 @@
 
 
   /**
-   * \param pw the transmission power in dBm
+   * \param pow the transmission power in dBm
    */
   void SetTxPower (double pow);
 
@@ -107,9 +118,9 @@
    */
   double GetTxPower () const;
   /**
-   * \param pw the noise figure in dB
+   * \param nf the noise figure in dB
    */
-  void SetNoiseFigure (double pow);
+  void SetNoiseFigure (double nf);
 
   /**
    * \return the noise figure in dB
@@ -131,7 +142,6 @@
    */
   Ptr<LteSpectrumPhy> GetUlSpectrumPhy () const;
 
-
   /**
    * \brief Create the PSD for the TX
    * \return the pointer to the PSD
@@ -160,11 +170,11 @@
    */
   std::vector <int> GetSubChannelsForReception (void);
 
-
   /**
   * \brief Create the DL CQI feedback from SINR values perceived at
   * the physical layer with the signal received from eNB
   * \param sinr SINR values vector
+  * \return a DL CQI control message containing the CQI feedback
   */
   Ptr<DlCqiLteControlMessage> CreateDlCqiFeedbackMessage (const SpectrumValue& sinr);
 
@@ -179,8 +189,6 @@
   // callbacks for LteSpectrumPhy
   virtual void ReceiveLteControlMessageList (std::list<Ptr<LteControlMessage> >);
   virtual void ReceivePss (uint16_t cellId, Ptr<SpectrumValue> p);
-  
-  
 
 
 
@@ -200,25 +208,29 @@
 
 
   /**
-  * \brief Send the SRS signal in the last symbols of the frame
-  */
+   * \brief Send the SRS signal in the last symbols of the frame
+   */
   void SendSrs ();
-  
-    /**
-  * \brief PhySpectrum generated a new DL HARQ feedback
-  */
+
+  /**
+   * \brief PhySpectrum generated a new DL HARQ feedback
+   */
   virtual void ReceiveLteDlHarqFeedback (DlInfoListElement_s mes);
 
   /**
-  * \brief Set the HARQ PHY module
-  */
+   * \brief Set the HARQ PHY module
+   */
   void SetHarqPhyModule (Ptr<LteHarqPhy> harq);
 
+  /**
+   * \return The current state
+   */
+  State GetState () const;
 
 
 
 private:
-  
+
   void SetTxMode1Gain (double gain);
   void SetTxMode2Gain (double gain);
   void SetTxMode3Gain (double gain);
@@ -230,11 +242,22 @@
 
   void QueueSubChannelsForTransmission (std::vector <int> rbMap);
 
+  /**
+   * \brief Layer-1 filtering of RSRP and RSRQ measurements and reporting to
+   *        the RRC entity.
+   *
+   * Initially executed at +0.200s, and then repeatedly executed with
+   * periodicity as indicated by the *UeMeasurementsFilterPeriod* attribute.
+   */
   void ReportUeMeasurements ();
 
+  void SwitchToState (State s);
+
   // UE CPHY SAP methods
-  void DoReset ();  
-  void DoSyncronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn);  
+  void DoReset ();
+  void DoStartCellSearch (uint16_t dlEarfcn);
+  void DoSynchronizeWithEnb (uint16_t cellId);
+  void DoSynchronizeWithEnb (uint16_t cellId, uint16_t dlEarfcn);
   void DoSetDlBandwidth (uint8_t ulBandwidth);
   void DoConfigureUplink (uint16_t ulEarfcn, uint8_t ulBandwidth);
   void DoSetRnti (uint16_t rnti);
@@ -242,16 +265,16 @@
   void DoSetSrsConfigurationIndex (uint16_t srcCi);
 
   // UE PHY SAP methods 
-  virtual void DoSendMacPdu (Ptr<Packet> p);  
+  virtual void DoSendMacPdu (Ptr<Packet> p);
   virtual void DoSendLteControlMessage (Ptr<LteControlMessage> msg);
   virtual void DoSendRachPreamble (uint32_t prachId, uint32_t raRnti);
-  
+
   std::vector <int> m_subChannelsForTransmission;
   std::vector <int> m_subChannelsForReception;
-  
+
   std::vector< std::vector <int> > m_subChannelsForTransmissionQueue;
-  
-  
+
+
   Ptr<LteAmc> m_amc;
 
   Time m_p10CqiPeriocity; /**< Wideband Periodic CQI: 2, 5, 10, 16, 20, 32, 40, 64, 80 or 160 ms */
@@ -272,7 +295,7 @@
  
   uint8_t m_transmissionMode;
   std::vector <double> m_txModeGain;
-  
+
   uint16_t m_srsPeriodicity;
   uint16_t m_srsSubframeOffset;
   uint16_t m_srsConfigured;
@@ -281,34 +304,38 @@
   bool m_dlConfigured;
   bool m_ulConfigured;
 
+  State m_state;
+  //             cellid    rnti
+  TracedCallback<uint16_t, uint16_t, State, State> m_stateTransitionTrace;
+
   uint8_t m_subframeNo;
 
   bool m_rsReceivedPowerUpdated;
   SpectrumValue m_rsReceivedPower;
 
   bool m_rsInterferencePowerUpdated;
-  SpectrumValue m_rsIntereferencePower;
+  SpectrumValue m_rsInterferencePower;
 
   bool m_pssReceived;
   struct PssElement
-    {
-      uint16_t cellId;
-      double pssPsdSum;
-      uint16_t nRB;
-    };
+  {
+    uint16_t cellId;
+    double pssPsdSum;
+    uint16_t nRB;
+  };
   std::list <PssElement> m_pssList;
 
   double m_pssReceptionThreshold; // on RSRQ [W]
 
   struct UeMeasurementsElement
-    {
-      double rsrpSum;
-      uint8_t rsrpNum;
-      double rsrqSum;
-      uint8_t rsrqNum;
-    };
+  {
+    double rsrpSum;
+    uint8_t rsrpNum;
+    double rsrqSum;
+    uint8_t rsrqNum;
+  };
 
-  std::map <uint16_t, UeMeasurementsElement> m_UeMeasurementsMap;
+  std::map <uint16_t, UeMeasurementsElement> m_ueMeasurementsMap;
   Time m_ueMeasurementsFilterPeriod;
   Time m_ueMeasurementsFilterLast;
 
@@ -327,7 +354,7 @@
 
   /**
    * Trace information regarding RSRP and RSRQ (see TS 36.214)
-   * uint16_t rnti, uint16_t cellId, double rsrp, double sinr, bool servingCell
+   * uint16_t rnti, uint16_t cellId, double rsrpDbm, double rsrqDb, bool isServingCell
    */
   TracedCallback<uint16_t, uint16_t, double, double, bool> m_reportUeMeasurements;
 
diff -Naur ns-3.18.1/src/lte/model/lte-ue-rrc.cc ns-3.19/src/lte/model/lte-ue-rrc.cc
--- ns-3.18.1/src/lte/model/lte-ue-rrc.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-ue-rrc.cc	2013-12-20 09:44:50.000000000 -0800
@@ -16,27 +16,23 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Nicola Baldo <nbaldo@cttc.es>
+ *         Budiarto Herman <budiarto.herman@magister.fi>
  */
 
+#include "lte-ue-rrc.h"
+
 #include <ns3/fatal-error.h>
 #include <ns3/log.h>
 #include <ns3/object-map.h>
 #include <ns3/object-factory.h>
-#include <ns3/node-list.h>
-#include <ns3/node.h>
 #include <ns3/simulator.h>
 
-#include "lte-ue-rrc.h"
-#include "lte-enb-rrc.h"
-#include "lte-rlc.h"
-#include "lte-rlc-tm.h"
-#include "lte-rlc-um.h"
-#include "lte-rlc-am.h"
-#include "lte-pdcp.h"
-#include "lte-pdcp-sap.h"
-#include "lte-radio-bearer-info.h"
-#include "lte-as-sap.h"
-#include "lte-enb-net-device.h"
+#include <ns3/lte-rlc.h>
+#include <ns3/lte-rlc-tm.h>
+#include <ns3/lte-rlc-um.h>
+#include <ns3/lte-rlc-am.h>
+#include <ns3/lte-pdcp.h>
+#include <ns3/lte-radio-bearer-info.h>
 
 #include <cmath>
 
@@ -45,7 +41,6 @@
 namespace ns3 {
 
 
-
 /////////////////////////////
 // CMAC SAP forwarder
 /////////////////////////////
@@ -58,7 +53,7 @@
   virtual void SetTemporaryCellRnti (uint16_t rnti);
   virtual void NotifyRandomAccessSuccessful ();
   virtual void NotifyRandomAccessFailed ();
-  
+
 private:
   LteUeRrc* m_rrc;
 };
@@ -94,16 +89,21 @@
 
 
 const char* g_ueRrcStateName[LteUeRrc::NUM_STATES] = 
-  {
-    "IDLE_CELL_SELECTION",
-    "IDLE_WAIT_SYSTEM_INFO",
-    "IDLE_CAMPED_NORMALLY",
-    "IDLE_RANDOM_ACCESS",
-    "IDLE_CONNECTING",
-    "CONNECTED_NORMALLY",
-    "CONNECTED_REESTABLISHING",
-    "CONNECTED_HANDOVER"
-  };
+{
+  "IDLE_START",
+  "IDLE_CELL_SEARCH",
+  "IDLE_WAIT_MIB_SIB1",
+  "IDLE_WAIT_MIB",
+  "IDLE_WAIT_SIB1",
+  "IDLE_CAMPED_NORMALLY",
+  "IDLE_WAIT_SIB2",
+  "IDLE_RANDOM_ACCESS",
+  "IDLE_CONNECTING",
+  "CONNECTED_NORMALLY",
+  "CONNECTED_HANDOVER",
+  "CONNECTED_PHY_PROBLEM",
+  "CONNECTED_REESTABLISHING"
+};
 
 std::string ToString (LteUeRrc::State s)
 {
@@ -115,7 +115,8 @@
 // ue RRC methods
 /////////////////////////////
 
-NS_OBJECT_ENSURE_REGISTERED (LteUeRrc);
+NS_OBJECT_ENSURE_REGISTERED (LteUeRrc)
+  ;
 
 
 LteUeRrc::LteUeRrc ()
@@ -124,15 +125,16 @@
     m_rrcSapUser (0),
     m_macSapProvider (0),
     m_asSapUser (0),
-    m_state (IDLE_CELL_SELECTION),
+    m_state (IDLE_START),
     m_imsi (0),
     m_rnti (0),
     m_cellId (0),
     m_useRlcSm (true),
-    m_connectionPending (0),
-    m_receivedMib (0),
-    m_receivedSib2 (0)
-
+    m_connectionPending (false),
+    m_hasReceivedMib (false),
+    m_hasReceivedSib1 (false),
+    m_hasReceivedSib2 (false),
+    m_csgWhiteList (0)
 {
   NS_LOG_FUNCTION (this);
   m_cphySapUser = new MemberLteUeCphySapUser<LteUeRrc> (this);
@@ -188,12 +190,30 @@
                    UintegerValue (0), // unused, read-only attribute
                    MakeUintegerAccessor (&LteUeRrc::GetRnti),
                    MakeUintegerChecker<uint16_t> ())
+    .AddTraceSource ("MibReceived",
+                     "trace fired upon reception of Master Information Block",
+                     MakeTraceSourceAccessor (&LteUeRrc::m_mibReceivedTrace))
+    .AddTraceSource ("Sib1Received",
+                     "trace fired upon reception of System Information Block Type 1",
+                     MakeTraceSourceAccessor (&LteUeRrc::m_sib1ReceivedTrace))
+    .AddTraceSource ("Sib2Received",
+                     "trace fired upon reception of System Information Block Type 2",
+                     MakeTraceSourceAccessor (&LteUeRrc::m_sib2ReceivedTrace))
     .AddTraceSource ("StateTransition",
                      "trace fired upon every UE RRC state transition",
                      MakeTraceSourceAccessor (&LteUeRrc::m_stateTransitionTrace))
+    .AddTraceSource ("InitialCellSelectionEndOk",
+                     "trace fired upon successful initial cell selection procedure",
+                     MakeTraceSourceAccessor (&LteUeRrc::m_initialCellSelectionEndOkTrace))
+    .AddTraceSource ("InitialCellSelectionEndError",
+                     "trace fired upon failed initial cell selection procedure",
+                     MakeTraceSourceAccessor (&LteUeRrc::m_initialCellSelectionEndErrorTrace))
     .AddTraceSource ("RandomAccessSuccessful",
                      "trace fired upon successful completion of the random access procedure",
                      MakeTraceSourceAccessor (&LteUeRrc::m_randomAccessSuccessfulTrace))
+    .AddTraceSource ("RandomAccessError",
+                     "trace fired upon failure of the random access procedure",
+                     MakeTraceSourceAccessor (&LteUeRrc::m_randomAccessErrorTrace))
     .AddTraceSource ("ConnectionEstablished",
                      "trace fired upon successful RRC connection establishment",
                      MakeTraceSourceAccessor (&LteUeRrc::m_connectionEstablishedTrace))
@@ -206,7 +226,10 @@
     .AddTraceSource ("HandoverEndOk",
                      "trace fired upon successful termination of a handover procedure",
                      MakeTraceSourceAccessor (&LteUeRrc::m_handoverEndOkTrace))
-    ;
+    .AddTraceSource ("HandoverEndError",
+                     "trace fired upon failure of a handover procedure",
+                     MakeTraceSourceAccessor (&LteUeRrc::m_handoverEndErrorTrace))
+  ;
   return tid;
 }
 
@@ -280,7 +303,7 @@
 }
 
 uint64_t
-LteUeRrc::GetImsi (void)
+LteUeRrc::GetImsi (void) const
 {
   return m_imsi;
 }
@@ -314,7 +337,7 @@
   return m_dlBandwidth;
 }
 
-uint16_t 
+uint16_t
 LteUeRrc::GetDlEarfcn () const
 {
   return m_dlEarfcn;
@@ -327,9 +350,8 @@
   return m_ulEarfcn;
 }
 
-
 LteUeRrc::State
-LteUeRrc::GetState (void)
+LteUeRrc::GetState (void) const
 {
   NS_LOG_FUNCTION (this);
   return m_state;
@@ -356,7 +378,7 @@
   rlc->SetRnti (m_rnti);
   rlc->SetLcId (lcid);
 
-  m_srb0 = CreateObject<LteSignalingRadioBearerInfo> ();  
+  m_srb0 = CreateObject<LteSignalingRadioBearerInfo> ();
   m_srb0->m_rlc = rlc;
   m_srb0->m_srbIdentity = 0;
   LteUeRrcSapUser::SetupParameters ueParams;
@@ -372,7 +394,7 @@
   lcConfig.logicalChannelGroup = 0; // all SRBs mapped to LCG 0
 
   m_cmacSapProvider->AddLc (lcid, lcConfig, rlc->GetLteMacSapUser ());
-    
+
 }
 
 
@@ -381,7 +403,6 @@
 {
   NS_LOG_FUNCTION (this << packet);
 
-
   uint8_t drbid = Bid2Drbid (bid);
 
   std::map<uint8_t, Ptr<LteDataRadioBearerInfo> >::iterator it =   m_drbMap.find (drbid);
@@ -391,35 +412,44 @@
   params.pdcpSdu = packet;
   params.rnti = m_rnti;
   params.lcid = it->second->m_logicalChannelIdentity;
-  
-  NS_LOG_LOGIC (this << " RNTI=" << m_rnti << " sending " << packet << "on DRBID " << (uint32_t) drbid << " (LCID" << params.lcid << ")" << " (" << packet->GetSize () << " bytes)");
-  it->second->m_pdcp->GetLtePdcpSapProvider ()->TransmitPdcpSdu (params);  
+
+  NS_LOG_LOGIC (this << " RNTI=" << m_rnti << " sending packet " << packet
+                     << " on DRBID " << (uint32_t) drbid
+                     << " (LCID " << (uint32_t) params.lcid << ")"
+                     << " (" << packet->GetSize () << " bytes)");
+  it->second->m_pdcp->GetLtePdcpSapProvider ()->TransmitPdcpSdu (params);
 }
 
+
 void
 LteUeRrc::DoDisconnect ()
 {
   NS_LOG_FUNCTION (this);
 
   switch (m_state)
-    {      
-    case IDLE_CELL_SELECTION:
+    {
+    case IDLE_START:
+    case IDLE_CELL_SEARCH:
+    case IDLE_WAIT_MIB_SIB1:
+    case IDLE_WAIT_MIB:
+    case IDLE_WAIT_SIB1:
     case IDLE_CAMPED_NORMALLY:
       NS_LOG_INFO ("already disconnected");
       break;
 
+    case IDLE_WAIT_SIB2:
     case IDLE_CONNECTING:
-      NS_LOG_INFO ("aborting connection setup procedure");
-      SwitchToState (IDLE_CAMPED_NORMALLY);
+      NS_FATAL_ERROR ("cannot abort connection setup procedure");
       break;
-      
+
     case CONNECTED_NORMALLY:
-    case CONNECTED_REESTABLISHING:
     case CONNECTED_HANDOVER:
+    case CONNECTED_PHY_PROBLEM:
+    case CONNECTED_REESTABLISHING:
       LeaveConnectedMode ();
       break;
-      
-    default:
+
+    default: // i.e. IDLE_RANDOM_ACCESS
       NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state));
       break;
     }
@@ -446,10 +476,11 @@
 LteUeRrc::DoNotifyRandomAccessSuccessful ()
 {
   NS_LOG_FUNCTION (this << m_imsi << ToString (m_state));
-  m_randomAccessSuccessfulTrace (m_imsi, m_cellId, m_rnti);  
+  m_randomAccessSuccessfulTrace (m_imsi, m_cellId, m_rnti);
+
   switch (m_state)
     {
-    case IDLE_RANDOM_ACCESS:     
+    case IDLE_RANDOM_ACCESS:
       {
         // we just received a RAR with a T-C-RNTI and an UL grant
         // send RRC connection request as message 3 of the random access procedure 
@@ -459,342 +490,269 @@
         m_rrcSapUser->SendRrcConnectionRequest (msg); 
       }
       break;
-      
-    case CONNECTED_HANDOVER:     
+
+    case CONNECTED_HANDOVER:
       {
         LteRrcSap::RrcConnectionReconfigurationCompleted msg;
         msg.rrcTransactionIdentifier = m_lastRrcTransactionIdentifier;
         m_rrcSapUser->SendRrcConnectionReconfigurationCompleted (msg);
+
+        // 3GPP TS 36.331 section 5.5.6.1 Measurements related actions upon handover
+        std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt;
+        for (measIdIt = m_varMeasConfig.measIdList.begin ();
+             measIdIt != m_varMeasConfig.measIdList.end ();
+             ++measIdIt)
+          {
+            VarMeasReportListClear (measIdIt->second.measId);
+          }
+
         SwitchToState (CONNECTED_NORMALLY);
         m_handoverEndOkTrace (m_imsi, m_cellId, m_rnti);
       }
       break;
-          
+
     default:
       NS_FATAL_ERROR ("unexpected event in state " << ToString (m_state));
       break; 
-    } 
+    }
 }
 
 void
 LteUeRrc::DoNotifyRandomAccessFailed ()
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << m_imsi << ToString (m_state));
+  m_randomAccessErrorTrace (m_imsi, m_cellId, m_rnti);
+
+  switch (m_state)
+    {
+    case IDLE_RANDOM_ACCESS:
+      {
+        SwitchToState (IDLE_CAMPED_NORMALLY);
+        m_asSapUser->NotifyConnectionFailed ();
+      }
+      break;
+
+    case CONNECTED_HANDOVER:
+      {
+        m_handoverEndErrorTrace (m_imsi, m_cellId, m_rnti);
+        /**
+         * \todo After a handover failure because of a random access failure,
+         *       send an RRC Connection Re-establishment and switch to
+         *       CONNECTED_REESTABLISHING state.
+         */
+      }
+      break;
+
+    default:
+      NS_FATAL_ERROR ("unexpected event in state " << ToString (m_state));
+      break;
+    }
 }
 
 
+void
+LteUeRrc::DoSetCsgWhiteList (uint32_t csgId)
+{
+  NS_LOG_FUNCTION (this << m_imsi << csgId);
+  m_csgWhiteList = csgId;
+}
+
 void 
-LteUeRrc::DoForceCampedOnEnb (uint16_t cellId, uint16_t earfcn)
+LteUeRrc::DoStartCellSelection (uint16_t dlEarfcn)
 {
-  NS_LOG_FUNCTION (this << cellId << earfcn);
-    
-  m_cellId = cellId;
-  m_dlEarfcn = earfcn;
-  m_cphySapProvider->SyncronizeWithEnb (m_cellId, m_dlEarfcn); 
-  SwitchToState (IDLE_WAIT_SYSTEM_INFO);
+  NS_LOG_FUNCTION (this << m_imsi << dlEarfcn);
+  NS_ASSERT_MSG (m_state == IDLE_START,
+                 "cannot start cell selection from state " << ToString (m_state));
+  m_dlEarfcn = dlEarfcn;
+  m_cphySapProvider->StartCellSearch (dlEarfcn);
+  SwitchToState (IDLE_CELL_SEARCH);
 }
 
 void 
+LteUeRrc::DoForceCampedOnEnb (uint16_t cellId, uint16_t dlEarfcn)
+{
+  NS_LOG_FUNCTION (this << m_imsi << cellId << dlEarfcn);
+
+  switch (m_state)
+    {
+    case IDLE_START:
+      m_cellId = cellId;
+      m_dlEarfcn = dlEarfcn;
+      m_cphySapProvider->SynchronizeWithEnb (m_cellId, m_dlEarfcn);
+      SwitchToState (IDLE_WAIT_MIB);
+      break;
+
+    case IDLE_CELL_SEARCH:
+    case IDLE_WAIT_MIB_SIB1:
+    case IDLE_WAIT_SIB1:
+      NS_FATAL_ERROR ("cannot abort cell selection " << ToString (m_state));
+      break;
+
+    case IDLE_WAIT_MIB:
+      NS_LOG_INFO ("already forced to camp to cell " << m_cellId);
+      break;
+
+    case IDLE_CAMPED_NORMALLY:
+    case IDLE_WAIT_SIB2:
+    case IDLE_RANDOM_ACCESS:
+    case IDLE_CONNECTING:
+      NS_LOG_INFO ("already camped to cell " << m_cellId);
+      break;
+
+    case CONNECTED_NORMALLY:
+    case CONNECTED_HANDOVER:
+    case CONNECTED_PHY_PROBLEM:
+    case CONNECTED_REESTABLISHING:
+      NS_LOG_INFO ("already connected to cell " << m_cellId);
+      break;
+
+    default:
+      NS_FATAL_ERROR ("unexpected event in state " << ToString (m_state));
+      break;
+    }
+
+}
+
+void
 LteUeRrc::DoConnect ()
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << m_imsi);
+
   switch (m_state)
     {
-    case IDLE_CELL_SELECTION:
-    case IDLE_WAIT_SYSTEM_INFO:
+    case IDLE_START:
+    case IDLE_CELL_SEARCH:
+    case IDLE_WAIT_MIB_SIB1:
+    case IDLE_WAIT_SIB1:
+    case IDLE_WAIT_MIB:
       m_connectionPending = true;
       break;
 
-    case IDLE_CAMPED_NORMALLY:     
-      StartConnection ();
+    case IDLE_CAMPED_NORMALLY:
+      m_connectionPending = true;
+      SwitchToState (IDLE_WAIT_SIB2);
       break;
 
+    case IDLE_WAIT_SIB2:
     case IDLE_RANDOM_ACCESS:
     case IDLE_CONNECTING:
-      NS_LOG_WARN ("already connecting (state " << ToString (m_state) << ")");      
+      NS_LOG_INFO ("already connecting");
       break;
 
     case CONNECTED_NORMALLY:
     case CONNECTED_REESTABLISHING:
     case CONNECTED_HANDOVER:
-      NS_LOG_WARN ("already connected (state " << ToString (m_state) << ")");      
-      break;  
-      
+      NS_LOG_INFO ("already connected");
+      break;
+
     default:
-      NS_FATAL_ERROR ("cannot connect while in state " << ToString (m_state));
+      NS_FATAL_ERROR ("unexpected event in state " << ToString (m_state));
       break;
     }
-
-
 }
 
 
 
 // CPHY SAP methods
 
-void 
-LteUeRrc::DoRecvMasterInformationBlock (LteRrcSap::MasterInformationBlock msg)  
+void
+LteUeRrc::DoRecvMasterInformationBlock (uint16_t cellId,
+                                        LteRrcSap::MasterInformationBlock msg)
 { 
-  NS_LOG_FUNCTION (this);
   m_dlBandwidth = msg.dlBandwidth;
   m_cphySapProvider->SetDlBandwidth (msg.dlBandwidth);
-  m_receivedMib = true;
-  if (m_state == IDLE_WAIT_SYSTEM_INFO && m_receivedMib && m_receivedSib2)
+  m_hasReceivedMib = true;
+  m_mibReceivedTrace (m_imsi, m_cellId, m_rnti, cellId);
+
+  switch (m_state)
     {
+    case IDLE_WAIT_MIB:
+      // manual attachment
       SwitchToState (IDLE_CAMPED_NORMALLY);
+      break;
+
+    case IDLE_WAIT_MIB_SIB1:
+      // automatic attachment from Idle mode cell selection
+      SwitchToState (IDLE_WAIT_SIB1);
+      break;
+
+    default:
+      // do nothing extra
+      break;
     }
 }
 
 void
-LteUeRrc::DoReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params)
+LteUeRrc::DoRecvSystemInformationBlockType1 (uint16_t cellId,
+                                             LteRrcSap::SystemInformationBlockType1 msg)
 {
-  NS_LOG_FUNCTION (this);
-
-  for (std::vector <LteUeCphySapUser::UeMeasurementsElement>::iterator newMeasIt = params.m_ueMeasurementsList.begin (); newMeasIt != params.m_ueMeasurementsList.end (); ++newMeasIt)
-    {      
-      NS_LOG_LOGIC (this << " CellId " << newMeasIt->m_cellId << " RSRP " << newMeasIt->m_rsrp << " RSRQ " << newMeasIt->m_rsrq);    
-      
-      //  3GPP TS 36.331 section 5.5.3.2 Layer 3 filtering
-      std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.find (newMeasIt->m_cellId);
-      if (storedMeasIt == m_storedMeasValues.end ())
-        {
-          // first value is unfiltered
-          MeasValues v;
-          v.rsrp = newMeasIt->m_rsrp;
-          v.rsrq = newMeasIt->m_rsrq;
-          std::pair<uint16_t, MeasValues> val (newMeasIt->m_cellId, v);
-          std::pair<std::map<uint16_t, MeasValues>::iterator, bool> 
-            ret = m_storedMeasValues.insert (val);
-          NS_ASSERT_MSG (ret.second == true, "element already existed");
-          storedMeasIt = ret.first;
-        }
-      else
-        {
-          // F_n = (1-a) F_{n-1} + a M_n
-          storedMeasIt->second.rsrp = (1 - m_varMeasConfig.aRsrp) * storedMeasIt->second.rsrp 
-            + m_varMeasConfig.aRsrp * newMeasIt->m_rsrp;          
-          storedMeasIt->second.rsrq = (1 - m_varMeasConfig.aRsrq) * storedMeasIt->second.rsrq 
-            + m_varMeasConfig.aRsrq * newMeasIt->m_rsrq;          
-        }  
-      storedMeasIt->second.timestamp = Simulator::Now ();
-    }
-
-                  
-  //  3GPP TS 36.331 section 5.5.4.1 Measurement report triggering - General
-  for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt 
-         = m_varMeasConfig.measIdList.begin ();
-       measIdIt != m_varMeasConfig.measIdList.end ();
-       ++measIdIt)               
-    {
-      NS_ASSERT (measIdIt->first == measIdIt->second.measId);
-      uint8_t measId = measIdIt->first;
-      NS_LOG_LOGIC (this << " considering measId " << (uint32_t) measId);
-
-      std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator 
-        reportConfigIt = m_varMeasConfig.reportConfigList.find (measIdIt->second.reportConfigId);
-      NS_ASSERT (reportConfigIt != m_varMeasConfig.reportConfigList.end ());
-      LteRrcSap::ReportConfigEutra& reportConfigEutra = reportConfigIt->second.reportConfigEutra;
-
-      std::map<uint8_t, LteRrcSap::MeasObjectToAddMod>::iterator 
-        measObjectIt = m_varMeasConfig.measObjectList.find (measIdIt->second.measObjectId);
-      NS_ASSERT (measObjectIt != m_varMeasConfig.measObjectList.end ());
-      LteRrcSap::MeasObjectEutra& measObjectEutra = measObjectIt->second.measObjectEutra;
-
-      std::map<uint8_t, VarMeasReport>::iterator 
-        measReportIt = m_varMeasReportList.find (measId);
-          
-      // we don't check the purpose field, as it is only included for
-      // triggerType == periodical, which is not supported  
-      NS_ASSERT_MSG (reportConfigEutra.triggerType 
-                     == LteRrcSap::ReportConfigEutra::EVENT,
-                     "only triggerType == event is supported");
-      // only EUTRA is supported, no need to check for it
-
-      bool eventEntryCondApplicable = false;
-      bool eventLeavingCondApplicable = false;
-
-      std::list<uint16_t> concernedCellsEntry;
-      std::list<uint16_t> concernedCellsLeaving;
-              
-      switch (reportConfigEutra.eventId)
-        {
-        case LteRrcSap::ReportConfigEutra::EVENT_A2:
-          {
-            double ms; // Ms, the measurement for serving cell
-            double thresh; // Tresh, the threshold parameter for this event
-            double hys = (double) reportConfigEutra.hysteresis * 0.5; // Hys, the hysteresis parameter for this event. See 36.331 section 6.3.5 for the conversion.
-            switch (reportConfigEutra.triggerQuantity)
-              {
-              case LteRrcSap::ReportConfigEutra::RSRP:
-                ms = m_storedMeasValues[m_cellId].rsrp;
-                //ms = EutranMeasurementMapping::QuantizeRsrp (m_storedMeasValues[m_cellId].rsrp);
-                NS_ASSERT (reportConfigEutra.threshold1.choice 
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
-                thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
-                break;
-              case LteRrcSap::ReportConfigEutra::RSRQ:
-                ms = m_storedMeasValues[m_cellId].rsrq;
-                //ms = EutranMeasurementMapping::QuantizeRsrq (m_storedMeasValues[m_cellId].rsrq);
-                NS_ASSERT (reportConfigEutra.threshold1.choice 
-                           == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);                
-                thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
-                break;
-              default:
-                NS_FATAL_ERROR ("unsupported triggerQuantity");
-                break;
-              }            
-            // Inequality A2-1 (Entering condition) :  Ms + Hys < Thresh
-            bool entryCond = ms + hys < thresh;
-            if (entryCond == true 
-                && (measReportIt == m_varMeasReportList.end ()
-                    || (measReportIt != m_varMeasReportList.end () 
-                        && (measReportIt->second.cellsTriggeredList.find (m_cellId) 
-                            == measReportIt->second.cellsTriggeredList.end ()))))
-              {
-                concernedCellsEntry.push_back (m_cellId);
-                eventEntryCondApplicable = true;
-              }
-            // Inequality A2-2 (Leaving condition) : Ms − Hys > Thresh
-            bool leavingCond = ms - hys > thresh;
-            if (leavingCond         
-                && measReportIt != m_varMeasReportList.end ()
-                && (measReportIt->second.cellsTriggeredList.find (m_cellId) 
-                    != measReportIt->second.cellsTriggeredList.end ()))
-              {
-                concernedCellsLeaving.push_back (m_cellId);
-                eventLeavingCondApplicable = true;
-              }
-            NS_LOG_LOGIC ("event A2: serving cell " << m_cellId << " ms=" << ms << " thresh=" << thresh << " entryCond=" << entryCond << " leavingCond=" << leavingCond);
-          }                  
-          break;
+  switch (m_state)
+    {
+    case IDLE_WAIT_SIB1:
+      NS_ASSERT_MSG (cellId == msg.cellAccessRelatedInfo.cellIdentity,
+                     "Cell identity in SIB1 does not match with the originating cell");
+      m_hasReceivedSib1 = true;
+      m_lastSib1 = msg;
+      m_sib1ReceivedTrace (m_imsi, m_cellId, m_rnti, cellId);
+      EvaluateCellForSelection ();
+      break;
 
-        case LteRrcSap::ReportConfigEutra::EVENT_A4:
-          {
-            for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
-                 storedMeasIt != m_storedMeasValues.end ();
-                 ++storedMeasIt)
-              {
-                uint16_t cellId = storedMeasIt->first;
-                if (cellId != m_cellId) 
-                  {
-                    double mn; // Mn, the measurement for neighboring cell
-                    double thresh; // Tresh, the threshold parameter for this event
-                    double hys = (double) reportConfigEutra.hysteresis * 0.5; // Hys, the hysteresis parameter for this event. See 36.331 section 6.3.5 for the conversion.
-                    switch (reportConfigEutra.triggerQuantity)
-                      {
-                      case LteRrcSap::ReportConfigEutra::RSRP:
-                        mn = storedMeasIt->second.rsrp;
-                        //mn = EutranMeasurementMapping::QuantizeRsrp (storedMeasIt->second.rsrp);
-                        NS_ASSERT (reportConfigEutra.threshold1.choice 
-                                   == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);    
-                        thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);            
-                        break;
-                      case LteRrcSap::ReportConfigEutra::RSRQ:
-                        mn = storedMeasIt->second.rsrq;
-                        //mn = EutranMeasurementMapping::QuantizeRsrq (storedMeasIt->second.rsrq);
-                        NS_ASSERT (reportConfigEutra.threshold1.choice 
-                                   == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);                
-                        thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
-                        break;
-                      default:
-                        NS_FATAL_ERROR ("unsupported triggerQuantity");
-                        break;
-                      }            
-                    // Inequality A4-1 (Entering condition) :  Mn + Ofn + Ocn − Hys > Thresh
-                    bool entryCond = mn + measObjectEutra.offsetFreq + 0.0 - hys > thresh;
-                    if (entryCond == true 
-                        && (measReportIt == m_varMeasReportList.end ()
-                            || (measReportIt != m_varMeasReportList.end () 
-                                && (measReportIt->second.cellsTriggeredList.find (cellId) 
-                                    == measReportIt->second.cellsTriggeredList.end ()))))
-                      {
-                        concernedCellsEntry.push_back (cellId);
-                        eventEntryCondApplicable = true;
-                      }
-                    // Inequality A4-2 (Leaving condition) : Mn + Ofn + Ocn + Hys < Thresh
-                    bool leavingCond = mn + measObjectEutra.offsetFreq + 0.0 + hys < thresh;
-                    if (leavingCond         
-                        && measReportIt != m_varMeasReportList.end ()
-                        && (measReportIt->second.cellsTriggeredList.find (cellId) 
-                            != measReportIt->second.cellsTriggeredList.end ()))
-                      {
-                        concernedCellsLeaving.push_back (cellId);
-                        eventLeavingCondApplicable = true;
-                      }
-                   
-                    NS_LOG_LOGIC ("event A4: neighbor cell " << cellId << " mn=" << mn << " thresh=" << thresh << " entryCond=" << entryCond << " leavingCond=" << leavingCond);
-                  }
-              }
-          }
-          break;
+    case IDLE_CAMPED_NORMALLY:
+    case IDLE_RANDOM_ACCESS:
+    case IDLE_CONNECTING:
+    case CONNECTED_NORMALLY:
+    case CONNECTED_HANDOVER:
+    case CONNECTED_PHY_PROBLEM:
+    case CONNECTED_REESTABLISHING:
+      NS_ASSERT_MSG (cellId == msg.cellAccessRelatedInfo.cellIdentity,
+                     "Cell identity in SIB1 does not match with the originating cell");
+      m_hasReceivedSib1 = true;
+      m_lastSib1 = msg;
+      m_sib1ReceivedTrace (m_imsi, m_cellId, m_rnti, cellId);
+      break;
 
-        default:
-          NS_FATAL_ERROR ("unsupported eventId " << reportConfigEutra.eventId);
-          break;
-          
-          } // switch (event type)
+    case IDLE_WAIT_MIB_SIB1:
+      // MIB has not been received, so ignore this SIB1
+      break;
 
-      NS_LOG_LOGIC ("eventEntryCondApplicable=" << eventEntryCondApplicable
-                    << " eventLeavingCondApplicable=" << eventLeavingCondApplicable);
+    default: // e.g. IDLE_START, IDLE_CELL_SEARCH, IDLE_WAIT_MIB, IDLE_WAIT_SIB2
+      // do nothing
+      break;
+    }
+}
 
-      bool initiateUeMeasurementReportingProcedure = false;
+void
+LteUeRrc::DoReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params)
+{
+  NS_LOG_FUNCTION (this);
 
-      if (eventEntryCondApplicable)
-        {          
-          if (measReportIt == m_varMeasReportList.end ())
-            {
-              VarMeasReport r;
-              r.measId = measId;              
-              std::pair<uint8_t, VarMeasReport> val (measId, r);
-              std::pair<std::map<uint8_t, VarMeasReport>::iterator, bool> 
-                ret = m_varMeasReportList.insert (val);
-              NS_ASSERT_MSG (ret.second == true, "element already existed");
-              measReportIt = ret.first;
-            }
-          for (std::list<uint16_t>::iterator it = concernedCellsEntry.begin ();
-               it != concernedCellsEntry.end ();
-               ++it)
-            {
-              measReportIt->second.cellsTriggeredList.insert (*it);
-            }
-          measReportIt->second.numberOfReportsSent = 0;
-          initiateUeMeasurementReportingProcedure = true;
-        }
-      
-      if (eventLeavingCondApplicable)
-        {                  
-          NS_ASSERT (measReportIt != m_varMeasReportList.end ());
-          for (std::list<uint16_t>::iterator it = concernedCellsLeaving.begin ();
-               it != concernedCellsLeaving.end ();
-               ++it)
-            {
-              measReportIt->second.cellsTriggeredList.erase (*it);
-            }
+  // layer 3 filtering does not apply in IDLE mode
+  bool useLayer3Filtering = (m_state == CONNECTED_NORMALLY);
 
-          // reportOnLeave will only be set when eventId = eventA3
-          if(reportConfigEutra.eventId == LteRrcSap::ReportConfigEutra::EVENT_A3)
-            {
-              if (reportConfigEutra.reportOnLeave)
-                {
-                  initiateUeMeasurementReportingProcedure = true;
-                }
-            }    
-        }
+  std::vector <LteUeCphySapUser::UeMeasurementsElement>::iterator newMeasIt;
+  for (newMeasIt = params.m_ueMeasurementsList.begin ();
+       newMeasIt != params.m_ueMeasurementsList.end (); ++newMeasIt)
+    {
+      SaveUeMeasurements (newMeasIt->m_cellId, newMeasIt->m_rsrp,
+                          newMeasIt->m_rsrq, useLayer3Filtering);
+    }
 
-      if (initiateUeMeasurementReportingProcedure)
-        {
-          SendMeasurementReport (measId);
-        }    
-      
-      if ((measReportIt != m_varMeasReportList.end ())
-          && (measReportIt->second.cellsTriggeredList.empty ()))
+  if (m_state == IDLE_CELL_SEARCH)
+    {
+      // start decoding BCH
+      SynchronizeToStrongestCell ();
+    }
+  else
+    {
+      std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt;
+      for (measIdIt = m_varMeasConfig.measIdList.begin ();
+           measIdIt != m_varMeasConfig.measIdList.end (); ++measIdIt)
         {
-          measReportIt->second.periodicReportTimer.Cancel ();
-          m_varMeasReportList.erase (measReportIt);
+          MeasurementReportTriggering (measIdIt->first);
         }
-      
-    } // for each measId in m_varMeasConfig.measIdList   
-}
+    }
+
+} // end of LteUeRrc::DoReportUeMeasurements
 
 
 
@@ -803,7 +761,7 @@
 void 
 LteUeRrc::DoCompleteSetup (LteUeRrcSapProvider::CompleteSetupParameters params)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << " RNTI " << m_rnti);
   m_srb0->m_rlc->SetLteRlcSapUser (params.srb0SapUser);
   if (m_srb1)
     {
@@ -813,40 +771,52 @@
 
 
 void 
-LteUeRrc::DoRecvSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 msg)
-{
-  NS_LOG_FUNCTION (this);
-  // to be implemented
-}
-
- 
-void 
 LteUeRrc::DoRecvSystemInformation (LteRrcSap::SystemInformation msg)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << " RNTI " << m_rnti);
+
   if (msg.haveSib2)
     {
-      m_receivedSib2 = true;
-      m_ulBandwidth = msg.sib2.freqInfo.ulBandwidth;
-      m_ulEarfcn = msg.sib2.freqInfo.ulCarrierFreq;
-      LteUeCmacSapProvider::RachConfig rc;
-      rc.numberOfRaPreambles = msg.sib2.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles;
-      rc.preambleTransMax = msg.sib2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax;
-      rc.raResponseWindowSize = msg.sib2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize;
-      m_cmacSapProvider->ConfigureRach (rc);
-      m_cphySapProvider->ConfigureUplink (m_ulEarfcn, m_ulBandwidth);
-    }
-  if (m_state == IDLE_WAIT_SYSTEM_INFO && m_receivedMib && m_receivedSib2)
-    {
-       SwitchToState (IDLE_CAMPED_NORMALLY);
+      switch (m_state)
+        {
+        case IDLE_CAMPED_NORMALLY:
+        case IDLE_WAIT_SIB2:
+        case IDLE_RANDOM_ACCESS:
+        case IDLE_CONNECTING:
+        case CONNECTED_NORMALLY:
+        case CONNECTED_HANDOVER:
+        case CONNECTED_PHY_PROBLEM:
+        case CONNECTED_REESTABLISHING:
+          m_hasReceivedSib2 = true;
+          m_ulBandwidth = msg.sib2.freqInfo.ulBandwidth;
+          m_ulEarfcn = msg.sib2.freqInfo.ulCarrierFreq;
+          m_sib2ReceivedTrace (m_imsi, m_cellId, m_rnti);
+          LteUeCmacSapProvider::RachConfig rc;
+          rc.numberOfRaPreambles = msg.sib2.radioResourceConfigCommon.rachConfigCommon.preambleInfo.numberOfRaPreambles;
+          rc.preambleTransMax = msg.sib2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.preambleTransMax;
+          rc.raResponseWindowSize = msg.sib2.radioResourceConfigCommon.rachConfigCommon.raSupervisionInfo.raResponseWindowSize;
+          m_cmacSapProvider->ConfigureRach (rc);
+          m_cphySapProvider->ConfigureUplink (m_ulEarfcn, m_ulBandwidth);
+          if (m_state == IDLE_WAIT_SIB2)
+            {
+              NS_ASSERT (m_connectionPending);
+              StartConnection ();
+            }
+          break;
+
+        default: // IDLE_START, IDLE_CELL_SEARCH, IDLE_WAIT_MIB, IDLE_WAIT_MIB_SIB1, IDLE_WAIT_SIB1
+          // do nothing
+          break;
+        }
     }
+
 }
 
 
 void 
 LteUeRrc::DoRecvRrcConnectionSetup (LteRrcSap::RrcConnectionSetup msg)
-{    
-  NS_LOG_FUNCTION (this);
+{
+  NS_LOG_FUNCTION (this << " RNTI " << m_rnti);
   switch (m_state)
     {
     case IDLE_CONNECTING:
@@ -860,7 +830,7 @@
         m_connectionEstablishedTrace (m_imsi, m_cellId, m_rnti);
       }
       break;
-      
+
     default:
       NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state));
       break;
@@ -885,12 +855,12 @@
           m_cellId = mci.targetPhysCellId;
           NS_ASSERT (mci.haveCarrierFreq);
           NS_ASSERT (mci.haveCarrierBandwidth);
-          m_cphySapProvider->SyncronizeWithEnb (m_cellId, mci.carrierFreq.dlCarrierFreq); 
-          m_cphySapProvider->SetDlBandwidth ( mci.carrierBandwidth.dlBandwidth); 
+          m_cphySapProvider->SynchronizeWithEnb (m_cellId, mci.carrierFreq.dlCarrierFreq);
+          m_cphySapProvider->SetDlBandwidth ( mci.carrierBandwidth.dlBandwidth);
           m_cphySapProvider->ConfigureUplink (mci.carrierFreq.ulCarrierFreq, mci.carrierBandwidth.ulBandwidth); 
           m_rnti = msg.mobilityControlInfo.newUeIdentity;
           m_srb0->m_rlc->SetRnti (m_rnti);
-          NS_ASSERT_MSG (mci.haveRachConfigDedicated, "handover is only supported with non-contention-based random access procedure");          
+          NS_ASSERT_MSG (mci.haveRachConfigDedicated, "handover is only supported with non-contention-based random access procedure");
           m_cmacSapProvider->StartNonContentionBasedRandomAccessProcedure (m_rnti, mci.rachConfigDedicated.raPreambleIndex, mci.rachConfigDedicated.raPrachMaskIndex);
           m_cphySapProvider->SetRnti (m_rnti);
           m_lastRrcTransactionIdentifier = msg.rrcTransactionIdentifier;
@@ -901,11 +871,11 @@
           // it's in the current stack, so we would corrupt the stack
           // if we did so. Hence we schedule it for later disposal
           m_srb1Old = m_srb1;
-          Simulator::ScheduleNow (&LteUeRrc::DisposeOldSrb1, this);          
+          Simulator::ScheduleNow (&LteUeRrc::DisposeOldSrb1, this);
           m_srb1 = 0; // new instance will be be created within ApplyRadioResourceConfigDedicated
 
           m_drbMap.clear (); // dispose all DRBs
-          ApplyRadioResourceConfigDedicated (msg.radioResourceConfigDedicated);    
+          ApplyRadioResourceConfigDedicated (msg.radioResourceConfigDedicated);
 
           if (msg.haveMeasConfig)
             {
@@ -924,7 +894,7 @@
           if (msg.haveMeasConfig)
             {
               ApplyMeasConfig (msg.measConfig);
-            }          
+            }
           LteRrcSap::RrcConnectionReconfigurationCompleted msg2;
           msg2.rrcTransactionIdentifier = msg.rrcTransactionIdentifier;
           m_rrcSapUser->SendRrcConnectionReconfigurationCompleted (msg2);
@@ -941,13 +911,21 @@
 void 
 LteUeRrc::DoRecvRrcConnectionReestablishment (LteRrcSap::RrcConnectionReestablishment msg)
 {
+  NS_LOG_FUNCTION (this << " RNTI " << m_rnti);
   switch (m_state)
     {
     case CONNECTED_REESTABLISHING:
       {
+        /**
+         * \todo After receiving RRC Connection Re-establishment, stop timer
+         *       T301, fire a new trace source, reply with RRC Connection
+         *       Re-establishment Complete, and finally switch to
+         *       CONNECTED_NORMALLY state. See Section 5.3.7.5 of 3GPP TS
+         *       36.331.
+         */
       }
       break;
-      
+
     default:
       NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state));
       break;
@@ -957,15 +935,19 @@
 void 
 LteUeRrc::DoRecvRrcConnectionReestablishmentReject (LteRrcSap::RrcConnectionReestablishmentReject msg)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << " RNTI " << m_rnti);
   switch (m_state)
     {
     case CONNECTED_REESTABLISHING:
       {
+        /**
+         * \todo After receiving RRC Connection Re-establishment Reject, stop
+         *       timer T301. See Section 5.3.7.8 of 3GPP TS 36.331.
+         */
         LeaveConnectedMode ();
       }
       break;
-      
+
     default:
       NS_FATAL_ERROR ("method unexpected in state " << ToString (m_state));
       break;
@@ -975,7 +957,8 @@
 void 
 LteUeRrc::DoRecvRrcConnectionRelease (LteRrcSap::RrcConnectionRelease msg)
 {
-  NS_LOG_FUNCTION (this);
+  NS_LOG_FUNCTION (this << " RNTI " << m_rnti);
+  /// \todo Currently not implemented, see Section 5.3.8 of 3GPP TS 36.331.
 }
 
 void 
@@ -988,15 +971,125 @@
 
 
 
-void 
-LteUeRrc::ApplyRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated rrcd)
+void
+LteUeRrc::SynchronizeToStrongestCell ()
 {
   NS_LOG_FUNCTION (this);
-  const struct LteRrcSap::PhysicalConfigDedicated& pcd = rrcd.physicalConfigDedicated;
-  
-  if (pcd.haveAntennaInfoDedicated)
+  NS_ASSERT (m_state == IDLE_CELL_SEARCH);
+
+  uint16_t maxRsrpCellId = 0;
+  double maxRsrp = -std::numeric_limits<double>::infinity ();
+
+  std::map<uint16_t, MeasValues>::iterator it;
+  for (it = m_storedMeasValues.begin (); it != m_storedMeasValues.end (); it++)
     {
-      m_cphySapProvider->SetTransmissionMode (pcd.antennaInfo.transmissionMode);
+      /*
+       * This block attempts to find a cell with strongest RSRP and has not
+       * yet been identified as "acceptable cell".
+       */
+      if (maxRsrp < it->second.rsrp)
+        {
+          std::set<uint16_t>::const_iterator itCell;
+          itCell = m_acceptableCell.find (it->first);
+          if (itCell == m_acceptableCell.end ())
+            {
+              maxRsrpCellId = it->first;
+              maxRsrp = it->second.rsrp;
+            }
+        }
+    }
+
+  if (maxRsrpCellId == 0)
+    {
+      NS_LOG_WARN (this << " Cell search is unable to detect surrounding cell to attach to");
+    }
+  else
+    {
+      NS_LOG_LOGIC (this << " cell " << maxRsrpCellId
+                         << " is the strongest untried surrounding cell");
+      m_cphySapProvider->SynchronizeWithEnb (maxRsrpCellId, m_dlEarfcn);
+      SwitchToState (IDLE_WAIT_MIB_SIB1);
+    }
+
+} // end of void LteUeRrc::SynchronizeToStrongestCell ()
+
+
+void
+LteUeRrc::EvaluateCellForSelection ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_state == IDLE_WAIT_SIB1);
+  NS_ASSERT (m_hasReceivedMib);
+  NS_ASSERT (m_hasReceivedSib1);
+  uint16_t cellId = m_lastSib1.cellAccessRelatedInfo.cellIdentity;
+
+  // Cell selection criteria evaluation
+
+  bool isSuitableCell = false;
+  bool isAcceptableCell = false;
+  std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.find (cellId);
+  double qRxLevMeas = storedMeasIt->second.rsrp;
+  double qRxLevMin = EutranMeasurementMapping::IeValue2ActualQRxLevMin (m_lastSib1.cellSelectionInfo.qRxLevMin);
+  NS_LOG_LOGIC (this << " cell selection to cellId=" << cellId
+                     << " qrxlevmeas=" << qRxLevMeas << " dBm"
+                     << " qrxlevmin=" << qRxLevMin << " dBm");
+
+  if (qRxLevMeas - qRxLevMin > 0)
+    {
+      isAcceptableCell = true;
+
+      uint32_t cellCsgId = m_lastSib1.cellAccessRelatedInfo.csgIdentity;
+      bool cellCsgIndication = m_lastSib1.cellAccessRelatedInfo.csgIndication;
+
+      isSuitableCell = (cellCsgIndication == false) || (cellCsgId == m_csgWhiteList);
+
+      NS_LOG_LOGIC (this << " csg(ue/cell/indication)=" << m_csgWhiteList << "/"
+                         << cellCsgId << "/" << cellCsgIndication);
+    }
+
+  // Cell selection decision
+
+  if (isSuitableCell)
+    {
+      m_cellId = cellId;
+      m_cphySapProvider->SynchronizeWithEnb (cellId, m_dlEarfcn);
+      m_cphySapProvider->SetDlBandwidth (m_dlBandwidth);
+      m_initialCellSelectionEndOkTrace (m_imsi, cellId);
+      SwitchToState (IDLE_CAMPED_NORMALLY);
+    }
+  else
+    {
+      // ignore the MIB and SIB1 received from this cell
+      m_hasReceivedMib = false;
+      m_hasReceivedSib1 = false;
+
+      m_initialCellSelectionEndErrorTrace (m_imsi, cellId);
+
+      if (isAcceptableCell)
+        {
+          /*
+           * The cells inserted into this list will not be considered for
+           * subsequent cell search attempt.
+           */
+          m_acceptableCell.insert (cellId);
+        }
+
+      SwitchToState (IDLE_CELL_SEARCH);
+      SynchronizeToStrongestCell (); // retry to a different cell
+    }
+
+} // end of void LteUeRrc::EvaluateCellForSelection ()
+
+
+void 
+LteUeRrc::ApplyRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated rrcd)
+{
+  NS_LOG_FUNCTION (this);
+  const struct LteRrcSap::PhysicalConfigDedicated& pcd = rrcd.physicalConfigDedicated;
+  
+  if (pcd.haveAntennaInfoDedicated)
+    {
+      m_cphySapProvider->SetTransmissionMode (pcd.antennaInfo.transmissionMode);
     }
   if (pcd.haveSoundingRsUlConfigDedicated)
     {
@@ -1187,23 +1280,17 @@
               NS_LOG_LOGIC (this << " deleting measId " << (uint32_t) measId << " because referring to measObjectId " << (uint32_t)  measObjectId);
               // note: postfix operator preserves iterator validity
               m_varMeasConfig.measIdList.erase (measIdIt++);
-              std::map<uint8_t, VarMeasReport>::iterator measReportIt = m_varMeasReportList.find (measId);
-              if (measReportIt != m_varMeasReportList.end ())
-                {                  
-                  NS_LOG_LOGIC (this << " deleting existing report for measId " << (uint32_t) measId << " because referring to measObjectId " << (uint32_t)  measObjectId);
-                  measReportIt->second.periodicReportTimer.Cancel ();
-                  m_varMeasReportList.erase (measReportIt);
-                }
+              VarMeasReportListClear (measId);
             }
           else
             {
               ++measIdIt;
             }
-        }    
-      
-    }     
+        }
+
+    }
 
-  // 3GPP TS 36.331 section 5.5.2.5  Measurement object addition/ modification  
+  // 3GPP TS 36.331 section 5.5.2.5  Measurement object addition/ modification
   for (std::list<LteRrcSap::MeasObjectToAddMod>::iterator it = mc.measObjectToAddModList.begin ();
        it !=  mc.measObjectToAddModList.end ();
        ++it)
@@ -1213,39 +1300,33 @@
       NS_ASSERT_MSG (it->measObjectEutra.cellsToAddModList.empty (), "cellsToAddModList not supported");
       NS_ASSERT_MSG (it->measObjectEutra.cellsToRemoveList.empty (), "blackCellsToRemoveList not supported");
       NS_ASSERT_MSG (it->measObjectEutra.blackCellsToAddModList.empty (), "blackCellsToAddModList not supported");
-      NS_ASSERT_MSG (it->measObjectEutra.haveCellForWhichToReportCGI == false , "cellForWhichToReportCGI is not supported");
-      
-                     
-      uint8_t measObjectId = it->measObjectId;         
-      std::map<uint8_t, LteRrcSap::MeasObjectToAddMod>::iterator measObjectIt = m_varMeasConfig.measObjectList.find (measObjectId);      
+      NS_ASSERT_MSG (it->measObjectEutra.haveCellForWhichToReportCGI == false, "cellForWhichToReportCGI is not supported");
+
+      uint8_t measObjectId = it->measObjectId;
+      std::map<uint8_t, LteRrcSap::MeasObjectToAddMod>::iterator measObjectIt = m_varMeasConfig.measObjectList.find (measObjectId);
       if (measObjectIt != m_varMeasConfig.measObjectList.end ())
         {
           NS_LOG_LOGIC ("measObjectId " << (uint32_t) measObjectId << " exists, updating entry");
-          measObjectIt->second = *it;          
+          measObjectIt->second = *it;
           for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt 
                  = m_varMeasConfig.measIdList.begin ();
                measIdIt != m_varMeasConfig.measIdList.end ();
-               ++measIdIt)               
+               ++measIdIt)
             {
               if (measIdIt->second.measObjectId == measObjectId)
                 {
                   uint8_t measId = measIdIt->second.measId;
                   NS_LOG_LOGIC (this << " found measId " << (uint32_t) measId << " referring to measObjectId " << (uint32_t)  measObjectId);
-                  std::map<uint8_t, VarMeasReport>::iterator measReportIt = m_varMeasReportList.find (measId);
-                  if (measReportIt != m_varMeasReportList.end ())
-                    {
-                      NS_LOG_LOGIC (this << " deleting existing report for measId " << (uint32_t) measId << " because referring to measObjectId " << (uint32_t)  measObjectId);
-                      measReportIt->second.periodicReportTimer.Cancel ();
-                      m_varMeasReportList.erase (measReportIt);
-                    }
+                  VarMeasReportListClear (measId);
                 }
             }
         }
       else
         {
-          NS_LOG_LOGIC ("measObjectId " << (uint32_t) measObjectId << " is new, adding entry");     
+          NS_LOG_LOGIC ("measObjectId " << (uint32_t) measObjectId << " is new, adding entry");
           m_varMeasConfig.measObjectList[measObjectId] = *it;
-        }            
+        }
+
     }
 
   // 3GPP TS 36.331 section 5.5.2.6 Reporting configuration removal
@@ -1266,22 +1347,16 @@
               NS_LOG_LOGIC (this << " deleting measId " << (uint32_t) measId << " because referring to reportConfigId " << (uint32_t)  reportConfigId);
               // note: postfix operator preserves iterator validity
               m_varMeasConfig.measIdList.erase (measIdIt++);
-              std::map<uint8_t, VarMeasReport>::iterator measReportIt = m_varMeasReportList.find (measId);
-              if (measReportIt != m_varMeasReportList.end ())
-                {                  
-                  NS_LOG_LOGIC (this << " deleting existing report for measId" << (uint32_t) measId << " because referring to reportConfigId " << (uint32_t)  reportConfigId);
-                  measReportIt->second.periodicReportTimer.Cancel ();
-                  m_varMeasReportList.erase (measReportIt);
-                }
+              VarMeasReportListClear (measId);
             }
           else
             {
               ++measIdIt;
             }
-        }    
+        }
 
     }
-  
+
   // 3GPP TS 36.331 section 5.5.2.7 Reporting configuration addition/ modification
   for (std::list<LteRrcSap::ReportConfigToAddMod>::iterator it = mc.reportConfigToAddModList.begin ();
        it !=  mc.reportConfigToAddModList.end ();
@@ -1290,75 +1365,54 @@
       // simplifying assumptions
       NS_ASSERT_MSG (it->reportConfigEutra.triggerType == LteRrcSap::ReportConfigEutra::EVENT,
                      "only trigger type EVENT is supported");
-      NS_ASSERT_MSG (it->reportConfigEutra.eventId == LteRrcSap::ReportConfigEutra::EVENT_A2
-                     || it->reportConfigEutra.eventId == LteRrcSap::ReportConfigEutra::EVENT_A4,
-                     "only events A2 and A4 are supported");
-      NS_ASSERT_MSG (it->reportConfigEutra.timeToTrigger == 0, "timeToTrigger > 0 is not supported");
-      
-      uint8_t reportConfigId = it->reportConfigId;         
-      std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator reportConfigIt = m_varMeasConfig.reportConfigList.find (reportConfigId);      
+
+      uint8_t reportConfigId = it->reportConfigId;
+      std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator reportConfigIt = m_varMeasConfig.reportConfigList.find (reportConfigId);
       if (reportConfigIt != m_varMeasConfig.reportConfigList.end ())
         {
           NS_LOG_LOGIC ("reportConfigId " << (uint32_t) reportConfigId << " exists, updating entry");
-          m_varMeasConfig.reportConfigList[reportConfigId] = *it;          
+          m_varMeasConfig.reportConfigList[reportConfigId] = *it;
           for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt 
                  = m_varMeasConfig.measIdList.begin ();
                measIdIt != m_varMeasConfig.measIdList.end ();
-               ++measIdIt)               
+               ++measIdIt)
             {
               if (measIdIt->second.reportConfigId == reportConfigId)
                 {
                   uint8_t measId = measIdIt->second.measId;
                   NS_LOG_LOGIC (this << " found measId " << (uint32_t) measId << " referring to reportConfigId " << (uint32_t)  reportConfigId);
-                  std::map<uint8_t, VarMeasReport>::iterator measReportIt = m_varMeasReportList.find (measId);
-                  if (measReportIt != m_varMeasReportList.end ())
-                    {
-                      NS_LOG_LOGIC (this << " deleting existing report for measId " << (uint32_t) measId << " because referring to reportConfigId " << (uint32_t)  reportConfigId);
-                      measReportIt->second.periodicReportTimer.Cancel ();
-                      m_varMeasReportList.erase (measReportIt);
-                    }
+                  VarMeasReportListClear (measId);
                 }
             }
         }
       else
         {
-          NS_LOG_LOGIC ("reportConfigId " << (uint32_t) reportConfigId << " is new, adding entry");     
+          NS_LOG_LOGIC ("reportConfigId " << (uint32_t) reportConfigId << " is new, adding entry");
           m_varMeasConfig.reportConfigList[reportConfigId] = *it;
-        }            
-    }
+        }
 
+    }
 
   // 3GPP TS 36.331 section 5.5.2.8 Quantity configuration
   if (mc.haveQuantityConfig)
     {
       NS_LOG_LOGIC (this << " setting quantityConfig");
       m_varMeasConfig.quantityConfig = mc.quantityConfig;
-      std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt = m_varMeasConfig.measIdList.begin ();
-      while (measIdIt != m_varMeasConfig.measIdList.end ())
-        {
-          uint8_t measId = measIdIt->second.measId;
-          NS_ASSERT (measId == measIdIt->first);
-          NS_LOG_LOGIC (this << " deleting measId " << (uint32_t) measId);
-          // note: postfix operator preserves iterator validity
-          m_varMeasConfig.measIdList.erase (measIdIt++);
-          std::map<uint8_t, VarMeasReport>::iterator measReportIt = m_varMeasReportList.find (measId);
-          if (measReportIt != m_varMeasReportList.end ())
-            {                  
-              NS_LOG_LOGIC (this << " deleting existing report for measId" << (uint32_t) measId);
-              measReportIt->second.periodicReportTimer.Cancel ();
-              m_varMeasReportList.erase (measReportIt);
-            }
-        }
       // we calculate here the coefficient a used for Layer 3 filtering, see 3GPP TS 36.331 section 5.5.3.2
-      m_varMeasConfig.aRsrp = std::pow (0.5,  mc.quantityConfig.filterCoefficientRSRP/4.0);
-      m_varMeasConfig.aRsrq = std::pow (0.5,  mc.quantityConfig.filterCoefficientRSRQ/4.0);
+      m_varMeasConfig.aRsrp = std::pow (0.5, mc.quantityConfig.filterCoefficientRSRP/4.0);
+      m_varMeasConfig.aRsrq = std::pow (0.5, mc.quantityConfig.filterCoefficientRSRQ/4.0);
       NS_LOG_LOGIC (this << " new filter coefficients: aRsrp=" << m_varMeasConfig.aRsrp << ", aRsrq=" << m_varMeasConfig.aRsrq);
 
-
+      for (std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt
+             = m_varMeasConfig.measIdList.begin ();
+           measIdIt != m_varMeasConfig.measIdList.end ();
+           ++measIdIt)
+        {
+          VarMeasReportListClear (measIdIt->second.measId);
+        }
     }
 
-
-  // 3GPP TS 36.331 section 5.5.2.2 Measurement identity removal  
+  // 3GPP TS 36.331 section 5.5.2.2 Measurement identity removal
   for (std::list<uint8_t>::iterator it = mc.measIdToRemoveList.begin ();
        it !=  mc.measIdToRemoveList.end ();
        ++it)
@@ -1366,13 +1420,11 @@
       uint8_t measId = *it;
       NS_LOG_LOGIC (this << " deleting measId " << (uint32_t) measId);
       m_varMeasConfig.measIdList.erase (measId);
-      std::map<uint8_t, VarMeasReport>::iterator measReportIt = m_varMeasReportList.find (measId);
-      if (measReportIt != m_varMeasReportList.end ())
-        {
-          NS_LOG_LOGIC (this << " deleting existing report for measId" << (uint32_t) measId);
-          measReportIt->second.periodicReportTimer.Cancel ();
-          m_varMeasReportList.erase (measReportIt);
-        }
+      VarMeasReportListClear (measId);
+
+      // removing time-to-trigger queues
+      m_enteringTriggerQueue.erase (measId);
+      m_leavingTriggerQueue.erase (measId);
     }
 
   // 3GPP TS 36.331 section 5.5.2.3 Measurement identity addition/ modification
@@ -1380,12 +1432,14 @@
        it !=  mc.measIdToAddModList.end ();
        ++it)
     {
-      NS_LOG_LOGIC (this << " measId " << (uint32_t) it->measId << " (measObjectId=" 
-                    << (uint32_t) it->measObjectId << ", reportConfigId=" << (uint32_t) it->reportConfigId << ")");
+      NS_LOG_LOGIC (this << " measId " << (uint32_t) it->measId
+                         << " (measObjectId=" << (uint32_t) it->measObjectId
+                         << ", reportConfigId=" << (uint32_t) it->reportConfigId
+                         << ")");
       NS_ASSERT (m_varMeasConfig.measObjectList.find (it->measObjectId)
                  != m_varMeasConfig.measObjectList.end ());
       NS_ASSERT (m_varMeasConfig.reportConfigList.find (it->reportConfigId)
-                 != m_varMeasConfig.reportConfigList.end ());      
+                 != m_varMeasConfig.reportConfigList.end ());
       m_varMeasConfig.measIdList[it->measId] = *it; // side effect: create new entry if not exists
       std::map<uint8_t, VarMeasReport>::iterator measReportIt = m_varMeasReportList.find (it->measId);
       if (measReportIt != m_varMeasReportList.end ())
@@ -1396,6 +1450,10 @@
       NS_ASSERT (m_varMeasConfig.reportConfigList.find (it->reportConfigId)
                  ->second.reportConfigEutra.triggerType != LteRrcSap::ReportConfigEutra::PERIODICAL);
 
+      // new empty queues for time-to-trigger
+      std::list<PendingTrigger_t> s;
+      m_enteringTriggerQueue[it->measId] = s;
+      m_leavingTriggerQueue[it->measId] = s;
     }
 
   if (mc.haveMeasGapConfig)
@@ -1414,16 +1472,1086 @@
     }
 }
 
+void
+LteUeRrc::SaveUeMeasurements (uint16_t cellId, double rsrp, double rsrq,
+                              bool useLayer3Filtering)
+{
+  NS_LOG_FUNCTION (this << cellId << rsrp << rsrq << useLayer3Filtering);
+
+  std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.find (cellId);;
+
+  if (storedMeasIt != m_storedMeasValues.end ())
+    {
+      if (useLayer3Filtering)
+        {
+          // F_n = (1-a) F_{n-1} + a M_n
+          storedMeasIt->second.rsrp = (1 - m_varMeasConfig.aRsrp) * storedMeasIt->second.rsrp
+            + m_varMeasConfig.aRsrp * rsrp;
+
+          if (std::isnan (storedMeasIt->second.rsrq))
+            {
+              // the previous RSRQ measurements provided UE PHY are invalid
+              storedMeasIt->second.rsrq = rsrq; // replace it with unfiltered value
+            }
+          else
+            {
+              storedMeasIt->second.rsrq = (1 - m_varMeasConfig.aRsrq) * storedMeasIt->second.rsrq
+                + m_varMeasConfig.aRsrq * rsrq;
+            }
+        }
+      else
+        {
+          storedMeasIt->second.rsrp = rsrp;
+          storedMeasIt->second.rsrq = rsrq;
+        }
+    }
+  else
+    {
+      // first value is always unfiltered
+      MeasValues v;
+      v.rsrp = rsrp;
+      v.rsrq = rsrq;
+      std::pair<uint16_t, MeasValues> val (cellId, v);
+      std::pair<std::map<uint16_t, MeasValues>::iterator, bool>
+        ret = m_storedMeasValues.insert (val);
+      NS_ASSERT_MSG (ret.second == true, "element already existed");
+      storedMeasIt = ret.first;
+    }
+
+  NS_LOG_DEBUG (this << " IMSI " << m_imsi << " state " << ToString (m_state)
+                     << ", measured cell " << m_cellId
+                     << ", new RSRP " << rsrp << " stored " << storedMeasIt->second.rsrp
+                     << ", new RSRQ " << rsrq << " stored " << storedMeasIt->second.rsrq);
+  storedMeasIt->second.timestamp = Simulator::Now ();
+
+} // end of void SaveUeMeasurements
+
+void
+LteUeRrc::MeasurementReportTriggering (uint8_t measId)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) measId);
+
+  std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator measIdIt =
+    m_varMeasConfig.measIdList.find (measId);
+  NS_ASSERT (measIdIt != m_varMeasConfig.measIdList.end ());
+  NS_ASSERT (measIdIt->first == measIdIt->second.measId);
+
+  std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator
+    reportConfigIt = m_varMeasConfig.reportConfigList.find (measIdIt->second.reportConfigId);
+  NS_ASSERT (reportConfigIt != m_varMeasConfig.reportConfigList.end ());
+  LteRrcSap::ReportConfigEutra& reportConfigEutra = reportConfigIt->second.reportConfigEutra;
+
+  std::map<uint8_t, LteRrcSap::MeasObjectToAddMod>::iterator
+    measObjectIt = m_varMeasConfig.measObjectList.find (measIdIt->second.measObjectId);
+  NS_ASSERT (measObjectIt != m_varMeasConfig.measObjectList.end ());
+  LteRrcSap::MeasObjectEutra& measObjectEutra = measObjectIt->second.measObjectEutra;
+
+  std::map<uint8_t, VarMeasReport>::iterator
+    measReportIt = m_varMeasReportList.find (measId);
+  bool isMeasIdInReportList = (measReportIt != m_varMeasReportList.end ());
+
+  // we don't check the purpose field, as it is only included for
+  // triggerType == periodical, which is not supported
+  NS_ASSERT_MSG (reportConfigEutra.triggerType
+                 == LteRrcSap::ReportConfigEutra::EVENT,
+                 "only triggerType == event is supported");
+  // only EUTRA is supported, no need to check for it
+
+  NS_LOG_LOGIC (this << " considering measId " << (uint32_t) measId);
+  bool eventEntryCondApplicable = false;
+  bool eventLeavingCondApplicable = false;
+  ConcernedCells_t concernedCellsEntry;
+  ConcernedCells_t concernedCellsLeaving;
+
+  switch (reportConfigEutra.eventId)
+    {
+    case LteRrcSap::ReportConfigEutra::EVENT_A1:
+      {
+        /*
+         * Event A1 (Serving becomes better than threshold)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.2
+         */
+
+        double ms; // Ms, the measurement result of the serving cell
+        double thresh; // Thresh, the threshold parameter for this event
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            ms = m_storedMeasValues[m_cellId].rsrp;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            ms = m_storedMeasValues[m_cellId].rsrq;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
+
+        // Inequality A1-1 (Entering condition): Ms - Hys > Thresh
+        bool entryCond = ms - hys > thresh;
+
+        if (entryCond)
+          {
+            if (!isMeasIdInReportList)
+              {
+                concernedCellsEntry.push_back (m_cellId);
+                eventEntryCondApplicable = true;
+              }
+            else
+              {
+                /*
+                 * This is to check that the triggered cell recorded in the
+                 * VarMeasReportList is the serving cell.
+                 */
+                NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
+                           != measReportIt->second.cellsTriggeredList.end ());
+              }
+          }
+        else if (reportConfigEutra.timeToTrigger > 0)
+          {
+            CancelEnteringTrigger (measId);
+          }
+
+        // Inequality A1-2 (Leaving condition): Ms + Hys < Thresh
+        bool leavingCond = ms + hys < thresh;
+
+        if (leavingCond)
+          {
+            if (isMeasIdInReportList)
+              {
+                /*
+                 * This is to check that the triggered cell recorded in the
+                 * VarMeasReportList is the serving cell.
+                 */
+                NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
+                           != measReportIt->second.cellsTriggeredList.end ());
+                concernedCellsLeaving.push_back (m_cellId);
+                eventLeavingCondApplicable = true;
+              }
+          }
+        else if (reportConfigEutra.timeToTrigger > 0)
+          {
+            CancelLeavingTrigger (measId);
+          }
+
+        NS_LOG_LOGIC (this << " event A1: serving cell " << m_cellId
+                           << " ms=" << ms << " thresh=" << thresh
+                           << " entryCond=" << entryCond
+                           << " leavingCond=" << leavingCond);
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A1
+
+      break;
+
+    case LteRrcSap::ReportConfigEutra::EVENT_A2:
+      {
+        /*
+         * Event A2 (Serving becomes worse than threshold)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.3
+         */
+
+        double ms; // Ms, the measurement result of the serving cell
+        double thresh; // Thresh, the threshold parameter for this event
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            ms = m_storedMeasValues[m_cellId].rsrp;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            ms = m_storedMeasValues[m_cellId].rsrq;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
+
+        // Inequality A2-1 (Entering condition): Ms + Hys < Thresh
+        bool entryCond = ms + hys < thresh;
+
+        if (entryCond)
+          {
+            if (!isMeasIdInReportList)
+              {
+                concernedCellsEntry.push_back (m_cellId);
+                eventEntryCondApplicable = true;
+              }
+            else
+              {
+                /*
+                 * This is to check that the triggered cell recorded in the
+                 * VarMeasReportList is the serving cell.
+                 */
+                NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
+                           != measReportIt->second.cellsTriggeredList.end ());
+              }
+          }
+        else if (reportConfigEutra.timeToTrigger > 0)
+          {
+            CancelEnteringTrigger (measId);
+          }
+
+        // Inequality A2-2 (Leaving condition): Ms - Hys > Thresh
+        bool leavingCond = ms - hys > thresh;
+
+        if (leavingCond)
+          {
+            if (isMeasIdInReportList)
+              {
+                /*
+                 * This is to check that the triggered cell recorded in the
+                 * VarMeasReportList is the serving cell.
+                 */
+                NS_ASSERT (measReportIt->second.cellsTriggeredList.find (m_cellId)
+                           != measReportIt->second.cellsTriggeredList.end ());
+                concernedCellsLeaving.push_back (m_cellId);
+                eventLeavingCondApplicable = true;
+              }
+          }
+        else if (reportConfigEutra.timeToTrigger > 0)
+          {
+            CancelLeavingTrigger (measId);
+          }
+
+        NS_LOG_LOGIC (this << " event A2: serving cell " << m_cellId
+                           << " ms=" << ms << " thresh=" << thresh
+                           << " entryCond=" << entryCond
+                           << " leavingCond=" << leavingCond);
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A2
+
+      break;
+
+    case LteRrcSap::ReportConfigEutra::EVENT_A3:
+      {
+        /*
+         * Event A3 (Neighbour becomes offset better than PCell)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.4
+         */
+
+        double mn; // Mn, the measurement result of the neighbouring cell
+        double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
+        double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
+        double mp; // Mp, the measurement result of the PCell
+        double ofp = measObjectEutra.offsetFreq; // Ofp, the frequency specific offset of the primary frequency
+        double ocp = 0.0; // Ocp, the cell specific offset of the PCell
+        // Off, the offset parameter for this event.
+        double off = EutranMeasurementMapping::IeValue2ActualA3Offset (reportConfigEutra.a3Offset);
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            mp = m_storedMeasValues[m_cellId].rsrp;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            mp = m_storedMeasValues[m_cellId].rsrq;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
+
+        for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+             storedMeasIt != m_storedMeasValues.end ();
+             ++storedMeasIt)
+          {
+            uint16_t cellId = storedMeasIt->first;
+            if (cellId == m_cellId)
+              {
+                continue;
+              }
+
+            switch (reportConfigEutra.triggerQuantity)
+              {
+              case LteRrcSap::ReportConfigEutra::RSRP:
+                mn = storedMeasIt->second.rsrp;
+                break;
+              case LteRrcSap::ReportConfigEutra::RSRQ:
+                mn = storedMeasIt->second.rsrq;
+                break;
+              default:
+                NS_FATAL_ERROR ("unsupported triggerQuantity");
+                break;
+              }
+
+            bool hasTriggered = isMeasIdInReportList
+              && (measReportIt->second.cellsTriggeredList.find (cellId)
+                  != measReportIt->second.cellsTriggeredList.end ());
+
+            // Inequality A3-1 (Entering condition): Mn + Ofn + Ocn - Hys > Mp + Ofp + Ocp + Off
+            bool entryCond = mn + ofn + ocn - hys > mp + ofp + ocp + off;
+
+            if (entryCond)
+              {
+                if (!hasTriggered)
+                  {
+                    concernedCellsEntry.push_back (cellId);
+                    eventEntryCondApplicable = true;
+                  }
+              }
+            else if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelEnteringTrigger (measId, cellId);
+              }
+
+            // Inequality A3-2 (Leaving condition): Mn + Ofn + Ocn + Hys < Mp + Ofp + Ocp + Off
+            bool leavingCond = mn + ofn + ocn + hys < mp + ofp + ocp + off;
+
+            if (leavingCond)
+              {
+                if (hasTriggered)
+                  {
+                    concernedCellsLeaving.push_back (cellId);
+                    eventLeavingCondApplicable = true;
+                  }
+              }
+            else if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelLeavingTrigger (measId, cellId);
+              }
+
+            NS_LOG_LOGIC (this << " event A3: neighbor cell " << cellId
+                               << " mn=" << mn << " mp=" << mp << " offset=" << off
+                               << " entryCond=" << entryCond
+                               << " leavingCond=" << leavingCond);
+
+          } // end of for (storedMeasIt)
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A3
+
+      break;
+
+    case LteRrcSap::ReportConfigEutra::EVENT_A4:
+      {
+        /*
+         * Event A4 (Neighbour becomes better than threshold)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.5
+         */
+
+        double mn; // Mn, the measurement result of the neighbouring cell
+        double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
+        double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
+        double thresh; // Thresh, the threshold parameter for this event
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            thresh = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            thresh = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
+
+        for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+             storedMeasIt != m_storedMeasValues.end ();
+             ++storedMeasIt)
+          {
+            uint16_t cellId = storedMeasIt->first;
+            if (cellId == m_cellId)
+              {
+                continue;
+              }
+
+            switch (reportConfigEutra.triggerQuantity)
+              {
+              case LteRrcSap::ReportConfigEutra::RSRP:
+                mn = storedMeasIt->second.rsrp;
+                break;
+              case LteRrcSap::ReportConfigEutra::RSRQ:
+                mn = storedMeasIt->second.rsrq;
+                break;
+              default:
+                NS_FATAL_ERROR ("unsupported triggerQuantity");
+                break;
+              }
+
+            bool hasTriggered = isMeasIdInReportList
+              && (measReportIt->second.cellsTriggeredList.find (cellId)
+                  != measReportIt->second.cellsTriggeredList.end ());
+
+            // Inequality A4-1 (Entering condition): Mn + Ofn + Ocn - Hys > Thresh
+            bool entryCond = mn + ofn + ocn - hys > thresh;
+
+            if (entryCond)
+              {
+                if (!hasTriggered)
+                  {
+                    concernedCellsEntry.push_back (cellId);
+                    eventEntryCondApplicable = true;
+                  }
+              }
+            else if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelEnteringTrigger (measId, cellId);
+              }
+
+            // Inequality A4-2 (Leaving condition): Mn + Ofn + Ocn + Hys < Thresh
+            bool leavingCond = mn + ofn + ocn + hys < thresh;
+
+            if (leavingCond)
+              {
+                if (hasTriggered)
+                  {
+                    concernedCellsLeaving.push_back (cellId);
+                    eventLeavingCondApplicable = true;
+                  }
+              }
+            else if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelLeavingTrigger (measId, cellId);
+              }
+
+            NS_LOG_LOGIC (this << " event A4: neighbor cell " << cellId
+                               << " mn=" << mn << " thresh=" << thresh
+                               << " entryCond=" << entryCond
+                               << " leavingCond=" << leavingCond);
+
+          } // end of for (storedMeasIt)
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A4
+
+      break;
+
+    case LteRrcSap::ReportConfigEutra::EVENT_A5:
+      {
+        /*
+         * Event A5 (PCell becomes worse than threshold1 and neighbour
+         * becomes better than threshold2)
+         * Please refer to 3GPP TS 36.331 Section 5.5.4.6
+         */
+
+        double mp; // Mp, the measurement result of the PCell
+        double mn; // Mn, the measurement result of the neighbouring cell
+        double ofn = measObjectEutra.offsetFreq; // Ofn, the frequency specific offset of the frequency of the
+        double ocn = 0.0; // Ocn, the cell specific offset of the neighbour cell
+        double thresh1; // Thresh1, the threshold parameter for this event
+        double thresh2; // Thresh2, the threshold parameter for this event
+        // Hys, the hysteresis parameter for this event.
+        double hys = EutranMeasurementMapping::IeValue2ActualHysteresis (reportConfigEutra.hysteresis);
+
+        switch (reportConfigEutra.triggerQuantity)
+          {
+          case LteRrcSap::ReportConfigEutra::RSRP:
+            mp = m_storedMeasValues[m_cellId].rsrp;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            NS_ASSERT (reportConfigEutra.threshold2.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRP);
+            thresh1 = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold1.range);
+            thresh2 = EutranMeasurementMapping::RsrpRange2Dbm (reportConfigEutra.threshold2.range);
+            break;
+          case LteRrcSap::ReportConfigEutra::RSRQ:
+            mp = m_storedMeasValues[m_cellId].rsrq;
+            NS_ASSERT (reportConfigEutra.threshold1.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            NS_ASSERT (reportConfigEutra.threshold2.choice
+                       == LteRrcSap::ThresholdEutra::THRESHOLD_RSRQ);
+            thresh1 = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold1.range);
+            thresh2 = EutranMeasurementMapping::RsrqRange2Db (reportConfigEutra.threshold2.range);
+            break;
+          default:
+            NS_FATAL_ERROR ("unsupported triggerQuantity");
+            break;
+          }
+
+        // Inequality A5-1 (Entering condition 1): Mp + Hys < Thresh1
+        bool entryCond = mp + hys < thresh1;
+
+        if (entryCond)
+          {
+            for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+                 storedMeasIt != m_storedMeasValues.end ();
+                 ++storedMeasIt)
+              {
+                uint16_t cellId = storedMeasIt->first;
+                if (cellId == m_cellId)
+                  {
+                    continue;
+                  }
+
+                switch (reportConfigEutra.triggerQuantity)
+                  {
+                  case LteRrcSap::ReportConfigEutra::RSRP:
+                    mn = storedMeasIt->second.rsrp;
+                    break;
+                  case LteRrcSap::ReportConfigEutra::RSRQ:
+                    mn = storedMeasIt->second.rsrq;
+                    break;
+                  default:
+                    NS_FATAL_ERROR ("unsupported triggerQuantity");
+                    break;
+                  }
+
+                bool hasTriggered = isMeasIdInReportList
+                  && (measReportIt->second.cellsTriggeredList.find (cellId)
+                      != measReportIt->second.cellsTriggeredList.end ());
+
+                // Inequality A5-2 (Entering condition 2): Mn + Ofn + Ocn - Hys > Thresh2
+
+                entryCond = mn + ofn + ocn - hys > thresh2;
+
+                if (entryCond)
+                  {
+                    if (!hasTriggered)
+                      {
+                        concernedCellsEntry.push_back (cellId);
+                        eventEntryCondApplicable = true;
+                      }
+                  }
+                else if (reportConfigEutra.timeToTrigger > 0)
+                  {
+                    CancelEnteringTrigger (measId, cellId);
+                  }
+
+                NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
+                                   << " mn=" << mn << " mp=" << mp
+                                   << " thresh2=" << thresh2
+                                   << " thresh1=" << thresh1
+                                   << " entryCond=" << entryCond);
+
+              } // end of for (storedMeasIt)
+
+          } // end of if (entryCond)
+        else
+          {
+            NS_LOG_LOGIC (this << " event A5: serving cell " << m_cellId
+                               << " mp=" << mp << " thresh1=" << thresh1
+                               << " entryCond=" << entryCond);
+
+            if (reportConfigEutra.timeToTrigger > 0)
+              {
+                CancelEnteringTrigger (measId);
+              }
+          }
+
+        if (isMeasIdInReportList)
+          {
+            // Inequality A5-3 (Leaving condition 1): Mp - Hys > Thresh1
+            bool leavingCond = mp - hys > thresh1;
+
+            if (leavingCond)
+              {
+                if (reportConfigEutra.timeToTrigger == 0)
+                  {
+                    // leaving condition #2 does not have to be checked
+
+                    for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+                         storedMeasIt != m_storedMeasValues.end ();
+                         ++storedMeasIt)
+                      {
+                        uint16_t cellId = storedMeasIt->first;
+                        if (cellId == m_cellId)
+                          {
+                            continue;
+                          }
+
+                        if (measReportIt->second.cellsTriggeredList.find (cellId)
+                            != measReportIt->second.cellsTriggeredList.end ())
+                          {
+                            concernedCellsLeaving.push_back (cellId);
+                            eventLeavingCondApplicable = true;
+                          }
+                      }
+                  } // end of if (reportConfigEutra.timeToTrigger == 0)
+                else
+                  {
+                    // leaving condition #2 has to be checked to cancel time-to-trigger
+
+                    for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+                         storedMeasIt != m_storedMeasValues.end ();
+                         ++storedMeasIt)
+                      {
+                        uint16_t cellId = storedMeasIt->first;
+                        if (cellId == m_cellId)
+                          {
+                            continue;
+                          }
+
+                        if (measReportIt->second.cellsTriggeredList.find (cellId)
+                            != measReportIt->second.cellsTriggeredList.end ())
+                          {
+                            switch (reportConfigEutra.triggerQuantity)
+                              {
+                              case LteRrcSap::ReportConfigEutra::RSRP:
+                                mn = storedMeasIt->second.rsrp;
+                                break;
+                              case LteRrcSap::ReportConfigEutra::RSRQ:
+                                mn = storedMeasIt->second.rsrq;
+                                break;
+                              default:
+                                NS_FATAL_ERROR ("unsupported triggerQuantity");
+                                break;
+                              }
+
+                            // Inequality A5-4 (Leaving condition 2): Mn + Ofn + Ocn + Hys < Thresh2
+
+                            leavingCond = mn + ofn + ocn + hys < thresh2;
+
+                            if (!leavingCond)
+                              {
+                                CancelLeavingTrigger (measId, cellId);
+                              }
+
+                            /*
+                             * Whatever the result of leaving condition #2, this
+                             * cell is still "in", because leaving condition #1
+                             * is already true.
+                             */
+                            concernedCellsLeaving.push_back (cellId);
+                            eventLeavingCondApplicable = true;
+
+                            NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
+                                               << " mn=" << mn << " mp=" << mp
+                                               << " thresh2=" << thresh2
+                                               << " thresh1=" << thresh1
+                                               << " leavingCond=" << leavingCond);
+
+                          } // end of if (measReportIt->second.cellsTriggeredList.find (cellId)
+                            //            != measReportIt->second.cellsTriggeredList.end ())
+
+                      } // end of for (storedMeasIt)
+
+                  } // end of else of if (reportConfigEutra.timeToTrigger == 0)
+
+                NS_LOG_LOGIC (this << " event A5: serving cell " << m_cellId
+                                   << " mp=" << mp << " thresh1=" << thresh1
+                                   << " leavingCond=" << leavingCond);
+
+              } // end of if (leavingCond)
+            else
+              {
+                if (reportConfigEutra.timeToTrigger > 0)
+                  {
+                    CancelLeavingTrigger (measId);
+                  }
+
+                // check leaving condition #2
+
+                for (std::map<uint16_t, MeasValues>::iterator storedMeasIt = m_storedMeasValues.begin ();
+                     storedMeasIt != m_storedMeasValues.end ();
+                     ++storedMeasIt)
+                  {
+                    uint16_t cellId = storedMeasIt->first;
+                    if (cellId == m_cellId)
+                      {
+                        continue;
+                      }
+
+                    if (measReportIt->second.cellsTriggeredList.find (cellId)
+                        != measReportIt->second.cellsTriggeredList.end ())
+                      {
+                        switch (reportConfigEutra.triggerQuantity)
+                          {
+                          case LteRrcSap::ReportConfigEutra::RSRP:
+                            mn = storedMeasIt->second.rsrp;
+                            break;
+                          case LteRrcSap::ReportConfigEutra::RSRQ:
+                            mn = storedMeasIt->second.rsrq;
+                            break;
+                          default:
+                            NS_FATAL_ERROR ("unsupported triggerQuantity");
+                            break;
+                          }
+
+                        // Inequality A5-4 (Leaving condition 2): Mn + Ofn + Ocn + Hys < Thresh2
+                        leavingCond = mn + ofn + ocn + hys < thresh2;
+
+                        if (leavingCond)
+                          {
+                            concernedCellsLeaving.push_back (cellId);
+                            eventLeavingCondApplicable = true;
+                          }
+
+                        NS_LOG_LOGIC (this << " event A5: neighbor cell " << cellId
+                                           << " mn=" << mn << " mp=" << mp
+                                           << " thresh2=" << thresh2
+                                           << " thresh1=" << thresh1
+                                           << " leavingCond=" << leavingCond);
+
+                      } // end of if (measReportIt->second.cellsTriggeredList.find (cellId)
+                        //            != measReportIt->second.cellsTriggeredList.end ())
+
+                  } // end of for (storedMeasIt)
+
+              } // end of else of if (leavingCond)
+
+          } // end of if (isMeasIdInReportList)
+
+      } // end of case LteRrcSap::ReportConfigEutra::EVENT_A5
+
+      break;
+
+    default:
+      NS_FATAL_ERROR ("unsupported eventId " << reportConfigEutra.eventId);
+      break;
+
+    } // switch (event type)
+
+  NS_LOG_LOGIC (this << " eventEntryCondApplicable=" << eventEntryCondApplicable
+                     << " eventLeavingCondApplicable=" << eventLeavingCondApplicable);
+
+  if (eventEntryCondApplicable)
+    {
+      if (reportConfigEutra.timeToTrigger == 0)
+        {
+          VarMeasReportListAdd (measId, concernedCellsEntry);
+        }
+      else
+        {
+          PendingTrigger_t t;
+          t.measId = measId;
+          t.concernedCells = concernedCellsEntry;
+          t.timer = Simulator::Schedule (MilliSeconds (reportConfigEutra.timeToTrigger),
+                                         &LteUeRrc::VarMeasReportListAdd, this,
+                                         measId, concernedCellsEntry);
+          std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
+            enteringTriggerIt = m_enteringTriggerQueue.find (measId);
+          NS_ASSERT (enteringTriggerIt != m_enteringTriggerQueue.end ());
+          enteringTriggerIt->second.push_back (t);
+        }
+    }
+
+  if (eventLeavingCondApplicable)
+    {
+      // reportOnLeave will only be set when eventId = eventA3
+      bool reportOnLeave = (reportConfigEutra.eventId == LteRrcSap::ReportConfigEutra::EVENT_A3)
+        && reportConfigEutra.reportOnLeave;
+
+      if (reportConfigEutra.timeToTrigger == 0)
+        {
+          VarMeasReportListErase (measId, concernedCellsLeaving, reportOnLeave);
+        }
+      else
+        {
+          PendingTrigger_t t;
+          t.measId = measId;
+          t.concernedCells = concernedCellsLeaving;
+          t.timer = Simulator::Schedule (MilliSeconds (reportConfigEutra.timeToTrigger),
+                                         &LteUeRrc::VarMeasReportListErase, this,
+                                         measId, concernedCellsLeaving, reportOnLeave);
+          std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
+            leavingTriggerIt = m_leavingTriggerQueue.find (measId);
+          NS_ASSERT (leavingTriggerIt != m_leavingTriggerQueue.end ());
+          leavingTriggerIt->second.push_back (t);
+        }
+    }
+
+} // end of void LteUeRrc::MeasurementReportTriggering (uint8_t measId)
+
+void
+LteUeRrc::CancelEnteringTrigger (uint8_t measId)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) measId);
+
+  std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
+    it1 = m_enteringTriggerQueue.find (measId);
+  NS_ASSERT (it1 != m_enteringTriggerQueue.end ());
+
+  if (!it1->second.empty ())
+    {
+      std::list<PendingTrigger_t>::iterator it2;
+      for (it2 = it1->second.begin (); it2 != it1->second.end (); ++it2)
+        {
+          NS_ASSERT (it2->measId == measId);
+          NS_LOG_LOGIC (this << " canceling entering time-to-trigger event at "
+                             << Simulator::GetDelayLeft (it2->timer).GetSeconds ());
+          Simulator::Cancel (it2->timer);
+        }
+
+      it1->second.clear ();
+    }
+}
+
+void
+LteUeRrc::CancelEnteringTrigger (uint8_t measId, uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) measId << cellId);
+
+  std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
+    it1 = m_enteringTriggerQueue.find (measId);
+  NS_ASSERT (it1 != m_enteringTriggerQueue.end ());
+
+  std::list<PendingTrigger_t>::iterator it2 = it1->second.begin ();
+  while (it2 != it1->second.end ())
+    {
+      NS_ASSERT (it2->measId == measId);
+
+      ConcernedCells_t::iterator it3;
+      for (it3 = it2->concernedCells.begin ();
+           it3 != it2->concernedCells.end (); ++it3)
+        {
+          if (*it3 == cellId)
+            {
+              it3 = it2->concernedCells.erase (it3);
+            }
+        }
+
+      if (it2->concernedCells.empty ())
+        {
+          NS_LOG_LOGIC (this << " canceling entering time-to-trigger event at "
+                             << Simulator::GetDelayLeft (it2->timer).GetSeconds ());
+          Simulator::Cancel (it2->timer);
+          it2 = it1->second.erase (it2);
+        }
+      else
+        {
+          it2++;
+        }
+    }
+}
+
+void
+LteUeRrc::CancelLeavingTrigger (uint8_t measId)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) measId);
+
+  std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
+    it1 = m_leavingTriggerQueue.find (measId);
+  NS_ASSERT (it1 != m_leavingTriggerQueue.end ());
+
+  if (!it1->second.empty ())
+    {
+      std::list<PendingTrigger_t>::iterator it2;
+      for (it2 = it1->second.begin (); it2 != it1->second.end (); ++it2)
+        {
+          NS_ASSERT (it2->measId == measId);
+          NS_LOG_LOGIC (this << " canceling leaving time-to-trigger event at "
+                             << Simulator::GetDelayLeft (it2->timer).GetSeconds ());
+          Simulator::Cancel (it2->timer);
+        }
+
+      it1->second.clear ();
+    }
+}
+
+void
+LteUeRrc::CancelLeavingTrigger (uint8_t measId, uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) measId << cellId);
+
+  std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
+    it1 = m_leavingTriggerQueue.find (measId);
+  NS_ASSERT (it1 != m_leavingTriggerQueue.end ());
+
+  std::list<PendingTrigger_t>::iterator it2 = it1->second.begin ();
+  while (it2 != it1->second.end ())
+    {
+      NS_ASSERT (it2->measId == measId);
+
+      ConcernedCells_t::iterator it3;
+      for (it3 = it2->concernedCells.begin ();
+           it3 != it2->concernedCells.end (); ++it3)
+        {
+          if (*it3 == cellId)
+            {
+              it3 = it2->concernedCells.erase (it3);
+            }
+        }
+
+      if (it2->concernedCells.empty ())
+        {
+          NS_LOG_LOGIC (this << " canceling leaving time-to-trigger event at "
+                             << Simulator::GetDelayLeft (it2->timer).GetSeconds ());
+          Simulator::Cancel (it2->timer);
+          it2 = it1->second.erase (it2);
+        }
+      else
+        {
+          it2++;
+        }
+    }
+}
+
+void
+LteUeRrc::VarMeasReportListAdd (uint8_t measId, ConcernedCells_t enteringCells)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) measId);
+  NS_ASSERT (!enteringCells.empty ());
+
+  std::map<uint8_t, VarMeasReport>::iterator
+    measReportIt = m_varMeasReportList.find (measId);
+
+  if (measReportIt == m_varMeasReportList.end ())
+    {
+      VarMeasReport r;
+      r.measId = measId;
+      std::pair<uint8_t, VarMeasReport> val (measId, r);
+      std::pair<std::map<uint8_t, VarMeasReport>::iterator, bool>
+        ret = m_varMeasReportList.insert (val);
+      NS_ASSERT_MSG (ret.second == true, "element already existed");
+      measReportIt = ret.first;
+    }
+
+  NS_ASSERT (measReportIt != m_varMeasReportList.end ());
+
+  for (ConcernedCells_t::const_iterator it = enteringCells.begin ();
+       it != enteringCells.end ();
+       ++it)
+    {
+      measReportIt->second.cellsTriggeredList.insert (*it);
+    }
+
+  NS_ASSERT (!measReportIt->second.cellsTriggeredList.empty ());
+  measReportIt->second.numberOfReportsSent = 0;
+  measReportIt->second.periodicReportTimer
+    = Simulator::Schedule (UE_MEASUREMENT_REPORT_DELAY,
+                           &LteUeRrc::SendMeasurementReport,
+                           this, measId);
+
+  std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
+    enteringTriggerIt = m_enteringTriggerQueue.find (measId);
+  NS_ASSERT (enteringTriggerIt != m_enteringTriggerQueue.end ());
+  if (!enteringTriggerIt->second.empty ())
+    {
+      /*
+       * Assumptions at this point:
+       *  - the call to this function was delayed by time-to-trigger;
+       *  - the time-to-trigger delay is fixed (not adaptive/dynamic); and
+       *  - the first element in the list is associated with this function call.
+       */
+      enteringTriggerIt->second.pop_front ();
+
+      if (!enteringTriggerIt->second.empty ())
+        {
+          /*
+           * To prevent the same set of cells triggering again in the future,
+           * we clean up the time-to-trigger queue. This case might occur when
+           * time-to-trigger > 200 ms.
+           */
+          for (ConcernedCells_t::const_iterator it = enteringCells.begin ();
+               it != enteringCells.end (); ++it)
+            {
+              CancelEnteringTrigger (measId, *it);
+            }
+        }
+
+    } // end of if (!enteringTriggerIt->second.empty ())
+
+} // end of LteUeRrc::VarMeasReportListAdd
+
+void
+LteUeRrc::VarMeasReportListErase (uint8_t measId, ConcernedCells_t leavingCells,
+                                  bool reportOnLeave)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) measId);
+  NS_ASSERT (!leavingCells.empty ());
+
+  std::map<uint8_t, VarMeasReport>::iterator
+    measReportIt = m_varMeasReportList.find (measId);
+  NS_ASSERT (measReportIt != m_varMeasReportList.end ());
+
+  for (ConcernedCells_t::const_iterator it = leavingCells.begin ();
+       it != leavingCells.end ();
+       ++it)
+    {
+      measReportIt->second.cellsTriggeredList.erase (*it);
+    }
+
+  if (reportOnLeave)
+    {
+      // runs immediately without UE_MEASUREMENT_REPORT_DELAY
+      SendMeasurementReport (measId);
+    }
+
+  if (measReportIt->second.cellsTriggeredList.empty ())
+    {
+      measReportIt->second.periodicReportTimer.Cancel ();
+      m_varMeasReportList.erase (measReportIt);
+    }
+
+  std::map<uint8_t, std::list<PendingTrigger_t> >::iterator
+    leavingTriggerIt = m_leavingTriggerQueue.find (measId);
+  NS_ASSERT (leavingTriggerIt != m_leavingTriggerQueue.end ());
+  if (!leavingTriggerIt->second.empty ())
+    {
+      /*
+       * Assumptions at this point:
+       *  - the call to this function was delayed by time-to-trigger; and
+       *  - the time-to-trigger delay is fixed (not adaptive/dynamic); and
+       *  - the first element in the list is associated with this function call.
+       */
+      leavingTriggerIt->second.pop_front ();
+
+      if (!leavingTriggerIt->second.empty ())
+        {
+          /*
+           * To prevent the same set of cells triggering again in the future,
+           * we clean up the time-to-trigger queue. This case might occur when
+           * time-to-trigger > 200 ms.
+           */
+          for (ConcernedCells_t::const_iterator it = leavingCells.begin ();
+               it != leavingCells.end (); ++it)
+            {
+              CancelLeavingTrigger (measId, *it);
+            }
+        }
+
+    } // end of if (!leavingTriggerIt->second.empty ())
+
+} // end of LteUeRrc::VarMeasReportListErase
+
+void
+LteUeRrc::VarMeasReportListClear (uint8_t measId)
+{
+  NS_LOG_FUNCTION (this << (uint16_t) measId);
+
+  // remove the measurement reporting entry for this measId from the VarMeasReportList
+  std::map<uint8_t, VarMeasReport>::iterator
+    measReportIt = m_varMeasReportList.find (measId);
+  if (measReportIt != m_varMeasReportList.end ())
+    {
+      NS_LOG_LOGIC (this << " deleting existing report for measId " << (uint16_t) measId);
+      measReportIt->second.periodicReportTimer.Cancel ();
+      m_varMeasReportList.erase (measReportIt);
+    }
+
+  CancelEnteringTrigger (measId);
+  CancelLeavingTrigger (measId);
+}
+
 void 
 LteUeRrc::SendMeasurementReport (uint8_t measId)
 {
-  NS_LOG_FUNCTION (this << (uint32_t) measId);
+  NS_LOG_FUNCTION (this << (uint16_t) measId);
   //  3GPP TS 36.331 section 5.5.5 Measurement reporting
 
   std::map<uint8_t, LteRrcSap::MeasIdToAddMod>::iterator 
     measIdIt = m_varMeasConfig.measIdList.find (measId);
   NS_ASSERT (measIdIt != m_varMeasConfig.measIdList.end ());
-  
+
   std::map<uint8_t, LteRrcSap::ReportConfigToAddMod>::iterator 
     reportConfigIt = m_varMeasConfig.reportConfigList.find (measIdIt->second.reportConfigId);
   NS_ASSERT (reportConfigIt != m_varMeasConfig.reportConfigList.end ());
@@ -1432,7 +2560,7 @@
   LteRrcSap::MeasurementReport measurementReport;
   LteRrcSap::MeasResults& measResults = measurementReport.measResults;
   measResults.measId = measId;
-  
+
   std::map<uint16_t, MeasValues>::iterator servingMeasIt = m_storedMeasValues.find (m_cellId);
   NS_ASSERT (servingMeasIt != m_storedMeasValues.end ());
   measResults.rsrpResult = EutranMeasurementMapping::Dbm2RsrpRange (servingMeasIt->second.rsrp);
@@ -1450,9 +2578,7 @@
     {
       if (!(measReportIt->second.cellsTriggeredList.empty ()))
         {
-          measResults.haveMeasResultNeighCells = true;
-          
-          std::multimap<double, uint16_t> sortedNeighCells;         
+          std::multimap<double, uint16_t> sortedNeighCells;
           for (std::set<uint16_t>::iterator cellsTriggeredIt = measReportIt->second.cellsTriggeredList.begin ();
                cellsTriggeredIt != measReportIt->second.cellsTriggeredList.end ();
                ++cellsTriggeredIt)
@@ -1461,7 +2587,7 @@
               if (cellId != m_cellId)
                 {
                   std::map<uint16_t, MeasValues>::iterator neighborMeasIt = m_storedMeasValues.find (cellId);
-                  double triggerValue;             
+                  double triggerValue;
                   switch (reportConfigEutra.triggerQuantity)
                     {
                     case LteRrcSap::ReportConfigEutra::RSRP:
@@ -1473,11 +2599,11 @@
                     default:
                       NS_FATAL_ERROR ("unsupported triggerQuantity");
                       break;
-                    }  
+                    }
                   sortedNeighCells.insert (std::pair<double, uint16_t> (triggerValue, cellId));
                 }
             }
-          
+
           std::multimap<double, uint16_t>::reverse_iterator sortedNeighCellsIt;
           uint32_t count;
           for (sortedNeighCellsIt = sortedNeighCells.rbegin (), count = 0;
@@ -1486,49 +2612,90 @@
             {
               uint16_t cellId = sortedNeighCellsIt->second;
               std::map<uint16_t, MeasValues>::iterator neighborMeasIt = m_storedMeasValues.find (cellId);
-              NS_ASSERT (neighborMeasIt != m_storedMeasValues.end ());            
+              NS_ASSERT (neighborMeasIt != m_storedMeasValues.end ());
               LteRrcSap::MeasResultEutra measResultEutra;
               measResultEutra.physCellId = cellId;
               measResultEutra.haveCgiInfo = false;
               measResultEutra.haveRsrpResult = true;
               measResultEutra.rsrpResult = EutranMeasurementMapping::Dbm2RsrpRange (neighborMeasIt->second.rsrp);
               measResultEutra.haveRsrqResult = true;
-              measResultEutra.rsrqResult = EutranMeasurementMapping::Db2RsrqRange (neighborMeasIt->second.rsrq);           
+              measResultEutra.rsrqResult = EutranMeasurementMapping::Db2RsrqRange (neighborMeasIt->second.rsrq);
               NS_LOG_INFO (this << " reporting neighbor cell " << (uint32_t) measResultEutra.physCellId 
-                           << " RSRP " << (uint32_t) measResultEutra.rsrpResult 
-                           << " (" << neighborMeasIt->second.rsrp << " dBm) "
-                           << " RSRQ " << (uint32_t) measResultEutra.rsrqResult 
-                           << " (" << neighborMeasIt->second.rsrq << " dB)"); 
+                                << " RSRP " << (uint32_t) measResultEutra.rsrpResult
+                                << " (" << neighborMeasIt->second.rsrp << " dBm)"
+                                << " RSRQ " << (uint32_t) measResultEutra.rsrqResult
+                                << " (" << neighborMeasIt->second.rsrq << " dB)");
               measResults.measResultListEutra.push_back (measResultEutra);
+              measResults.haveMeasResultNeighCells = true;
             }
         }
       else
         {
           NS_LOG_WARN (this << " cellsTriggeredList is empty");
         }
+
+      /*
+       * The current LteRrcSap implementation is broken in that it does not
+       * allow for infinite values of reportAmount, which is probably the most
+       * reasonable setting. So we just always assume infinite reportAmount.
+       */
       measReportIt->second.numberOfReportsSent++;
       measReportIt->second.periodicReportTimer.Cancel ();
-            
-      // the current LteRrcSap implementation is broken in that it does not allow for infinite values
-      // which is probably the most reasonable setting. So we just assume infinite reportAmount
-      // if (measReportIt->numberOfReportsSent < reportConfigEutra.reportAmount)
-      uint32_t intervalMs;
+
+      Time reportInterval;
       switch (reportConfigEutra.reportInterval)
         {
+        case LteRrcSap::ReportConfigEutra::MS120:
+          reportInterval = MilliSeconds (120);
+          break;
+        case LteRrcSap::ReportConfigEutra::MS240:
+          reportInterval = MilliSeconds (240);
+          break;
         case LteRrcSap::ReportConfigEutra::MS480:
-          intervalMs = 480;
+          reportInterval = MilliSeconds (480);
+          break;
+        case LteRrcSap::ReportConfigEutra::MS640:
+          reportInterval = MilliSeconds (640);
+          break;
+        case LteRrcSap::ReportConfigEutra::MS1024:
+          reportInterval = MilliSeconds (1024);
+          break;
+        case LteRrcSap::ReportConfigEutra::MS2048:
+          reportInterval = MilliSeconds (2048);
+          break;
+        case LteRrcSap::ReportConfigEutra::MS5120:
+          reportInterval = MilliSeconds (5120);
+          break;
+        case LteRrcSap::ReportConfigEutra::MS10240:
+          reportInterval = MilliSeconds (10240);
+          break;
+        case LteRrcSap::ReportConfigEutra::MIN1:
+          reportInterval = Seconds (60);
+          break;
+        case LteRrcSap::ReportConfigEutra::MIN6:
+          reportInterval = Seconds (360);
+          break;
+        case LteRrcSap::ReportConfigEutra::MIN12:
+          reportInterval = Seconds (720);
+          break;
+        case LteRrcSap::ReportConfigEutra::MIN30:
+          reportInterval = Seconds (1800);
+          break;
+        case LteRrcSap::ReportConfigEutra::MIN60:
+          reportInterval = Seconds (3600);
           break;
-          
         default:
-          NS_FATAL_ERROR ("unsupported reportInterval");
-          break;          
+          NS_FATAL_ERROR ("Unsupported reportInterval " << (uint16_t) reportConfigEutra.reportInterval);
+          break;
         }
+
+      // schedule the next measurement reporting
       measReportIt->second.periodicReportTimer 
-        = Simulator::Schedule (MilliSeconds (intervalMs), 
+        = Simulator::Schedule (reportInterval,
                                &LteUeRrc::SendMeasurementReport,
-                               this,
-                               measId);
+                               this, measId);
 
+      // send the measurement report to eNodeB
       m_rrcSapUser->SendMeasurementReport (measurementReport);
     } 
 }
@@ -1536,9 +2703,11 @@
 void 
 LteUeRrc::StartConnection ()
 {
-  NS_LOG_FUNCTION (this);
-  m_connectionPending = false;
-  SwitchToState (IDLE_RANDOM_ACCESS);        
+  NS_LOG_FUNCTION (this << m_imsi);
+  NS_ASSERT (m_hasReceivedMib);
+  NS_ASSERT (m_hasReceivedSib2);
+  m_connectionPending = false; // reset the flag
+  SwitchToState (IDLE_RANDOM_ACCESS);
   m_cmacSapProvider->StartContentionBasedRandomAccessProcedure ();
 }
 
@@ -1578,49 +2747,55 @@
 void 
 LteUeRrc::SwitchToState (State newState)
 {
-  NS_LOG_FUNCTION (this << newState);
+  NS_LOG_FUNCTION (this << ToString (newState));
   State oldState = m_state;
   m_state = newState;
-  NS_LOG_INFO ("IMSI " << m_imsi << " RNTI " << m_rnti << " UeRrc " << ToString (oldState) << " --> " << ToString (newState));
+  NS_LOG_INFO (this << "IMSI " << m_imsi << " RNTI " << m_rnti << " UeRrc "
+                    << ToString (oldState) << " --> " << ToString (newState));
   m_stateTransitionTrace (m_imsi, m_cellId, m_rnti, oldState, newState);
 
   switch (newState)
     {
-    case IDLE_CELL_SELECTION:
+    case IDLE_START:
+      NS_FATAL_ERROR ("cannot switch to an initial state");
       break;
 
-    case IDLE_WAIT_SYSTEM_INFO:
+    case IDLE_CELL_SEARCH:
+    case IDLE_WAIT_MIB_SIB1:
+    case IDLE_WAIT_MIB:
+    case IDLE_WAIT_SIB1:
       break;
 
     case IDLE_CAMPED_NORMALLY:
       if (m_connectionPending)
         {
-          StartConnection ();
+          SwitchToState (IDLE_WAIT_SIB2);
         }
       break;
 
-    case IDLE_RANDOM_ACCESS:
+    case IDLE_WAIT_SIB2:
+      if (m_hasReceivedSib2)
+        {
+          NS_ASSERT (m_connectionPending);
+          StartConnection ();
+        }
       break;
 
+    case IDLE_RANDOM_ACCESS:
     case IDLE_CONNECTING:
-      break;
- 
     case CONNECTED_NORMALLY:
-      break;
-
-    case CONNECTED_REESTABLISHING:
-      break;
-
     case CONNECTED_HANDOVER:
+    case CONNECTED_PHY_PROBLEM:
+    case CONNECTED_REESTABLISHING:
       break;
  
     default:
       break;
     }
 }
-  
 
-    
-  
+
+
+
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/lte/model/lte-ue-rrc.h ns-3.19/src/lte/model/lte-ue-rrc.h
--- ns-3.18.1/src/lte/model/lte-ue-rrc.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/lte-ue-rrc.h	2013-12-20 09:44:50.000000000 -0800
@@ -16,6 +16,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Nicola Baldo <nbaldo@cttc.es>
+ *         Budiarto Herman <budiarto.herman@magister.fi>
  */
 
 #ifndef LTE_UE_RRC_H
@@ -35,13 +36,32 @@
 
 namespace ns3 {
 
+
+/**
+ * \brief Artificial delay of UE measurements procedure.
+ *
+ * i.e. the period between the time layer-1-filtered measurements from PHY
+ * layer is received and the earliest time the actual measurement report
+ * submission to the serving cell is invoked.
+ *
+ * This delay exists because of racing condition between several UE measurements
+ * functions which happen to be scheduled at the same time. The delay ensures
+ * that:
+ *  - measurements (e.g., layer-3 filtering) are always performed before
+ *    reporting, thus the latter always use the latest measured RSRP and RSRQ;
+ *    and
+ *  - time-to-trigger check is always performed before the reporting, so there
+ *    would still be chance for it to cancel the reporting if necessary.
+ */
+static const Time UE_MEASUREMENT_REPORT_DELAY = MicroSeconds (1);
+
+
 class LteRlc;
 class LteMacSapProvider;
 class LteUeCmacSapUser;
 class LteUeCmacSapProvider;
 class LteDataRadioBearerInfo;
 class LteSignalingRadioBearerInfo;
-class LteEnbRrc;
 
 /**
  *
@@ -64,17 +84,22 @@
    * 
    */
   enum State
-    {
-      IDLE_CELL_SELECTION = 0,
-      IDLE_WAIT_SYSTEM_INFO,
-      IDLE_CAMPED_NORMALLY,
-      IDLE_RANDOM_ACCESS,
-      IDLE_CONNECTING,
-      CONNECTED_NORMALLY,
-      CONNECTED_REESTABLISHING,
-      CONNECTED_HANDOVER,
-      NUM_STATES
-    };
+  {
+    IDLE_START = 0,
+    IDLE_CELL_SEARCH,
+    IDLE_WAIT_MIB_SIB1,
+    IDLE_WAIT_MIB,
+    IDLE_WAIT_SIB1,
+    IDLE_CAMPED_NORMALLY,
+    IDLE_WAIT_SIB2,
+    IDLE_RANDOM_ACCESS,
+    IDLE_CONNECTING,
+    CONNECTED_NORMALLY,
+    CONNECTED_HANDOVER,
+    CONNECTED_PHY_PROBLEM,
+    CONNECTED_REESTABLISHING,
+    NUM_STATES
+  };
 
 
   /**
@@ -174,8 +199,7 @@
    *
    * \return imsi the unique UE identifier
    */
-  uint64_t GetImsi (void);
-
+  uint64_t GetImsi (void) const;
 
   /**
    *
@@ -183,14 +207,12 @@
    */
   uint16_t GetRnti () const;
 
-
   /**
    *
    * \return the CellId of the attached Enb
    */
   uint16_t GetCellId () const;
 
-
   /** 
    * \return the uplink bandwidth in RBs
    */
@@ -201,7 +223,7 @@
    */
   uint8_t GetDlBandwidth () const;
 
-  /** 
+  /**
    * \return the downlink carrier frequency (EARFCN)
    */
   uint16_t GetDlEarfcn () const;
@@ -211,11 +233,11 @@
    */
   uint16_t GetUlEarfcn () const;
 
-  /** 
-   * 
+  /**
+   *
    * \return the current state
    */
-  State GetState ();
+  State GetState () const;
 
   /** 
    * 
@@ -237,31 +259,210 @@
   void DoNotifyRandomAccessFailed ();
  
   // LTE AS SAP methods
-  void DoForceCampedOnEnb (uint16_t cellId, uint16_t earfcn);
+  void DoSetCsgWhiteList (uint32_t csgId);
+  void DoForceCampedOnEnb (uint16_t cellId, uint16_t dlEarfcn);
+  void DoStartCellSelection (uint16_t dlEarfcn);
   void DoConnect ();
   void DoSendData (Ptr<Packet> packet, uint8_t bid);
   void DoDisconnect ();
 
   // CPHY SAP methods
-  void DoRecvMasterInformationBlock (LteRrcSap::MasterInformationBlock msg);
+  void DoRecvMasterInformationBlock (uint16_t cellId,
+                                     LteRrcSap::MasterInformationBlock msg);
+  void DoRecvSystemInformationBlockType1 (uint16_t cellId,
+                                          LteRrcSap::SystemInformationBlockType1 msg);
   void DoReportUeMeasurements (LteUeCphySapUser::UeMeasurementsParameters params);
 
   // RRC SAP methods
+
+  /// Part of the RRC protocol. Implement the LteUeRrcSapProvider::CompleteSetup interface.
   void DoCompleteSetup (LteUeRrcSapProvider::CompleteSetupParameters params);
-  void DoRecvSystemInformationBlockType1 (LteRrcSap::SystemInformationBlockType1 msg);
+  /// Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvSystemInformation interface.
   void DoRecvSystemInformation (LteRrcSap::SystemInformation msg);
+  /// Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionSetup interface.
   void DoRecvRrcConnectionSetup (LteRrcSap::RrcConnectionSetup msg);
+  /// Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReconfiguration interface.
   void DoRecvRrcConnectionReconfiguration (LteRrcSap::RrcConnectionReconfiguration msg);
+  /// Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReestablishment interface.
   void DoRecvRrcConnectionReestablishment (LteRrcSap::RrcConnectionReestablishment msg);
+  /// Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReestablishmentReject interface.
   void DoRecvRrcConnectionReestablishmentReject (LteRrcSap::RrcConnectionReestablishmentReject msg);
+  /// Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionRelease interface.
   void DoRecvRrcConnectionRelease (LteRrcSap::RrcConnectionRelease msg);
+  /// Part of the RRC protocol. Implement the LteUeRrcSapProvider::RecvRrcConnectionReject interface.
   void DoRecvRrcConnectionReject (LteRrcSap::RrcConnectionReject msg);
 
  
-  // internal methods
-  void ApplyRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated rrcd);
+  // INTERNAL METHODS
+
+  /**
+   * \brief Go through the list of measurement results, choose the one with the
+   *        strongest RSRP, and tell PHY to synchronize to it.
+   *
+   * \warning This function is a part of the *initial cell selection* procedure,
+   *          hence must be only executed during IDLE mode.
+   */
+  void SynchronizeToStrongestCell ();
+
+  /**
+   * \brief Performs cell selection evaluation to the current serving cell.
+   *
+   * \warning This function is a part of the *initial cell selection* procedure,
+   *          hence must be only executed during IDLE mode and specifically
+   *          during the state when the UE just received the first SIB1 message
+   *          from the serving cell.
+   *
+   * This function assumes that the required information for the evaluation
+   * procedure have been readily gathered, such as *measurement results*, MIB,
+   * and SIB1. Please refer to the LTE module's Design Documentation for more
+   * details on the evaluation process.
+   *
+   * If the cell passes the evaluation, the UE will immediately camp to it.
+   * Otherwise, the UE will pick another cell and restart the cell selection
+   * procedure.
+   */
+  void EvaluateCellForSelection ();
+
+  /**
+   * \brief Update the current measurement configuration #m_varMeasConfig.
+   * \param mc measurements to be performed by the UE
+   *
+   * Implements Section 5.5.2 "Measurement configuration" of 3GPP TS 36.331.
+   * The supported subfunctions are:
+   * - Measurement object removal
+   * - Measurement object addition/ modification
+   * - Reporting configuration removal
+   * - Reporting configuration addition/ modification
+   * - Quantity configuration
+   * - Measurement identity removal
+   * - Measurement identity addition/ modification
+   *
+   * The subfunctions that will be invoked are determined by the content of
+   * the given measurement configuration.
+   *
+   * Note the existence of some chain reaction behaviours:
+   * - Removal of measurement object or reporting configuration also removes any
+   *   impacted measurement identities.
+   * - Removal of measurement identity also removes any associated *reporting
+   *   entry* from #m_varMeasReportList.
+   * - Modification to measurement object or reporting configuration also
+   *   removes any reporting entries of the impacted measurement identities
+   *   from #m_varMeasReportList.
+   * - Modification to quantity configuration also removes all existing
+   *   reporting entries from #m_varMeasReportList, regardless of measurement
+   *   identity.
+   *
+   * Some unsupported features:
+   * - List of neighbouring cells
+   * - List of black cells
+   * - CGI reporting
+   * - Periodical reporting configuration
+   * - Measurement gaps
+   * - s-Measure
+   * - Speed-dependent scaling
+   *
+   * \warning There is a possibility that the input argument (of type
+   *          LteRrcSap::MeasConfig) may contain information in fields related
+   *          to the unsupported features. In such case, the function will raise
+   *          an error.
+   *
+   * The measurement configuration given as an argument is typically provided by
+   * the serving eNodeB. It is transmitted through the RRC protocol when the UE
+   * joins the cell, e.g., by connection establishment or by incoming handover.
+   * The information inside the argument can be configured from the eNodeB side,
+   * which would then equally apply to all other UEs attached to the same
+   * eNodeB. See the LTE module's User Documentation for more information on
+   * configuring this.
+   *
+   * \sa LteRrcSap::MeasConfig, LteUeRrc::m_varMeasReportList
+   */
   void ApplyMeasConfig (LteRrcSap::MeasConfig mc);
+
+  /**
+   * \brief Keep the given measurement result as the latest measurement figures,
+   *        to be utilised by UE RRC functions.
+   * \param cellId the cell ID of the measured cell
+   * \param rsrp measured RSRP value to be saved (in dBm)
+   * \param rsrq measured RSRQ value to be saved (in dB)
+   * \param useLayer3Filtering
+   * \todo Remove the useLayer3Filtering argument
+   *
+   * Implements Section 5.5.3.2 "Layer 3 filtering" of 3GPP TS 36.331. *Layer-3
+   * filtering* is applied to the given measurement results before saved to
+   * #m_storedMeasValues. The filtering is however disabled when the UE is in
+   * IDLE mode, i.e., saving unfiltered values.
+   *
+   * Layer-3 filtering is influenced by a filter coefficient, which determines
+   * the strength of the filtering. This coefficient is provided by the active
+   * *quantity configuration* in #m_varMeasConfig, which is configured by the
+   * LteUeRrc::ApplyMeasConfig. Details on how the coefficient works and how to
+   * modify it can be found in LTE module's Design Documentation.
+   *
+   * \sa LteUeRrc::m_storedMeasValues
+   */
+  void SaveUeMeasurements (uint16_t cellId, double rsrp, double rsrq,
+                           bool useLayer3Filtering);
+
+  /**
+   * \brief Evaluate the reporting criteria of a measurement identity and
+   *        invoke some reporting actions based on the result.
+   * \param measId the measurement identity to be evaluated
+   *
+   * Implements Section 5.5.4.1 "Measurement report triggering - General" of
+   * 3GPP TS 36.331. This function take into use the latest measurement results
+   * and evaluate them against the *entering condition* and the *leaving
+   * condition* of the measurement identity's reporting criteria. The evaluation
+   * also take into account other defined criteria, such as *hysteresis* and
+   * *time-to-trigger*.
+   *
+   * The entering and leaving condition to be evaluated are determined by the
+   * *event type* of the measurement identity's reporting criteria. As defined
+   * in LteRrcSap::ReportConfigEutra, there 5 supported events. The gore details
+   * of these events can be found in Section 5.5.4 of 3GPP TS 36.331.
+   *
+   * An applicable entering condition (i.e., the condition evaluates to true)
+   * will insert a new *reporting entry* to #m_varMeasReportList, so
+   * *measurement reports* would be produced and submitted to eNodeB. On the
+   * other hand, an applicable leaving condition will remove the related
+   * reporting entry from #m_varMeasReportList, so submission of related
+   * measurement reports to eNodeB will be suspended.
+   */
+  void MeasurementReportTriggering (uint8_t measId);
+
+  /**
+   * \brief Produce a proper measurement report from the given measurement
+   *        identity's reporting entry in #m_varMeasReportList and then submit
+   *        it to the serving eNodeB.
+   * \param measId the measurement identity which report is to be submitted.
+   *
+   * Implements Section 5.5.5 "Measurement reporting" of 3GPP TS 36.331.
+   * Producing a *measurement report* involves several tasks such as:
+   * - including the measurement results of the serving cell into the report;
+   * - selecting some neighbour cells which triggered the reporting (i.e., those
+   *   in *cellsTriggeredList*) to be included in the report;
+   * - sorting the order of neighbour cells in the report by their RSRP or RSRQ
+   *   measurement results (the highest comes first); and
+   * - ensuring the number of neighbour cells in the report is under the
+   *   *maxReportCells* limit defined by the measurement identity's reporting
+   *   configuration.
+   *
+   * The RSRP and RSRQ measurement results included in the report are expressed
+   * in 3GPP-specified range format. They are converted from dBm and dB units
+   * using EutranMeasurementMapping::Dbm2RsrpRange and
+   * EutranMeasurementMapping::Db2RsrqRange functions.
+   *
+   * Measurement report is submitted to the serving eNodeB through the *RRC
+   * protocol*. The LteUeRrcSapUser::SendMeasurementReport method of the *UE RRC
+   * SAP* facilitates this submission.
+   *
+   * After the submission, the function will repeat itself after a certain
+   * interval. The interval length may vary from 120 ms to 60 minutes and is
+   * determined by the *report interval* parameter specified by the measurement
+   * identity's reporting configuration.
+   */
   void SendMeasurementReport (uint8_t measId);
+
+  void ApplyRadioResourceConfigDedicated (LteRrcSap::RadioResourceConfigDedicated rrcd);
   void StartConnection ();
   void LeaveConnectedMode ();
   void DisposeOldSrb1 ();
@@ -281,7 +482,7 @@
 
   LteMacSapProvider* m_macSapProvider;
   LtePdcpSapUser* m_drbPdcpSapUser;
-  
+
   LteAsSapProvider* m_asSapProvider;
   LteAsSapUser* m_asSapUser;
 
@@ -295,7 +496,7 @@
   Ptr<LteSignalingRadioBearerInfo> m_srb1;
   Ptr<LteSignalingRadioBearerInfo> m_srb1Old;
   std::map <uint8_t, Ptr<LteDataRadioBearerInfo> > m_drbMap;
-  
+
   bool m_useRlcSm;
 
   uint8_t m_lastRrcTransactionIdentifier;
@@ -306,65 +507,296 @@
   uint16_t m_dlEarfcn;  /**< downlink carrier frequency */
   uint16_t m_ulEarfcn;  /**< uplink carrier frequency */
 
-  //             imsi      cellid    rnti   
+  //             imsi      cellId    rnti,     sourceCellId
+  TracedCallback<uint64_t, uint16_t, uint16_t, uint16_t> m_mibReceivedTrace;
+  //             imsi      cellId    rnti,     sourceCellId
+  TracedCallback<uint64_t, uint16_t, uint16_t, uint16_t> m_sib1ReceivedTrace;
+  //             imsi      cellId    rnti
+  TracedCallback<uint64_t, uint16_t, uint16_t> m_sib2ReceivedTrace;
+  //             imsi      cellId    rnti
   TracedCallback<uint64_t, uint16_t, uint16_t, State, State> m_stateTransitionTrace;
-  //             imsi      cellid    rnti   
+  //             imsi      cellId
+  TracedCallback<uint64_t, uint16_t> m_initialCellSelectionEndOkTrace;
+  //             imsi      cellId
+  TracedCallback<uint64_t, uint16_t> m_initialCellSelectionEndErrorTrace;
+  //             imsi      cellId    rnti
   TracedCallback<uint64_t, uint16_t, uint16_t> m_randomAccessSuccessfulTrace;
-  //             imsi      cellid    rnti   
+  //             imsi      cellId    rnti
+  TracedCallback<uint64_t, uint16_t, uint16_t> m_randomAccessErrorTrace;
+  //             imsi      cellId    rnti
   TracedCallback<uint64_t, uint16_t, uint16_t> m_connectionEstablishedTrace;
-  //             imsi      cellid    rnti   
+  //             imsi      cellId    rnti
   TracedCallback<uint64_t, uint16_t, uint16_t> m_connectionReconfigurationTrace;
-  //             imsi      cellid    rnti     targetCellId
+  //             imsi      cellId    rnti      targetCellId
   TracedCallback<uint64_t, uint16_t, uint16_t, uint16_t> m_handoverStartTrace;
-  //             imsi      cellid    rnti    
+  //             imsi      cellId    rnti
   TracedCallback<uint64_t, uint16_t, uint16_t> m_handoverEndOkTrace;
+  //             imsi      cellId    rnti
+  TracedCallback<uint64_t, uint16_t, uint16_t> m_handoverEndErrorTrace;
 
   bool m_connectionPending; /**< true if a connection request by upper layers is pending */
-  bool m_receivedMib; /**< true if MIB was received for the current cell  */
-  bool m_receivedSib2; /**< true if SIB2 was received for the current cell  */
+  bool m_hasReceivedMib; /**< true if MIB was received for the current cell  */
+  bool m_hasReceivedSib1; /**< true if SIB1 was received for the current cell  */
+  bool m_hasReceivedSib2; /**< true if SIB2 was received for the current cell  */
+
+  /// Stored content of the last SIB1 received.
+  LteRrcSap::SystemInformationBlockType1 m_lastSib1;
+
+  /// List of cell ID of acceptable cells for cell selection that have been detected.
+  std::set<uint16_t> m_acceptableCell;
 
+  /// List of CSG ID which this UE entity has access to.
+  uint32_t m_csgWhiteList;
+
+
+  // INTERNAL DATA STRUCTURE RELATED TO UE MEASUREMENTS
 
   /**
-   * Includes the accumulated configuration of the measurements to be
-   * performed by the UE, see TS 36.331 section 7.1. Also note that some
-   * optional variables in the specs are omitted.
-   * 
+   * \brief Includes the accumulated configuration of the measurements to be
+   *        performed by the UE.
+   *
+   * Based on 3GPP TS 36.331 section 7.1. Also note that some optional variables
+   * in the specification are omitted.
    */
   struct VarMeasConfig
   {
-    std::map<uint8_t, LteRrcSap::MeasIdToAddMod>   measIdList;
+    std::map<uint8_t, LteRrcSap::MeasIdToAddMod> measIdList;
     std::map<uint8_t, LteRrcSap::MeasObjectToAddMod> measObjectList;
     std::map<uint8_t, LteRrcSap::ReportConfigToAddMod> reportConfigList;
     LteRrcSap::QuantityConfig quantityConfig; 
     double aRsrp;
     double aRsrq;
   };
-  
+
+  /**
+   * \brief Includes the accumulated configuration of the measurements to be
+   *        performed by the UE.
+   *
+   * Based on 3GPP TS 36.331 section 7.1.
+   */
+  VarMeasConfig m_varMeasConfig;
+
+  /**
+   * \brief Represents a single measurement reporting entry., which includes
+   *        information about a measurement for which the triggering conditions
+   *        have been met.
+   *
+   * Based on 3GPP TS 36.331 section 7.1.
+   */
   struct VarMeasReport
   {
     uint8_t measId;
-    std::set<uint16_t> cellsTriggeredList; // note: only EUTRA is
-                                            // supported
+    std::set<uint16_t> cellsTriggeredList; // note: only E-UTRA is supported.
     uint32_t numberOfReportsSent;
     EventId periodicReportTimer;
   };
-  
-  VarMeasConfig m_varMeasConfig;
-  //       measId
+
+  /**
+   * \brief The list of active reporting entries, indexed by the measurement
+   *        identity which triggered the reporting. Includes information about
+   *        measurements for which the triggering conditions have been met.
+   */
   std::map<uint8_t, VarMeasReport> m_varMeasReportList;
-  
+
+  /**
+   * \brief List of cell IDs which are responsible for a certain trigger.
+   */
+  typedef std::list<uint16_t> ConcernedCells_t;
+
+  /**
+   * \brief Compose a new reporting entry of the given measurement identity,
+   *        insert it into #m_varMeasReportList, and set it up for submission
+   *        to eNodeB.
+   * \param measId the measurement identity which the new reporting entry will
+   *               be based upon
+   * \param enteringCells the cells which are responsible for triggering the
+   *                      reporting (i.e., successfully fulfilling the entering
+   *                      condition of the measurement identity) and will be
+   *                      included in the measurement report.
+   *
+   * \note If an existing reporting entry with the same measurement identity has
+   *       already existed in #m_varMeasReportList, the function will update it
+   *       by adding the entering cells into the existing reporting entry.
+   * \note When time-to-trigger is enabled for this measurement identity, the
+   *       function will also remove the related trigger from the
+   *       #m_enteringTriggerQueue.
+   */
+  void VarMeasReportListAdd (uint8_t measId, ConcernedCells_t enteringCells);
+
+  /**
+   * \brief Remove some cells from an existing reporting entry in
+   *        #m_varMeasReportList.
+   * \param measId the measurement identity to be removed from
+   *               #m_varMeasReportList, must already exists there, otherwise
+   *               an error would be raised
+   * \param leavingCells the cells which are about to be removed
+   * \param reportOnLeave when true, will make the function send one last
+   *                      measurement report to eNodeB before removing it
+   *
+   * \note If a given cell is not found in the reporting entry, the function
+   *       will quietly continue.
+   * \note If the removal has removed all the cells in the reporting entry, the
+   *       function will remove the reporting entry as well.
+   * \note When time-to-trigger is enabled for this measurement identity, the
+   *       function will also remove the related trigger from the
+   *       #m_leavingTriggerQueue.
+   */
+  void VarMeasReportListErase (uint8_t measId, ConcernedCells_t leavingCells,
+                               bool reportOnLeave);
+
+  /**
+   * \brief Remove the reporting entry of the given measurement identity from
+   *        #m_varMeasReportList.
+   * \param measId the measurement identity to be removed from
+   *               #m_varMeasReportList, must already exists there, otherwise
+   *               an error would be raised
+   *
+   * Any events or triggers related with this measurement identity will be
+   * canceled as well.
+   */
+  void VarMeasReportListClear (uint8_t measId);
+
+  /**
+   * \brief Represents a measurement result from a certain cell.
+   */
   struct MeasValues
   {
-    double rsrp;
-    double rsrq;
-    Time timestamp;
+    double rsrp; ///< Measured RSRP in dBm.
+    double rsrq; ///< Measured RSRQ in dB.
+    Time timestamp; ///< Not used. \todo Should be removed.
   };
 
-  /////////cellId
+  /**
+   * \brief Internal storage of the latest measurement results from all detected
+   *        detected cells, indexed by the cell ID where the measurement was
+   *        taken from.
+   *
+   * Each *measurement result* comprises of RSRP (in dBm) and RSRQ (in dB).
+   *
+   * In IDLE mode, the measurement results are used by the *initial cell
+   * selection* procedure. While in CONNECTED mode, *layer-3 filtering* is
+   * applied to the measurement results and they are used by *UE measurements*
+   * function (LteUeRrc::MeasurementReportTriggering and
+   * LteUeRrc::SendMeasurementReport).
+   */
   std::map<uint16_t, MeasValues> m_storedMeasValues;
-  
 
-};
+  /**
+   * \brief Represents a single triggered event from a measurement identity
+   *        which reporting criteria have been fulfilled, but delayed by
+   *        time-to-trigger.
+   */
+  struct PendingTrigger_t
+  {
+    uint8_t measId; ///< The measurement identity which raised the trigger.
+    ConcernedCells_t concernedCells; ///< The list of cells responsible for this trigger.
+    EventId timer; ///< The pending reporting event, scheduled at the end of the time-to-trigger.
+  };
+
+  /**
+   * \brief List of triggers that were raised because entering condition have
+   *        been true, but are still delayed from reporting it by
+   *        time-to-trigger.
+   *
+   * The list is indexed by the measurement identity where the trigger
+   * originates from. The enclosed event will run at the end of the
+   * time-to-trigger and insert a *reporting entry* to #m_varMeasReportList.
+   */
+  std::map<uint8_t, std::list<PendingTrigger_t> > m_enteringTriggerQueue;
+
+  /**
+   * \brief List of triggers that were raised because leaving condition have
+   *        been true, but are still delayed from stopping the reporting by
+   *        time-to-trigger.
+   *
+   * The list is indexed by the measurement identity where the trigger
+   * originates from. The enclosed event will run at the end of the
+   * time-to-trigger and remove the associated *reporting entry* from
+   * #m_varMeasReportList.
+   */
+  std::map<uint8_t, std::list<PendingTrigger_t> > m_leavingTriggerQueue;
+
+  /**
+   * \brief Clear all the waiting triggers in #m_enteringTriggerQueue which are
+   *        associated with the given measurement identity.
+   * \param measId the measurement identity to be processed, must already exists
+   *               in #m_enteringTriggerQueue, otherwise an error would be
+   *               raised
+   *
+   * \note The function may conclude that there is nothing to be removed. In
+   *       this case, the function will simply ignore quietly.
+   *
+   * This function is used when the entering condition of the measurement
+   * identity becomes no longer true. Therefore all the waiting triggers for
+   * this measurement identity in #m_enteringTriggerQueue have become invalid
+   * and must be canceled.
+   *
+   * \sa LteUeRrc::m_enteringTriggerQueue
+   */
+  void CancelEnteringTrigger (uint8_t measId);
+
+  /**
+   * \brief Remove a specific cell from the waiting triggers in
+   *        #m_enteringTriggerQueue which belong to the given measurement
+   *        identity.
+   * \param measId the measurement identity to be processed, must already exists
+   *               in #m_enteringTriggerQueue, otherwise an error would be
+   *               raised
+   * \param cellId the cell ID to be removed from the waiting triggers
+   *
+   * \note The function may conclude that there is nothing to be removed. In
+   *       this case, the function will simply ignore quietly.
+   *
+   * This function is used when a specific neighbour cell no longer fulfills
+   * the entering condition of the measurement identity. Thus the cell must be
+   * removed from all the waiting triggers for this measurement identity in
+   * #m_enteringTriggerQueue.
+   *
+   * \sa LteUeRrc::m_enteringTriggerQueue
+   */
+  void CancelEnteringTrigger (uint8_t measId, uint16_t cellId);
+
+  /**
+   * \brief Clear all the waiting triggers in #m_leavingTriggerQueue which are
+   *        associated with the given measurement identity.
+   * \param measId the measurement identity to be processed, must already exists
+   *               in #m_leavingTriggerQueue, otherwise an error would be
+   *               raised
+   *
+   * \note The function may conclude that there is nothing to be removed. In
+   *       this case, the function will simply ignore quietly.
+   *
+   * This function is used when the leaving condition of the measurement
+   * identity becomes no longer true. Therefore all the waiting triggers for
+   * this measurement identity in #m_leavingTriggerQueue have become invalid
+   * and must be canceled.
+   *
+   * \sa LteUeRrc::m_leavingTriggerQueue
+   */
+  void CancelLeavingTrigger (uint8_t measId);
+
+  /**
+   * \brief Remove a specific cell from the waiting triggers in
+   *        #m_leavingTriggerQueue which belong to the given measurement
+   *        identity.
+   * \param measId the measurement identity to be processed, must already exists
+   *               in #m_leavingTriggerQueue, otherwise an error would be
+   *               raised
+   * \param cellId the cell ID to be removed from the waiting triggers
+   *
+   * \note The function may conclude that there is nothing to be removed. In
+   *       this case, the function will simply ignore quietly.
+   *
+   * This function is used when a specific neighbour cell no longer fulfills
+   * the leaving condition of the measurement identity. Thus the cell must be
+   * removed from all the waiting triggers for this measurement identity in
+   * #m_leavingTriggerQueue.
+   *
+   * \sa LteUeRrc::m_leavingTriggerQueue
+   */
+  void CancelLeavingTrigger (uint8_t measId, uint16_t cellId);
+
+}; // end of class LteUeRrc
 
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/lte/model/no-op-handover-algorithm.cc ns-3.19/src/lte/model/no-op-handover-algorithm.cc
--- ns-3.18.1/src/lte/model/no-op-handover-algorithm.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/no-op-handover-algorithm.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,98 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#include "no-op-handover-algorithm.h"
+#include <ns3/log.h>
+
+NS_LOG_COMPONENT_DEFINE ("NoOpHandoverAlgorithm");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (NoOpHandoverAlgorithm)
+  ;
+
+
+NoOpHandoverAlgorithm::NoOpHandoverAlgorithm ()
+  : m_handoverManagementSapUser (0)
+{
+  NS_LOG_FUNCTION (this);
+  m_handoverManagementSapProvider = new MemberLteHandoverManagementSapProvider<NoOpHandoverAlgorithm> (this);
+}
+
+
+NoOpHandoverAlgorithm::~NoOpHandoverAlgorithm ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+
+void
+NoOpHandoverAlgorithm::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+  delete m_handoverManagementSapProvider;
+}
+
+
+TypeId
+NoOpHandoverAlgorithm::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::NoOpHandoverAlgorithm")
+    .SetParent<LteHandoverAlgorithm> ()
+    .AddConstructor<NoOpHandoverAlgorithm> ()
+  ;
+  return tid;
+}
+
+
+void
+NoOpHandoverAlgorithm::SetLteHandoverManagementSapUser (LteHandoverManagementSapUser* s)
+{
+  NS_LOG_FUNCTION (this << s);
+  m_handoverManagementSapUser = s;
+}
+
+
+LteHandoverManagementSapProvider*
+NoOpHandoverAlgorithm::GetLteHandoverManagementSapProvider ()
+{
+  NS_LOG_FUNCTION (this);
+  return m_handoverManagementSapProvider;
+}
+
+
+void
+NoOpHandoverAlgorithm::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+  LteHandoverAlgorithm::DoInitialize ();
+}
+
+
+void
+NoOpHandoverAlgorithm::DoReportUeMeas (uint16_t rnti,
+                                       LteRrcSap::MeasResults measResults)
+{
+  NS_LOG_FUNCTION (this << rnti << (uint16_t) measResults.measId);
+}
+
+
+} // end of namespace ns3
diff -Naur ns-3.18.1/src/lte/model/no-op-handover-algorithm.h ns-3.19/src/lte/model/no-op-handover-algorithm.h
--- ns-3.18.1/src/lte/model/no-op-handover-algorithm.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/model/no-op-handover-algorithm.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,80 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#ifndef NO_OP_HANDOVER_ALGORITHM_H
+#define NO_OP_HANDOVER_ALGORITHM_H
+
+#include <ns3/lte-handover-algorithm.h>
+#include <ns3/lte-handover-management-sap.h>
+#include <ns3/lte-rrc-sap.h>
+
+namespace ns3 {
+
+
+/**
+ * \brief Handover algorithm implementation which simply does nothing.
+ *
+ * Selecting this handover algorithm is equivalent to disabling automatic
+ * triggering of handover. This is the default choice.
+ *
+ * To enable automatic handover, please select another handover algorithm, i.e.,
+ * another child class of LteHandoverAlgorithm.
+ */
+class NoOpHandoverAlgorithm : public LteHandoverAlgorithm
+{
+public:
+  /**
+   * \brief Creates a No-op handover algorithm instance.
+   */
+  NoOpHandoverAlgorithm ();
+
+  virtual ~NoOpHandoverAlgorithm ();
+
+  // inherited from Object
+  static TypeId GetTypeId ();
+
+  // inherited from LteHandoverAlgorithm
+  virtual void SetLteHandoverManagementSapUser (LteHandoverManagementSapUser* s);
+  virtual LteHandoverManagementSapProvider* GetLteHandoverManagementSapProvider ();
+
+  // let the forwarder class access the protected and private members
+  friend class MemberLteHandoverManagementSapProvider<NoOpHandoverAlgorithm>;
+
+protected:
+  // inherited from Object
+  virtual void DoInitialize ();
+  virtual void DoDispose ();
+
+  // inherited from LteHandoverAlgorithm as a Handover Management SAP implementation
+  void DoReportUeMeas (uint16_t rnti, LteRrcSap::MeasResults measResults);
+
+private:
+  // Handover Management SAPs
+  LteHandoverManagementSapUser* m_handoverManagementSapUser;
+  LteHandoverManagementSapProvider* m_handoverManagementSapProvider;
+
+}; // end of class NoOpHandoverAlgorithm
+
+
+} // end of namespace ns3
+
+
+#endif /* NO_OP_HANDOVER_ALGORITHM_H */
diff -Naur ns-3.18.1/src/lte/model/pf-ff-mac-scheduler.cc ns-3.19/src/lte/model/pf-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/pf-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/pf-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -42,7 +42,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (PfFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (PfFfMacScheduler)
+  ;
 
 
 
@@ -649,6 +650,14 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -689,7 +698,45 @@
           m_rachAllocationMap.at (i) = (*itRach).m_rnti;
         }
       rbStart = rbStart + rbLen;
-
+      
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+      
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -951,6 +998,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
 
 
   for (int i = 0; i < rbgNum; i++)
@@ -1404,12 +1461,6 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
 
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
@@ -1417,7 +1468,7 @@
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/pss-ff-mac-scheduler.cc ns-3.19/src/lte/model/pss-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/pss-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/pss-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -46,7 +46,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (PssFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (PssFfMacScheduler)
+  ;
 
 
 
@@ -678,6 +679,13 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -719,6 +727,44 @@
         }
       rbStart = rbStart + rbLen;
 
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -980,6 +1026,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
 
   std::map <uint16_t, pssFlowPerf_t>::iterator it;
   std::map <uint16_t, pssFlowPerf_t> tdUeSet; // the result of TD scheduler
@@ -1711,20 +1767,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
-
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/rem-spectrum-phy.cc ns-3.19/src/lte/model/rem-spectrum-phy.cc
--- ns-3.18.1/src/lte/model/rem-spectrum-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/rem-spectrum-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RemSpectrumPhy);
+NS_OBJECT_ENSURE_REGISTERED (RemSpectrumPhy)
+  ;
 
 RemSpectrumPhy::RemSpectrumPhy ()
   : m_mobility (0),    
diff -Naur ns-3.18.1/src/lte/model/rr-ff-mac-scheduler.cc ns-3.19/src/lte/model/rr-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/rr-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/rr-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -46,7 +46,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (RrFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (RrFfMacScheduler)
+  ;
 
 
 class RrSchedulerMemberCschedSapProvider : public FfMacCschedSapProvider
@@ -617,6 +618,13 @@
   std::set <uint16_t> rntiAllocated;
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -658,6 +666,44 @@
         }
       rbStart = rbStart + rbLen;
 
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -920,6 +966,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
   // Get the actual active flows (queue!=0)
   std::list<FfMacSchedSapProvider::SchedDlRlcBufferReqParameters>::iterator it;
   m_rlcBufferReq.sort (SortRlcBufferReq);
@@ -1249,19 +1305,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/tdbet-ff-mac-scheduler.cc ns-3.19/src/lte/model/tdbet-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/tdbet-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/tdbet-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,7 +43,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (TdBetFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (TdBetFfMacScheduler)
+  ;
 
 
 
@@ -650,6 +651,13 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -691,6 +699,44 @@
         }
       rbStart = rbStart + rbLen;
 
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -952,6 +998,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
 
   std::map <uint16_t, tdbetsFlowPerf_t>::iterator it;
   std::map <uint16_t, tdbetsFlowPerf_t>::iterator itMax = m_flowStatsDl.end ();
@@ -1304,20 +1360,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
-
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/tdmt-ff-mac-scheduler.cc ns-3.19/src/lte/model/tdmt-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/tdmt-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/tdmt-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,7 +43,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (TdMtFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (TdMtFfMacScheduler)
+  ;
 
 
 
@@ -639,6 +640,13 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -680,6 +688,44 @@
         }
       rbStart = rbStart + rbLen;
 
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -941,6 +987,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
 
   std::set <uint16_t>::iterator it;
   std::set <uint16_t>::iterator itMax = m_flowStatsDl.end ();
@@ -1301,20 +1357,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
-
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/tdtbfq-ff-mac-scheduler.cc ns-3.19/src/lte/model/tdtbfq-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/tdtbfq-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/tdtbfq-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -44,7 +44,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (TdTbfqFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (TdTbfqFfMacScheduler)
+  ;
 
 
 
@@ -694,6 +695,13 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -735,6 +743,44 @@
         }
       rbStart = rbStart + rbLen;
 
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -996,6 +1042,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
 
   // update token pool, counter and bank size
   std::map <uint16_t, tdtbfqsFlowPerf_t>::iterator itStats;
@@ -1398,20 +1454,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
-
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/model/trace-fading-loss-model.cc ns-3.19/src/lte/model/trace-fading-loss-model.cc
--- ns-3.18.1/src/lte/model/trace-fading-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/trace-fading-loss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TraceFadingLossModel);
+NS_OBJECT_ENSURE_REGISTERED (TraceFadingLossModel)
+  ;
   
 
 
diff -Naur ns-3.18.1/src/lte/model/trace-fading-loss-model.h ns-3.19/src/lte/model/trace-fading-loss-model.h
--- ns-3.18.1/src/lte/model/trace-fading-loss-model.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/trace-fading-loss-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -69,14 +69,12 @@
   
 private:
   /**
-   * @param txPower set of values vs frequency representing the
-   * transmission power. See SpectrumChannel for details.
-   *
-   * @param a sender mobility
-   * @param b receiver mobility
-   *
-   * @return set of values vs frequency representing the received
-   * power in the same units used for the txPower parameter.
+   * \param txPsd set of values vs frequency representing the
+   *              transmission power. See SpectrumChannel for details.
+   * \param a sender mobility
+   * \param b receiver mobility
+   * \return set of values vs frequency representing the received
+   *         power in the same units used for the txPsd parameter.
    */
   Ptr<SpectrumValue> DoCalcRxPowerSpectralDensity (Ptr<const SpectrumValue> txPsd,
                                                    Ptr<const MobilityModel> a,
diff -Naur ns-3.18.1/src/lte/model/tta-ff-mac-scheduler.cc ns-3.19/src/lte/model/tta-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/model/tta-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/model/tta-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,7 +43,8 @@
 };  // see table 7.1.6.1-1 of 36.213
 
 
-NS_OBJECT_ENSURE_REGISTERED (TtaFfMacScheduler);
+NS_OBJECT_ENSURE_REGISTERED (TtaFfMacScheduler)
+  ;
 
 
 
@@ -639,6 +640,13 @@
   rbgMap.resize (m_cschedCellConfig.m_dlBandwidth / rbgSize, false);
   FfMacSchedSapUser::SchedDlConfigIndParameters ret;
 
+  //   update UL HARQ proc id
+  std::map <uint16_t, uint8_t>::iterator itProcId;
+  for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
+    {
+      (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
+    }
+
   // RACH Allocation
   m_rachAllocationMap.resize (m_cschedCellConfig.m_ulBandwidth, 0);
   uint16_t rbStart = 0;
@@ -680,6 +688,44 @@
         }
       rbStart = rbStart + rbLen;
 
+      if (m_harqOn == true)
+        {
+          // generate UL-DCI for HARQ retransmissions
+          UlDciListElement_s uldci;
+          uldci.m_rnti = newRar.m_rnti;
+          uldci.m_rbLen = rbLen;
+          uldci.m_rbStart = rbStart;
+          uldci.m_mcs = m_ulGrantMcs;
+          uldci.m_tbSize = tbSizeBits / 8;
+          uldci.m_ndi = 1;
+          uldci.m_cceIndex = 0;
+          uldci.m_aggrLevel = 1;
+          uldci.m_ueTxAntennaSelection = 3; // antenna selection OFF
+          uldci.m_hopping = false;
+          uldci.m_n2Dmrs = 0;
+          uldci.m_tpc = 0; // no power control
+          uldci.m_cqiRequest = false; // only period CQI at this stage
+          uldci.m_ulIndex = 0; // TDD parameter
+          uldci.m_dai = 1; // TDD parameter
+          uldci.m_freqHopping = 0;
+          uldci.m_pdcchPowerOffset = 0; // not used
+
+          uint8_t harqId = 0;
+          std::map <uint16_t, uint8_t>::iterator itProcId;
+          itProcId = m_ulHarqCurrentProcessId.find (uldci.m_rnti);
+          if (itProcId == m_ulHarqCurrentProcessId.end ())
+            {
+              NS_FATAL_ERROR ("No info find in HARQ buffer for UE " << uldci.m_rnti);
+            }
+          harqId = (*itProcId).second;
+          std::map <uint16_t, UlHarqProcessesDciBuffer_t>::iterator itDci = m_ulHarqProcessesDciBuffer.find (uldci.m_rnti);
+          if (itDci == m_ulHarqProcessesDciBuffer.end ())
+            {
+              NS_FATAL_ERROR ("Unable to find RNTI entry in UL DCI HARQ buffer for RNTI " << uldci.m_rnti);
+            }
+          (*itDci).second.at (harqId) = uldci;
+        }
+
       ret.m_buildRarList.push_back (newRar);
     }
   m_rachList.clear ();
@@ -941,6 +987,16 @@
   m_dlInfoListBuffered.clear ();
   m_dlInfoListBuffered = dlInfoListUntxed;
 
+  if (rbgAllocatedNum == rbgNum)
+    {
+      // all the RBGs are already allocated -> exit
+      if ((ret.m_buildDataList.size () > 0) || (ret.m_buildRarList.size () > 0))
+        {
+          m_schedSapUser->SchedDlConfigInd (ret);
+        }
+      return;
+    }
+
 
 
   for (int i = 0; i < rbgNum; i++)
@@ -1380,20 +1436,13 @@
   if (m_harqOn == true)
     {
       //   Process UL HARQ feedback
-      //   update UL HARQ proc id
-      std::map <uint16_t, uint8_t>::iterator itProcId;
-      for (itProcId = m_ulHarqCurrentProcessId.begin (); itProcId != m_ulHarqCurrentProcessId.end (); itProcId++)
-        {
-          (*itProcId).second = ((*itProcId).second + 1) % HARQ_PROC_NUM;
-        }
-
       for (uint16_t i = 0; i < params.m_ulInfoList.size (); i++)
         {        
           if (params.m_ulInfoList.at (i).m_receptionStatus == UlInfoListElement_s::NotOk)
             {
               // retx correspondent block: retrieve the UL-DCI
               uint16_t rnti = params.m_ulInfoList.at (i).m_rnti;
-              itProcId = m_ulHarqCurrentProcessId.find (rnti);
+              std::map <uint16_t, uint8_t>::iterator itProcId = m_ulHarqCurrentProcessId.find (rnti);
               if (itProcId == m_ulHarqCurrentProcessId.end ())
                 {
                   NS_LOG_ERROR ("No info find in HARQ buffer for UE (might change eNB) " << rnti);
diff -Naur ns-3.18.1/src/lte/test/epc-test-s1u-downlink.cc ns-3.19/src/lte/test/epc-test-s1u-downlink.cc
--- ns-3.18.1/src/lte/test/epc-test-s1u-downlink.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/epc-test-s1u-downlink.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,7 @@
 #include "ns3/simulator.h"
 #include "ns3/log.h"
 #include "ns3/test.h"
-#include "ns3/epc-helper.h"
+#include "ns3/point-to-point-epc-helper.h"
 #include "ns3/epc-enb-application.h"
 #include "ns3/packet-sink-helper.h"
 #include "ns3/udp-echo-helper.h"
@@ -44,7 +44,8 @@
 namespace ns3 {
 
 
-NS_LOG_COMPONENT_DEFINE ("EpcTestS1uDownlink");
+NS_LOG_COMPONENT_DEFINE ("EpcTestS1uDownlink")
+  ;
 
 
 
@@ -97,7 +98,7 @@
 void 
 EpcS1uDlTestCase::DoRun ()
 {
-  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
   Ptr<Node> pgw = epcHelper->GetPgwNode ();
 
   // allow jumbo packets
diff -Naur ns-3.18.1/src/lte/test/epc-test-s1u-uplink.cc ns-3.19/src/lte/test/epc-test-s1u-uplink.cc
--- ns-3.18.1/src/lte/test/epc-test-s1u-uplink.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/epc-test-s1u-uplink.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,7 @@
 #include "ns3/simulator.h"
 #include "ns3/log.h"
 #include "ns3/test.h"
-#include "ns3/epc-helper.h"
+#include "ns3/point-to-point-epc-helper.h"
 #include "ns3/epc-enb-application.h"
 #include "ns3/packet-sink-helper.h"
 #include "ns3/point-to-point-helper.h"
@@ -52,7 +52,8 @@
 
 
 
-NS_LOG_COMPONENT_DEFINE ("EpcTestS1uUplink");
+NS_LOG_COMPONENT_DEFINE ("EpcTestS1uUplink")
+  ;
 
 /*
  * A Udp client. Sends UDP packet carrying sequence number and time
@@ -293,7 +294,7 @@
 void 
 EpcS1uUlTestCase::DoRun ()
 {
-  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
   Ptr<Node> pgw = epcHelper->GetPgwNode ();
 
   // allow jumbo packets
diff -Naur ns-3.18.1/src/lte/test/lte-simple-helper.cc ns-3.19/src/lte/test/lte-simple-helper.cc
--- ns-3.18.1/src/lte/test/lte-simple-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-simple-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (LteSimpleHelper);
+NS_OBJECT_ENSURE_REGISTERED (LteSimpleHelper)
+  ;
 
 LteSimpleHelper::LteSimpleHelper (void)
 {
diff -Naur ns-3.18.1/src/lte/test/lte-simple-net-device.cc ns-3.19/src/lte/test/lte-simple-net-device.cc
--- ns-3.18.1/src/lte/test/lte-simple-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-simple-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (LteSimpleNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (LteSimpleNetDevice)
+  ;
 
 
 TypeId LteSimpleNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/lte/test/lte-test-cell-selection.cc ns-3.19/src/lte/test/lte-test-cell-selection.cc
--- ns-3.18.1/src/lte/test/lte-test-cell-selection.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-cell-selection.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,431 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#include "lte-test-cell-selection.h"
+
+#include <ns3/simulator.h>
+#include <ns3/log.h>
+#include <ns3/boolean.h>
+#include <ns3/double.h>
+#include <ns3/integer.h>
+
+#include <ns3/mobility-helper.h>
+#include <ns3/lte-helper.h>
+#include <ns3/point-to-point-epc-helper.h>
+#include <ns3/internet-stack-helper.h>
+#include <ns3/point-to-point-helper.h>
+#include <ns3/ipv4-address-helper.h>
+#include <ns3/ipv4-static-routing-helper.h>
+
+#include <ns3/node-container.h>
+#include <ns3/net-device-container.h>
+#include <ns3/ipv4-interface-container.h>
+
+#include <ns3/lte-ue-net-device.h>
+#include <ns3/lte-ue-rrc.h>
+#include <ns3/lte-enb-net-device.h>
+
+NS_LOG_COMPONENT_DEFINE ("LteCellSelectionTest");
+
+namespace ns3 {
+
+
+/*
+ * Test Suite
+ */
+
+
+LteCellSelectionTestSuite::LteCellSelectionTestSuite ()
+  : TestSuite ("lte-cell-selection", SYSTEM)
+{
+  std::vector<LteCellSelectionTestCase::UeSetup_t> w;
+
+  // REAL RRC PROTOCOL
+
+  w.clear ();
+  //                                                x     y    csgMember
+  //                                                checkPoint     cell1, cell2
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.0, 0.55, false,
+                                                    MilliSeconds (283), 1, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.0, 0.45, false,
+                                                    MilliSeconds (283), 1, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.5, 0.45, false,
+                                                    MilliSeconds (363), 1, 3));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.5, 0.0,  true,
+                                                    MilliSeconds (283), 2, 4));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (1.0, 0.55, true,
+                                                    MilliSeconds (283), 3, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (1.0, 0.45, true,
+                                                    MilliSeconds (283), 4, 0));
+
+  AddTestCase (new LteCellSelectionTestCase ("EPC, real RRC, RngNum=1",
+                                             true, false, 60.0, w, 1),
+               //                                        isd       rngrun
+               TestCase::QUICK);
+
+  // IDEAL RRC PROTOCOL
+
+  w.clear ();
+  //                                                x     y    csgMember
+  //                                                checkPoint     cell1, cell2
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.0, 0.55, false,
+                                                    MilliSeconds (266), 1, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.0, 0.45, false,
+                                                    MilliSeconds (266), 1, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.5, 0.45, false,
+                                                    MilliSeconds (346), 1, 3));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (0.5, 0.0,  true,
+                                                    MilliSeconds (266), 2, 4));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (1.0, 0.55, true,
+                                                    MilliSeconds (266), 3, 0));
+  w.push_back (LteCellSelectionTestCase::UeSetup_t (1.0, 0.45, true,
+                                                    MilliSeconds (266), 4, 0));
+
+  AddTestCase (new LteCellSelectionTestCase ("EPC, ideal RRC, RngNum=1",
+                                             true, true, 60.0, w, 1),
+               //                                        isd      rngrun
+               TestCase::QUICK);
+
+} // end of LteCellSelectionTestSuite::LteCellSelectionTestSuite ()
+
+
+static LteCellSelectionTestSuite g_lteCellSelectionTestSuite;
+
+
+
+/*
+ * Test Case
+ */
+
+
+LteCellSelectionTestCase::UeSetup_t::UeSetup_t (
+  double relPosX, double relPosY, bool isCsgMember, Time checkPoint,
+  uint16_t expectedCellId1, uint16_t expectedCellId2)
+  : position (Vector (relPosX, relPosY, 0.0)),
+    isCsgMember (isCsgMember),
+    checkPoint (checkPoint),
+    expectedCellId1 (expectedCellId1),
+    expectedCellId2 (expectedCellId2)
+{
+}
+
+
+LteCellSelectionTestCase::LteCellSelectionTestCase (
+  std::string name, bool isEpcMode, bool isIdealRrc,
+  double interSiteDistance,
+  std::vector<UeSetup_t> ueSetupList, int64_t rngRun)
+  : TestCase (name),
+    m_isEpcMode (isEpcMode),
+    m_isIdealRrc (isIdealRrc),
+    m_interSiteDistance (interSiteDistance),
+    m_ueSetupList (ueSetupList),
+    m_rngRun (rngRun)
+{
+  NS_LOG_FUNCTION (this << GetName ());
+  m_lastState.resize (m_ueSetupList.size (), LteUeRrc::NUM_STATES);
+}
+
+
+LteCellSelectionTestCase::~LteCellSelectionTestCase ()
+{
+  NS_LOG_FUNCTION (this << GetName ());
+}
+
+
+void
+LteCellSelectionTestCase::DoRun ()
+{
+  NS_LOG_FUNCTION (this << GetName ());
+
+  Config::SetGlobal ("RngRun", IntegerValue (m_rngRun));
+
+  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+  lteHelper->SetAttribute ("PathlossModel",
+                           StringValue ("ns3::FriisSpectrumPropagationLossModel"));
+  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (m_isIdealRrc));
+
+  Ptr<PointToPointEpcHelper> epcHelper;
+
+  if (m_isEpcMode)
+    {
+      epcHelper = CreateObject<PointToPointEpcHelper> ();
+      lteHelper->SetEpcHelper (epcHelper);
+    }
+
+  /*
+   * The topology is the following (the number on the node indicate the cell ID)
+   *
+   *      [1]        [3]
+   *    non-CSG -- non-CSG
+   *       |          |
+   *       |          | 60 m
+   *       |          |
+   *      [2]        [4]
+   *      CSG ------ CSG
+   *           60 m
+   */
+
+  // Create Nodes
+  NodeContainer enbNodes;
+  enbNodes.Create (4);
+  NodeContainer ueNodes;
+  uint16_t nUe = m_ueSetupList.size ();
+  ueNodes.Create (nUe);
+
+  // Assign nodes to position
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  // eNodeB
+  positionAlloc->Add (Vector (                0.0, m_interSiteDistance, 0.0));
+  positionAlloc->Add (Vector (                0.0,                 0.0, 0.0));
+  positionAlloc->Add (Vector (m_interSiteDistance, m_interSiteDistance, 0.0));
+  positionAlloc->Add (Vector (m_interSiteDistance,                 0.0, 0.0));
+  // UE
+  std::vector<UeSetup_t>::const_iterator itSetup;
+  for (itSetup = m_ueSetupList.begin ();
+       itSetup != m_ueSetupList.end (); itSetup++)
+    {
+      Vector uePos (m_interSiteDistance * itSetup->position.x,
+                    m_interSiteDistance * itSetup->position.y,
+                    m_interSiteDistance * itSetup->position.z);
+      NS_LOG_INFO ("UE position " << uePos);
+      positionAlloc->Add (uePos);
+    }
+
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.Install (enbNodes);
+  mobility.Install (ueNodes);
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  int64_t stream = 1;
+  NetDeviceContainer enbDevs;
+
+  // cell ID 1 is a non-CSG cell
+  lteHelper->SetEnbDeviceAttribute ("CsgId", UintegerValue (0));
+  lteHelper->SetEnbDeviceAttribute ("CsgIndication", BooleanValue (false));
+  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (0)));
+
+  // cell ID 2 is a CSG cell
+  lteHelper->SetEnbDeviceAttribute ("CsgId", UintegerValue (1));
+  lteHelper->SetEnbDeviceAttribute ("CsgIndication", BooleanValue (true));
+  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (1)));
+
+  // cell ID 3 is a non-CSG cell
+  lteHelper->SetEnbDeviceAttribute ("CsgId", UintegerValue (0));
+  lteHelper->SetEnbDeviceAttribute ("CsgIndication", BooleanValue (false));
+  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (2)));
+
+  // cell ID 4 is a CSG cell
+  lteHelper->SetEnbDeviceAttribute ("CsgId", UintegerValue (1));
+  lteHelper->SetEnbDeviceAttribute ("CsgIndication", BooleanValue (true));
+  enbDevs.Add (lteHelper->InstallEnbDevice (enbNodes.Get (3)));
+
+  NetDeviceContainer ueDevs;
+  Time lastCheckPoint = MilliSeconds (0);
+  NS_ASSERT (m_ueSetupList.size () == ueNodes.GetN ());
+  NodeContainer::Iterator itNode;
+  for (itSetup = m_ueSetupList.begin (), itNode = ueNodes.Begin ();
+       itSetup != m_ueSetupList.end () || itNode != ueNodes.End ();
+       itSetup++, itNode++)
+    {
+      if (itSetup->isCsgMember)
+        {
+          lteHelper->SetUeDeviceAttribute ("CsgId", UintegerValue (1));
+        }
+      else
+        {
+          lteHelper->SetUeDeviceAttribute ("CsgId", UintegerValue (0));
+        }
+
+      NetDeviceContainer devs = lteHelper->InstallUeDevice (*itNode);
+      Ptr<LteUeNetDevice> ueDev = devs.Get (0)->GetObject<LteUeNetDevice> ();
+      NS_ASSERT (ueDev != 0);
+      ueDevs.Add (devs);
+      Simulator::Schedule (itSetup->checkPoint,
+                           &LteCellSelectionTestCase::CheckPoint,
+                           this, ueDev,
+                           itSetup->expectedCellId1, itSetup->expectedCellId2);
+
+      if (lastCheckPoint < itSetup->checkPoint)
+        {
+          lastCheckPoint = itSetup->checkPoint;
+        }
+    }
+
+  stream += lteHelper->AssignStreams (enbDevs, stream);
+  stream += lteHelper->AssignStreams (ueDevs, stream);
+
+  // Tests
+  NS_ASSERT (m_ueSetupList.size () == ueDevs.GetN ());
+  NetDeviceContainer::Iterator itDev;
+  for (itSetup = m_ueSetupList.begin (), itDev = ueDevs.Begin ();
+       itSetup != m_ueSetupList.end () || itDev != ueDevs.End ();
+       itSetup++, itDev++)
+    {
+      Ptr<LteUeNetDevice> ueDev = (*itDev)->GetObject<LteUeNetDevice> ();
+    }
+
+  if (m_isEpcMode)
+    {
+      // Create P-GW node
+      Ptr<Node> pgw = epcHelper->GetPgwNode ();
+
+      // Create a single RemoteHost
+      NodeContainer remoteHostContainer;
+      remoteHostContainer.Create (1);
+      Ptr<Node> remoteHost = remoteHostContainer.Get (0);
+      InternetStackHelper internet;
+      internet.Install (remoteHostContainer);
+
+      // Create the Internet
+      PointToPointHelper p2ph;
+      p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
+      p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
+      p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.010)));
+      NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
+      Ipv4AddressHelper ipv4h;
+      ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
+      Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
+
+      // Routing of the Internet Host (towards the LTE network)
+      Ipv4StaticRoutingHelper ipv4RoutingHelper;
+      Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
+      remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
+
+      // Install the IP stack on the UEs
+      internet.Install (ueNodes);
+      Ipv4InterfaceContainer ueIpIfaces;
+      ueIpIfaces = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
+
+      // Assign IP address to UEs
+      for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+        {
+          Ptr<Node> ueNode = ueNodes.Get (u);
+          // Set the default gateway for the UE
+          Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
+          ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
+        }
+
+    } // end of if (m_isEpcMode)
+  else
+    {
+      NS_FATAL_ERROR ("No support yet for LTE-only simulations");
+    }
+
+  // Connect to trace sources in UEs
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/StateTransition",
+                   MakeCallback (&LteCellSelectionTestCase::StateTransitionCallback,
+                                 this));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/InitialCellSelectionEndOk",
+                   MakeCallback (&LteCellSelectionTestCase::InitialCellSelectionEndOkCallback,
+                                 this));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/InitialCellSelectionEndError",
+                   MakeCallback (&LteCellSelectionTestCase::InitialCellSelectionEndErrorCallback,
+                                 this));
+  Config::Connect ("/NodeList/*/DeviceList/*/LteUeRrc/ConnectionEstablished",
+                   MakeCallback (&LteCellSelectionTestCase::ConnectionEstablishedCallback,
+                                 this));
+
+  // Enable Idle mode cell selection
+  lteHelper->Attach (ueDevs);
+
+  // Run simulation
+  Simulator::Stop (lastCheckPoint);
+  Simulator::Run ();
+
+  NS_LOG_INFO ("Simulation ends");
+  Simulator::Destroy ();
+
+} // end of void LteCellSelectionTestCase::DoRun ()
+
+
+void
+LteCellSelectionTestCase::CheckPoint (Ptr<LteUeNetDevice> ueDev,
+                                      uint16_t expectedCellId1,
+                                      uint16_t expectedCellId2)
+{
+  uint16_t actualCellId = ueDev->GetRrc ()->GetCellId ();
+
+  if (expectedCellId2 == 0)
+    {
+      NS_TEST_ASSERT_MSG_EQ (actualCellId, expectedCellId1,
+                             "IMSI " << ueDev->GetImsi ()
+                                     << " has attached to an unexpected cell");
+    }
+  else
+    {
+      bool pass = (actualCellId == expectedCellId1) ||
+        (actualCellId == expectedCellId2);
+      NS_TEST_ASSERT_MSG_EQ (pass, true,
+                             "IMSI " << ueDev->GetImsi ()
+                                     << " has attached to an unexpected cell"
+                                     << " (actual: " << actualCellId << ","
+                                     << " expected: " << expectedCellId1
+                                     << " or " << expectedCellId2 << ")");
+    }
+
+  if (expectedCellId1 > 0)
+    {
+      NS_TEST_ASSERT_MSG_EQ (m_lastState.at (ueDev->GetImsi () - 1),
+                             LteUeRrc::CONNECTED_NORMALLY,
+                             "UE " << ueDev->GetImsi ()
+                                   << " is not at CONNECTED_NORMALLY state");
+    }
+}
+
+
+void
+LteCellSelectionTestCase::StateTransitionCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
+  LteUeRrc::State oldState, LteUeRrc::State newState)
+{
+  NS_LOG_FUNCTION (this << imsi << cellId << rnti << oldState << newState);
+  m_lastState.at (imsi - 1) = newState;
+}
+
+
+void
+LteCellSelectionTestCase::InitialCellSelectionEndOkCallback (
+  std::string context, uint64_t imsi, uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << imsi << cellId);
+}
+
+
+void
+LteCellSelectionTestCase::InitialCellSelectionEndErrorCallback (
+  std::string context, uint64_t imsi, uint16_t cellId)
+{
+  NS_LOG_FUNCTION (this << imsi << cellId);
+}
+
+
+void
+LteCellSelectionTestCase::ConnectionEstablishedCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti)
+{
+  NS_LOG_FUNCTION (this << imsi << cellId << rnti);
+}
+
+
+
+} // end of namespace ns3
diff -Naur ns-3.18.1/src/lte/test/lte-test-cell-selection.h ns-3.19/src/lte/test/lte-test-cell-selection.h
--- ns-3.18.1/src/lte/test/lte-test-cell-selection.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-cell-selection.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,130 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#ifndef LTE_TEST_CELL_SELECTION_H
+#define LTE_TEST_CELL_SELECTION_H
+
+#include <ns3/test.h>
+#include <ns3/nstime.h>
+#include <ns3/node-container.h>
+#include <ns3/vector.h>
+#include <ns3/lte-ue-rrc.h>
+#include <vector>
+
+namespace ns3 {
+
+
+/**
+ * \brief Test suite for executing the cell selection test cases in without-EPC
+ *        and with-EPC scenarios.
+ *
+ * \sa ns3::LteCellSelectionTestCase
+ */
+class LteCellSelectionTestSuite : public TestSuite
+{
+public:
+  LteCellSelectionTestSuite ();
+};
+
+
+
+class LteUeNetDevice;
+
+/**
+ * \brief Testing the initial cell selection procedure by UE at IDLE state in
+ *        the beginning of simulation.
+ */
+class LteCellSelectionTestCase : public TestCase
+{
+public:
+  /**
+   * \brief A set of input parameters for setting up a UE in the simulation.
+   */
+  struct UeSetup_t
+  {
+    Vector position; ///< The position, relative to the inter site distance, where the UE will be spawned in the simulation.
+    bool isCsgMember; ///< Whether UE is allowed access to CSG cell.
+    Time checkPoint; ///< The time in simulation when the UE is verified by the test script.
+    uint16_t expectedCellId1; ///< The cell ID that the UE is expected to attach to (0 means that the UE should not attach to any cell).
+    uint16_t expectedCellId2; ///< An alternative cell ID that the UE is expected to attach to (0 means that this no alternative cell is expected).
+    UeSetup_t (double relPosX, double relPosY, bool isCsgMember, Time checkPoint,
+               uint16_t expectedCellId1, uint16_t expectedCellId2);
+  };
+
+  /**
+   * \brief Creates an instance of the initial cell selection test case.
+   * \param name name of this test
+   * \param isEpcMode set to true for setting up simulation with EPC enabled
+   * \param isIdealRrc if true, simulation uses Ideal RRC protocol, otherwise
+   *                   simulation uses Real RRC protocol
+   * \param interSiteDistance the distance between eNodeB in meters
+   * \param ueSetupList a list of UE configuration to be installed in the
+   *                    simulation
+   * \param rngRun the number of run to be used by the random number generator
+   */
+  LteCellSelectionTestCase (std::string name, bool isEpcMode, bool isIdealRrc,
+                            double interSiteDistance,
+                            std::vector<UeSetup_t> ueSetupList,
+                            int64_t rngRun);
+
+  virtual ~LteCellSelectionTestCase ();
+
+private:
+  /**
+   * \brief Setup the simulation according to the configuration set by the
+   *        class constructor, run it, and verify the result.
+   */
+  virtual void DoRun ();
+
+  /**
+   * \brief Verifies if the given UE is attached to either of the given two
+   *        cells and in a CONNECTED_NORMALLY state.
+   */
+  void CheckPoint (Ptr<LteUeNetDevice> ueDev, uint16_t expectedCellId1,
+                   uint16_t expectedCellId2);
+
+  void StateTransitionCallback (std::string context, uint64_t imsi,
+                                uint16_t cellId, uint16_t rnti,
+                                LteUeRrc::State oldState, LteUeRrc::State newState);
+  void InitialCellSelectionEndOkCallback (std::string context, uint64_t imsi,
+                                          uint16_t cellId);
+  void InitialCellSelectionEndErrorCallback (std::string context, uint64_t imsi,
+                                             uint16_t cellId);
+  void ConnectionEstablishedCallback (std::string context, uint64_t imsi,
+                                      uint16_t cellId, uint16_t rnti);
+
+  bool m_isEpcMode;
+  bool m_isIdealRrc;
+  double m_interSiteDistance;
+  std::vector<UeSetup_t> m_ueSetupList;
+  int64_t m_rngRun;
+
+  /// The current UE RRC state.
+  std::vector<LteUeRrc::State> m_lastState;
+
+}; // end of class LteCellSelectionTestCase
+
+
+
+} // end of namespace ns3
+
+
+#endif /* LTE_TEST_CELL_SELECTION_H */
diff -Naur ns-3.18.1/src/lte/test/lte-test-entities.cc ns-3.19/src/lte/test/lte-test-entities.cc
--- ns-3.18.1/src/lte/test/lte-test-entities.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-entities.cc	2013-12-20 09:44:50.000000000 -0800
@@ -608,7 +608,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (EpcTestRrc);
+NS_OBJECT_ENSURE_REGISTERED (EpcTestRrc)
+  ;
 
 EpcTestRrc::EpcTestRrc ()
   : m_s1SapProvider (0)
diff -Naur ns-3.18.1/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc ns-3.19/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-fdtbfq-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -49,7 +49,7 @@
 #include <ns3/boolean.h>
 #include <ns3/enum.h>
 
-#include "ns3/epc-helper.h"
+#include "ns3/point-to-point-epc-helper.h"
 #include "ns3/network-module.h"
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/internet-module.h"
@@ -267,7 +267,7 @@
   Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper>  epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
 
   //LogComponentEnable ("FdTbfqFfMacScheduler", LOG_DEBUG);
@@ -515,7 +515,7 @@
 
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper>  epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
 
   Ptr<Node> pgw = epcHelper->GetPgwNode ();
diff -Naur ns-3.18.1/src/lte/test/lte-test-pathloss-model.cc ns-3.19/src/lte/test/lte-test-pathloss-model.cc
--- ns-3.18.1/src/lte/test/lte-test-pathloss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-pathloss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -78,8 +78,6 @@
 LtePathlossModelTestSuite::LtePathlossModelTestSuite ()
   : TestSuite ("lte-pathloss-model", SYSTEM)
 {
- 
-  
   // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
   // LogComponentEnable ("LteHelper", logLevel);
   // LogComponentEnable ("LtePathlossModelTest", logLevel);
@@ -214,10 +212,10 @@
   lteHelper->EnableRlcTraces ();
   lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::HybridBuildingsPropagationLossModel"));
 
-  // set frequency. This is important because it changes the behavior of the pathloss model
+  // set frequency. This is important because it changes the behavior of the path loss model
   lteHelper->SetEnbDeviceAttribute ("DlEarfcn", UintegerValue (200));
+  lteHelper->SetUeDeviceAttribute ("DlEarfcn", UintegerValue (200));
 
-  
   // remove shadowing component
   lteHelper->SetPathlossModelAttribute ("ShadowSigmaOutdoor", DoubleValue (0.0));
   lteHelper->SetPathlossModelAttribute ("ShadowSigmaIndoor", DoubleValue (0.0));
@@ -263,7 +261,6 @@
   // Attach a UE to a eNB
   lteHelper->Attach (ueDevs, enbDevs.Get (0));
 
-  
   // Activate an EPS bearer
   enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
   EpsBearer bearer (q);
diff -Naur ns-3.18.1/src/lte/test/lte-test-phy-error-model.cc ns-3.19/src/lte/test/lte-test-phy-error-model.cc
--- ns-3.18.1/src/lte/test/lte-test-phy-error-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-phy-error-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -46,76 +46,111 @@
 #include <ns3/config.h>
 #include <ns3/boolean.h>
 #include <ns3/enum.h>
+#include <ns3/integer.h>
 #include <ns3/unused.h>
 #include <ns3/ff-mac-scheduler.h>
 #include <ns3/buildings-helper.h>
 
 #include "lte-test-phy-error-model.h"
 
-NS_LOG_COMPONENT_DEFINE ("LenaTestPhyErrorModel");
+NS_LOG_COMPONENT_DEFINE ("LteTestPhyErrorModel");
 
 namespace ns3 {
 
 
-LenaTestPhyErrorModelrSuite::LenaTestPhyErrorModelrSuite ()
+LenaTestPhyErrorModelSuite::LenaTestPhyErrorModelSuite ()
   : TestSuite ("lte-phy-error-model", SYSTEM)
 {
   NS_LOG_INFO ("creating LenaTestPhyErrorModelTestCase");
   
   
-  // Tests on DL Control Channels (PCFICH+PDDCH)
-  // 1 interfering eNB SINR -2.0 BLER 0.007 TB size 217
-  AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (2, 1078, 217, 0.007), TestCase::QUICK);
-  // 2 interfering eNBs SINR -4.0 BLER 0.037 TB size 217
-  AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (3, 1040, 217, 0.045), TestCase::EXTENSIVE);
-  // 3 interfering eNBs SINR -6.0 BLER 0.21 TB size 133
-  AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (4, 1250, 133, 0.206), TestCase::EXTENSIVE);
-  // 4 interfering eNBs SINR -7.0 BLER 0.34 TB size 133
-  AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (5, 1260, 81, 0.343), TestCase::EXTENSIVE);
-
-  // Tests on DL Data channels (PDSCH)
-  // the tolerance is calculated with the following octave code:
-  //
-  // n =  1000;
-  // for p=1-[0.33 0.11 0.2 0.3 0.55 0.14]
-  //    tol = n*p - binoinv(0.005, n, p)
-  // endfor
-
-  // MCS 2 TB size of 256 bits BLER 0.33 SINR -5.51
-  AddTestCase (new LenaDataPhyErrorModelTestCase (4, 1800, 32, 0.33, 39), TestCase::QUICK);
-// MCS 2 TB size of 528 bits BLER 0.11 SINR -5.51
-  AddTestCase (new LenaDataPhyErrorModelTestCase (2, 1800, 66, 0.11, 26), TestCase::EXTENSIVE);
-// MCS 2 TB size of 1088 bits BLER 0.02 SINR -5.51
-  AddTestCase (new LenaDataPhyErrorModelTestCase (1, 1800, 136, 0.02, 33), TestCase::EXTENSIVE);
-  // MCS 12 TB size of 4800 bits  BLER 0.3  SINR 4.43
-  AddTestCase (new LenaDataPhyErrorModelTestCase (1, 600, 600, 0.3, 38), TestCase::EXTENSIVE);
-// MCS 12 TB size of 1632 bits  BLER 0.55  SINR 4.43
-  AddTestCase (new LenaDataPhyErrorModelTestCase (3, 600, 204, 0.55, 40), TestCase::EXTENSIVE);
-// MCS 16 TB size of 7272 bits (3648 x 3584) BLER 0.14 SINR 8.48
-// BLER 0.14 = 1 - ((1-0.075)*(1-0.075))
-  AddTestCase (new LenaDataPhyErrorModelTestCase (1, 470, 781, 0.14, 29), TestCase::EXTENSIVE);
+  for (uint32_t rngRun = 1; rngRun <= 3; ++rngRun)
+    {
+
+      // Tests on DL Control Channels (PCFICH+PDCCH)
+      // the tolerance is calculated with the following octave code:
+      //
+      // n =  1000; # TX packets
+      // for p=1-[0.007 0.045 0.206 0.343]
+      //    tol = n*p - binoinv(0.001, n, p)
+      // endfor
+
+      // 1 interfering eNB SINR -2.0 BLER 0.007 TB size 217
+      AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (2, 1078, 0.007, 9,
+                                                        Seconds (0.04), rngRun),
+                   (rngRun == 1) ? TestCase::QUICK : TestCase::TAKES_FOREVER);
+      // 2 interfering eNBs SINR -4.0 BLER 0.037 TB size 217
+      AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (3, 1040, 0.045, 21,
+                                                        Seconds (0.04), rngRun),
+                   (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
+      // 3 interfering eNBs SINR -6.0 BLER 0.21 TB size 133
+      AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (4, 1250, 0.206, 40,
+                                                        Seconds (0.12), rngRun),
+                   (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
+      // 4 interfering eNBs SINR -7.0 BLER 0.34 TB size 133
+      AddTestCase (new LenaDlCtrlPhyErrorModelTestCase (5, 1260, 0.343, 47,
+                                                        Seconds (0.12), rngRun),
+                   (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
+
+      // Tests on DL Data channels (PDSCH)
+      // the tolerance is calculated with the following octave code:
+      //
+      // n =  1000; # TX packets
+      // for p=1-[0.33 0.11 0.2 0.3 0.55 0.14]
+      //    tol = n*p - binoinv(0.005, n, p)
+      // endfor
+
+      // MCS 2 TB size of 256 bits BLER 0.33 SINR -5.51
+      AddTestCase (new LenaDataPhyErrorModelTestCase (4, 1800, 0.33, 39,
+                                                      Seconds (0.04), rngRun),
+                   (rngRun == 1) ? TestCase::QUICK : TestCase::TAKES_FOREVER);
+      // MCS 2 TB size of 528 bits BLER 0.11 SINR -5.51
+      AddTestCase (new LenaDataPhyErrorModelTestCase (2, 1800, 0.11, 26,
+                                                      Seconds (0.04), rngRun),
+                   (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
+      // MCS 2 TB size of 1088 bits BLER 0.02 SINR -5.51
+      AddTestCase (new LenaDataPhyErrorModelTestCase (1, 1800, 0.02, 33,
+                                                      Seconds (0.04), rngRun),
+                   (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
+      // MCS 12 TB size of 4800 bits  BLER 0.3  SINR 4.43
+      AddTestCase (new LenaDataPhyErrorModelTestCase (1, 600, 0.3, 38,
+                                                      Seconds (0.04), rngRun),
+                   (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
+      // MCS 12 TB size of 1632 bits  BLER 0.55  SINR 4.43
+      AddTestCase (new LenaDataPhyErrorModelTestCase (3, 600, 0.55, 40,
+                                                      Seconds (0.04), rngRun),
+                   (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
+      // MCS 16 TB size of 7272 bits (3648 x 3584) BLER 0.14 SINR 8.48
+      // BLER 0.14 = 1 - ((1-0.075)*(1-0.075))
+      AddTestCase (new LenaDataPhyErrorModelTestCase (1, 470, 0.14, 29,
+                                                      Seconds (0.04), rngRun),
+                   (rngRun == 1) ? TestCase::EXTENSIVE : TestCase::TAKES_FOREVER);
 
- 
+    }
 
 }
 
-static LenaTestPhyErrorModelrSuite lenaTestPhyErrorModelrSuite;
+static LenaTestPhyErrorModelSuite lenaTestPhyErrorModelSuite;
 
 std::string 
-LenaDataPhyErrorModelTestCase::BuildNameString (uint16_t nUser, uint16_t dist)
+LenaDataPhyErrorModelTestCase::BuildNameString (uint16_t nUser, uint16_t dist, uint32_t rngRun)
 {
   std::ostringstream oss;
-  oss << nUser << " UEs, distance " << dist << " m";
+  oss << "DataPhyErrorModel " <<  nUser << " UEs, distance " << dist << " m, RngRun " << rngRun;
   return oss.str ();
 }
 
-LenaDataPhyErrorModelTestCase::LenaDataPhyErrorModelTestCase (uint16_t nUser, uint16_t dist, uint16_t tbSize, double blerRef, uint16_t toleranceRxPackets)
-  : TestCase (BuildNameString (nUser, dist)),              
+LenaDataPhyErrorModelTestCase::LenaDataPhyErrorModelTestCase (
+  uint16_t nUser, uint16_t dist, double blerRef,
+  uint16_t toleranceRxPackets, Time statsStartTime, uint32_t rngRun)
+  : TestCase (BuildNameString (nUser, dist, rngRun)),
     m_nUser (nUser),
     m_dist (dist),
     m_blerRef (blerRef),
-    m_toleranceRxPackets (toleranceRxPackets)
-{  
+    m_toleranceRxPackets (toleranceRxPackets),
+    m_statsStartTime (statsStartTime),
+    m_rngRun (rngRun)
+{
 }
 
 LenaDataPhyErrorModelTestCase::~LenaDataPhyErrorModelTestCase ()
@@ -132,12 +167,13 @@
   Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
   Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (true));
   Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
+  Config::SetGlobal ("RngRun", IntegerValue (m_rngRun));
 
-
-  /**
+  /*
    * Initialize Simulation Scenario: 1 eNB and m_nUser UEs
    */
 
+  int64_t stream = 1;
   Ptr<LteHelper> lena = CreateObject<LteHelper> ();
   
   // Create Nodes: eNodeB and UE
@@ -168,7 +204,9 @@
   lena->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
   
   enbDevs = lena->InstallEnbDevice (enbNodes);
+  stream += lena->AssignStreams (enbDevs, stream);
   ueDevs = lena->InstallUeDevice (ueNodes);
+  stream += lena->AssignStreams (ueDevs, stream);
 
   // Attach a UE to a eNB
   lena->Attach (ueDevs, enbDevs.Get (0));
@@ -198,14 +236,13 @@
       uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
     }
     
-  lena->EnableRlcTraces ();
-  Time simulationTime = Seconds (1.000);
-
-  Simulator::Stop (simulationTime);
+  Time statsDuration = Seconds (1.0);
+  Simulator::Stop (m_statsStartTime + statsDuration - Seconds (0.0001));
 
+  lena->EnableRlcTraces ();
   Ptr<RadioBearerStatsCalculator> rlcStats = lena->GetRlcStats ();
-  rlcStats->SetAttribute ("EpochDuration", TimeValue (simulationTime));
-
+  rlcStats->SetAttribute ("StartTime", TimeValue (m_statsStartTime));
+  rlcStats->SetAttribute ("EpochDuration", TimeValue (statsDuration));
 
   Simulator::Run ();
 
@@ -223,23 +260,21 @@
       double expectedDlRxPackets = dlTxPackets -dlTxPackets*m_blerRef;
       NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " DOWNLINK"
                    << " pkts rx " << dlRxPackets << " tx " << dlTxPackets
-                   << " BLER " << dlBler << " Err " << std::fabs (m_blerRef - dlBler) 
-                   << " expected rx " << expectedDlRxPackets 
-                   << " difference " << std::abs (expectedDlRxPackets - dlRxPackets) 
+                   << " BLER " << dlBler << " Err " << std::fabs (m_blerRef - dlBler)
+                   << " expected rx " << expectedDlRxPackets
+                   << " difference " << std::abs (expectedDlRxPackets - dlRxPackets)
                    << " tolerance " << m_toleranceRxPackets);
       NS_UNUSED (dlBler);
 
-      // sanity check for whether the tx packets reported by the stats are correct 
-      // we expect one packet per TTI, excluding the initial RRC connection establishment period
-      double expectedDlMinTxPackets = simulationTime.GetMilliSeconds () - 50;
-      NS_TEST_ASSERT_MSG_GT (dlTxPackets, expectedDlMinTxPackets, " too few DL TX packets reported");
-
-      // the quantiles are evaluated offline according to a Bernoulli 
-      // ditribution with n equal to the number of packet sent and p equal 
-      // to the BLER (see /reference/bernuolliDistribution.m for details)
-      NS_TEST_ASSERT_MSG_EQ_TOL (dlRxPackets, expectedDlRxPackets, m_toleranceRxPackets, " Unexpected DL BLER distribution!");
-
-
+      // sanity check for whether the tx packets reported by the stats are correct
+      // we expect one packet per TTI
+      double expectedDlTxPackets = statsDuration.GetMilliSeconds ();
+      NS_TEST_ASSERT_MSG_EQ_TOL (dlTxPackets, expectedDlTxPackets, expectedDlTxPackets * 0.005, 
+                                 " too different DL TX packets reported");
+
+      // this is the main test condition: check that the RX packets are within the expected range
+      NS_TEST_ASSERT_MSG_EQ_TOL (dlRxPackets, expectedDlRxPackets, m_toleranceRxPackets, 
+                                 " too different DL RX packets reported");
     }
 
 
@@ -250,19 +285,24 @@
 
 
 std::string 
-LenaDlCtrlPhyErrorModelTestCase::BuildNameString (uint16_t nEnb, uint16_t dist)
+LenaDlCtrlPhyErrorModelTestCase::BuildNameString (uint16_t nEnb, uint16_t dist, uint32_t rngRun)
 {
   std::ostringstream oss;
-  oss << nEnb << " eNBs, distance " << dist << " m";
+  oss << "DlCtrlPhyErrorModel " << nEnb << " eNBs, distance " << dist << " m, RngRun " << rngRun;
   return oss.str ();
 }
 
 
-LenaDlCtrlPhyErrorModelTestCase::LenaDlCtrlPhyErrorModelTestCase (uint16_t nEnb, uint16_t dist, uint16_t tbSize, double blerRef)
-: TestCase (BuildNameString (nEnb, dist)),              
-m_nEnb (nEnb),
-m_dist (dist),
-m_blerRef (blerRef)
+LenaDlCtrlPhyErrorModelTestCase::LenaDlCtrlPhyErrorModelTestCase (
+  uint16_t nEnb, uint16_t dist, double blerRef,
+  uint16_t toleranceRxPackets, Time statsStartTime, uint32_t rngRun)
+  : TestCase (BuildNameString (nEnb, dist, rngRun)),
+    m_nEnb (nEnb),
+    m_dist (dist),
+    m_blerRef (blerRef),
+    m_toleranceRxPackets (toleranceRxPackets),
+    m_statsStartTime (statsStartTime),
+    m_rngRun (rngRun)
 {
 }
 
@@ -280,11 +320,13 @@
   Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (true));
   Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
   Config::SetDefault ("ns3::RrFfMacScheduler::HarqEnabled", BooleanValue (false));
-  
-  /**
-  * Initialize Simulation Scenario: 1 eNB and m_nUser UEs
-  */
-  
+  Config::SetGlobal ("RngRun", IntegerValue (m_rngRun));
+
+  /*
+   * Initialize Simulation Scenario: 1 eNB and m_nUser UEs
+   */
+
+  int64_t stream = 1;
   Ptr<LteHelper> lena = CreateObject<LteHelper> ();
   
   // Create Nodes: eNodeB and UE
@@ -315,7 +357,9 @@
   lena->SetSchedulerAttribute ("UlCqiFilter", EnumValue (FfMacScheduler::PUSCH_UL_CQI));
   
   enbDevs = lena->InstallEnbDevice (enbNodes);
+  stream += lena->AssignStreams (enbDevs, stream);
   ueDevs = lena->InstallUeDevice (ueNodes);
+  stream += lena->AssignStreams (ueDevs, stream);
   
   // Attach a UE to one eNB (the others are interfering ones)
   lena->Attach (ueDevs, enbDevs.Get (0));
@@ -345,16 +389,14 @@
   uePhy->SetAttribute ("TxPower", DoubleValue (23.0));
   uePhy->SetAttribute ("NoiseFigure", DoubleValue (9.0));
   
-  
+  Time statsDuration = Seconds (1.0);
+  Simulator::Stop (m_statsStartTime + statsDuration - Seconds (0.0001));
+
   lena->EnableRlcTraces ();
-  Time simulationTime = Seconds (1.000);
-  
-  Simulator::Stop (simulationTime);
-  
   Ptr<RadioBearerStatsCalculator> rlcStats = lena->GetRlcStats ();
-  rlcStats->SetAttribute ("EpochDuration", TimeValue (simulationTime));
-  
-  
+  rlcStats->SetAttribute ("StartTime", TimeValue (m_statsStartTime));
+  rlcStats->SetAttribute ("EpochDuration", TimeValue (statsDuration));
+
   Simulator::Run ();
   
   NS_LOG_INFO ("\tTest downlink control channels (PCFICH+PDCCH)");
@@ -367,19 +409,27 @@
       uint8_t lcId = 3;
       double dlRxPackets = rlcStats->GetDlRxPackets (imsi, lcId);
       double dlTxPackets = rlcStats->GetDlTxPackets (imsi, lcId);
-      double bler = 1.0 - (dlRxPackets/dlTxPackets);
-      NS_LOG_INFO ("\tUser " << i << " imsi " << imsi 
+      double dlBler = 1.0 - (dlRxPackets/dlTxPackets);
+      double expectedDlRxPackets = dlTxPackets -dlTxPackets*m_blerRef;
+      NS_LOG_INFO ("\tUser " << i << " imsi " << imsi << " DOWNLINK"
                    << " pkts rx " << dlRxPackets << " tx " << dlTxPackets
-                   << " BLER " << bler << " Err " << fabs (m_blerRef - bler));
-      NS_UNUSED (bler);
+                   << " BLER " << dlBler << " Err " << std::fabs (m_blerRef - dlBler)
+                   << " expected rx " << expectedDlRxPackets
+                   << " difference " << std::abs (expectedDlRxPackets - dlRxPackets)
+                   << " tolerance " << m_toleranceRxPackets);
+      NS_UNUSED (dlBler);
 
-      // sanity check for whether the tx packets reported by the stats are correct 
-      // we expect one packet per TTI, excluding the initial RRC connection establishment period
-      double expectedMinDlTxPackets = simulationTime.GetMilliSeconds () - 50;
-      NS_TEST_ASSERT_MSG_GT (dlTxPackets, expectedMinDlTxPackets, " too few TX packets reported");
+      // sanity check for whether the tx packets reported by the stats are correct
+      // we expect one packet per TTI
+      double expectedDlTxPackets = statsDuration.GetMilliSeconds ();
+      NS_TEST_ASSERT_MSG_EQ_TOL (dlTxPackets, expectedDlTxPackets, expectedDlTxPackets * 0.005, 
+                                 " too different DL TX packets reported");
+
+      // this is the main test condition: check that the RX packets are within the expected range
+      NS_TEST_ASSERT_MSG_EQ_TOL (dlRxPackets, expectedDlRxPackets, m_toleranceRxPackets,
+                                 "too different DL RX packets reported");
 
-      NS_TEST_ASSERT_MSG_EQ_TOL (bler, m_blerRef, 0.1, " Unexpected BLER distribution!");
-    }  
+    }
   
   Simulator::Destroy ();
 }
diff -Naur ns-3.18.1/src/lte/test/lte-test-phy-error-model.h ns-3.19/src/lte/test/lte-test-phy-error-model.h
--- ns-3.18.1/src/lte/test/lte-test-phy-error-model.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-phy-error-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -21,8 +21,9 @@
 #ifndef LENA_TEST_PHY_ERROR_MODEL_H
 #define LENA_TEST_PHY_ERROR_MODEL_H
 
-#include "ns3/simulator.h"
-#include "ns3/test.h"
+#include <ns3/simulator.h>
+#include <ns3/test.h>
+#include <ns3/nstime.h>
 
 
 namespace ns3 {
@@ -38,16 +39,20 @@
 class LenaDataPhyErrorModelTestCase : public TestCase
 {
 public:
-  LenaDataPhyErrorModelTestCase (uint16_t nUser, uint16_t dist, uint16_t tbSize, double refBler, uint16_t toleranceRxPackets);
+  LenaDataPhyErrorModelTestCase (uint16_t nUser, uint16_t dist,
+                                 double blerRef, uint16_t toleranceRxPackets,
+                                 Time statsStartTime, uint32_t rngRun);
   virtual ~LenaDataPhyErrorModelTestCase ();
 
 private:
   virtual void DoRun (void);
-  static std::string BuildNameString (uint16_t nUser, uint16_t dist);
+  static std::string BuildNameString (uint16_t nUser, uint16_t dist, uint32_t rngRun);
   uint16_t m_nUser;
   uint16_t m_dist;
   double m_blerRef;
   uint16_t m_toleranceRxPackets;
+  Time m_statsStartTime; ///< Extra time in the beginning of simulation to allow RRC connection establishment + SRS
+  uint32_t m_rngRun;
 
 };
 
@@ -55,25 +60,30 @@
 
 class LenaDlCtrlPhyErrorModelTestCase : public TestCase
 {
-  public:
-    LenaDlCtrlPhyErrorModelTestCase (uint16_t nEnbr, uint16_t dist, uint16_t tbSize, double refBler);
-    virtual ~LenaDlCtrlPhyErrorModelTestCase ();
-    
-  private:
-    virtual void DoRun (void);
-    static std::string BuildNameString (uint16_t nUser, uint16_t dist);
-    uint16_t m_nEnb;
-    uint16_t m_dist;
-    double m_blerRef;
-    
+public:
+  LenaDlCtrlPhyErrorModelTestCase (uint16_t nEnb, uint16_t dist,
+                                   double blerRef, uint16_t toleranceRxPackets,
+                                   Time statsStartTime, uint32_t rngRun);
+  virtual ~LenaDlCtrlPhyErrorModelTestCase ();
+
+private:
+  virtual void DoRun (void);
+  static std::string BuildNameString (uint16_t nUser, uint16_t dist, uint32_t rngRun);
+  uint16_t m_nEnb;
+  uint16_t m_dist;
+  double m_blerRef;
+  uint16_t m_toleranceRxPackets;
+  Time m_statsStartTime; ///< Extra time in the beginning of simulation to allow RRC connection establishment + SRS
+  uint32_t m_rngRun;
+
 };
 
 
 
-class LenaTestPhyErrorModelrSuite : public TestSuite
+class LenaTestPhyErrorModelSuite : public TestSuite
 {
 public:
-  LenaTestPhyErrorModelrSuite ();
+  LenaTestPhyErrorModelSuite ();
 };
 
 
diff -Naur ns-3.18.1/src/lte/test/lte-test-pss-ff-mac-scheduler.cc ns-3.19/src/lte/test/lte-test-pss-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/test/lte-test-pss-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-pss-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -49,7 +49,7 @@
 #include <ns3/boolean.h>
 #include <ns3/enum.h>
 
-#include "ns3/epc-helper.h"
+#include "ns3/point-to-point-epc-helper.h"
 #include "ns3/network-module.h"
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/internet-module.h"
@@ -268,7 +268,7 @@
   Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper>  epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
 
   //LogComponentEnable ("PssFfMacScheduler", LOG_DEBUG);
@@ -516,7 +516,7 @@
 
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper>  epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
 
   Ptr<Node> pgw = epcHelper->GetPgwNode ();
diff -Naur ns-3.18.1/src/lte/test/lte-test-rr-ff-mac-scheduler.cc ns-3.19/src/lte/test/lte-test-rr-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/test/lte-test-rr-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-rr-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -60,7 +60,7 @@
 
   bool errorModel = true;
 
-  
+
   // DOWNLINK- DISTANCE 0 -> MCS 28 -> Itbs 26 (from table 7.1.7.2.1-1 of 36.213)
   // 1 user -> 24 PRB at Itbs 26 -> 2196 -> 2196000 bytes/sec
   // 3 users -> 8 PRB at Itbs 26 -> 749 -> 749000 bytes/sec
@@ -184,8 +184,9 @@
       Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
     }
   Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (false));
-//   LogComponentDisableAll (LOG_LEVEL_ALL);
-  //LogComponentEnable ("LenaTestRrFfMacCheduler", LOG_LEVEL_ALL);
+
+  // This is needed as the RR scheduler does not allocate resources properly for retransmission
+  Config::SetDefault ("ns3::LteRlcAm::TxOpportunityForRetxAlwaysBigEnough", BooleanValue (true));
 
   /**
    * Initialize Simulation Scenario: 1 eNB and m_nUser UEs
diff -Naur ns-3.18.1/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc ns-3.19/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc
--- ns-3.18.1/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-tdtbfq-ff-mac-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -49,7 +49,7 @@
 #include <ns3/boolean.h>
 #include <ns3/enum.h>
 
-#include "ns3/epc-helper.h"
+#include "ns3/point-to-point-epc-helper.h"
 #include "ns3/network-module.h"
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/internet-module.h"
@@ -267,7 +267,7 @@
   Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper>  epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
 
   //LogComponentEnable ("TdTbfqFfMacScheduler", LOG_DEBUG);
@@ -515,7 +515,7 @@
 
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper>  epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper>  epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
 
   Ptr<Node> pgw = epcHelper->GetPgwNode ();
diff -Naur ns-3.18.1/src/lte/test/lte-test-ue-measurements.cc ns-3.19/src/lte/test/lte-test-ue-measurements.cc
--- ns-3.18.1/src/lte/test/lte-test-ue-measurements.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-ue-measurements.cc	2013-12-20 09:44:50.000000000 -0800
@@ -18,27 +18,39 @@
  * Author: Manuel Requena <manuel.requena@cttc.es>
  *         Nicola Baldo <nbaldo@cttc.es>
  *         Marco Miozzo <mmiozzo@cttc.es>
+ *         Budiarto Herman <budiarto.herman@magister.fi>
  */
 
-#include "ns3/simulator.h"
-#include "ns3/log.h"
-#include "ns3/string.h"
-#include "ns3/double.h"
+#include <ns3/simulator.h>
+#include <ns3/log.h>
+#include <ns3/callback.h>
+#include <ns3/config.h>
+#include <ns3/string.h>
+#include <ns3/double.h>
 #include <ns3/enum.h>
-#include "ns3/boolean.h"
-#include "ns3/mobility-helper.h"
-#include "ns3/lte-helper.h"
-#include "ns3/ff-mac-scheduler.h"
+#include <ns3/boolean.h>
 
-#include "ns3/lte-enb-phy.h"
-#include "ns3/lte-enb-net-device.h"
-
-#include "ns3/lte-ue-phy.h"
-#include "ns3/lte-ue-net-device.h"
+#include <ns3/mobility-helper.h>
+#include <ns3/lte-helper.h>
+#include <ns3/point-to-point-epc-helper.h>
+#include <ns3/internet-stack-helper.h>
+#include <ns3/point-to-point-helper.h>
+#include <ns3/ipv4-address-helper.h>
+#include <ns3/ipv4-static-routing-helper.h>
+
+#include <ns3/node-container.h>
+#include <ns3/net-device-container.h>
+#include <ns3/ipv4-interface-container.h>
+
+#include <ns3/ff-mac-scheduler.h>
+#include <ns3/lte-enb-net-device.h>
+#include <ns3/lte-enb-phy.h>
 #include <ns3/lte-enb-rrc.h>
+#include <ns3/lte-ue-net-device.h>
+#include <ns3/lte-ue-phy.h>
+#include <ns3/lte-ue-rrc.h>
 
 #include "lte-test-ue-measurements.h"
-
 #include "lte-test-sinr-chunk-processor.h"
 #include <ns3/lte-common.h>
 
@@ -47,23 +59,27 @@
 namespace ns3 {
 
 
+// ===== LTE-UE-MEASUREMENTS TEST SUITE ==================================== //
+
 void
-ReportUeMeasurementsCallback (LteUeMeasurementsTestCase *testcase, std::string path,
-                             uint16_t rnti, uint16_t cellId, double rsrp, double rsrq, bool servingCell)
+ReportUeMeasurementsCallback (LteUeMeasurementsTestCase *testcase,
+                              std::string path, uint16_t rnti, uint16_t cellId,
+                              double rsrp, double rsrq, bool servingCell)
 {
   testcase->ReportUeMeasurements (rnti, cellId, rsrp, rsrq, servingCell);
 }
 
 void
-RecvMeasurementReportCallback (LteUeMeasurementsTestCase *testcase, std::string path,
-                             uint64_t imsi, uint16_t rnti, uint16_t cellId, LteRrcSap::MeasurementReport meas)
+RecvMeasurementReportCallback (LteUeMeasurementsTestCase *testcase,
+                               std::string path, uint64_t imsi, uint16_t cellId,
+                               uint16_t rnti, LteRrcSap::MeasurementReport meas)
 {
-  testcase->RecvMeasurementReport (imsi, rnti, cellId, meas);
+  testcase->RecvMeasurementReport (imsi, cellId, rnti, meas);
 }
 
 
-/**
- * TestSuite
+/*
+ * Test Suite
  */
 
 LteUeMeasurementsTestSuite::LteUeMeasurementsTestSuite ()
@@ -88,18 +104,21 @@
   AddTestCase (new LteUeMeasurementsTestCase ("d1=200000, d2=10000",  200000.000000, 10000.000000, -139.760302, -113.739702, -29.502549, -3.481949), TestCase::EXTENSIVE);
   AddTestCase (new LteUeMeasurementsTestCase ("d1=500000, d2=10000",  500000.000000, 10000.000000, -147.719102, -113.739702, -37.453160, -3.473760), TestCase::EXTENSIVE);
   AddTestCase (new LteUeMeasurementsTestCase ("d1=1000000, d2=10000",  1000000.000000, 10000.000000, -153.739702, -113.739702, -43.472589, -3.472589), TestCase::EXTENSIVE);
-
-
 }
 
 static LteUeMeasurementsTestSuite lteUeMeasurementsTestSuite;
 
 
-/**
- * TestCase
+/*
+ * Test Case
  */
 
-LteUeMeasurementsTestCase::LteUeMeasurementsTestCase (std::string name, double d1, double d2, double rsrpDbmUe1, double rsrpDbmUe2, double rsrqDbUe1, double rsrqDbUe2)
+LteUeMeasurementsTestCase::LteUeMeasurementsTestCase (std::string name,
+                                                      double d1, double d2,
+                                                      double rsrpDbmUe1,
+                                                      double rsrpDbmUe2,
+                                                      double rsrqDbUe1,
+                                                      double rsrqDbUe2)
   : TestCase (name),
     m_d1 (d1),
     m_d2 (d2),
@@ -118,7 +137,7 @@
 void
 LteUeMeasurementsTestCase::DoRun (void)
 {
-  NS_LOG_INFO (this << GetName ());
+  NS_LOG_INFO (this << " " << GetName ());
 
   Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled", BooleanValue (false));
   Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));
@@ -128,8 +147,8 @@
   lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
   lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (false));
 
-  LogComponentEnable ("LteUeMeasurementsTest", LOG_LEVEL_ALL);
-  
+  // LogComponentEnable ("LteUeMeasurementsTest", LOG_LEVEL_ALL);
+
   // Create Nodes: eNodeB and UE
   NodeContainer enbNodes;
   NodeContainer ueNodes1;
@@ -137,7 +156,7 @@
   enbNodes.Create (2);
   ueNodes1.Create (1);
   ueNodes2.Create (1);
-  NodeContainer allNodes = NodeContainer ( enbNodes, ueNodes1, ueNodes2);
+  NodeContainer allNodes = NodeContainer (enbNodes, ueNodes1, ueNodes2);
 
   // the topology is the following:
   //         d2
@@ -167,6 +186,7 @@
   ueDevs1 = lteHelper->InstallUeDevice (ueNodes1);
   ueDevs2 = lteHelper->InstallUeDevice (ueNodes2);
 
+  // Attach UEs to eNodeBs
   lteHelper->Attach (ueDevs1, enbDevs.Get (0));
   lteHelper->Attach (ueDevs2, enbDevs.Get (1));
 
@@ -208,8 +228,7 @@
   Config::Connect ("/NodeList/1/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
                    MakeBoundCallback (&RecvMeasurementReportCallback, this));
 
-  
-// need to allow for RRC connection establishment + SRS
+  // need to allow for RRC connection establishment + SRS
   Simulator::Stop (Seconds (0.800));
   Simulator::Run ();
 
@@ -217,9 +236,10 @@
 
 }
 
-
 void
-LteUeMeasurementsTestCase::ReportUeMeasurements (uint16_t rnti, uint16_t cellId, double rsrp, double rsrq, bool servingCell)
+LteUeMeasurementsTestCase::ReportUeMeasurements (uint16_t rnti, uint16_t cellId,
+                                                 double rsrp, double rsrq,
+                                                 bool servingCell)
 {
   // need to allow for RRC connection establishment + CQI feedback reception + UE measurements filtering (200 ms)
   if (Simulator::Now () > MilliSeconds (400))
@@ -228,38 +248,1692 @@
         {
           NS_LOG_DEBUG ("UE serving cellId " << cellId << " Rxed RSRP " << rsrp << " thr " << m_rsrpDbmUeServingCell << " RSRQ " << rsrq << " thr " << m_rsrqDbUeServingCell);
           NS_TEST_ASSERT_MSG_EQ_TOL (m_rsrpDbmUeServingCell, rsrp, 0.2, "Wrong RSRP UE 1");
-          NS_TEST_ASSERT_MSG_EQ_TOL (m_rsrqDbUeServingCell, rsrq, 0.2 , "Wrong RSRQ UE 1");
+          NS_TEST_ASSERT_MSG_EQ_TOL (m_rsrqDbUeServingCell, rsrq, 0.2, "Wrong RSRQ UE 1");
         }
       else
         {
           NS_LOG_DEBUG ("UE neighbor cellId " << cellId << " Rxed RSRP " << rsrp << " thr " << m_rsrpDbmUeNeighborCell << " RSRQ " << rsrq << " thr " << m_rsrqDbUeNeighborCell);
-          NS_TEST_ASSERT_MSG_EQ_TOL (m_rsrpDbmUeNeighborCell, rsrp, 0.2 , "Wrong RSRP UE 2");
-          NS_TEST_ASSERT_MSG_EQ_TOL (m_rsrqDbUeNeighborCell, rsrq, 0.2 , "Wrong RSRQ UE ");
+          NS_TEST_ASSERT_MSG_EQ_TOL (m_rsrpDbmUeNeighborCell, rsrp, 0.2, "Wrong RSRP UE 2");
+          NS_TEST_ASSERT_MSG_EQ_TOL (m_rsrqDbUeNeighborCell, rsrq, 0.2, "Wrong RSRQ UE ");
         }
     }
 }
 
-
 void
-LteUeMeasurementsTestCase::RecvMeasurementReport (uint64_t imsi, uint16_t cellId, uint16_t rnti, LteRrcSap::MeasurementReport meas)
+LteUeMeasurementsTestCase::RecvMeasurementReport (uint64_t imsi, uint16_t cellId, uint16_t rnti,
+                                                  LteRrcSap::MeasurementReport meas)
 {
   // need to allow for RRC connection establishment + CQI feedback reception + UE measurements filtering (200 ms)
   if (Simulator::Now () > MilliSeconds (400))
     {
       if (cellId == imsi)
         {
-          NS_LOG_DEBUG ("Serving Cell: received IMSI " << imsi << " CellId " << cellId << " RNTI " << rnti  << " thr " << (uint16_t)EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeServingCell) << " RSRP " << (uint16_t)meas.measResults.rsrpResult << " RSRQ " << (uint16_t)meas.measResults.rsrqResult << " thr " << (uint16_t)EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeServingCell));
-          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrpResult, EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeServingCell), "Wrong RSRP ");
-          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrqResult, EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeServingCell), "Wrong RSRQ ");
+          NS_LOG_DEBUG (this << "Serving Cell: received IMSI " << imsi << " CellId " << cellId << " RNTI " << rnti
+                             << " thr " << (uint16_t) EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeServingCell)
+                             << " RSRP " << (uint16_t) meas.measResults.rsrpResult
+                             << " RSRQ " << (uint16_t)meas.measResults.rsrqResult
+                             << " thr " << (uint16_t) EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeServingCell));
+          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrpResult,
+                                 EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeServingCell),
+                                 "Wrong RSRP ");
+          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrqResult,
+                                 EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeServingCell),
+                                 "Wrong RSRQ ");
         }
       else
         {
-          NS_LOG_DEBUG ("Neighbor cell: received IMSI " << imsi << " CellId " << cellId << " RNTI " << rnti  << " thr " << (uint16_t)EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeNeighborCell) << " RSRP " << (uint16_t)meas.measResults.rsrpResult << " RSRQ " << (uint16_t)meas.measResults.rsrqResult << " thr " << (uint16_t)EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeNeighborCell));
-          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrpResult, EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeNeighborCell), "Wrong RSRP ");
-          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrqResult, EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeNeighborCell), "Wrong RSRQ ");
+          NS_LOG_DEBUG (this << "Neighbor cell: received IMSI " << imsi << " CellId " << cellId << " RNTI " << rnti
+                             << " thr " << (uint16_t) EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeNeighborCell)
+                             << " RSRP " << (uint16_t) meas.measResults.rsrpResult
+                             << " RSRQ " << (uint16_t)meas.measResults.rsrqResult
+                             << " thr " << (uint16_t) EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeNeighborCell));
+          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrpResult,
+                                 EutranMeasurementMapping::Dbm2RsrpRange (m_rsrpDbmUeNeighborCell),
+                                 "Wrong RSRP ");
+          NS_TEST_ASSERT_MSG_EQ (meas.measResults.rsrqResult,
+                                 EutranMeasurementMapping::Db2RsrqRange (m_rsrqDbUeNeighborCell),
+                                 "Wrong RSRQ ");
         }
     }
 }
 
+
+// ===== LTE-UE-MEASUREMENTS-PIECEWISE-1 TEST SUITE ======================== //
+
+/*
+ * Overloaded operators, for the convenience of defining test cases
+ */
+
+std::vector<Time>&
+operator<< (std::vector<Time>& v, const uint64_t& ms)
+{
+  /*
+   * Prior attempt to use seconds as unit of choice resulted in precision lost.
+   * Therefore milliseconds are used now instead.
+   */
+  v.push_back (MilliSeconds (ms) + UE_MEASUREMENT_REPORT_DELAY);
+  return v;
+}
+
+std::vector<uint8_t>&
+operator<< (std::vector<uint8_t>& v, const uint8_t& range)
+{
+  v.push_back (range);
+  return v;
+}
+
+
+/*
+ * Test Suite
+ */
+
+LteUeMeasurementsPiecewiseTestSuite1::LteUeMeasurementsPiecewiseTestSuite1 ()
+  : TestSuite ("lte-ue-measurements-piecewise-1", SYSTEM)
+{
+  std::vector<Time> expectedTime;
+  std::vector<uint8_t> expectedRsrp;
+
+  // === Event A1 (serving cell becomes better than threshold) ===
+
+  // With very low threshold
+  LteRrcSap::ReportConfigEutra config;
+  config.triggerType = LteRrcSap::ReportConfigEutra::EVENT;
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  config.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRP;
+  config.threshold1.range = 0;
+  config.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRP;
+  config.reportInterval = LteRrcSap::ReportConfigEutra::MS120;
+  expectedTime.clear ();
+  expectedTime << 200 << 320 << 440 << 560 << 680 << 800 << 920 << 1040 << 1160 << 1280
+               << 1400 << 1520 << 1640 << 1760 << 1880 << 2000 << 2120;
+  expectedRsrp.clear ();
+  expectedRsrp << 67 << 67 << 57 << 57 << 66 << 47 << 47 << 66 << 66 << 57
+               << 51 << 51 << 47 << 47 << 51 << 57 << 57;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A1 with very low threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With normal threshold
+  config.threshold1.range = 54;
+  expectedTime.clear ();
+  expectedTime << 200 << 320 << 440 << 560 << 680 << 1000 << 1120 << 1240 << 1360 << 2000
+               << 2120;
+  expectedRsrp.clear ();
+  expectedRsrp << 67 << 67 << 57 << 57 << 66 << 66 << 66 << 57 << 57 << 57
+               << 57;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A1 with normal threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With short time-to-trigger
+  config.timeToTrigger = 64;
+  expectedTime.clear ();
+  expectedTime << 264 << 384 << 504 << 624 << 744 << 1064 << 1184 << 1304 << 1424 << 2064
+               << 2184;
+  expectedRsrp.clear ();
+  expectedRsrp << 67 << 67 << 57 << 66 << 66 << 66 << 66 << 57 << 51 << 57
+               << 57;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A1 with short time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With long time-to-trigger
+  config.timeToTrigger = 128;
+  expectedTime.clear ();
+  expectedTime << 328 << 448 << 568 << 688 << 808 << 1128 << 1248 << 1368 << 1488 << 2128;
+  expectedRsrp.clear ();
+  expectedRsrp << 67 << 57 << 57 << 66 << 47 << 66 << 57 << 57 << 51 << 57;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A1 with long time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With super time-to-trigger
+  config.timeToTrigger = 256;
+  expectedTime.clear ();
+  expectedTime << 456 << 576 << 696 << 816 << 936 << 1056 << 1176 << 1296 << 1416 << 1536;
+  expectedRsrp.clear ();
+  expectedRsrp << 57 << 57 << 66 << 47 << 47 << 66 << 66 << 57 << 51 << 51;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A1 with super time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With hysteresis
+  config.hysteresis = 8;
+  config.timeToTrigger = 0;
+  expectedTime.clear ();
+  expectedTime << 200 << 320 << 440 << 560 << 680 << 1000 << 1120 << 1240 << 1360 << 1480
+               << 2200;
+  expectedRsrp.clear ();
+  expectedRsrp << 67 << 67 << 57 << 57 << 66 << 66 << 66 << 57 << 57 << 51
+               << 67;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A1 with hysteresis",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With very high threshold
+  config.threshold1.range = 97;
+  config.hysteresis = 0;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A1 with very high threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // === Event A2 (serving cell becomes worse than threshold) ===
+
+  // With very low threshold
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  config.threshold1.range = 0;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A2 with very low threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With normal threshold
+  config.threshold1.range = 54;
+  expectedTime.clear ();
+  expectedTime << 800 << 920 << 1400 << 1520 << 1640 << 1760 << 1880;
+  expectedRsrp.clear ();
+  expectedRsrp << 47 << 47 << 51 << 51 << 47 << 47 << 51;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A2 with normal threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With short time-to-trigger
+  config.timeToTrigger = 64;
+  expectedTime.clear ();
+  expectedTime << 864 << 984 << 1464 << 1584 << 1704 << 1824 << 1944;
+  expectedRsrp.clear ();
+  expectedRsrp << 47 << 47 << 51 << 51 << 47 << 51 << 51;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A2 with short time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With long time-to-trigger
+  config.timeToTrigger = 128;
+  expectedTime.clear ();
+  expectedTime << 928 << 1048 << 1528 << 1648 << 1768 << 1888 << 2008;
+  expectedRsrp.clear ();
+  expectedRsrp << 47 << 66 << 51 << 47 << 47 << 51 << 57;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A2 with long time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With super time-to-trigger
+  config.timeToTrigger = 256;
+  expectedTime.clear ();
+  expectedTime << 1656 << 1776 << 1896 << 2016 << 2136;
+  expectedRsrp.clear ();
+  expectedRsrp << 47 << 47 << 51 << 57 << 57;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A2 with super time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With hysteresis
+  config.hysteresis = 8;
+  config.timeToTrigger = 0;
+  expectedTime.clear ();
+  expectedTime << 800 << 920 << 1600 << 1720 << 1840 << 1960 << 2080;
+  expectedRsrp.clear ();
+  expectedRsrp << 47 << 47 << 47 << 47 << 51 << 51 << 57;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A2 with hysteresis",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With very high threshold
+  config.threshold1.range = 97;
+  config.hysteresis = 0;
+  expectedTime.clear ();
+  expectedTime << 200 << 320 << 440 << 560 << 680 << 800 << 920 << 1040 << 1160 << 1280
+               << 1400 << 1520 << 1640 << 1760 << 1880 << 2000 << 2120;
+  expectedRsrp.clear ();
+  expectedRsrp << 67 << 67 << 57 << 57 << 66 << 47 << 47 << 66 << 66 << 57
+               << 51 << 51 << 47 << 47 << 51 << 57 << 57;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A2 with very high threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  /*
+   * Event A3, A4, and A5 are not tested intensively here because they depend on
+   * the existence of at least one neighbouring cell, which is not available in
+   * this configuration. Piecewise configuration #2 includes a neighbouring
+   * cell, hence more thorough tests on these events are performed there.
+   */
+
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+
+  // === Event A3 (neighbour becomes offset better than PCell) ===
+
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  config.a3Offset = 0;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A3",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // === Event A4 (neighbour becomes better than threshold) ===
+
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  config.threshold1.range = 54;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A4",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // === Event A5 (PCell becomes worse than absolute threshold1 AND neighbour becomes better than another absolute threshold2) ===
+
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A5;
+  config.threshold2.range = 58;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase1 ("Piecewise test case 1 - Event A5",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+} // end of LteUeMeasurementsPiecewiseTestSuite1::LteUeMeasurementsPiecewiseTestSuite1
+
+static LteUeMeasurementsPiecewiseTestSuite1 lteUeMeasurementsPiecewiseTestSuite1;
+
+
+/*
+ * Test Case
+ */
+
+LteUeMeasurementsPiecewiseTestCase1::LteUeMeasurementsPiecewiseTestCase1 (
+  std::string name, LteRrcSap::ReportConfigEutra config,
+  std::vector<Time> expectedTime, std::vector<uint8_t> expectedRsrp)
+  : TestCase (name),
+    m_config (config),
+    m_expectedTime (expectedTime),
+    m_expectedRsrp (expectedRsrp)
+{
+  // input sanity check
+  uint16_t size = m_expectedTime.size ();
+
+  if (size != m_expectedRsrp.size ())
+    {
+      NS_FATAL_ERROR ("Vectors of expected results are not of the same size");
+    }
+
+  m_itExpectedTime = m_expectedTime.begin ();
+  m_itExpectedRsrp = m_expectedRsrp.begin ();
+
+  NS_LOG_INFO (this << " name=" << name);
+}
+
+LteUeMeasurementsPiecewiseTestCase1::~LteUeMeasurementsPiecewiseTestCase1 ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase1::DoRun ()
+{
+  NS_LOG_INFO (this << " " << GetName ());
+
+  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+  lteHelper->SetAttribute ("PathlossModel",
+                           StringValue ("ns3::FriisSpectrumPropagationLossModel"));
+  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (true));
+
+  // Create Nodes: eNodeB and UE
+  NodeContainer enbNodes;
+  NodeContainer ueNodes;
+  enbNodes.Create (1);
+  ueNodes.Create (1);
+
+  /*
+   * The topology is the following:
+   *
+   * eNodeB     UE
+   *    |       |
+   *    x ----- x --------- x --------------- x ------------------- x
+   *      100 m |   200 m   |      300 m      |        400 m        |
+   *            |           |                 |                     |
+   *         VeryNear      Near              Far                 VeryFar
+   */
+
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0)); // eNodeB
+  positionAlloc->Add (Vector (100.0, 0.0, 0.0)); // UE
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.Install (enbNodes);
+  mobility.Install (ueNodes);
+  m_ueMobility = ueNodes.Get (0)->GetObject<MobilityModel> ();
+
+  // Disable layer-3 filtering
+  Config::SetDefault ("ns3::LteEnbRrc::RsrpFilterCoefficient",
+                      UintegerValue (0));
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  NetDeviceContainer enbDevs;
+  NetDeviceContainer ueDevs;
+  lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
+  lteHelper->SetSchedulerAttribute ("UlCqiFilter",
+                                    EnumValue (FfMacScheduler::PUSCH_UL_CQI));
+  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
+  ueDevs = lteHelper->InstallUeDevice (ueNodes);
+
+  // Setup UE measurement configuration
+  Ptr<LteEnbRrc> enbRrc = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetRrc ();
+  m_expectedMeasId = enbRrc->AddUeMeasReportConfig (m_config);
+
+  // Attach UE to eNodeB
+  lteHelper->Attach (ueDevs.Get (0), enbDevs.Get (0));
+
+  // Activate an EPS bearer
+  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
+  EpsBearer bearer (q);
+  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
+
+  // Connect to trace sources
+  Config::Connect ("/NodeList/0/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
+                   MakeCallback (&LteUeMeasurementsPiecewiseTestCase1::RecvMeasurementReportCallback,
+                                 this));
+
+  /*
+   * Schedule "teleports"
+   *          0                   1                   2
+   *          +-------------------+-------------------+---------> time
+   * VeryNear |------  ----    ----                    --------
+   *     Near |                    ----            ----
+   *      Far |                        ----    ----
+   *  VeryFar |      --    ----            ----
+   */
+  Simulator::Schedule (MilliSeconds (301),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportVeryFar, this);
+  Simulator::Schedule (MilliSeconds (401),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportVeryNear, this);
+  Simulator::Schedule (MilliSeconds (601),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportVeryFar, this);
+  Simulator::Schedule (MilliSeconds (801),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportVeryNear, this);
+  Simulator::Schedule (MilliSeconds (1001),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportNear, this);
+  Simulator::Schedule (MilliSeconds (1201),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportFar, this);
+  Simulator::Schedule (MilliSeconds (1401),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportVeryFar, this);
+  Simulator::Schedule (MilliSeconds (1601),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportFar, this);
+  Simulator::Schedule (MilliSeconds (1801),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportNear, this);
+  Simulator::Schedule (MilliSeconds (2001),
+                       &LteUeMeasurementsPiecewiseTestCase1::TeleportVeryNear, this);
+
+  // Run simulation
+  Simulator::Stop (Seconds (2.201));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+} // end of void LteUeMeasurementsPiecewiseTestCase1::DoRun ()
+
+void
+LteUeMeasurementsPiecewiseTestCase1::DoTeardown ()
+{
+  NS_LOG_FUNCTION (this);
+  bool hasEnded = m_itExpectedTime == m_expectedTime.end ();
+  NS_TEST_ASSERT_MSG_EQ (hasEnded, true,
+                         "Reporting should have occurred at " << m_itExpectedTime->GetSeconds () << "s");
+  hasEnded = m_itExpectedRsrp == m_expectedRsrp.end ();
+  NS_ASSERT (hasEnded);
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase1::RecvMeasurementReportCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
+  LteRrcSap::MeasurementReport report)
+{
+  NS_LOG_FUNCTION (this << context);
+  NS_ASSERT (rnti == 1);
+  NS_ASSERT (cellId == 1);
+
+  if (report.measResults.measId == m_expectedMeasId)
+    {
+      // verifying the report completeness
+      LteRrcSap::MeasResults measResults = report.measResults;
+      NS_LOG_DEBUG (this << " rsrp=" << (uint16_t) measResults.rsrpResult
+                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.rsrpResult) << " dBm)"
+                         << " rsrq=" << (uint16_t) measResults.rsrqResult
+                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.rsrqResult) << " dB)");
+      NS_TEST_ASSERT_MSG_EQ (measResults.haveMeasResultNeighCells, false,
+                             "Report should not have neighboring cells information");
+      NS_TEST_ASSERT_MSG_EQ (measResults.measResultListEutra.size (), 0,
+                             "Unexpected report size");
+
+      bool hasEnded = m_itExpectedTime == m_expectedTime.end ();
+      NS_TEST_ASSERT_MSG_EQ (hasEnded, false,
+                             "Reporting should not have occurred at "
+                             << Simulator::Now ().GetSeconds () << "s");
+      if (!hasEnded)
+        {
+          hasEnded = m_itExpectedRsrp == m_expectedRsrp.end ();
+          NS_ASSERT (!hasEnded);
+
+          // using milliseconds to avoid floating-point comparison
+          uint64_t timeNowMs = Simulator::Now ().GetMilliSeconds ();
+          uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds ();
+          m_itExpectedTime++;
+
+          uint16_t observedRsrp = measResults.rsrpResult;
+          uint16_t referenceRsrp = *m_itExpectedRsrp;
+          m_itExpectedRsrp++;
+
+          NS_TEST_ASSERT_MSG_EQ (timeNowMs, timeExpectedMs,
+                                 "Reporting should not have occurred at this time");
+          NS_TEST_ASSERT_MSG_EQ (observedRsrp, referenceRsrp,
+                                 "The RSRP observed differs with the reference RSRP");
+        } // end of if (!hasEnded)
+
+    } // end of if (measResults.measId == m_expectedMeasId)
+
+} // end of LteUeMeasurementsPiecewiseTestCase1::RecvMeasurementReportCallback
+
+void
+LteUeMeasurementsPiecewiseTestCase1::TeleportVeryNear ()
+{
+  NS_LOG_FUNCTION (this);
+  m_ueMobility->SetPosition (Vector (100.0, 0.0, 0.0));
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase1::TeleportNear ()
+{
+  NS_LOG_FUNCTION (this);
+  m_ueMobility->SetPosition (Vector (300.0, 0.0, 0.0));
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase1::TeleportFar ()
+{
+  NS_LOG_FUNCTION (this);
+  m_ueMobility->SetPosition (Vector (600.0, 0.0, 0.0));
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase1::TeleportVeryFar ()
+{
+  NS_LOG_FUNCTION (this);
+  m_ueMobility->SetPosition (Vector (1000.0, 0.0, 0.0));
+}
+
+
+// ===== LTE-UE-MEASUREMENTS-PIECEWISE-2 TEST SUITE ======================== //
+
+/*
+ * Test Suite
+ */
+
+LteUeMeasurementsPiecewiseTestSuite2::LteUeMeasurementsPiecewiseTestSuite2 ()
+  : TestSuite ("lte-ue-measurements-piecewise-2", SYSTEM)
+{
+  std::vector<Time> expectedTime;
+  std::vector<uint8_t> expectedRsrp;
+
+  /*
+   * Higher level of fullness/duration are given to Event A1 and A2 because they
+   * are supposed to be more intensively tested in Piecewise configuration #1.
+   */
+
+  // === Event A1 (serving cell becomes better than threshold) ===
+
+  // With very low threshold
+  LteRrcSap::ReportConfigEutra config;
+  config.triggerType = LteRrcSap::ReportConfigEutra::EVENT;
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  config.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRP;
+  config.threshold1.range = 0;
+  config.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRP;
+  config.reportInterval = LteRrcSap::ReportConfigEutra::MS240;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 920 << 1160 << 1400 << 1640 << 1880 << 2120;
+  expectedRsrp.clear ();
+  expectedRsrp << 73 << 63 << 72 << 52 << 72 << 56 << 52 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A1 with very low threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With normal threshold
+  config.threshold1.range = 58;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 1000 << 1240 << 2000;
+  expectedRsrp.clear ();
+  expectedRsrp << 73 << 63 << 72 << 72 << 59 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A1 with normal threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With hysteresis
+  config.hysteresis = 6;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 1000 << 1240 << 1480 << 2200;
+  expectedRsrp.clear ();
+  expectedRsrp << 73 << 63 << 72 << 72 << 59 << 56 << 72;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A1 with hysteresis",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With very high threshold
+  config.threshold1.range = 97;
+  config.hysteresis = 0;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A1 with very high threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // === Event A2 (serving cell becomes worse than threshold) ===
+
+  // With very low threshold
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  config.threshold1.range = 0;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A2 with very low threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With normal threshold
+  config.threshold1.range = 58;
+  expectedTime.clear ();
+  expectedTime << 800 << 1400 << 1640 << 1880;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 52 << 56;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A2 with normal threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With hysteresis
+  config.hysteresis = 6;
+  expectedTime.clear ();
+  expectedTime << 800 << 1600 << 1840 << 2080;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 52 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A2 with hysteresis",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With very high threshold
+  config.threshold1.range = 97;
+  config.hysteresis = 0;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 920 << 1160 << 1400 << 1640 << 1880 << 2120;
+  expectedRsrp.clear ();
+  expectedRsrp << 73 << 63 << 72 << 52 << 72 << 56 << 52 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A2 with very high threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // === Event A3 (neighbour becomes offset better than PCell) ===
+
+  // With positive offset
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  config.threshold1.range = 0;
+  config.a3Offset = 7;
+  expectedTime.clear ();
+  expectedTime << 800 << 1600;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 52;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A3 with positive offset",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With zero offset
+  config.a3Offset = 0;
+  expectedTime.clear ();
+  expectedTime << 800 << 1400 << 1640 << 1880;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 52 << 56;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A3 with zero offset",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With short time-to-trigger
+  config.timeToTrigger = 160;
+  expectedTime.clear ();
+  expectedTime << 960 << 1560 << 1800 << 2040;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A3 with short time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With super time-to-trigger
+  config.timeToTrigger = 320;
+  expectedTime.clear ();
+  expectedTime << 1720 << 1960 << 2200;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 72;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A3 with super time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With hysteresis and reportOnLeave
+  config.hysteresis = 6;
+  config.reportOnLeave = true;
+  config.timeToTrigger = 0;
+  expectedTime.clear ();
+  expectedTime << 800 << 1000 << 1600 << 1840 << 2080 << 2200;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 72 << 52 << 56 << 59 << 72;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A3 with hysteresis",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With negative offset
+  config.a3Offset = -7;
+  config.hysteresis = 0;
+  config.reportOnLeave = false;
+  expectedTime.clear ();
+  expectedTime << 400 << 800 << 1200 << 1440 << 1680 << 1920 << 2160;
+  expectedRsrp.clear ();
+  expectedRsrp << 63 << 52 << 59 << 56 << 52 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A3 with negative offset",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // === Event A4 (neighbour becomes better than threshold) ===
+
+  // With very low threshold
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  config.threshold1.range = 0;
+  config.a3Offset = 0;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 920 << 1160 << 1400 << 1640 << 1880 << 2120;
+  expectedRsrp.clear ();
+  expectedRsrp << 73 << 63 << 72 << 52 << 72 << 56 << 52 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A4 with very low threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With normal threshold
+  config.threshold1.range = 58;
+  expectedTime.clear ();
+  expectedTime << 400 << 800 << 1400 << 1640 << 1880;
+  expectedRsrp.clear ();
+  expectedRsrp << 63 << 52 << 56 << 52 << 56;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A4 with normal threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With short time-to-trigger
+  config.timeToTrigger = 160;
+  expectedTime.clear ();
+  expectedTime << 560 << 960 << 1560 << 1800 << 2040;
+  expectedRsrp.clear ();
+  expectedRsrp << 63 << 52 << 56 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A4 with short time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With super time-to-trigger
+  config.timeToTrigger = 320;
+  expectedTime.clear ();
+  expectedTime << 1720 << 1960 << 2200;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 72;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A4 with super time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With hysteresis
+  config.hysteresis = 6;
+  config.timeToTrigger = 0;
+  expectedTime.clear ();
+  expectedTime << 400 << 800 << 1600 << 1840 << 2080;
+  expectedRsrp.clear ();
+  expectedRsrp << 63 << 52 << 52 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A4 with hysteresis",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With very high threshold
+  config.threshold1.range = 97;
+  config.hysteresis = 0;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A4 with very high threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // === Event A5 (PCell becomes worse than absolute threshold1 AND neighbour becomes better than another absolute threshold2) ===
+
+  // With low-low threshold
+  config.eventId = LteRrcSap::ReportConfigEutra::EVENT_A5;
+  config.threshold1.range = 0;
+  config.threshold2.range = 0;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with low-low threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With low-normal threshold
+  config.threshold2.range = 58;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with low-normal threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With low-high threshold
+  config.threshold2.range = 97;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with low-high threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With normal-low threshold
+  config.threshold1.range = 58;
+  config.threshold2.range = 0;
+  expectedTime.clear ();
+  expectedTime << 800 << 1400 << 1640 << 1880;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 52 << 56;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with normal-low threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With normal-normal threshold
+  config.threshold2.range = 58;
+  expectedTime.clear ();
+  expectedTime << 800 << 1400 << 1640 << 1880;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 52 << 56;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with normal-normal threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With short time-to-trigger
+  config.timeToTrigger = 160;
+  expectedTime.clear ();
+  expectedTime << 960 << 1560 << 1800 << 2040;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with short time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With super time-to-trigger
+  config.timeToTrigger = 320;
+  expectedTime.clear ();
+  expectedTime << 1720 << 1960 << 2200;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 56 << 72;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with super time-to-trigger",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With hysteresis
+  config.hysteresis = 6;
+  config.timeToTrigger = 0;
+  expectedTime.clear ();
+  expectedTime << 800 << 1600 << 1840 << 2080;
+  expectedRsrp.clear ();
+  expectedRsrp << 52 << 52 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with hysteresis",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::QUICK);
+
+  // With normal-high threshold
+  config.threshold2.range = 97;
+  config.hysteresis = 0;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with normal-high threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With high-low threshold
+  config.threshold1.range = 97;
+  config.threshold2.range = 0;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 920 << 1160 << 1400 << 1640 << 1880 << 2120;
+  expectedRsrp.clear ();
+  expectedRsrp << 73 << 63 << 72 << 52 << 72 << 56 << 52 << 56 << 59;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with high-low threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+  // With high-normal threshold
+  config.threshold2.range = 58;
+  expectedTime.clear ();
+  expectedTime << 400 << 800 << 1400 << 1640 << 1880;
+  expectedRsrp.clear ();
+  expectedRsrp << 63 << 52 << 56 << 52 << 56;
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with high-normal threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::TAKES_FOREVER);
+
+  // With high-high threshold
+  config.threshold2.range = 97;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsPiecewiseTestCase2 ("Piecewise test case 2 - Event A5 with high-high threshold",
+                                                        config, expectedTime, expectedRsrp),
+               TestCase::EXTENSIVE);
+
+} // end of LteUeMeasurementsPiecewiseTestSuite2::LteUeMeasurementsPiecewiseTestSuite2
+
+static LteUeMeasurementsPiecewiseTestSuite2 lteUeMeasurementsPiecewiseTestSuite2;
+
+
+/*
+ * Test Case
+ */
+
+LteUeMeasurementsPiecewiseTestCase2::LteUeMeasurementsPiecewiseTestCase2 (
+  std::string name, LteRrcSap::ReportConfigEutra config,
+  std::vector<Time> expectedTime, std::vector<uint8_t> expectedRsrp)
+  : TestCase (name),
+    m_config (config),
+    m_expectedTime (expectedTime),
+    m_expectedRsrp (expectedRsrp)
+{
+  // input sanity check
+  uint16_t size = m_expectedTime.size ();
+
+  if (size != m_expectedRsrp.size ())
+    {
+      NS_FATAL_ERROR ("Vectors of expected results are not of the same size");
+    }
+
+  m_itExpectedTime = m_expectedTime.begin ();
+  m_itExpectedRsrp = m_expectedRsrp.begin ();
+
+  NS_LOG_INFO (this << " name=" << name);
+}
+
+LteUeMeasurementsPiecewiseTestCase2::~LteUeMeasurementsPiecewiseTestCase2 ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase2::DoRun ()
+{
+  NS_LOG_INFO (this << " " << GetName ());
+
+  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+  lteHelper->SetAttribute ("PathlossModel",
+                           StringValue ("ns3::FriisSpectrumPropagationLossModel"));
+  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (true));
+
+  // Create Nodes: eNodeB and UE
+  NodeContainer enbNodes;
+  NodeContainer ueNodes;
+  enbNodes.Create (2);
+  ueNodes.Create (1);
+
+  /*
+   * The topology is the following:
+   *
+   * eNodeB    UE                                                eNodeB
+   *    |      |                                                    |
+   *    x ---- x --------------- x ------- x --------------- x ---- x
+   *      50 m |      200 m      |  100 m  |      200 m      | 50 m
+   *           |                 |         |                 |
+   *        VeryNear            Near      Far             VeryFar
+   */
+
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0)); // Serving eNodeB
+  positionAlloc->Add (Vector (600.0, 0.0, 0.0)); // Neighbour eNodeB
+  positionAlloc->Add (Vector (50.0, 0.0, 0.0)); // UE
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.Install (enbNodes);
+  mobility.Install (ueNodes);
+  m_ueMobility = ueNodes.Get (0)->GetObject<MobilityModel> ();
+
+  // Disable layer-3 filtering
+  Config::SetDefault ("ns3::LteEnbRrc::RsrpFilterCoefficient",
+                      UintegerValue (0));
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  NetDeviceContainer enbDevs;
+  NetDeviceContainer ueDevs;
+  lteHelper->SetSchedulerType ("ns3::RrFfMacScheduler");
+  lteHelper->SetSchedulerAttribute ("UlCqiFilter",
+                                    EnumValue (FfMacScheduler::PUSCH_UL_CQI));
+  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
+  ueDevs = lteHelper->InstallUeDevice (ueNodes);
+
+  // Setup UE measurement configuration in serving cell
+  Ptr<LteEnbRrc> enbRrc1 = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetRrc ();
+  m_expectedMeasId = enbRrc1->AddUeMeasReportConfig (m_config);
+
+  // Disable handover in neighbour cell
+  Ptr<LteEnbRrc> enbRrc2 = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetRrc ();
+  enbRrc2->SetAttribute ("AdmitHandoverRequest", BooleanValue (false));
+
+  // Attach UE to serving eNodeB
+  lteHelper->Attach (ueDevs.Get (0), enbDevs.Get (0));
+
+  // Activate an EPS bearer
+  enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
+  EpsBearer bearer (q);
+  lteHelper->ActivateDataRadioBearer (ueDevs, bearer);
+
+  // Connect to trace sources in serving eNodeB
+  Config::Connect ("/NodeList/0/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
+                   MakeCallback (&LteUeMeasurementsPiecewiseTestCase2::RecvMeasurementReportCallback,
+                                 this));
+
+  /*
+   * Schedule "teleports"
+   *          0                   1                   2
+   *          +-------------------+-------------------+---------> time
+   * VeryNear |------  ----    ----                    --------
+   *     Near |                    ----            ----
+   *      Far |                        ----    ----
+   *  VeryFar |      --    ----            ----
+   */
+  Simulator::Schedule (MilliSeconds (301),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportVeryFar, this);
+  Simulator::Schedule (MilliSeconds (401),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportVeryNear, this);
+  Simulator::Schedule (MilliSeconds (601),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportVeryFar, this);
+  Simulator::Schedule (MilliSeconds (801),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportVeryNear, this);
+  Simulator::Schedule (MilliSeconds (1001),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportNear, this);
+  Simulator::Schedule (MilliSeconds (1201),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportFar, this);
+  Simulator::Schedule (MilliSeconds (1401),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportVeryFar, this);
+  Simulator::Schedule (MilliSeconds (1601),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportFar, this);
+  Simulator::Schedule (MilliSeconds (1801),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportNear, this);
+  Simulator::Schedule (MilliSeconds (2001),
+                       &LteUeMeasurementsPiecewiseTestCase2::TeleportVeryNear, this);
+
+  // Run simulation
+  Simulator::Stop (Seconds (2.201));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+} // end of void LteUeMeasurementsPiecewiseTestCase2::DoRun ()
+
+void
+LteUeMeasurementsPiecewiseTestCase2::DoTeardown ()
+{
+  NS_LOG_FUNCTION (this);
+  bool hasEnded = m_itExpectedTime == m_expectedTime.end ();
+  NS_TEST_ASSERT_MSG_EQ (hasEnded, true,
+                         "Reporting should have occurred at " << m_itExpectedTime->GetSeconds () << "s");
+  hasEnded = m_itExpectedRsrp == m_expectedRsrp.end ();
+  NS_ASSERT (hasEnded);
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase2::RecvMeasurementReportCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
+  LteRrcSap::MeasurementReport report)
+{
+  NS_LOG_FUNCTION (this << context);
+  NS_ASSERT (rnti == 1);
+  NS_ASSERT (cellId == 1);
+
+  if (report.measResults.measId == m_expectedMeasId)
+    {
+      // verifying the report completeness
+      LteRrcSap::MeasResults measResults = report.measResults;
+      NS_LOG_DEBUG (this << " Serving cellId=" << cellId
+                         << " rsrp=" << (uint16_t) measResults.rsrpResult
+                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.rsrpResult) << " dBm)"
+                         << " rsrq=" << (uint16_t) measResults.rsrqResult
+                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.rsrqResult) << " dB)");
+
+      // verifying reported best cells
+      if (measResults.measResultListEutra.size () == 0)
+        {
+          NS_TEST_ASSERT_MSG_EQ (measResults.haveMeasResultNeighCells, false,
+                                 "Unexpected report content");
+        }
+      else
+        {
+          NS_TEST_ASSERT_MSG_EQ (measResults.haveMeasResultNeighCells, true,
+                                 "Unexpected report content");
+          std::list<LteRrcSap::MeasResultEutra>::iterator it = measResults.measResultListEutra.begin ();
+          NS_ASSERT (it != measResults.measResultListEutra.end ());
+          NS_ASSERT (it->physCellId == 2);
+          NS_TEST_ASSERT_MSG_EQ (it->haveCgiInfo, false,
+                                 "Report contains cgi-info, which is not supported");
+          NS_TEST_ASSERT_MSG_EQ (it->haveRsrpResult, true,
+                                 "Report does not contain measured RSRP result");
+          NS_TEST_ASSERT_MSG_EQ (it->haveRsrqResult, true,
+                                 "Report does not contain measured RSRQ result");
+          NS_LOG_DEBUG (this << " Neighbour cellId=" << it->physCellId
+                             << " rsrp=" << (uint16_t) it->rsrpResult
+                             << " (" << EutranMeasurementMapping::RsrpRange2Dbm (it->rsrpResult) << " dBm)"
+                             << " rsrq=" << (uint16_t) it->rsrqResult
+                             << " (" << EutranMeasurementMapping::RsrqRange2Db (it->rsrqResult) << " dB)");
+
+        } // end of else of if (measResults.measResultListEutra.size () == 0)
+
+      // verifying the report timing
+      bool hasEnded = m_itExpectedTime == m_expectedTime.end ();
+      NS_TEST_ASSERT_MSG_EQ (hasEnded, false,
+                             "Reporting should not have occurred at "
+                             << Simulator::Now ().GetSeconds () << "s");
+      if (!hasEnded)
+        {
+          hasEnded = m_itExpectedRsrp == m_expectedRsrp.end ();
+          NS_ASSERT (!hasEnded);
+
+          // using milliseconds to avoid floating-point comparison
+          uint64_t timeNowMs = Simulator::Now ().GetMilliSeconds ();
+          uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds ();
+          m_itExpectedTime++;
+
+          uint16_t observedRsrp = measResults.rsrpResult;
+          uint16_t referenceRsrp = *m_itExpectedRsrp;
+          m_itExpectedRsrp++;
+
+          NS_TEST_ASSERT_MSG_EQ (timeNowMs, timeExpectedMs,
+                                 "Reporting should not have occurred at this time");
+          NS_TEST_ASSERT_MSG_EQ (observedRsrp, referenceRsrp,
+                                 "The RSRP observed differs with the reference RSRP");
+
+        } // end of if (!hasEnded)
+
+    } // end of if (report.measResults.measId == m_expectedMeasId)
+
+} // end of void LteUeMeasurementsPiecewiseTestCase2::RecvMeasurementReportCallback
+
+void
+LteUeMeasurementsPiecewiseTestCase2::TeleportVeryNear ()
+{
+  NS_LOG_FUNCTION (this);
+  m_ueMobility->SetPosition (Vector (50.0, 0.0, 0.0));
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase2::TeleportNear ()
+{
+  NS_LOG_FUNCTION (this);
+  m_ueMobility->SetPosition (Vector (250.0, 0.0, 0.0));
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase2::TeleportFar ()
+{
+  NS_LOG_FUNCTION (this);
+  m_ueMobility->SetPosition (Vector (350.0, 0.0, 0.0));
+}
+
+void
+LteUeMeasurementsPiecewiseTestCase2::TeleportVeryFar ()
+{
+  NS_LOG_FUNCTION (this);
+  m_ueMobility->SetPosition (Vector (550.0, 0.0, 0.0));
+}
+
+
+// ===== LTE-UE-MEASUREMENTS-HANDOVER TEST SUITE =========================== //
+
+/*
+ * Test Suite
+ */
+
+LteUeMeasurementsHandoverTestSuite::LteUeMeasurementsHandoverTestSuite ()
+  : TestSuite ("lte-ue-measurements-handover", SYSTEM)
+{
+  std::list<LteRrcSap::ReportConfigEutra> sourceConfigList;
+  std::list<LteRrcSap::ReportConfigEutra> targetConfigList;
+  std::vector<Time> expectedTime;
+  std::vector<uint8_t> expectedRsrp;
+
+  LteRrcSap::ReportConfigEutra sourceConfig;
+  sourceConfig.triggerType = LteRrcSap::ReportConfigEutra::EVENT;
+  sourceConfig.eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  sourceConfig.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRP;
+  sourceConfig.threshold1.range = 0;
+  sourceConfig.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRP;
+  sourceConfig.reportInterval = LteRrcSap::ReportConfigEutra::MS240;
+  sourceConfigList.push_back (sourceConfig);
+
+  LteRrcSap::ReportConfigEutra targetConfig;
+  targetConfig.triggerType = LteRrcSap::ReportConfigEutra::EVENT;
+  targetConfig.eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  targetConfig.threshold1.choice = LteRrcSap::ThresholdEutra::THRESHOLD_RSRP;
+  targetConfig.threshold1.range = 0;
+  targetConfig.triggerQuantity = LteRrcSap::ReportConfigEutra::RSRP;
+  targetConfig.reportInterval = LteRrcSap::ReportConfigEutra::MS240;
+  targetConfigList.push_back (targetConfig);
+
+  // === Report interval difference ===
+
+  // decreasing report interval
+  sourceConfigList.front ().reportInterval = LteRrcSap::ReportConfigEutra::MS480;
+  targetConfigList.front ().reportInterval = LteRrcSap::ReportConfigEutra::MS240;
+  expectedTime.clear ();
+  expectedTime << 200 << 680 << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 55 << 55 << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - decreasing report interval",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::TAKES_FOREVER);
+
+  // increasing report interval
+  sourceConfigList.front ().reportInterval = LteRrcSap::ReportConfigEutra::MS120;
+  targetConfigList.front ().reportInterval = LteRrcSap::ReportConfigEutra::MS640;
+  expectedTime.clear ();
+  expectedTime << 200 << 320 << 440 << 560 << 680 << 800 << 920 << 1200 << 1840;
+  expectedRsrp.clear ();
+  expectedRsrp << 55 << 55 << 55 << 55 << 55 << 55 << 55 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - increasing report interval",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::QUICK);
+
+  // === Event difference ===
+
+  sourceConfigList.front ().reportInterval = LteRrcSap::ReportConfigEutra::MS240;
+  targetConfigList.front ().reportInterval = LteRrcSap::ReportConfigEutra::MS240;
+  sourceConfigList.front ().threshold1.range = 54;
+  sourceConfigList.front ().threshold2.range = 54;
+  sourceConfigList.front ().a3Offset = 1;
+  targetConfigList.front ().threshold1.range = 54;
+  targetConfigList.front ().threshold2.range = 54;
+  targetConfigList.front ().a3Offset = 1;
+
+  // Event A1 to Event A2
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 920 << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 55 << 55 << 55 << 55 << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A1 to Event A2",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::EXTENSIVE);
+
+  // Event A2 to Event A1
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A2 to Event A1",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::TAKES_FOREVER);
+
+  // Event A3 to Event A4
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  expectedTime.clear ();
+  expectedTime << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A3 to Event A4",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::TAKES_FOREVER);
+
+  // Event A4 to Event A3
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  expectedTime.clear ();
+  expectedTime << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A4 to Event A3",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::QUICK);
+
+  // Event A2 to Event A3
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  expectedTime.clear ();
+  expectedTime << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A2 to Event A3",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::EXTENSIVE);
+
+  // Event A3 to Event A2
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  expectedTime.clear ();
+  expectedTime << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A3 to Event A2",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::TAKES_FOREVER);
+
+  // Event A4 to Event A5
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A5;
+  expectedTime.clear ();
+  expectedTime << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A4 to Event A5",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::TAKES_FOREVER);
+
+  // Event A5 to Event A4
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A5;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  expectedTime.clear ();
+  expectedTime << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A5 to Event A4",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::EXTENSIVE);
+
+  // === Threshold/offset difference ===
+
+  sourceConfigList.front ().threshold1.range = 52;
+  targetConfigList.front ().threshold1.range = 56;
+
+  // Event A1
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 920;
+  expectedRsrp.clear ();
+  expectedRsrp << 55 << 55 << 55 << 55;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A1 threshold difference",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::EXTENSIVE);
+
+  // Event A2
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A2;
+  expectedTime.clear ();
+  expectedTime << 1200 << 1440 << 1680 << 1920;
+  expectedRsrp.clear ();
+  expectedRsrp << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A2 threshold difference",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::QUICK);
+
+  // Event A3
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  sourceConfigList.front ().a3Offset = -30;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A3;
+  targetConfigList.front ().a3Offset = 30;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 920;
+  expectedRsrp.clear ();
+  expectedRsrp << 55 << 55 << 55 << 55;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A3 offset difference",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::QUICK);
+
+  // Event A4
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A4;
+  expectedTime.clear ();
+  expectedTime << 200 << 440 << 680 << 920;
+  expectedRsrp.clear ();
+  expectedRsrp << 55 << 55 << 55 << 55;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A4 threshold difference",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::EXTENSIVE);
+
+  // Event A5
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A5;
+  sourceConfigList.front ().threshold2.range = 52;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A5;
+  targetConfigList.front ().threshold2.range = 56;
+  expectedTime.clear ();
+  expectedRsrp.clear ();
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - Event A5 threshold difference",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::EXTENSIVE);
+
+  // === Time-to-trigger (TTT) difference ===
+
+  sourceConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  sourceConfigList.front ().a3Offset = 1;
+  sourceConfigList.front ().threshold1.range = 0;
+  sourceConfigList.front ().threshold2.range = 0;
+  targetConfigList.front ().eventId = LteRrcSap::ReportConfigEutra::EVENT_A1;
+  targetConfigList.front ().a3Offset = 1;
+  targetConfigList.front ().threshold1.range = 0;
+  targetConfigList.front ().threshold2.range = 0;
+
+  // decreasing time-to-trigger (short duration)
+  sourceConfigList.front ().timeToTrigger = 1024;
+  targetConfigList.front ().timeToTrigger = 100;
+  expectedTime.clear ();
+  expectedTime << 1300 << 1540 << 1780;
+  expectedRsrp.clear ();
+  expectedRsrp << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - decreasing TTT (short)",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (2)),
+               TestCase::QUICK);
+
+  // decreasing time-to-trigger (longer duration)
+  sourceConfigList.front ().timeToTrigger = 1024;
+  targetConfigList.front ().timeToTrigger = 640;
+  expectedTime.clear ();
+  expectedTime << 1224 << 1464 << 1704 << 1944 << 2840 << 3080 << 3320 << 3560 << 3800 << 4040;
+  expectedRsrp.clear ();
+  expectedRsrp << 55 << 55 << 55 << 55 << 53 << 53 << 53 << 53 << 53 << 53;
+  AddTestCase (new LteUeMeasurementsHandoverTestCase ("Handover test case - decreasing TTT (long)",
+                                                      sourceConfigList, targetConfigList,
+                                                      expectedTime, expectedRsrp,
+                                                      Seconds (4.2)),
+               TestCase::EXTENSIVE);
+
+} // end of LteUeMeasurementsHandoverTestSuite::LteUeMeasurementsHandoverTestSuite
+
+static LteUeMeasurementsHandoverTestSuite lteUeMeasurementsHandoverTestSuite;
+
+
+/*
+ * Test Case
+ */
+
+LteUeMeasurementsHandoverTestCase::LteUeMeasurementsHandoverTestCase (
+  std::string name,
+  std::list<LteRrcSap::ReportConfigEutra> sourceConfigList,
+  std::list<LteRrcSap::ReportConfigEutra> targetConfigList,
+  std::vector<Time> expectedTime, std::vector<uint8_t> expectedRsrp,
+  Time duration)
+  : TestCase (name),
+    m_sourceConfigList (sourceConfigList),
+    m_targetConfigList (targetConfigList),
+    m_expectedTime (expectedTime),
+    m_expectedRsrp (expectedRsrp),
+    m_duration (duration)
+{
+  // input sanity check
+  uint16_t size = m_expectedTime.size ();
+
+  if (size != m_expectedRsrp.size ())
+    {
+      NS_FATAL_ERROR ("Vectors of expected results are not of the same size");
+    }
+
+  m_itExpectedTime = m_expectedTime.begin ();
+  m_itExpectedRsrp = m_expectedRsrp.begin ();
+
+  NS_LOG_INFO (this << " name=" << name);
+}
+
+LteUeMeasurementsHandoverTestCase::~LteUeMeasurementsHandoverTestCase ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+LteUeMeasurementsHandoverTestCase::DoRun ()
+{
+  NS_LOG_INFO (this << " " << GetName ());
+
+  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
+  lteHelper->SetEpcHelper (epcHelper);
+  lteHelper->SetAttribute ("PathlossModel",
+                           StringValue ("ns3::FriisSpectrumPropagationLossModel"));
+  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (true));
+
+  // Create Nodes: eNodeB and UE
+  NodeContainer enbNodes;
+  NodeContainer ueNodes;
+  enbNodes.Create (2);
+  ueNodes.Create (1);
+
+  /*
+   * The topology is the following:
+   *
+   * eNodeB                   UE                     eNodeB
+   *    |                     |                         |
+   *    x ------------------- x ----------------------- x
+   *             400 m                   500 m
+   */
+
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0)); // Source eNodeB
+  positionAlloc->Add (Vector (900.0, 0.0, 0.0)); // Target eNodeB
+  positionAlloc->Add (Vector (400.0, 0.0, 0.0)); // UE
+  MobilityHelper mobility;
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.Install (enbNodes);
+  mobility.Install (ueNodes);
+
+  // Create P-GW node
+  Ptr<Node> pgw = epcHelper->GetPgwNode ();
+
+  // Create a single RemoteHost
+  NodeContainer remoteHostContainer;
+  remoteHostContainer.Create (1);
+  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
+  InternetStackHelper internet;
+  internet.Install (remoteHostContainer);
+
+  // Create the Internet
+  PointToPointHelper p2ph;
+  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
+  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
+  p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.010)));
+  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
+  Ipv4AddressHelper ipv4h;
+  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
+  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
+
+  // Routing of the Internet Host (towards the LTE network)
+  Ipv4StaticRoutingHelper ipv4RoutingHelper;
+  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
+  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
+
+  // Enable layer-3 filtering
+  Config::SetDefault ("ns3::LteEnbRrc::RsrpFilterCoefficient",
+                      UintegerValue (4));
+
+  // Disable control channel error model
+  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled",
+                      BooleanValue (false));
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  NetDeviceContainer enbDevs;
+  NetDeviceContainer ueDevs;
+  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
+  ueDevs = lteHelper->InstallUeDevice (ueNodes);
+
+  // Setup UE measurement configuration in eNodeBs
+  uint8_t measId;
+  std::list<LteRrcSap::ReportConfigEutra>::const_iterator itReportConfig;
+  Ptr<LteEnbRrc> enbRrc1 = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetRrc ();
+  Ptr<LteEnbRrc> enbRrc2 = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetRrc ();
+
+  for (itReportConfig = m_sourceConfigList.begin ();
+       itReportConfig != m_sourceConfigList.end (); itReportConfig++)
+    {
+      measId = enbRrc1->AddUeMeasReportConfig (*itReportConfig);
+      m_expectedSourceCellMeasId.insert (measId);
+    }
+
+  for (itReportConfig = m_targetConfigList.begin ();
+       itReportConfig != m_targetConfigList.end (); itReportConfig++)
+    {
+      measId = enbRrc2->AddUeMeasReportConfig (*itReportConfig);
+      m_expectedTargetCellMeasId.insert (measId);
+    }
+
+  // Install the IP stack on the UEs
+  internet.Install (ueNodes);
+  Ipv4InterfaceContainer ueIpIfaces;
+  ueIpIfaces = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
+
+  // Assign IP address to UEs
+  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+    {
+      Ptr<Node> ueNode = ueNodes.Get (u);
+      // Set the default gateway for the UE
+      Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
+      ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
+    }
+
+  // Attach UE to serving eNodeB
+  lteHelper->Attach (ueDevs.Get (0), enbDevs.Get (0));
+
+  // Add X2 interface
+  lteHelper->AddX2Interface (enbNodes);
+
+  // Connect to trace sources in source eNodeB
+  Config::Connect ("/NodeList/1/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
+                   MakeCallback (&LteUeMeasurementsHandoverTestCase::RecvMeasurementReportCallback,
+                                 this));
+
+  // Connect to trace sources in target eNodeB
+  Config::Connect ("/NodeList/2/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
+                   MakeCallback (&LteUeMeasurementsHandoverTestCase::RecvMeasurementReportCallback,
+                                 this));
+
+  // Schedule handover
+  lteHelper->HandoverRequest (MilliSeconds (m_duration.GetMilliSeconds () / 2),
+                              ueDevs.Get (0), enbDevs.Get (0), enbDevs.Get (1));
+
+  // Run simulation
+  Simulator::Stop (m_duration);
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+} // end of void LteUeMeasurementsHandoverTestCase::DoRun ()
+
+void
+LteUeMeasurementsHandoverTestCase::DoTeardown ()
+{
+  NS_LOG_FUNCTION (this);
+  bool hasEnded = m_itExpectedTime == m_expectedTime.end ();
+  NS_TEST_ASSERT_MSG_EQ (hasEnded, true,
+                         "Reporting should have occurred at " << m_itExpectedTime->GetSeconds () << "s");
+  hasEnded = m_itExpectedRsrp == m_expectedRsrp.end ();
+  NS_ASSERT (hasEnded);
+}
+
+void
+LteUeMeasurementsHandoverTestCase::RecvMeasurementReportCallback (
+  std::string context, uint64_t imsi, uint16_t cellId, uint16_t rnti,
+  LteRrcSap::MeasurementReport report)
+{
+  uint8_t measId = report.measResults.measId;
+  NS_LOG_FUNCTION (this << context << (uint16_t) measId);
+
+  bool isCorrectMeasId;
+  if (cellId == 1)
+    {
+      std::set<uint8_t>::iterator itMeasId = m_expectedSourceCellMeasId.find (measId);
+      isCorrectMeasId = (itMeasId != m_expectedSourceCellMeasId.end ());
+    }
+  else if (cellId == 2)
+    {
+      std::set<uint8_t>::iterator itMeasId = m_expectedTargetCellMeasId.find (measId);
+      isCorrectMeasId = (itMeasId != m_expectedTargetCellMeasId.end ());
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Invalid cell ID " << cellId);
+    }
+
+  if (isCorrectMeasId)
+    {
+      // verifying the report completeness
+      LteRrcSap::MeasResults measResults = report.measResults;
+      NS_LOG_DEBUG (this << " Serving cellId=" << cellId
+                         << " rsrp=" << (uint16_t) measResults.rsrpResult
+                         << " (" << EutranMeasurementMapping::RsrpRange2Dbm (measResults.rsrpResult) << " dBm)"
+                         << " rsrq=" << (uint16_t) measResults.rsrqResult
+                         << " (" << EutranMeasurementMapping::RsrqRange2Db (measResults.rsrqResult) << " dB)");
+
+      // verifying reported best cells
+      if (measResults.measResultListEutra.size () == 0)
+        {
+          NS_TEST_ASSERT_MSG_EQ (measResults.haveMeasResultNeighCells, false,
+                                 "Unexpected report content");
+        }
+      else
+        {
+          NS_TEST_ASSERT_MSG_EQ (measResults.haveMeasResultNeighCells, true,
+                                 "Unexpected report content");
+          std::list<LteRrcSap::MeasResultEutra>::iterator it = measResults.measResultListEutra.begin ();
+          NS_ASSERT (it != measResults.measResultListEutra.end ());
+          NS_ASSERT (it->physCellId != cellId);
+          NS_ASSERT (it->physCellId <= 2);
+          NS_TEST_ASSERT_MSG_EQ (it->haveCgiInfo, false,
+                                 "Report contains cgi-info, which is not supported");
+          NS_TEST_ASSERT_MSG_EQ (it->haveRsrpResult, true,
+                                 "Report does not contain measured RSRP result");
+          NS_TEST_ASSERT_MSG_EQ (it->haveRsrqResult, true,
+                                 "Report does not contain measured RSRQ result");
+          NS_LOG_DEBUG (this << " Neighbour cellId=" << it->physCellId
+                             << " rsrp=" << (uint16_t) it->rsrpResult
+                             << " (" << EutranMeasurementMapping::RsrpRange2Dbm (it->rsrpResult) << " dBm)"
+                             << " rsrq=" << (uint16_t) it->rsrqResult
+                             << " (" << EutranMeasurementMapping::RsrqRange2Db (it->rsrqResult) << " dB)");
+
+        } // end of else of if (measResults.measResultListEutra.size () == 0)
+
+      // verifying the report timing
+      bool hasEnded = m_itExpectedTime == m_expectedTime.end ();
+      NS_TEST_ASSERT_MSG_EQ (hasEnded, false,
+                             "Reporting should not have occurred at "
+                             << Simulator::Now ().GetSeconds () << "s");
+      if (!hasEnded)
+        {
+          hasEnded = m_itExpectedRsrp == m_expectedRsrp.end ();
+          NS_ASSERT (!hasEnded);
+
+          // using milliseconds to avoid floating-point comparison
+          uint64_t timeNowMs = Simulator::Now ().GetMilliSeconds ();
+          uint64_t timeExpectedMs = m_itExpectedTime->GetMilliSeconds ();
+          m_itExpectedTime++;
+
+          uint16_t observedRsrp = measResults.rsrpResult;
+          uint16_t referenceRsrp = *m_itExpectedRsrp;
+          m_itExpectedRsrp++;
+
+          NS_TEST_ASSERT_MSG_EQ (timeNowMs, timeExpectedMs,
+                                 "Reporting should not have occurred at this time");
+          NS_TEST_ASSERT_MSG_EQ (observedRsrp, referenceRsrp,
+                                 "The RSRP observed differs with the reference RSRP");
+
+        } // end of if (!hasEnded)
+
+    } // end of if (report.measResults.measId == correctMeasId)
+
+} // end of void LteUeMeasurementsHandoverTestCase::RecvMeasurementReportCallback
+
+
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/lte/test/lte-test-ue-measurements.h ns-3.19/src/lte/test/lte-test-ue-measurements.h
--- ns-3.18.1/src/lte/test/lte-test-ue-measurements.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-ue-measurements.h	2013-12-20 09:44:50.000000000 -0800
@@ -17,8 +17,9 @@
  *
  * Author: Manuel Requena <manuel.requena@cttc.es>
  *         Nicola Baldo <nbaldo@cttc.es>
- *         Marco Miozzo <mmiozzo@cttc.es> 
+ *         Marco Miozzo <mmiozzo@cttc.es>
  *              adapt lte-test-interference.cc to lte-ue-measurements.cc
+ *         Budiarto Herman <budiarto.herman@magister.fi>
  */
 
 #ifndef LTE_TEST_UE_MEASUREMENTS_H
@@ -26,13 +27,22 @@
 
 #include <ns3/test.h>
 #include <ns3/lte-rrc-sap.h>
-
+#include <ns3/nstime.h>
+#include <list>
+#include <set>
+#include <vector>
 
 namespace ns3 {
 
 
+class MobilityModel;
+
+
+// ===== LTE-UE-MEASUREMENTS TEST SUITE ==================================== //
+
+
 /**
- * Test that UE Measurements (see 36.214) calculation works fine in a 
+ * Test that UE Measurements (see 36.214) calculation works fine in a
  * multi-cell interference scenario.
  */
 class LteUeMeasurementsTestSuite : public TestSuite
@@ -55,17 +65,346 @@
 private:
   virtual void DoRun (void);
 
-
   double m_d1;
   double m_d2;
   double m_rsrpDbmUeServingCell;
   double m_rsrpDbmUeNeighborCell;
   double m_rsrqDbUeServingCell;
   double m_rsrqDbUeNeighborCell;
-  
+
+};
+
+
+
+// ===== LTE-UE-MEASUREMENTS-PIECEWISE-1 TEST SUITE ======================== //
+
+
+/**
+ * \brief Test suite for generating calls to UE measurements test case
+ *        ns3::LteUeMeasurementsPiecewiseTestCase1.
+ */
+class LteUeMeasurementsPiecewiseTestSuite1 : public TestSuite
+{
+public:
+  LteUeMeasurementsPiecewiseTestSuite1 ();
+};
+
+
+/**
+ * \brief Testing UE measurements in LTE with simulation of 1 eNodeB and 1 UE in
+ *        piecewise configuration and 120 ms report interval.
+ */
+class LteUeMeasurementsPiecewiseTestCase1 : public TestCase
+{
+public:
+  LteUeMeasurementsPiecewiseTestCase1 (std::string name,
+                                       LteRrcSap::ReportConfigEutra config,
+                                       std::vector<Time> expectedTime,
+                                       std::vector<uint8_t> expectedRsrp);
+
+  virtual ~LteUeMeasurementsPiecewiseTestCase1 ();
+
+  /**
+   * \brief Triggers when eNodeB receives measurement report from UE, then
+   *        perform verification on it.
+   *
+   * The trigger is set up beforehand by connecting to the
+   * `LteUeRrc::RecvMeasurementReport` trace source.
+   *
+   * Verification consists of checking whether the report carries the right
+   * value of RSRP or not, and whether it occurs at the expected time or not.
+   */
+  void RecvMeasurementReportCallback (std::string context, uint64_t imsi,
+                                      uint16_t cellId, uint16_t rnti,
+                                      LteRrcSap::MeasurementReport report);
+
+private:
+  /**
+   * \brief Setup the simulation with the intended UE measurement reporting
+   *        configuration, run it, and connect the
+   *        `RecvMeasurementReportCallback` function to the
+   *        `LteUeRrc::RecvMeasurementReport` trace source.
+   */
+  virtual void DoRun ();
+
+  /**
+   * \brief Runs at the end of the simulation, verifying that all expected
+   *        measurement reports have been examined.
+   */
+  virtual void DoTeardown ();
+
+  void TeleportVeryNear ();
+  void TeleportNear ();
+  void TeleportFar ();
+  void TeleportVeryFar ();
+
+  /**
+   * \brief The active report triggering configuration.
+   */
+  LteRrcSap::ReportConfigEutra m_config;
+
+  /**
+   * \brief The list of expected time when measurement reports are received by
+   *        eNodeB.
+   */
+  std::vector<Time> m_expectedTime;
+
+  /**
+   * \brief The list of expected values of RSRP (in 3GPP range unit) from the
+   *        measurement reports received.
+   */
+  std::vector<uint8_t> m_expectedRsrp;
+
+  /**
+   * \brief Pointer to the element of `m_expectedTime` which is expected to
+   *        occur next in the simulation.
+   */
+  std::vector<Time>::iterator m_itExpectedTime;
+
+  /**
+   * \brief Pointer to the element of `m_expectedRsrp` which is expected to
+   *        occur next in the simulation.
+   */
+  std::vector<uint8_t>::iterator m_itExpectedRsrp;
+
+  /**
+   * \brief The measurement identity being tested. Measurement reports with
+   *        different measurement identity (e.g. from handover algorithm) will
+   *        be ignored.
+   */
+  uint8_t m_expectedMeasId;
+
+  Ptr<MobilityModel> m_ueMobility;
+
+}; // end of class LteUeMeasurementsPiecewiseTestCase1
+
+
+
+// ===== LTE-UE-MEASUREMENTS-PIECEWISE-2 TEST SUITE ======================== //
+
+
+/**
+ * \brief Test suite for generating calls to UE measurements test case
+ *        ns3::LteUeMeasurementsPiecewiseTestCase2.
+ */
+class LteUeMeasurementsPiecewiseTestSuite2 : public TestSuite
+{
+public:
+  LteUeMeasurementsPiecewiseTestSuite2 ();
+};
+
+
+/**
+ * \brief Testing UE measurements in LTE with simulation of 2 eNodeB and 1 UE in
+ *        piecewise configuration and 240 ms report interval.
+ */
+class LteUeMeasurementsPiecewiseTestCase2 : public TestCase
+{
+public:
+  LteUeMeasurementsPiecewiseTestCase2 (std::string name,
+                                       LteRrcSap::ReportConfigEutra config,
+                                       std::vector<Time> expectedTime,
+                                       std::vector<uint8_t> expectedRsrp);
+
+  virtual ~LteUeMeasurementsPiecewiseTestCase2 ();
+
+  /**
+   * \brief Triggers when eNodeB receives measurement report from UE, then
+   *        perform verification on it.
+   *
+   * The trigger is set up beforehand by connecting to the
+   * `LteUeRrc::RecvMeasurementReport` trace source.
+   *
+   * Verification consists of checking whether the report carries the right
+   * value of RSRP or not, and whether it occurs at the expected time or not.
+   */
+  void RecvMeasurementReportCallback (std::string context, uint64_t imsi,
+                                      uint16_t cellId, uint16_t rnti,
+                                      LteRrcSap::MeasurementReport report);
+
+private:
+  /**
+   * \brief Setup the simulation with the intended UE measurement reporting
+   *        configuration, run it, and connect the
+   *        `RecvMeasurementReportCallback` function to the
+   *        `LteUeRrc::RecvMeasurementReport` trace source.
+   */
+  virtual void DoRun ();
+
+  /**
+   * \brief Runs at the end of the simulation, verifying that all expected
+   *        measurement reports have been examined.
+   */
+  virtual void DoTeardown ();
+
+  void TeleportVeryNear ();
+  void TeleportNear ();
+  void TeleportFar ();
+  void TeleportVeryFar ();
+
+  /**
+   * \brief The active report triggering configuration.
+   */
+  LteRrcSap::ReportConfigEutra m_config;
+
+  /**
+   * \brief The list of expected time when measurement reports are received by
+   *        eNodeB.
+   */
+  std::vector<Time> m_expectedTime;
+
+  /**
+   * \brief The list of expected values of RSRP (in 3GPP range unit) from the
+   *        measurement reports received.
+   */
+  std::vector<uint8_t> m_expectedRsrp;
+
+  /**
+   * \brief Pointer to the element of `m_expectedTime` which is expected to
+   *        occur next in the simulation.
+   */
+  std::vector<Time>::iterator m_itExpectedTime;
+
+  /**
+   * \brief Pointer to the element of `m_expectedRsrp` which is expected to
+   *        occur next in the simulation.
+   */
+  std::vector<uint8_t>::iterator m_itExpectedRsrp;
+
+  /**
+   * \brief The measurement identity being tested. Measurement reports with
+   *        different measurement identity (e.g. from handover algorithm) will
+   *        be ignored.
+   */
+  uint8_t m_expectedMeasId;
+
+  Ptr<MobilityModel> m_ueMobility;
+
+}; // end of class LteUeMeasurementsPiecewiseTestCase2
+
+
+
+// ===== LTE-UE-MEASUREMENTS-HANDOVER TEST SUITE =========================== //
+
+
+/**
+ * \brief Test suite for generating calls to UE measurements test case
+ *        ns3::LteUeMeasurementsHandoverTestCase.
+ */
+class LteUeMeasurementsHandoverTestSuite : public TestSuite
+{
+public:
+  LteUeMeasurementsHandoverTestSuite ();
 };
 
 
+/**
+ * \brief Testing UE measurements in LTE with simulation of 2 eNodeB and 1 UE in
+ *        a handover configuration.
+ *
+ * The simulation will run for the specified duration, while the handover
+ * command will be issued exactly at the middle of simulation.
+ */
+class LteUeMeasurementsHandoverTestCase : public TestCase
+{
+public:
+  LteUeMeasurementsHandoverTestCase (std::string name,
+                                     std::list<LteRrcSap::ReportConfigEutra> sourceConfigList,
+                                     std::list<LteRrcSap::ReportConfigEutra> targetConfigList,
+                                     std::vector<Time> expectedTime,
+                                     std::vector<uint8_t> expectedRsrp,
+                                     Time duration);
+
+  virtual ~LteUeMeasurementsHandoverTestCase ();
+
+  /**
+   * \brief Triggers when either one of the eNodeBs receives measurement report
+   *        from UE, then perform verification on it.
+   *
+   * The trigger is set up beforehand by connecting to the
+   * `LteUeRrc::RecvMeasurementReport` trace source.
+   *
+   * Verification consists of checking whether the report carries the right
+   * value of RSRP or not, and whether it occurs at the expected time or not.
+   */
+  void RecvMeasurementReportCallback (std::string context, uint64_t imsi,
+                                      uint16_t cellId, uint16_t rnti,
+                                      LteRrcSap::MeasurementReport report);
+
+private:
+  /**
+   * \brief Setup the simulation with the intended UE measurement reporting
+   *        configuration, run it, and connect the
+   *        `RecvMeasurementReportCallback` function to the
+   *        `LteUeRrc::RecvMeasurementReport` trace source.
+   */
+  virtual void DoRun ();
+
+  /**
+   * \brief Runs at the end of the simulation, verifying that all expected
+   *        measurement reports have been examined.
+   */
+  virtual void DoTeardown ();
+
+  /**
+   * \brief The list of active report triggering configuration for the source
+   *        eNodeB.
+   */
+  std::list<LteRrcSap::ReportConfigEutra> m_sourceConfigList;
+
+  /**
+   * \brief The list of active report triggering configuration for the target
+   *        eNodeB.
+   */
+  std::list<LteRrcSap::ReportConfigEutra> m_targetConfigList;
+
+  /**
+   * \brief The list of expected time when measurement reports are received by
+   *        eNodeB.
+   */
+  std::vector<Time> m_expectedTime;
+
+  /**
+   * \brief The list of expected values of RSRP (in 3GPP range unit) from the
+   *        measurement reports received.
+   */
+  std::vector<uint8_t> m_expectedRsrp;
+
+  /**
+   * \brief Pointer to the element of `m_expectedTime` which is expected to
+   *        occur next in the simulation.
+   */
+  std::vector<Time>::iterator m_itExpectedTime;
+
+  /**
+   * \brief Pointer to the element of `m_expectedRsrp` which is expected to
+   *        occur next in the simulation.
+   */
+  std::vector<uint8_t>::iterator m_itExpectedRsrp;
+
+  /**
+   * \brief Duration of simulation.
+   */
+  Time m_duration;
+
+  /**
+   * \brief The list of measurement identities being tested in the source cell.
+   *        Measurement reports with different measurement identity (e.g. from
+   *        handover algorithm and ANR) will be ignored.
+   */
+  std::set<uint8_t> m_expectedSourceCellMeasId;
+
+  /**
+   * \brief The list of measurement identities being tested in the target cell.
+   *        Measurement reports with different measurement identity (e.g. from
+   *        handover algorithm and ANR) will be ignored.
+   */
+  std::set<uint8_t> m_expectedTargetCellMeasId;
+
+}; // end of class LteUeMeasurementsHandoverTestCase
+
+
+
 } // namespace ns3
 
 
diff -Naur ns-3.18.1/src/lte/test/lte-test-ue-phy.cc ns-3.19/src/lte/test/lte-test-ue-phy.cc
--- ns-3.18.1/src/lte/test/lte-test-ue-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-ue-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 namespace ns3 {
 
  
-NS_OBJECT_ENSURE_REGISTERED (LteTestUePhy);
+NS_OBJECT_ENSURE_REGISTERED (LteTestUePhy)
+  ;
 
 LteTestUePhy::LteTestUePhy ()
 {
diff -Naur ns-3.18.1/src/lte/test/lte-test-uplink-sinr.cc ns-3.19/src/lte/test/lte-test-uplink-sinr.cc
--- ns-3.18.1/src/lte/test/lte-test-uplink-sinr.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/lte-test-uplink-sinr.cc	2013-12-20 09:44:50.000000000 -0800
@@ -337,7 +337,7 @@
   */
   
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  lteHelper->EnableLogComponents ();
+  // lteHelper->EnableLogComponents ();
   Ptr<LteSpectrumPhy> dlPhy = CreateObject<LteSpectrumPhy> ();
   Ptr<LteSpectrumPhy> ulPhy = CreateObject<LteSpectrumPhy> ();
   Ptr<LteTestUePhy> uePhy = CreateObject<LteTestUePhy> (dlPhy, ulPhy);
diff -Naur ns-3.18.1/src/lte/test/test-lte-epc-e2e-data.cc ns-3.19/src/lte/test/test-lte-epc-e2e-data.cc
--- ns-3.18.1/src/lte/test/test-lte-epc-e2e-data.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/test-lte-epc-e2e-data.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,7 @@
 #include "ns3/log.h"
 #include "ns3/test.h"
 #include "ns3/lte-helper.h"
-#include "ns3/epc-helper.h"
+#include "ns3/point-to-point-epc-helper.h"
 #include "ns3/packet-sink-helper.h"
 #include "ns3/udp-client-server-helper.h"
 #include "ns3/udp-echo-helper.h"
@@ -47,7 +47,8 @@
 namespace ns3 {
 
 
-NS_LOG_COMPONENT_DEFINE ("LteEpcE2eData");
+NS_LOG_COMPONENT_DEFINE ("LteEpcE2eData")
+  ;
 
 
 
@@ -116,7 +117,7 @@
   Config::SetDefault ("ns3::LteSpectrumPhy::DataErrorModelEnabled", BooleanValue (false));  
   Config::SetDefault ("ns3::LteHelper::UseIdealRrc", BooleanValue (true));
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
 
   lteHelper->SetAttribute("PathlossModel",
@@ -272,16 +273,16 @@
                UintegerValue (2 * 1024 * 1024));
 
 
-  Time simulationTime = Seconds (2.0);
-
-  double statsStartTime = 0.040; // need to allow for RRC connection establishment + SRS 
+  double statsStartTime = 0.040; // need to allow for RRC connection establishment + SRS
+  double statsDuration = 2.0;
+    
   lteHelper->EnablePdcpTraces ();
 
   lteHelper->GetPdcpStats ()->SetAttribute ("StartTime", TimeValue (Seconds (statsStartTime)));
-  lteHelper->GetPdcpStats ()->SetAttribute ("EpochDuration", TimeValue (simulationTime));
+  lteHelper->GetPdcpStats ()->SetAttribute ("EpochDuration", TimeValue (Seconds (statsDuration)));
   
   
-  Simulator::Stop (simulationTime);  
+  Simulator::Stop (Seconds (statsStartTime + statsDuration - 0.0001));  
   Simulator::Run ();
 
   uint64_t imsiCounter = 0;
diff -Naur ns-3.18.1/src/lte/test/test-lte-handover-delay.cc ns-3.19/src/lte/test/test-lte-handover-delay.cc
--- ns-3.18.1/src/lte/test/test-lte-handover-delay.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/test-lte-handover-delay.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,7 @@
 #include <ns3/ipv4-interface-container.h>
 
 #include <ns3/lte-helper.h>
-#include <ns3/epc-helper.h>
+#include <ns3/point-to-point-epc-helper.h>
 #include <ns3/internet-stack-helper.h>
 #include <ns3/point-to-point-helper.h>
 #include <ns3/ipv4-address-helper.h>
@@ -96,7 +96,7 @@
       << " handover time = " << m_handoverTime.GetSeconds () << "-----");
 
   Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
-  Ptr<EpcHelper> epcHelper = CreateObject<EpcHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
   lteHelper->SetEpcHelper (epcHelper);
   lteHelper->SetAttribute ("UseIdealRrc", BooleanValue(m_useIdealRrc));
 
diff -Naur ns-3.18.1/src/lte/test/test-lte-handover-target.cc ns-3.19/src/lte/test/test-lte-handover-target.cc
--- ns-3.18.1/src/lte/test/test-lte-handover-target.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/lte/test/test-lte-handover-target.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,434 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Budiarto Herman
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Budiarto Herman <budiarto.herman@magister.fi>
+ *
+ */
+
+#include <ns3/test.h>
+
+#include <ns3/log.h>
+#include <ns3/nstime.h>
+#include <ns3/callback.h>
+#include <ns3/config.h>
+#include <ns3/boolean.h>
+#include <ns3/double.h>
+#include <ns3/uinteger.h>
+#include <ns3/simulator.h>
+
+#include <ns3/node-container.h>
+#include <ns3/net-device-container.h>
+#include <ns3/ipv4-interface-container.h>
+
+#include <ns3/lte-helper.h>
+#include <ns3/point-to-point-epc-helper.h>
+#include <ns3/internet-stack-helper.h>
+#include <ns3/point-to-point-helper.h>
+#include <ns3/ipv4-address-helper.h>
+#include <ns3/ipv4-static-routing-helper.h>
+#include <ns3/mobility-helper.h>
+
+#include <ns3/data-rate.h>
+#include <ns3/ipv4-static-routing.h>
+#include <ns3/position-allocator.h>
+#include <ns3/lte-enb-net-device.h>
+#include <ns3/lte-enb-phy.h>
+
+NS_LOG_COMPONENT_DEFINE ("LteHandoverTargetTest");
+
+namespace ns3 {
+
+
+/**
+ * \brief Testing a handover algorithm, verifying that it selects the right
+ *        target cell when more than one options available.
+ *
+ * Part of the `lte-handover-target` test suite.
+ *
+ * The test case will run a 1-second LTE-EPC simulation using the parameters
+ * provided to the constructor function.
+ *
+ * \sa ns3::LteHandoverTargetTestCase
+ */
+class LteHandoverTargetTestCase : public TestCase
+{
+public:
+  /**
+   * \brief Construct a new test case and providing input parameters for the
+   *        simulation.
+   * \param name the name of the test case, to be displayed in the test result
+   * \param uePosition the point in (x, y, z) coordinate where the UE will be
+   *                   placed in the simulation
+   * \param gridSizeX number of eNodeBs in a row
+   * \param gridSizeY number of eNodeBs in a column
+   * \param sourceCellId the cell ID of the eNodeB which the UE will be
+   *                     initially attached to in the beginning of simulation,
+   *                     and also the eNodeB which will "shutdown" in the
+   *                     middle of simulation
+   * \param targetCellId the cell ID of the expected eNodeB where the UE will
+   *                     perform handover to after the "shutdown" of the source
+   *                     cell
+   * \param handoverAlgorithmType the type of handover algorithm to be used in
+   *                              all eNodeBs
+   */
+  LteHandoverTargetTestCase (std::string name, Vector uePosition,
+                             uint8_t gridSizeX, uint8_t gridSizeY,
+                             uint16_t sourceCellId, uint16_t targetCellId,
+                             std::string handoverAlgorithmType);
+
+  virtual ~LteHandoverTargetTestCase ();
+
+  /**
+   * \brief Triggers when an eNodeB starts a handover and then verifies that
+   *        the handover has the right source and target cells.
+   *
+   * The trigger is set up beforehand by connecting to the
+   * `LteEnbRrc::HandoverStart` trace source.
+   */
+  void HandoverStartCallback (std::string context, uint64_t imsi,
+                              uint16_t sourceCellId, uint16_t rnti,
+                              uint16_t targetCellId);
+
+  /**
+   * \brief A trigger that can be scheduled to "shutdown" the cell pointed by
+   *        `m_sourceCellId` by reducing its power to 1 dB.
+   */
+  void CellShutdownCallback ();
+
+private:
+  /**
+   * \brief Run a simulation of a micro-cell network using the parameters
+   *        provided to the constructor function.
+   */
+  virtual void DoRun ();
+
+  /**
+   * \brief Called at the end of simulation and verifies that a handover has
+   *        occurred in the simulation.
+   */
+  virtual void DoTeardown ();
+
+  // simulation parameters
+  Vector m_uePosition;
+  uint8_t m_gridSizeX;
+  uint8_t m_gridSizeY;
+  uint16_t m_sourceCellId;
+  uint16_t m_targetCellId;
+  std::string m_handoverAlgorithmType;
+
+  Ptr<LteEnbNetDevice> m_sourceEnbDev;
+  bool m_hasHandoverOccurred;
+
+}; // end of class LteHandoverTargetTestCase
+
+
+LteHandoverTargetTestCase::LteHandoverTargetTestCase (std::string name, Vector uePosition,
+                                                      uint8_t gridSizeX, uint8_t gridSizeY,
+                                                      uint16_t sourceCellId, uint16_t targetCellId,
+                                                      std::string handoverAlgorithmType)
+  : TestCase (name),
+    m_uePosition (uePosition),
+    m_gridSizeX (gridSizeX),
+    m_gridSizeY (gridSizeY),
+    m_sourceCellId (sourceCellId),
+    m_targetCellId (targetCellId),
+    m_handoverAlgorithmType (handoverAlgorithmType),
+    m_sourceEnbDev (0),
+    m_hasHandoverOccurred (false)
+{
+  NS_LOG_INFO (this << " name=" << name);
+
+  // SANITY CHECK
+
+  uint16_t nEnb = gridSizeX * gridSizeY;
+
+  if (sourceCellId > nEnb)
+    {
+      NS_FATAL_ERROR ("Invalid source cell ID " << sourceCellId);
+    }
+
+  if (targetCellId > nEnb)
+    {
+      NS_FATAL_ERROR ("Invalid target cell ID " << targetCellId);
+    }
+}
+
+
+LteHandoverTargetTestCase::~LteHandoverTargetTestCase ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+
+void
+LteHandoverTargetTestCase::HandoverStartCallback (std::string context, uint64_t imsi,
+                                                  uint16_t sourceCellId, uint16_t rnti,
+                                                  uint16_t targetCellId)
+{
+  NS_LOG_FUNCTION (this << context << imsi << sourceCellId << rnti << targetCellId);
+
+  uint64_t timeNowMs = Simulator::Now ().GetMilliSeconds ();
+  NS_TEST_ASSERT_MSG_GT (timeNowMs, 500,
+                         "Handover occured but too early");
+  NS_TEST_ASSERT_MSG_EQ (sourceCellId, m_sourceCellId,
+                         "Handover occured but with wrong source cell");
+  NS_TEST_ASSERT_MSG_EQ (targetCellId, m_targetCellId,
+                         "Handover occured but with wrong target cell");
+  m_hasHandoverOccurred = true;
+}
+
+
+void
+LteHandoverTargetTestCase::CellShutdownCallback ()
+{
+  NS_LOG_FUNCTION (this);
+
+  if (m_sourceEnbDev != 0)
+    {
+      // set the Tx power to 1 dBm
+      NS_ASSERT (m_sourceEnbDev->GetCellId () == m_sourceCellId);
+      NS_LOG_INFO ("Shutting down cell " << m_sourceCellId);
+      Ptr<LteEnbPhy> phy = m_sourceEnbDev->GetPhy ();
+      phy->SetTxPower (1);
+    }
+}
+
+
+void
+LteHandoverTargetTestCase::DoRun ()
+{
+  NS_LOG_INFO (this << " " << GetName ());
+
+  Config::SetDefault ("ns3::LteEnbPhy::TxPower", DoubleValue (38)); // micro cell
+  Config::SetDefault ("ns3::LteSpectrumPhy::CtrlErrorModelEnabled",
+                      BooleanValue (false)); // disable control channel error model
+
+  Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
+  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
+  lteHelper->SetEpcHelper (epcHelper);
+  lteHelper->SetAttribute ("PathlossModel",
+                           StringValue ("ns3::FriisSpectrumPropagationLossModel"));
+  lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (true));
+
+  if (m_handoverAlgorithmType == "ns3::A2A4RsrqHandoverAlgorithm")
+    {
+      lteHelper->SetHandoverAlgorithmType ("ns3::A2A4RsrqHandoverAlgorithm");
+      lteHelper->SetHandoverAlgorithmAttribute ("ServingCellThreshold",
+                                                UintegerValue (30));
+      lteHelper->SetHandoverAlgorithmAttribute ("NeighbourCellOffset",
+                                                UintegerValue (1));
+    }
+  else if (m_handoverAlgorithmType == "ns3::A3RsrpHandoverAlgorithm")
+    {
+      lteHelper->SetHandoverAlgorithmType ("ns3::A3RsrpHandoverAlgorithm");
+      lteHelper->SetHandoverAlgorithmAttribute ("Hysteresis",
+                                                DoubleValue (1.5));
+      lteHelper->SetHandoverAlgorithmAttribute ("TimeToTrigger",
+                                                TimeValue (MilliSeconds (128)));
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Unknown handover algorithm " << m_handoverAlgorithmType);
+    }
+
+  // Create Nodes: eNodeB and UE
+  NodeContainer enbNodes;
+  NodeContainer ueNodes;
+  enbNodes.Create (m_gridSizeX * m_gridSizeY);
+  ueNodes.Create (1);
+
+  /*
+   * The size of the grid is determined by m_gridSizeX and m_gridSizeY. The
+   * following figure is the topology when m_gridSizeX = 4 and m_gridSizeY = 3.
+   *
+   *                  9 -- 10 -- 11 -- 12
+   *                  |     |     |     |
+   *                  |     |     |     |
+   *                  5 --- 6 --- 7 --- 8
+   *                  |     |     |     |
+   *                  |     |     |     |
+   *   (0, 0, 0) ---> 1 --- 2 --- 3 --- 4
+   *
+   * The grid starts at (0, 0, 0) point on the bottom left corner. The distance
+   * between two adjacent eNodeBs is 130 m.
+   */
+
+  // Set up eNodeB position
+  MobilityHelper enbMobility;
+  enbMobility.SetPositionAllocator ("ns3::GridPositionAllocator",
+                                    "MinX", DoubleValue (0.0),
+                                    "MinY", DoubleValue (0.0),
+                                    "DeltaX", DoubleValue (130.0),
+                                    "DeltaY", DoubleValue (130.0),
+                                    "GridWidth", UintegerValue (m_gridSizeX),
+                                    "LayoutType", StringValue ("RowFirst"));
+  enbMobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  enbMobility.Install (enbNodes);
+
+  // Setup UE position
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  positionAlloc->Add (m_uePosition);
+  MobilityHelper ueMobility;
+  ueMobility.SetPositionAllocator (positionAlloc);
+  ueMobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  ueMobility.Install (ueNodes);
+
+  // Create P-GW node
+  Ptr<Node> pgw = epcHelper->GetPgwNode ();
+
+  // Create a single RemoteHost
+  NodeContainer remoteHostContainer;
+  remoteHostContainer.Create (1);
+  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
+  InternetStackHelper internet;
+  internet.Install (remoteHostContainer);
+
+  // Create the Internet
+  PointToPointHelper p2ph;
+  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
+  p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
+  p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.010)));
+  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
+  Ipv4AddressHelper ipv4h;
+  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
+  Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
+
+  // Routing of the Internet Host (towards the LTE network)
+  Ipv4StaticRoutingHelper ipv4RoutingHelper;
+  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
+  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
+
+  // Create Devices and install them in the Nodes (eNB and UE)
+  NetDeviceContainer enbDevs;
+  NetDeviceContainer ueDevs;
+  enbDevs = lteHelper->InstallEnbDevice (enbNodes);
+  ueDevs = lteHelper->InstallUeDevice (ueNodes);
+
+  // Install the IP stack on the UEs
+  internet.Install (ueNodes);
+  Ipv4InterfaceContainer ueIpIfaces;
+  ueIpIfaces = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueDevs));
+
+  // Assign IP address to UEs
+  for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
+    {
+      Ptr<Node> ueNode = ueNodes.Get (u);
+      // Set the default gateway for the UE
+      Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
+      ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
+    }
+
+  // Add X2 interface
+  lteHelper->AddX2Interface (enbNodes);
+
+  // Connect to trace sources in all eNodeB
+  Config::Connect ("/NodeList/*/DeviceList/*/LteEnbRrc/HandoverStart",
+                   MakeCallback (&LteHandoverTargetTestCase::HandoverStartCallback,
+                                 this));
+
+  // Get the source eNodeB
+  Ptr<NetDevice> sourceEnb = enbDevs.Get (m_sourceCellId - 1);
+  m_sourceEnbDev = sourceEnb->GetObject<LteEnbNetDevice> ();
+  NS_ASSERT (m_sourceEnbDev != 0);
+  NS_ASSERT (m_sourceEnbDev->GetCellId () == m_sourceCellId);
+
+  // Attach UE to the source eNodeB
+  lteHelper->Attach (ueDevs.Get (0), sourceEnb);
+
+  // Schedule a "shutdown" of the source eNodeB
+  Simulator::Schedule (Seconds (0.5),
+                       &LteHandoverTargetTestCase::CellShutdownCallback, this);
+
+  // Run simulation
+  Simulator::Stop (Seconds (1));
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+} // end of void LteX2HandoverTargetTestCase::DoRun ()
+
+
+void
+LteHandoverTargetTestCase::DoTeardown ()
+{
+  NS_LOG_FUNCTION (this);
+  NS_TEST_ASSERT_MSG_EQ (m_hasHandoverOccurred, true, "Handover did not occur");
+}
+
+
+
+/**
+ * \brief Test suite ``lte-handover-target``, verifying that handover
+ *        algorithms are able to select the right target cell.
+ *
+ * Handover algorithm tested in this test suite:
+ * - A2-A4-RSRQ handover algorithm (ns3::A2A4RsrqHandoverAlgorithm)
+ * - Strongest cell handover algorithm (ns3::A3RsrpHandoverAlgorithm)
+ */
+class LteHandoverTargetTestSuite : public TestSuite
+{
+public:
+  LteHandoverTargetTestSuite ();
+};
+
+
+LteHandoverTargetTestSuite::LteHandoverTargetTestSuite ()
+  : TestSuite ("lte-handover-target", SYSTEM)
+{
+  // LogComponentEnable ("LteHandoverTargetTest", LOG_PREFIX_ALL);
+  // LogComponentEnable ("LteHandoverTargetTest", LOG_LEVEL_ALL);
+  // LogComponentEnable ("A2A4RsrqHandoverAlgorithm", LOG_PREFIX_ALL);
+  // LogComponentEnable ("A2A4RsrqHandoverAlgorithm", LOG_LEVEL_ALL);
+  // LogComponentEnable ("A3RsrpHandoverAlgorithm", LOG_PREFIX_ALL);
+  // LogComponentEnable ("A3RsrpHandoverAlgorithm", LOG_LEVEL_ALL);
+
+  /*
+   *    3 --- 4
+   *    |     |
+   *    |o    |
+   *    1 --- 2   o = UE
+   */
+  AddTestCase (new LteHandoverTargetTestCase ("4 cells and A2-A4-RSRQ algorithm",
+                                              Vector (20, 40, 0), 2, 2, 1, 3,
+                                              "ns3::A2A4RsrqHandoverAlgorithm"),
+               TestCase::QUICK);
+  AddTestCase (new LteHandoverTargetTestCase ("4 cells and strongest cell algorithm",
+                                              Vector (20, 40, 0), 2, 2, 1, 3,
+                                              "ns3::A3RsrpHandoverAlgorithm"),
+               TestCase::QUICK);
+
+  /*
+   *    4 --- 5 --- 6
+   *    |     |o    |
+   *    |     |     |
+   *    1 --- 2 --- 3   o = UE
+   */
+  AddTestCase (new LteHandoverTargetTestCase ("6 cells and A2-A4-RSRQ algorithm",
+                                              Vector (150, 90, 0), 3, 2, 5, 2,
+                                              "ns3::A2A4RsrqHandoverAlgorithm"),
+               TestCase::EXTENSIVE);
+  AddTestCase (new LteHandoverTargetTestCase ("6 cells and strongest cell algorithm",
+                                              Vector (150, 90, 0), 3, 2, 5, 2,
+                                              "ns3::A3RsrpHandoverAlgorithm"),
+               TestCase::EXTENSIVE);
+
+} // end of LteHandoverTargetTestSuite ()
+
+
+static LteHandoverTargetTestSuite g_lteHandoverTargetTestSuiteInstance;
+
+
+} // end of namespace ns3
diff -Naur ns-3.18.1/src/lte/test/test-lte-x2-handover.cc ns-3.19/src/lte/test/test-lte-x2-handover.cc
--- ns-3.18.1/src/lte/test/test-lte-x2-handover.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/test-lte-x2-handover.cc	2013-12-20 09:44:50.000000000 -0800
@@ -72,7 +72,7 @@
   bool m_admitHo;
   bool     m_useIdealRrc;
   Ptr<LteHelper> m_lteHelper;
-  Ptr<EpcHelper> m_epcHelper;
+  Ptr<PointToPointEpcHelper> m_epcHelper;
   
   struct BearerData
   {
@@ -156,6 +156,7 @@
   m_lteHelper = CreateObject<LteHelper> ();
   m_lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
   m_lteHelper->SetSchedulerType (m_schedulerType);
+  m_lteHelper->SetHandoverAlgorithmType ("ns3::NoOpHandoverAlgorithm"); // disable automatic handover
   m_lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (m_useIdealRrc));
   
 
@@ -166,7 +167,7 @@
 
   if (m_epc)
     {
-      m_epcHelper = CreateObject<EpcHelper> ();
+      m_epcHelper = CreateObject<PointToPointEpcHelper> ();
       m_lteHelper->SetEpcHelper (m_epcHelper);      
     }
 
@@ -579,39 +580,39 @@
 
   std::string hel1name ("1 fwd");
   std::list<HandoverEvent> hel1;
-  hel1.push_back (ue1fwd);  
+  hel1.push_back (ue1fwd);
 
   std::string hel2name ("1 fwd & bwd");
   std::list<HandoverEvent> hel2;
-  hel2.push_back (ue1fwd);     
-  hel2.push_back (ue1bwd);    
+  hel2.push_back (ue1fwd);
+  hel2.push_back (ue1bwd);
 
   std::string hel3name ("1 fwd & bwd & fwd");
   std::list<HandoverEvent> hel3;
-  hel3.push_back (ue1fwd);     
-  hel3.push_back (ue1bwd);     
-  hel3.push_back (ue1fwdagain);     
+  hel3.push_back (ue1fwd);
+  hel3.push_back (ue1bwd);
+  hel3.push_back (ue1fwdagain);
 
   std::string hel4name ("1+2 fwd");
   std::list<HandoverEvent> hel4;
-  hel4.push_back (ue1fwd);  
+  hel4.push_back (ue1fwd);
   hel4.push_back (ue2fwd);
 
   std::string hel5name ("1+2 fwd & bwd");
   std::list<HandoverEvent> hel5;
-  hel5.push_back (ue1fwd);     
-  hel5.push_back (ue1bwd);    
-  hel5.push_back (ue2fwd);     
-  hel5.push_back (ue2bwd);    
+  hel5.push_back (ue1fwd);
+  hel5.push_back (ue1bwd);
+  hel5.push_back (ue2fwd);
+  hel5.push_back (ue2bwd);
 
   std::string hel6name ("2 fwd");
   std::list<HandoverEvent> hel6;
-  hel6.push_back (ue2fwd);     
+  hel6.push_back (ue2fwd);
 
   std::string hel7name ("2 fwd & bwd");
   std::list<HandoverEvent> hel7;
-  hel7.push_back (ue2fwd);     
-  hel7.push_back (ue2bwd);    
+  hel7.push_back (ue2fwd);
+  hel7.push_back (ue2bwd);
 
   std::vector<std::string> schedulers;
   schedulers.push_back ("ns3::RrFfMacScheduler");
@@ -619,7 +620,7 @@
   for (std::vector<std::string>::iterator schedIt = schedulers.begin (); schedIt != schedulers.end (); ++schedIt)
     {
       for (int32_t useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
-        {          
+        {
           //                                     nUes, nDBearers, helist, name, useUdp, sched, admitHo, idealRrc
           AddTestCase (new LteX2HandoverTestCase (  1,    0,    hel0, hel0name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
           AddTestCase (new LteX2HandoverTestCase (  2,    0,    hel0, hel0name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
diff -Naur ns-3.18.1/src/lte/test/test-lte-x2-handover-measures.cc ns-3.19/src/lte/test/test-lte-x2-handover-measures.cc
--- ns-3.18.1/src/lte/test/test-lte-x2-handover-measures.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/test/test-lte-x2-handover-measures.cc	2013-12-20 09:44:50.000000000 -0800
@@ -46,8 +46,8 @@
       checkInterval (interval),
       ueDeviceIndex (ueIndex),
       enbDeviceIndex (enbIndex)
-    {
-    }
+  {
+  }
 };
 
 
@@ -63,17 +63,26 @@
    * \param checkPointEventList
    * \param checkPointEventListName
    * \param useUdp true if UDP is to be used, false if TCP is to be used
+   * \param schedulerType type of scheduler to be used (e.g. "ns3::PfFfMacScheduler")
+   * \param handoverAlgorithmType type of handover algorithm to be used (e.g. "ns3::A3RsrpHandoverAlgorithm")
+   * \param admitHo
+   * \param useIdealRrc true if ideal RRC is to be used, false if real RRC is to be used
    *
    * \return
    */
   LteX2HandoverMeasuresTestCase (uint32_t nEnbs, uint32_t nUes, uint32_t nDedicatedBearers,
-                                 std::list<CheckPointEvent> checkPointEventList, std::string checkPointEventListName,
-                                 bool useUdp, std::string schedulerType, bool admitHo, bool useIdealRrc);
+                                 std::list<CheckPointEvent> checkPointEventList,
+                                 std::string checkPointEventListName,
+                                 bool useUdp, std::string schedulerType,
+                                 std::string handoverAlgorithmType, bool admitHo,
+                                 bool useIdealRrc);
 
 private:
   static std::string BuildNameString (uint32_t nEnbs, uint32_t nUes, uint32_t nDedicatedBearers,
                                       std::string checkPointEventListName,
-                                      bool useUdp, std::string schedulerType, bool admitHo, bool useIdealRrc);
+                                      bool useUdp, std::string schedulerType,
+                                      std::string handoverAlgorithmType, bool admitHo,
+                                      bool useIdealRrc);
   virtual void DoRun (void);
   void CheckConnected (Ptr<NetDevice> ueDevice, Ptr<NetDevice> enbDevice);
 
@@ -85,10 +94,11 @@
   bool m_epc;
   bool m_useUdp;
   std::string m_schedulerType;
+  std::string m_handoverAlgorithmType;
   bool m_admitHo;
   bool m_useIdealRrc;
   Ptr<LteHelper> m_lteHelper;
-  Ptr<EpcHelper> m_epcHelper;
+  Ptr<PointToPointEpcHelper> m_epcHelper;
 
   struct BearerData
   {
@@ -120,7 +130,9 @@
 std::string
 LteX2HandoverMeasuresTestCase::BuildNameString (uint32_t nEnbs, uint32_t nUes, uint32_t nDedicatedBearers,
                                                 std::string checkPointEventListName,
-                                                bool useUdp, std::string schedulerType, bool admitHo, bool useIdealRrc)
+                                                bool useUdp, std::string schedulerType,
+                                                std::string handoverAlgorithmType, bool admitHo,
+                                                bool useIdealRrc)
 {
   std::ostringstream oss;
   oss << "nEnbs=" << nEnbs
@@ -128,6 +140,7 @@
       << " nDedicatedBearers=" << nDedicatedBearers
       << " udp=" << useUdp
       << " " << schedulerType
+      << " " << handoverAlgorithmType
       << " admitHo=" << admitHo
       << " hoList: " << checkPointEventListName;
   if (useIdealRrc)
@@ -142,9 +155,14 @@
 }
 
 LteX2HandoverMeasuresTestCase::LteX2HandoverMeasuresTestCase (uint32_t nEnbs, uint32_t nUes, uint32_t nDedicatedBearers,
-                                                              std::list<CheckPointEvent> checkPointEventList, std::string checkPointEventListName,
-                                                              bool useUdp, std::string schedulerType, bool admitHo, bool useIdealRrc)
-  : TestCase (BuildNameString (nEnbs, nUes, nDedicatedBearers, checkPointEventListName, useUdp, schedulerType, admitHo, useIdealRrc)),
+                                                              std::list<CheckPointEvent> checkPointEventList,
+                                                              std::string checkPointEventListName,
+                                                              bool useUdp, std::string schedulerType,
+                                                              std::string handoverAlgorithmType, bool admitHo,
+                                                              bool useIdealRrc)
+  : TestCase (BuildNameString (nEnbs, nUes, nDedicatedBearers,
+                               checkPointEventListName, useUdp, schedulerType,
+                               handoverAlgorithmType, admitHo, useIdealRrc)),
     m_nEnbs (nEnbs),
     m_nUes (nUes),
     m_nDedicatedBearers (nDedicatedBearers),
@@ -153,6 +171,7 @@
     m_epc (true),
     m_useUdp (useUdp),
     m_schedulerType (schedulerType),
+    m_handoverAlgorithmType (handoverAlgorithmType),
     m_admitHo (admitHo),
     m_useIdealRrc (useIdealRrc),
     m_maxHoDuration (Seconds (0.1)),
@@ -167,14 +186,14 @@
 {
   NS_LOG_FUNCTION (this << BuildNameString (m_nEnbs, m_nUes, m_nDedicatedBearers,
                                             m_checkPointEventListName,
-                                            m_useUdp, m_schedulerType, m_admitHo, m_useIdealRrc));
+                                            m_useUdp, m_schedulerType,
+                                            m_handoverAlgorithmType, m_admitHo,
+                                            m_useIdealRrc));
 
   Config::Reset ();
   Config::SetDefault ("ns3::UdpClient::Interval", TimeValue (m_udpClientInterval));
   Config::SetDefault ("ns3::UdpClient::MaxPackets", UintegerValue (1000000));
   Config::SetDefault ("ns3::UdpClient::PacketSize", UintegerValue (m_udpClientPktSize));
-  Config::SetDefault ("ns3::LteEnbRrc::ServingCellHandoverThreshold", UintegerValue (30));
-  Config::SetDefault ("ns3::LteEnbRrc::NeighbourCellHandoverOffset", UintegerValue (1));
   Config::SetDefault ("ns3::LteEnbRrc::HandoverJoiningTimeoutDuration", TimeValue (MilliSeconds (200)));
   Config::SetDefault ("ns3::LteEnbPhy::TxPower", DoubleValue (20));
 
@@ -183,9 +202,29 @@
 
   m_lteHelper = CreateObject<LteHelper> ();
   m_lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisSpectrumPropagationLossModel"));
-  m_lteHelper->SetSchedulerType (m_schedulerType);
   m_lteHelper->SetAttribute ("UseIdealRrc", BooleanValue (m_useIdealRrc));
+  m_lteHelper->SetSchedulerType (m_schedulerType);
 
+  if (m_handoverAlgorithmType == "ns3::A2A4RsrqHandoverAlgorithm")
+    {
+      m_lteHelper->SetHandoverAlgorithmType ("ns3::A2A4RsrqHandoverAlgorithm");
+      m_lteHelper->SetHandoverAlgorithmAttribute ("ServingCellThreshold",
+                                                  UintegerValue (30));
+      m_lteHelper->SetHandoverAlgorithmAttribute ("NeighbourCellOffset",
+                                                  UintegerValue (1));
+    }
+  else if (m_handoverAlgorithmType == "ns3::A3RsrpHandoverAlgorithm")
+    {
+      m_lteHelper->SetHandoverAlgorithmType ("ns3::A3RsrpHandoverAlgorithm");
+      m_lteHelper->SetHandoverAlgorithmAttribute ("Hysteresis",
+                                                  DoubleValue (1.5));
+      m_lteHelper->SetHandoverAlgorithmAttribute ("TimeToTrigger",
+                                                  TimeValue (MilliSeconds (128)));
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Unknown handover algorithm " << m_handoverAlgorithmType);
+    }
 
   double distance = 1000.0; // m
   double speed = 150;       // m/s
@@ -197,7 +236,7 @@
 
   if (m_epc)
     {
-      m_epcHelper = CreateObject<EpcHelper> ();
+      m_epcHelper = CreateObject<PointToPointEpcHelper> ();
       m_lteHelper->SetEpcHelper (m_epcHelper);
     }
 
@@ -210,18 +249,20 @@
       enbPositionAlloc->Add (enbPosition);
     }
   MobilityHelper enbMobility;
-  enbMobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
-  enbMobility.SetPositionAllocator(enbPositionAlloc);
-  enbMobility.Install(enbNodes);
+  enbMobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  enbMobility.SetPositionAllocator (enbPositionAlloc);
+  enbMobility.Install (enbNodes);
 
   // Install Mobility Model in UE
   // UE moves with a constant speed along the X axis
   MobilityHelper ueMobility;
   ueMobility.SetMobilityModel ("ns3::ConstantVelocityMobilityModel");
-  ueMobility.Install(ueNodes);
-  ueNodes.Get (0)->GetObject<MobilityModel> ()->SetPosition (Vector (0, 0, 0));
-  ueNodes.Get (0)->GetObject<ConstantVelocityMobilityModel> ()->SetVelocity (Vector (speed, 0, 0));
-
+  ueMobility.Install (ueNodes);
+  for (uint16_t i = 0; i < m_nUes; i++)
+    {
+      ueNodes.Get (i)->GetObject<MobilityModel> ()->SetPosition (Vector (0, 0, 0));
+      ueNodes.Get (i)->GetObject<ConstantVelocityMobilityModel> ()->SetVelocity (Vector (speed, 0, 0));
+    }
 
   NetDeviceContainer enbDevices;
   enbDevices = m_lteHelper->InstallEnbDevice (enbNodes);
@@ -604,64 +645,72 @@
   std::string cel1name ("ho: 0 -> 1");
   std::list<CheckPointEvent> cel1;
   cel1.push_back (CheckPointEvent (Seconds (1), Seconds (10.1), checkInterval, 0, 0));
-  cel1.push_back (CheckPointEvent (Seconds (11), Seconds (37), checkInterval, 0, 1));
+  cel1.push_back (CheckPointEvent (Seconds (11), Seconds (17), checkInterval, 0, 1));
 
   std::string cel2name ("ho: 0 -> 1 -> 2");
   std::list<CheckPointEvent> cel2;
-  cel2.push_back (CheckPointEvent (Seconds (1), Seconds (10.1), Seconds (1), 0, 0));
-  cel2.push_back (CheckPointEvent (Seconds (11), Seconds (17.1), Seconds (1), 0, 1));
-  cel2.push_back (CheckPointEvent (Seconds (18), Seconds (37), Seconds (1), 0, 2));
+  cel2.push_back (CheckPointEvent (Seconds (1), Seconds (10.1), checkInterval, 0, 0));
+  cel2.push_back (CheckPointEvent (Seconds (11), Seconds (17.1), checkInterval, 0, 1));
+  cel2.push_back (CheckPointEvent (Seconds (18), Seconds (24), checkInterval, 0, 2));
 
   std::string cel3name ("ho: 0 -> 1 -> 2 -> 3");
   std::list<CheckPointEvent> cel3;
-  cel3.push_back (CheckPointEvent (Seconds (1), Seconds (10.1), Seconds (1),  0, 0));
-  cel3.push_back (CheckPointEvent (Seconds (11), Seconds (17.1), Seconds (1), 0, 1));
-  cel3.push_back (CheckPointEvent (Seconds (18), Seconds (24.1), Seconds (1), 0, 2));
-  cel3.push_back (CheckPointEvent (Seconds (25), Seconds (37), Seconds (1), 0, 3));
+  cel3.push_back (CheckPointEvent (Seconds (1), Seconds (10.1), checkInterval,  0, 0));
+  cel3.push_back (CheckPointEvent (Seconds (11), Seconds (17.1), checkInterval, 0, 1));
+  cel3.push_back (CheckPointEvent (Seconds (18), Seconds (24.1), checkInterval, 0, 2));
+  cel3.push_back (CheckPointEvent (Seconds (25), Seconds (37), checkInterval, 0, 3));
 
 
   int32_t useIdealRrc;
-  std::vector<std::string> schedulers;
-  schedulers.push_back ("ns3::PfFfMacScheduler");
-  for (std::vector<std::string>::iterator schedIt = schedulers.begin (); schedIt != schedulers.end (); ++schedIt)
+  std::string sched = "ns3::PfFfMacScheduler";
+  std::string ho = "ns3::A2A4RsrqHandoverAlgorithm";
+  for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
     {
-      for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
-        {
-          //                                             nEnbs, nUes, nDBearers, celist, name, useUdp, sched, admitHo, idealRrc
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  2,   1,    0,      cel1, cel1name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  2,   1,    1,      cel1, cel1name, true, *schedIt, true,  useIdealRrc), TestCase::QUICK);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  2,   1,    2,      cel1, cel1name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  3,   1,    0,      cel2, cel2name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  3,   1,    1,      cel2, cel2name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  3,   1,    2,      cel2, cel2name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  4,   1,    0,      cel3, cel3name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  4,   1,    1,      cel3, cel3name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  4,   1,    2,      cel3, cel3name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-        }
+      //                                          nEnbs, nUes, nDBearers, celist, name, useUdp, sched, ho, admitHo, idealRrc
+      AddTestCase (new LteX2HandoverMeasuresTestCase (2,   1,    0,    cel1, cel1name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (2,   1,    1,    cel1, cel1name, true, sched, ho, true, useIdealRrc), TestCase::QUICK);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (2,   1,    2,    cel1, cel1name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (3,   1,    0,    cel2, cel2name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (3,   1,    1,    cel2, cel2name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (3,   1,    2,    cel2, cel2name, true, sched, ho, true, useIdealRrc), TestCase::EXTENSIVE);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (4,   1,    0,    cel3, cel3name, true, sched, ho, true, useIdealRrc), TestCase::EXTENSIVE);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (4,   1,    1,    cel3, cel3name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (4,   1,    2,    cel3, cel3name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
     }
 
-  schedulers.resize (0);
-  schedulers.push_back ("ns3::RrFfMacScheduler");
-  for (std::vector<std::string>::iterator schedIt = schedulers.begin (); schedIt != schedulers.end (); ++schedIt)
+  sched = "ns3::RrFfMacScheduler";
+  for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
     {
-      for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
-        {
-          //                                             nEnbs, nUes, nDBearers, celist, name, useUdp, sched, admitHo, idealRrc
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  2,   1,    0,      cel1, cel1name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-//           AddTestCase (new LteX2HandoverMeasuresTestCase (  2,   1,    1,      cel1b, cel1bname, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-//           AddTestCase (new LteX2HandoverMeasuresTestCase (  2,   1,    2,      cel1, cel1name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  3,   1,    0,      cel2, cel2name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-//           AddTestCase (new LteX2HandoverMeasuresTestCase (  3,   1,    1,      cel2, cel2name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-//           AddTestCase (new LteX2HandoverMeasuresTestCase (  3,   1,    2,      cel2, cel2name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-          AddTestCase (new LteX2HandoverMeasuresTestCase (  4,   1,    0,      cel3, cel3name, true, *schedIt, true,  useIdealRrc), TestCase::EXTENSIVE);
-//           AddTestCase (new LteX2HandoverMeasuresTestCase (  4,   1,    1,      cel3, cel3name, true, *schedIt, true,  useIdealRrc), TestCase::QUICK);
-//           AddTestCase (new LteX2HandoverMeasuresTestCase (  4,   1,    2,      cel3, cel3name, true, *schedIt, true,  useIdealRrc), TestCase::QUICK);
-        }
+      //                                          nEnbs, nUes, nDBearers, celist, name, useUdp, sched, admitHo, idealRrc
+      AddTestCase (new LteX2HandoverMeasuresTestCase (2,   1,    0,    cel1, cel1name, true, sched, ho, true, useIdealRrc), TestCase::EXTENSIVE);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (3,   1,    0,    cel2, cel2name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (4,   1,    0,    cel3, cel3name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
     }
 
-}
+  ho = "ns3::A3RsrpHandoverAlgorithm";
+  sched = "ns3::PfFfMacScheduler";
+  for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
+    {
+      //                                          nEnbs, nUes, nDBearers, celist, name, useUdp, sched, admitHo, idealRrc
+      AddTestCase (new LteX2HandoverMeasuresTestCase (2,   1,    0,    cel1, cel1name, true, sched, ho, true, useIdealRrc), TestCase::EXTENSIVE);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (3,   1,    0,    cel2, cel2name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (4,   1,    0,    cel3, cel3name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+    }
+
+  sched = "ns3::RrFfMacScheduler";
+  for (useIdealRrc = 1; useIdealRrc >= 0; --useIdealRrc)
+    {
+      //                                          nEnbs, nUes, nDBearers, celist, name, useUdp, sched, admitHo, idealRrc
+      AddTestCase (new LteX2HandoverMeasuresTestCase (2,   1,    0,    cel1, cel1name, true, sched, ho, true, useIdealRrc), TestCase::QUICK);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (3,   1,    0,    cel2, cel2name, true, sched, ho, true, useIdealRrc), TestCase::TAKES_FOREVER);
+      AddTestCase (new LteX2HandoverMeasuresTestCase (4,   1,    0,    cel3, cel3name, true, sched, ho, true, useIdealRrc), TestCase::EXTENSIVE);
+    }
+
+} // end of LteX2HandoverMeasuresTestSuite ()
 
 static LteX2HandoverMeasuresTestSuite g_lteX2HandoverMeasuresTestSuiteInstance;
 
 
+
 } // namespace ns3
+
diff -Naur ns-3.18.1/src/lte/wscript ns-3.19/src/lte/wscript
--- ns-3.18.1/src/lte/wscript	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/lte/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -40,6 +40,7 @@
         'helper/lte-helper.cc',
         'helper/lte-stats-calculator.cc',
         'helper/epc-helper.cc',
+        'helper/point-to-point-epc-helper.cc',
         'helper/radio-bearer-stats-calculator.cc',
         'helper/radio-bearer-stats-connector.cc',
         'helper/phy-stats-calculator.cc',
@@ -98,6 +99,13 @@
         'model/epc-mme.cc',
         'model/lte-asn1-header.cc',
         'model/lte-rrc-header.cc',
+        'model/lte-handover-management-sap.cc',
+        'model/lte-handover-algorithm.cc',
+        'model/a2-a4-rsrq-handover-algorithm.cc',
+        'model/a3-rsrp-handover-algorithm.cc',
+        'model/no-op-handover-algorithm.cc',
+        'model/lte-anr-sap.cc',
+        'model/lte-anr.cc',
         ]
 
     module_test = bld.create_ns3_module_test_library('lte')
@@ -142,7 +150,9 @@
         'test/test-lte-x2-handover-measures.cc',
         'test/test-asn1-encoding.cc',
         'test/lte-test-ue-measurements.cc',
+        'test/lte-test-cell-selection.cc',
         'test/test-lte-handover-delay.cc',
+        'test/test-lte-handover-target.cc',
         ]
 
     headers = bld(features='ns3header')
@@ -184,6 +194,7 @@
         'helper/lte-helper.h',
         'helper/lte-stats-calculator.h',
         'helper/epc-helper.h',
+        'helper/point-to-point-epc-helper.h',
         'helper/phy-stats-calculator.h',
         'helper/mac-stats-calculator.h',
         'helper/phy-tx-stats-calculator.h',
@@ -242,6 +253,13 @@
         'model/epc-mme.h',
         'model/lte-asn1-header.h',
         'model/lte-rrc-header.h',
+        'model/lte-handover-management-sap.h',
+        'model/lte-handover-algorithm.h',
+        'model/a2-a4-rsrq-handover-algorithm.h',
+        'model/a3-rsrp-handover-algorithm.h',
+        'model/no-op-handover-algorithm.h',
+        'model/lte-anr-sap.h',
+        'model/lte-anr.h',
         ]
 
     if (bld.env['ENABLE_EXAMPLES']):
diff -Naur ns-3.18.1/src/mesh/bindings/modulegen__gcc_ILP32.py ns-3.19/src/mesh/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/mesh/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -33,7 +33,7 @@
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
     ## edca-txop-n.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA'], import_from_module='ns.wifi')
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'], import_from_module='ns.wifi')
     ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType [enumeration]
     module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
     ## address.h (module 'network'): ns3::Address [class]
@@ -157,7 +157,7 @@
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
     module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
-    module.add_class('WifiHelper', import_from_module='ns.wifi')
+    module.add_class('WifiHelper', allow_subclassing=True, import_from_module='ns.wifi')
     ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper [class]
     module.add_class('WifiMacHelper', allow_subclassing=True, import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
@@ -237,7 +237,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -247,7 +247,7 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
     module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
@@ -1988,10 +1988,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3326,17 +3327,17 @@
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::NodeContainer', 'c')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, std::string nodeName) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetRemoteStationManager(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetRemoteStationManager', 
                    'void', 
@@ -3344,7 +3345,8 @@
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('SetStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')])
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
     return
 
 def register_Ns3WifiMacHelper_methods(root_module, cls):
@@ -3540,8 +3542,8 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'm'), param('uint8_t', 'l'), param('uint8_t', 'r'), param('bool', 'sg'), param('uint8_t', 'ns'), param('uint8_t', 'ne'), param('bool', 'Stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -3597,10 +3599,10 @@
     cls.add_method('SetShortGuardInterval', 
                    'void', 
                    [param('bool', 'guardinterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbcsatuts) [member function]
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
-                   [param('bool', 'stbcsatuts')])
+                   [param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
     cls.add_method('SetTxPowerLevel', 
                    'void', 
@@ -4670,6 +4672,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4680,6 +4687,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4695,6 +4707,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4720,6 +4737,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5616,10 +5638,10 @@
     cls.add_method('SetProbeResp', 
                    'void', 
                    [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy arg0) [member function]
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
     cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'arg0')])
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
     cls.add_method('SetQosAmsdu', 
                    'void', 
@@ -6295,15 +6317,15 @@
                    'void', 
                    [param('bool', 'greenfield')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool GuardInterval) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
     cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('bool', 'guardInterval')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool Ldpc) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('bool', 'ldpc')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
@@ -7205,10 +7227,10 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immeadiateAck) [member function]
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
     cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('bool', 'immeadiateAck')])
+                   [param('bool', 'immediateAck')])
     ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
     cls.add_method('SetReceivedFragment', 
                    'void', 
@@ -8924,6 +8946,31 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::DcaTxop> ns3::RegularWifiMac::GetDcaTxop() const [member function]
+    cls.add_method('GetDcaTxop', 
+                   'ns3::Ptr< ns3::DcaTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('FinishConfigureStandard', 
                    'void', 
diff -Naur ns-3.18.1/src/mesh/bindings/modulegen__gcc_LP64.py ns-3.19/src/mesh/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/mesh/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -33,7 +33,7 @@
     ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
     module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
     ## edca-txop-n.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA'], import_from_module='ns.wifi')
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'], import_from_module='ns.wifi')
     ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType [enumeration]
     module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
     ## address.h (module 'network'): ns3::Address [class]
@@ -157,7 +157,7 @@
     ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
     module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
-    module.add_class('WifiHelper', import_from_module='ns.wifi')
+    module.add_class('WifiHelper', allow_subclassing=True, import_from_module='ns.wifi')
     ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper [class]
     module.add_class('WifiMacHelper', allow_subclassing=True, import_from_module='ns.wifi')
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
@@ -237,7 +237,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -247,7 +247,7 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
     module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
@@ -1988,10 +1988,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3326,17 +3327,17 @@
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::NodeContainer', 'c')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, std::string nodeName) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetRemoteStationManager(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetRemoteStationManager', 
                    'void', 
@@ -3344,7 +3345,8 @@
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('SetStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')])
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
     return
 
 def register_Ns3WifiMacHelper_methods(root_module, cls):
@@ -3540,8 +3542,8 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'm'), param('uint8_t', 'l'), param('uint8_t', 'r'), param('bool', 'sg'), param('uint8_t', 'ns'), param('uint8_t', 'ne'), param('bool', 'Stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -3597,10 +3599,10 @@
     cls.add_method('SetShortGuardInterval', 
                    'void', 
                    [param('bool', 'guardinterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbcsatuts) [member function]
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
-                   [param('bool', 'stbcsatuts')])
+                   [param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
     cls.add_method('SetTxPowerLevel', 
                    'void', 
@@ -4670,6 +4672,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4680,6 +4687,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4695,6 +4707,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4720,6 +4737,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5616,10 +5638,10 @@
     cls.add_method('SetProbeResp', 
                    'void', 
                    [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy arg0) [member function]
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
     cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'arg0')])
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
     cls.add_method('SetQosAmsdu', 
                    'void', 
@@ -6295,15 +6317,15 @@
                    'void', 
                    [param('bool', 'greenfield')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool GuardInterval) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
     cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('bool', 'guardInterval')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool Ldpc) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('bool', 'ldpc')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
@@ -7205,10 +7227,10 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immeadiateAck) [member function]
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
     cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('bool', 'immeadiateAck')])
+                   [param('bool', 'immediateAck')])
     ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
     cls.add_method('SetReceivedFragment', 
                    'void', 
@@ -8924,6 +8946,31 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::DcaTxop> ns3::RegularWifiMac::GetDcaTxop() const [member function]
+    cls.add_method('GetDcaTxop', 
+                   'ns3::Ptr< ns3::DcaTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('FinishConfigureStandard', 
                    'void', 
diff -Naur ns-3.18.1/src/mesh/helper/dot11s/dot11s-installer.cc ns-3.19/src/mesh/helper/dot11s/dot11s-installer.cc
--- ns-3.18.1/src/mesh/helper/dot11s/dot11s-installer.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/helper/dot11s/dot11s-installer.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,9 @@
 
 namespace ns3 {
 using namespace dot11s;
-NS_OBJECT_ENSURE_REGISTERED (Dot11sStack);
+NS_OBJECT_ENSURE_REGISTERED (Dot11sStack)
+  ;
+  
 TypeId
 Dot11sStack::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/mesh/helper/flame/flame-installer.cc ns-3.19/src/mesh/helper/flame/flame-installer.cc
--- ns-3.18.1/src/mesh/helper/flame/flame-installer.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/helper/flame/flame-installer.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,9 @@
 namespace ns3
 {
 using namespace flame;
-NS_OBJECT_ENSURE_REGISTERED (FlameStack);
+NS_OBJECT_ENSURE_REGISTERED (FlameStack)
+  ;
+  
 TypeId
 FlameStack::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/mesh/model/dot11s/airtime-metric.cc ns-3.19/src/mesh/model/dot11s/airtime-metric.cc
--- ns-3.18.1/src/mesh/model/dot11s/airtime-metric.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/dot11s/airtime-metric.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,9 @@
 
 namespace ns3 {
 namespace dot11s {
-NS_OBJECT_ENSURE_REGISTERED (AirtimeLinkMetricCalculator);
+NS_OBJECT_ENSURE_REGISTERED (AirtimeLinkMetricCalculator)
+  ;
+  
 TypeId
 AirtimeLinkMetricCalculator::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/mesh/model/dot11s/hwmp-protocol.cc ns-3.19/src/mesh/model/dot11s/hwmp-protocol.cc
--- ns-3.18.1/src/mesh/model/dot11s/hwmp-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/dot11s/hwmp-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -41,7 +41,9 @@
 namespace ns3 {
 namespace dot11s {
 
-NS_OBJECT_ENSURE_REGISTERED (HwmpProtocol);
+NS_OBJECT_ENSURE_REGISTERED (HwmpProtocol)
+  ;
+  
 TypeId
 HwmpProtocol::GetTypeId ()
 {
diff -Naur ns-3.18.1/src/mesh/model/dot11s/hwmp-rtable.cc ns-3.19/src/mesh/model/dot11s/hwmp-rtable.cc
--- ns-3.18.1/src/mesh/model/dot11s/hwmp-rtable.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/dot11s/hwmp-rtable.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 NS_LOG_COMPONENT_DEFINE ("HwmpRtable");
 
-NS_OBJECT_ENSURE_REGISTERED (HwmpRtable);
+NS_OBJECT_ENSURE_REGISTERED (HwmpRtable)
+  ;
 
 TypeId
 HwmpRtable::GetTypeId ()
diff -Naur ns-3.18.1/src/mesh/model/dot11s/hwmp-tag.cc ns-3.19/src/mesh/model/dot11s/hwmp-tag.cc
--- ns-3.18.1/src/mesh/model/dot11s/hwmp-tag.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/dot11s/hwmp-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,9 @@
 namespace ns3 {
 namespace dot11s {
 
-NS_OBJECT_ENSURE_REGISTERED (HwmpTag);
+NS_OBJECT_ENSURE_REGISTERED (HwmpTag)
+  ;
+  
 //Class HwmpTag:
 HwmpTag::HwmpTag () :
   m_address (Mac48Address::GetBroadcast ()), m_ttl (0), m_metric (0), m_seqno (0)
diff -Naur ns-3.18.1/src/mesh/model/dot11s/peer-link.cc ns-3.19/src/mesh/model/dot11s/peer-link.cc
--- ns-3.18.1/src/mesh/model/dot11s/peer-link.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/dot11s/peer-link.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 namespace ns3 {
 namespace dot11s {
 
-NS_OBJECT_ENSURE_REGISTERED ( PeerLink);
+NS_OBJECT_ENSURE_REGISTERED ( PeerLink)
+  ;
 
 TypeId
 PeerLink::GetTypeId ()
diff -Naur ns-3.18.1/src/mesh/model/dot11s/peer-link-frame.cc ns-3.19/src/mesh/model/dot11s/peer-link-frame.cc
--- ns-3.18.1/src/mesh/model/dot11s/peer-link-frame.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/dot11s/peer-link-frame.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 namespace dot11s {
-NS_OBJECT_ENSURE_REGISTERED (PeerLinkFrameStart);
+NS_OBJECT_ENSURE_REGISTERED (PeerLinkFrameStart)
+  ;
 
 PeerLinkFrameStart::PeerLinkFrameStart () :
   m_subtype (255), m_capability (0), m_aid (0), m_rates (SupportedRates ()), m_meshId (),
diff -Naur ns-3.18.1/src/mesh/model/dot11s/peer-management-protocol.cc ns-3.19/src/mesh/model/dot11s/peer-management-protocol.cc
--- ns-3.18.1/src/mesh/model/dot11s/peer-management-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/dot11s/peer-management-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -39,7 +39,8 @@
 /***************************************************
  * PeerManager
  ***************************************************/
-NS_OBJECT_ENSURE_REGISTERED (PeerManagementProtocol);
+NS_OBJECT_ENSURE_REGISTERED (PeerManagementProtocol)
+  ;
 
 TypeId
 PeerManagementProtocol::GetTypeId (void)
diff -Naur ns-3.18.1/src/mesh/model/flame/flame-header.cc ns-3.19/src/mesh/model/flame/flame-header.cc
--- ns-3.18.1/src/mesh/model/flame/flame-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/flame/flame-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 namespace ns3 {
 namespace flame {
 
-NS_OBJECT_ENSURE_REGISTERED (FlameHeader);
+NS_OBJECT_ENSURE_REGISTERED (FlameHeader)
+  ;
 
 FlameHeader::FlameHeader () :
   m_cost (0), m_seqno (0), m_origDst (Mac48Address ()), m_origSrc (Mac48Address ())
diff -Naur ns-3.18.1/src/mesh/model/flame/flame-protocol.cc ns-3.19/src/mesh/model/flame/flame-protocol.cc
--- ns-3.18.1/src/mesh/model/flame/flame-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/flame/flame-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,8 +38,10 @@
 //-----------------------------------------------------------------------------
 // FlameTag
 //-----------------------------------------------------------------------------
-NS_OBJECT_ENSURE_REGISTERED (FlameTag);
-NS_OBJECT_ENSURE_REGISTERED (FlameProtocol);
+NS_OBJECT_ENSURE_REGISTERED (FlameTag)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (FlameProtocol)
+  ;
 
 TypeId
 FlameTag::GetTypeId ()
diff -Naur ns-3.18.1/src/mesh/model/flame/flame-rtable.cc ns-3.19/src/mesh/model/flame/flame-rtable.cc
--- ns-3.18.1/src/mesh/model/flame/flame-rtable.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/flame/flame-rtable.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 NS_LOG_COMPONENT_DEFINE ("FlameRtable");
 
-NS_OBJECT_ENSURE_REGISTERED (FlameRtable);
+NS_OBJECT_ENSURE_REGISTERED (FlameRtable)
+  ;
 
 TypeId
 FlameRtable::GetTypeId ()
diff -Naur ns-3.18.1/src/mesh/model/mesh-l2-routing-protocol.cc ns-3.19/src/mesh/model/mesh-l2-routing-protocol.cc
--- ns-3.18.1/src/mesh/model/mesh-l2-routing-protocol.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/mesh-l2-routing-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MeshL2RoutingProtocol);
+NS_OBJECT_ENSURE_REGISTERED (MeshL2RoutingProtocol)
+  ;
 
 TypeId
 MeshL2RoutingProtocol::GetTypeId (void)
diff -Naur ns-3.18.1/src/mesh/model/mesh-point-device.cc ns-3.19/src/mesh/model/mesh-point-device.cc
--- ns-3.18.1/src/mesh/model/mesh-point-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/mesh-point-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MeshPointDevice);
+NS_OBJECT_ENSURE_REGISTERED (MeshPointDevice)
+  ;
 
 TypeId
 MeshPointDevice::GetTypeId ()
diff -Naur ns-3.18.1/src/mesh/model/mesh-wifi-interface-mac.cc ns-3.19/src/mesh/model/mesh-wifi-interface-mac.cc
--- ns-3.18.1/src/mesh/model/mesh-wifi-interface-mac.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mesh/model/mesh-wifi-interface-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MeshWifiInterfaceMac);
+NS_OBJECT_ENSURE_REGISTERED (MeshWifiInterfaceMac)
+  ;
 
 TypeId
 MeshWifiInterfaceMac::GetTypeId ()
diff -Naur ns-3.18.1/src/mobility/bindings/modulegen__gcc_ILP32.py ns-3.19/src/mobility/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/mobility/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -125,7 +125,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1009,10 +1009,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -2303,6 +2304,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2313,6 +2319,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2328,6 +2339,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2353,6 +2369,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/mobility/bindings/modulegen__gcc_LP64.py ns-3.19/src/mobility/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/mobility/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -125,7 +125,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1009,10 +1009,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -2303,6 +2304,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2313,6 +2319,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2328,6 +2339,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2353,6 +2369,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/mobility/doc/mobility.rst ns-3.19/src/mobility/doc/mobility.rst
--- ns-3.18.1/src/mobility/doc/mobility.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/doc/mobility.rst	2013-12-20 09:44:50.000000000 -0800
@@ -140,7 +140,9 @@
 The |ns2| mobility format is a widely used mobility trace format.  The
 documentation is available at: http://www.isi.edu/nsnam/ns/doc/node172.html
 
-Valid trace files use the following ns2 statements: ::
+Valid trace files use the following ns2 statements:
+
+.. sourcecode:: bash
 
    $node set X_ x1
    $node set Y_ y1
@@ -166,14 +168,14 @@
 
 Some examples of external tools that can export in this format include:
 
-- BonnMotion http://net.cs.uni-bonn.de/wg/cs/applications/bonnmotion/
+- `BonnMotion <http://net.cs.uni-bonn.de/wg/cs/applications/bonnmotion/>`_
 
-  - Some installation instructions for BonnMotion can be found here:  http://www.nsnam.org/wiki/HOWTO_use_ns-3_with_BonnMotion_mobility_generator_and_analysis_tool
-  - Documentation on using BonnMotion with |ns3| is posted here: http://www.ida.liu.se/~rikno/files/mobility_generation.pdf  
+  - `Installation instructions <http://www.nsnam.org/wiki/HOWTO_use_ns-3_with_BonnMotion_mobility_generator_and_analysis_tool>`_ and
+  - `Documentation <http://www.ida.liu.se/~rikno/files/mobility_generation.pdf>`_ for using BonnMotion with |ns3|
 
-- SUMO http://sourceforge.net/apps/mediawiki/sumo/index.php?title=Main_Page
-- TraNS http://trans.epfl.ch/
-- the ``setdest`` utility in |ns2|, documented here: http://www.winlab.rutgers.edu/~zhibinwu/html/ns2_wireless_scene.htm
+- `SUMO <http://sourceforge.net/apps/mediawiki/sumo/index.php?title=Main_Page>`_
+- `TraNS <http://trans.epfl.ch/>`_
+- |ns2| `setdest <http://www.winlab.rutgers.edu/~zhibinwu/html/ns2_wireless_scene.htm>`_ utility
 
 A special Ns2MobilityHelper object can be used to parse these files
 and convert the statements into |ns3| mobility events.  The underlying
@@ -208,7 +210,7 @@
 First, the user instantiates a ``MobilityHelper`` object and sets some
 ``Attributes`` controlling the "position allocator" functionality.
 
-::
+.. sourcecode:: cpp
 
   MobilityHelper mobility;
 
@@ -227,14 +229,14 @@
 
 Next, the user typically sets the MobilityModel subclass; e.g.:
 
-::
+.. sourcecode:: cpp
 
   mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
     "Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));
 
 Once the helper is configured, it is typically passed a container, such as:
 
-::
+.. sourcecode:: cpp
 
   mobility.Install (wifiStaNodes);
 
@@ -270,13 +272,17 @@
 
 Example usage:
 
-::
+.. sourcecode:: bash
 
-  ./waf --run "ns2-mobility-trace --traceFile=src/mobility/examples/default.ns_movements --nodeNum=2 --duration=100.0 --logFile=ns2-mob.log"
+  $ ./waf --run "ns2-mobility-trace \
+  --traceFile=src/mobility/examples/default.ns_movements \
+  --nodeNum=2 \
+  --duration=100.0 \
+  --logFile=ns2-mob.log"
 
 Sample log file output:
 
-::
+.. sourcecode:: text
 
   +0.0ns POS: x=150, y=93.986, z=0; VEL:0, y=50.4038, z=0
   +0.0ns POS: x=195.418, y=150, z=0; VEL:50.1186, y=0, z=0
@@ -299,7 +305,7 @@
 
 The program ``bonnmotion-ns2-example.cc`` will output the following to stdout:
 
-::
+.. sourcecode:: text
 
   At 0.00 node 0: Position(329.82, 66.06, 0.00);   Speed(0.53, -0.22, 0.00)
   At 100.00 node 0: Position(378.38, 45.59, 0.00);   Speed(0.00, 0.00, 0.00)
@@ -322,7 +328,7 @@
 The output of the |ns2| ``bonnmotion-example.tcl`` program is shown below
 for comparison (file ``bonnmotion-example.tr``):
 
-::
+.. sourcecode:: text
 
   M 0.00000 0 (329.82, 66.06, 0.00), (378.38, 45.59), 0.57
   M 100.00000 0 (378.38, 45.59, 0.00), (378.38, 45.59), 0.57
@@ -362,7 +368,7 @@
 Class ``MobilityModel`` and class ``PositionAllocator`` both have public
 API to assign streams to underlying random variables:
 
-::
+.. sourcecode:: cpp
 
   /**
    * Assign a fixed random variable stream number to the random variables
@@ -377,7 +383,7 @@
 The class ``MobilityHelper`` also provides this API.  The typical usage 
 pattern when using the helper is:
 
-::
+.. sourcecode:: cpp
 
   int64_t streamIndex = /*some positive integer */  
   MobilityHelper mobility;
diff -Naur ns-3.18.1/src/mobility/helper/mobility-helper.cc ns-3.19/src/mobility/helper/mobility-helper.cc
--- ns-3.18.1/src/mobility/helper/mobility-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/helper/mobility-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("MobilityHelper");
+NS_LOG_COMPONENT_DEFINE ("MobilityHelper")
+  ;
 
 MobilityHelper::MobilityHelper ()
 {
diff -Naur ns-3.18.1/src/mobility/model/constant-acceleration-mobility-model.cc ns-3.19/src/mobility/model/constant-acceleration-mobility-model.cc
--- ns-3.18.1/src/mobility/model/constant-acceleration-mobility-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/constant-acceleration-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -20,7 +20,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ConstantAccelerationMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (ConstantAccelerationMobilityModel)
+  ;
 
 TypeId ConstantAccelerationMobilityModel::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/mobility/model/constant-position-mobility-model.cc ns-3.19/src/mobility/model/constant-position-mobility-model.cc
--- ns-3.18.1/src/mobility/model/constant-position-mobility-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/constant-position-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -21,7 +21,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ConstantPositionMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (ConstantPositionMobilityModel)
+  ;
 
 TypeId
 ConstantPositionMobilityModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/mobility/model/constant-velocity-mobility-model.cc ns-3.19/src/mobility/model/constant-velocity-mobility-model.cc
--- ns-3.18.1/src/mobility/model/constant-velocity-mobility-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/constant-velocity-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ConstantVelocityMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (ConstantVelocityMobilityModel)
+  ;
 
 TypeId ConstantVelocityMobilityModel::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/mobility/model/gauss-markov-mobility-model.cc ns-3.19/src/mobility/model/gauss-markov-mobility-model.cc
--- ns-3.18.1/src/mobility/model/gauss-markov-mobility-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/gauss-markov-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (GaussMarkovMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (GaussMarkovMobilityModel)
+  ;
 
 TypeId
 GaussMarkovMobilityModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/mobility/model/hierarchical-mobility-model.cc ns-3.19/src/mobility/model/hierarchical-mobility-model.cc
--- ns-3.18.1/src/mobility/model/hierarchical-mobility-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/hierarchical-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (HierarchicalMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (HierarchicalMobilityModel)
+  ;
 
 TypeId 
 HierarchicalMobilityModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/mobility/model/mobility-model.cc ns-3.19/src/mobility/model/mobility-model.cc
--- ns-3.18.1/src/mobility/model/mobility-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (MobilityModel)
+  ;
 
 TypeId 
 MobilityModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/mobility/model/position-allocator.cc ns-3.19/src/mobility/model/position-allocator.cc
--- ns-3.18.1/src/mobility/model/position-allocator.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/position-allocator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (PositionAllocator)
+  ;
 
 TypeId 
 PositionAllocator::GetTypeId (void)
@@ -48,7 +49,8 @@
 {
 }
 
-NS_OBJECT_ENSURE_REGISTERED (ListPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (ListPositionAllocator)
+  ;
 
 TypeId
 ListPositionAllocator::GetTypeId (void)
@@ -85,7 +87,8 @@
   return 0;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (GridPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (GridPositionAllocator)
+  ;
 
 TypeId 
 GridPositionAllocator::GetTypeId (void)
@@ -213,7 +216,8 @@
   return 0;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (RandomRectanglePositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (RandomRectanglePositionAllocator)
+  ;
 
 TypeId
 RandomRectanglePositionAllocator::GetTypeId (void)
@@ -269,7 +273,8 @@
   return 2;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (RandomBoxPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (RandomBoxPositionAllocator)
+  ;
 
 TypeId
 RandomBoxPositionAllocator::GetTypeId (void)
@@ -337,7 +342,8 @@
   return 3;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (RandomDiscPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (RandomDiscPositionAllocator)
+  ;
 
 TypeId
 RandomDiscPositionAllocator::GetTypeId (void)
@@ -418,7 +424,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (UniformDiscPositionAllocator);
+NS_OBJECT_ENSURE_REGISTERED (UniformDiscPositionAllocator)
+  ;
 
 TypeId
 UniformDiscPositionAllocator::GetTypeId (void)
diff -Naur ns-3.18.1/src/mobility/model/random-direction-2d-mobility-model.cc ns-3.19/src/mobility/model/random-direction-2d-mobility-model.cc
--- ns-3.18.1/src/mobility/model/random-direction-2d-mobility-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/random-direction-2d-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 const double RandomDirection2dMobilityModel::PI = 3.14159265358979323846;
 
-NS_OBJECT_ENSURE_REGISTERED (RandomDirection2dMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (RandomDirection2dMobilityModel)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/mobility/model/random-walk-2d-mobility-model.cc ns-3.19/src/mobility/model/random-walk-2d-mobility-model.cc
--- ns-3.18.1/src/mobility/model/random-walk-2d-mobility-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/mobility/model/random-walk-2d-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RandomWalk2dMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (RandomWalk2dMobilityModel)
+  ;
 
 TypeId
 RandomWalk2dMobilityModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/mobility/model/random-waypoint-mobility-model.cc ns-3.19/src/mobility/model/random-waypoint-mobility-model.cc
--- ns-3.18.1/src/mobility/model/random-waypoint-mobility-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mobility/model/random-waypoint-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RandomWaypointMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (RandomWaypointMobilityModel)
+  ;
 
 TypeId
 RandomWaypointMobilityModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/mobility/model/steady-state-random-waypoint-mobility-model.cc ns-3.19/src/mobility/model/steady-state-random-waypoint-mobility-model.cc
--- ns-3.18.1/src/mobility/model/steady-state-random-waypoint-mobility-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mobility/model/steady-state-random-waypoint-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SteadyStateRandomWaypointMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (SteadyStateRandomWaypointMobilityModel)
+  ;
 
 TypeId
 SteadyStateRandomWaypointMobilityModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/mobility/model/waypoint-mobility-model.cc ns-3.19/src/mobility/model/waypoint-mobility-model.cc
--- ns-3.18.1/src/mobility/model/waypoint-mobility-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mobility/model/waypoint-mobility-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WaypointMobilityModel);
+NS_OBJECT_ENSURE_REGISTERED (WaypointMobilityModel)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/mpi/bindings/modulegen__gcc_ILP32.py ns-3.19/src/mpi/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/mpi/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -40,20 +40,14 @@
     module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
     ## callback.h (module 'core'): ns3::CallbackBase [class]
     module.add_class('CallbackBase', import_from_module='ns.core')
-    ## event-id.h (module 'core'): ns3::EventId [class]
-    module.add_class('EventId', import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::LbtsMessage [class]
-    module.add_class('LbtsMessage')
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface [class]
     module.add_class('MpiInterface')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
     module.add_class('ObjectDeleter', import_from_module='ns.core')
-    ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
-    module.add_class('ObjectFactory', import_from_module='ns.core')
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
     module.add_class('PacketMetadata', import_from_module='ns.network')
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
@@ -72,8 +66,8 @@
     module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
     module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
-    ## mpi-interface.h (module 'mpi'): ns3::SentBuffer [class]
-    module.add_class('SentBuffer')
+    ## parallel-communication-interface.h (module 'mpi'): ns3::ParallelCommunicationInterface [class]
+    module.add_class('ParallelCommunicationInterface', allow_subclassing=True)
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## tag.h (module 'network'): ns3::Tag [class]
@@ -100,12 +94,6 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## scheduler.h (module 'core'): ns3::Scheduler [class]
-    module.add_class('Scheduler', import_from_module='ns.core', parent=root_module['ns3::Object'])
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event [struct]
-    module.add_class('Event', import_from_module='ns.core', outer_class=root_module['ns3::Scheduler'])
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey [struct]
-    module.add_class('EventKey', import_from_module='ns.core', outer_class=root_module['ns3::Scheduler'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
@@ -114,8 +102,6 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
@@ -124,12 +110,10 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simulator-impl.h (module 'core'): ns3::SimulatorImpl [class]
-    module.add_class('SimulatorImpl', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -148,20 +132,12 @@
     module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     ## callback.h (module 'core'): ns3::CallbackValue [class]
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::DistributedSimulatorImpl [class]
-    module.add_class('DistributedSimulatorImpl', parent=root_module['ns3::SimulatorImpl'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## event-impl.h (module 'core'): ns3::EventImpl [class]
-    module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver [class]
     module.add_class('MpiReceiver', parent=root_module['ns3::Object'])
     ## nix-vector.h (module 'network'): ns3::NixVector [class]
     module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
-    module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
-    module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## packet.h (module 'network'): ns3::Packet [class]
     module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -228,13 +204,10 @@
     register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
-    register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
-    register_Ns3LbtsMessage_methods(root_module, root_module['ns3::LbtsMessage'])
     register_Ns3MpiInterface_methods(root_module, root_module['ns3::MpiInterface'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
-    register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
     register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
     register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
     register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
@@ -242,7 +215,7 @@
     register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
     register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
     register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
-    register_Ns3SentBuffer_methods(root_module, root_module['ns3::SentBuffer'])
+    register_Ns3ParallelCommunicationInterface_methods(root_module, root_module['ns3::ParallelCommunicationInterface'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
@@ -255,19 +228,14 @@
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
-    register_Ns3Scheduler_methods(root_module, root_module['ns3::Scheduler'])
-    register_Ns3SchedulerEvent_methods(root_module, root_module['ns3::Scheduler::Event'])
-    register_Ns3SchedulerEventKey_methods(root_module, root_module['ns3::Scheduler::EventKey'])
     register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
-    register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
-    register_Ns3SimulatorImpl_methods(root_module, root_module['ns3::SimulatorImpl'])
     register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
@@ -277,13 +245,9 @@
     register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
-    register_Ns3DistributedSimulatorImpl_methods(root_module, root_module['ns3::DistributedSimulatorImpl'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
-    register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
     register_Ns3MpiReceiver_methods(root_module, root_module['ns3::MpiReceiver'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
-    register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
-    register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
@@ -703,51 +667,6 @@
                    is_static=True, visibility='protected')
     return
 
-def register_Ns3EventId_methods(root_module, cls):
-    cls.add_binary_comparison_operator('!=')
-    cls.add_binary_comparison_operator('==')
-    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::EventId const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::EventId const &', 'arg0')])
-    ## event-id.h (module 'core'): ns3::EventId::EventId() [constructor]
-    cls.add_constructor([])
-    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::Ptr<ns3::EventImpl> const & impl, uint64_t ts, uint32_t context, uint32_t uid) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::EventImpl > const &', 'impl'), param('uint64_t', 'ts'), param('uint32_t', 'context'), param('uint32_t', 'uid')])
-    ## event-id.h (module 'core'): void ns3::EventId::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [])
-    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetContext() const [member function]
-    cls.add_method('GetContext', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): uint64_t ns3::EventId::GetTs() const [member function]
-    cls.add_method('GetTs', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): bool ns3::EventId::IsExpired() const [member function]
-    cls.add_method('IsExpired', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): bool ns3::EventId::IsRunning() const [member function]
-    cls.add_method('IsRunning', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): ns3::EventImpl * ns3::EventId::PeekEventImpl() const [member function]
-    cls.add_method('PeekEventImpl', 
-                   'ns3::EventImpl *', 
-                   [], 
-                   is_const=True)
-    return
-
 def register_Ns3Hasher_methods(root_module, cls):
     ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
@@ -777,35 +696,6 @@
                    [])
     return
 
-def register_Ns3LbtsMessage_methods(root_module, cls):
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::LbtsMessage::LbtsMessage(ns3::LbtsMessage const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::LbtsMessage const &', 'arg0')])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::LbtsMessage::LbtsMessage() [constructor]
-    cls.add_constructor([])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::LbtsMessage::LbtsMessage(uint32_t rxc, uint32_t txc, uint32_t id, bool isFinished, ns3::Time const & t) [constructor]
-    cls.add_constructor([param('uint32_t', 'rxc'), param('uint32_t', 'txc'), param('uint32_t', 'id'), param('bool', 'isFinished'), param('ns3::Time const &', 't')])
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::LbtsMessage::GetMyId() [member function]
-    cls.add_method('GetMyId', 
-                   'uint32_t', 
-                   [])
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::LbtsMessage::GetRxCount() [member function]
-    cls.add_method('GetRxCount', 
-                   'uint32_t', 
-                   [])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::Time ns3::LbtsMessage::GetSmallestTime() [member function]
-    cls.add_method('GetSmallestTime', 
-                   'ns3::Time', 
-                   [])
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::LbtsMessage::GetTxCount() [member function]
-    cls.add_method('GetTxCount', 
-                   'uint32_t', 
-                   [])
-    ## distributed-simulator-impl.h (module 'mpi'): bool ns3::LbtsMessage::IsFinished() [member function]
-    cls.add_method('IsFinished', 
-                   'bool', 
-                   [])
-    return
-
 def register_Ns3MpiInterface_methods(root_module, cls):
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface::MpiInterface() [constructor]
     cls.add_constructor([])
@@ -826,11 +716,6 @@
                    'void', 
                    [param('int *', 'pargc'), param('char * * *', 'pargv')], 
                    is_static=True)
-    ## mpi-interface.h (module 'mpi'): static uint32_t ns3::MpiInterface::GetRxCount() [member function]
-    cls.add_method('GetRxCount', 
-                   'uint32_t', 
-                   [], 
-                   is_static=True)
     ## mpi-interface.h (module 'mpi'): static uint32_t ns3::MpiInterface::GetSize() [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -841,31 +726,16 @@
                    'uint32_t', 
                    [], 
                    is_static=True)
-    ## mpi-interface.h (module 'mpi'): static uint32_t ns3::MpiInterface::GetTxCount() [member function]
-    cls.add_method('GetTxCount', 
-                   'uint32_t', 
-                   [], 
-                   is_static=True)
     ## mpi-interface.h (module 'mpi'): static bool ns3::MpiInterface::IsEnabled() [member function]
     cls.add_method('IsEnabled', 
                    'bool', 
                    [], 
                    is_static=True)
-    ## mpi-interface.h (module 'mpi'): static void ns3::MpiInterface::ReceiveMessages() [member function]
-    cls.add_method('ReceiveMessages', 
-                   'void', 
-                   [], 
-                   is_static=True)
     ## mpi-interface.h (module 'mpi'): static void ns3::MpiInterface::SendPacket(ns3::Ptr<ns3::Packet> p, ns3::Time const & rxTime, uint32_t node, uint32_t dev) [member function]
     cls.add_method('SendPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Time const &', 'rxTime'), param('uint32_t', 'node'), param('uint32_t', 'dev')], 
                    is_static=True)
-    ## mpi-interface.h (module 'mpi'): static void ns3::MpiInterface::TestSendComplete() [member function]
-    cls.add_method('TestSendComplete', 
-                   'void', 
-                   [], 
-                   is_static=True)
     return
 
 def register_Ns3ObjectBase_methods(root_module, cls):
@@ -941,42 +811,6 @@
                    is_static=True)
     return
 
-def register_Ns3ObjectFactory_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(ns3::ObjectFactory const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
-    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
-    cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
-    cls.add_constructor([param('std::string', 'typeId')])
-    ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::Object >', 
-                   [], 
-                   is_const=True)
-    ## object-factory.h (module 'core'): ns3::TypeId ns3::ObjectFactory::GetTypeId() const [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True)
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
-    cls.add_method('SetTypeId', 
-                   'void', 
-                   [param('ns3::TypeId', 'tid')])
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(char const * tid) [member function]
-    cls.add_method('SetTypeId', 
-                   'void', 
-                   [param('char const *', 'tid')])
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(std::string tid) [member function]
-    cls.add_method('SetTypeId', 
-                   'void', 
-                   [param('std::string', 'tid')])
-    return
-
 def register_Ns3PacketMetadata_methods(root_module, cls):
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
     cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
@@ -1168,23 +1002,46 @@
     cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
     return
 
-def register_Ns3SentBuffer_methods(root_module, cls):
-    ## mpi-interface.h (module 'mpi'): ns3::SentBuffer::SentBuffer(ns3::SentBuffer const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::SentBuffer const &', 'arg0')])
-    ## mpi-interface.h (module 'mpi'): ns3::SentBuffer::SentBuffer() [constructor]
-    cls.add_constructor([])
-    ## mpi-interface.h (module 'mpi'): uint8_t * ns3::SentBuffer::GetBuffer() [member function]
-    cls.add_method('GetBuffer', 
-                   'uint8_t *', 
-                   [])
-    ## mpi-interface.h (module 'mpi'): MPI_Request * ns3::SentBuffer::GetRequest() [member function]
-    cls.add_method('GetRequest', 
-                   'MPI_Request *', 
-                   [])
-    ## mpi-interface.h (module 'mpi'): void ns3::SentBuffer::SetBuffer(uint8_t * buffer) [member function]
-    cls.add_method('SetBuffer', 
+def register_Ns3ParallelCommunicationInterface_methods(root_module, cls):
+    ## parallel-communication-interface.h (module 'mpi'): ns3::ParallelCommunicationInterface::ParallelCommunicationInterface() [constructor]
+    cls.add_constructor([])
+    ## parallel-communication-interface.h (module 'mpi'): ns3::ParallelCommunicationInterface::ParallelCommunicationInterface(ns3::ParallelCommunicationInterface const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ParallelCommunicationInterface const &', 'arg0')])
+    ## parallel-communication-interface.h (module 'mpi'): void ns3::ParallelCommunicationInterface::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): void ns3::ParallelCommunicationInterface::Disable() [member function]
+    cls.add_method('Disable', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): void ns3::ParallelCommunicationInterface::Enable(int * pargc, char * * * pargv) [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [param('int *', 'pargc'), param('char * * *', 'pargv')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): uint32_t ns3::ParallelCommunicationInterface::GetSize() [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): uint32_t ns3::ParallelCommunicationInterface::GetSystemId() [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): bool ns3::ParallelCommunicationInterface::IsEnabled() [member function]
+    cls.add_method('IsEnabled', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): void ns3::ParallelCommunicationInterface::SendPacket(ns3::Ptr<ns3::Packet> p, ns3::Time const & rxTime, uint32_t node, uint32_t dev) [member function]
+    cls.add_method('SendPacket', 
                    'void', 
-                   [param('uint8_t *', 'buffer')])
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Time const &', 'rxTime'), param('uint32_t', 'node'), param('uint32_t', 'dev')], 
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, cls):
@@ -1718,71 +1575,6 @@
                    [])
     return
 
-def register_Ns3Scheduler_methods(root_module, cls):
-    ## scheduler.h (module 'core'): ns3::Scheduler::Scheduler() [constructor]
-    cls.add_constructor([])
-    ## scheduler.h (module 'core'): ns3::Scheduler::Scheduler(ns3::Scheduler const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Scheduler const &', 'arg0')])
-    ## scheduler.h (module 'core'): static ns3::TypeId ns3::Scheduler::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## scheduler.h (module 'core'): void ns3::Scheduler::Insert(ns3::Scheduler::Event const & ev) [member function]
-    cls.add_method('Insert', 
-                   'void', 
-                   [param('ns3::Scheduler::Event const &', 'ev')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## scheduler.h (module 'core'): bool ns3::Scheduler::IsEmpty() const [member function]
-    cls.add_method('IsEmpty', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event ns3::Scheduler::PeekNext() const [member function]
-    cls.add_method('PeekNext', 
-                   'ns3::Scheduler::Event', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## scheduler.h (module 'core'): void ns3::Scheduler::Remove(ns3::Scheduler::Event const & ev) [member function]
-    cls.add_method('Remove', 
-                   'void', 
-                   [param('ns3::Scheduler::Event const &', 'ev')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event ns3::Scheduler::RemoveNext() [member function]
-    cls.add_method('RemoveNext', 
-                   'ns3::Scheduler::Event', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3SchedulerEvent_methods(root_module, cls):
-    cls.add_binary_comparison_operator('<')
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event::Event() [constructor]
-    cls.add_constructor([])
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event::Event(ns3::Scheduler::Event const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Scheduler::Event const &', 'arg0')])
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event::impl [variable]
-    cls.add_instance_attribute('impl', 'ns3::EventImpl *', is_const=False)
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event::key [variable]
-    cls.add_instance_attribute('key', 'ns3::Scheduler::EventKey', is_const=False)
-    return
-
-def register_Ns3SchedulerEventKey_methods(root_module, cls):
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_binary_comparison_operator('!=')
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::EventKey() [constructor]
-    cls.add_constructor([])
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::EventKey(ns3::Scheduler::EventKey const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Scheduler::EventKey const &', 'arg0')])
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::m_context [variable]
-    cls.add_instance_attribute('m_context', 'uint32_t', is_const=False)
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::m_ts [variable]
-    cls.add_instance_attribute('m_ts', 'uint64_t', is_const=False)
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::m_uid [variable]
-    cls.add_instance_attribute('m_uid', 'uint32_t', is_const=False)
-    return
-
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -1831,18 +1623,6 @@
                    is_static=True)
     return
 
-def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
-    cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [copy constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
-    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::Cleanup() [member function]
-    cls.add_method('Cleanup', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    return
-
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -1891,108 +1671,6 @@
                    is_static=True)
     return
 
-def register_Ns3SimulatorImpl_methods(root_module, cls):
-    ## simulator-impl.h (module 'core'): ns3::SimulatorImpl::SimulatorImpl() [constructor]
-    cls.add_constructor([])
-    ## simulator-impl.h (module 'core'): ns3::SimulatorImpl::SimulatorImpl(ns3::SimulatorImpl const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::SimulatorImpl const &', 'arg0')])
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Cancel(ns3::EventId const & ev) [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Destroy() [member function]
-    cls.add_method('Destroy', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): uint32_t ns3::SimulatorImpl::GetContext() const [member function]
-    cls.add_method('GetContext', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::Time ns3::SimulatorImpl::GetDelayLeft(ns3::EventId const & id) const [member function]
-    cls.add_method('GetDelayLeft', 
-                   'ns3::Time', 
-                   [param('ns3::EventId const &', 'id')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::Time ns3::SimulatorImpl::GetMaximumSimulationTime() const [member function]
-    cls.add_method('GetMaximumSimulationTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): uint32_t ns3::SimulatorImpl::GetSystemId() const [member function]
-    cls.add_method('GetSystemId', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): static ns3::TypeId ns3::SimulatorImpl::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## simulator-impl.h (module 'core'): bool ns3::SimulatorImpl::IsExpired(ns3::EventId const & ev) const [member function]
-    cls.add_method('IsExpired', 
-                   'bool', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): bool ns3::SimulatorImpl::IsFinished() const [member function]
-    cls.add_method('IsFinished', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::Time ns3::SimulatorImpl::Now() const [member function]
-    cls.add_method('Now', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Remove(ns3::EventId const & ev) [member function]
-    cls.add_method('Remove', 
-                   'void', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Run() [member function]
-    cls.add_method('Run', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
-    cls.add_method('Schedule', 
-                   'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleDestroy', 
-                   'ns3::EventId', 
-                   [param('ns3::EventImpl *', 'event')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::ScheduleNow(ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleNow', 
-                   'ns3::EventId', 
-                   [param('ns3::EventImpl *', 'event')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleWithContext', 
-                   'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
-    cls.add_method('SetScheduler', 
-                   'void', 
-                   [param('ns3::ObjectFactory', 'schedulerFactory')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Stop() [member function]
-    cls.add_method('Stop', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Stop(ns3::Time const & time) [member function]
-    cls.add_method('Stop', 
-                   'void', 
-                   [param('ns3::Time const &', 'time')], 
-                   is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3Time_methods(root_module, cls):
     cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
     cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
@@ -2052,6 +1730,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2062,6 +1745,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2077,6 +1765,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2102,6 +1795,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -2362,113 +2060,6 @@
                    [param('ns3::CallbackBase', 'base')])
     return
 
-def register_Ns3DistributedSimulatorImpl_methods(root_module, cls):
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::DistributedSimulatorImpl::DistributedSimulatorImpl(ns3::DistributedSimulatorImpl const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::DistributedSimulatorImpl const &', 'arg0')])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::DistributedSimulatorImpl::DistributedSimulatorImpl() [constructor]
-    cls.add_constructor([])
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Cancel(ns3::EventId const & ev) [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Destroy() [member function]
-    cls.add_method('Destroy', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::DistributedSimulatorImpl::GetContext() const [member function]
-    cls.add_method('GetContext', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::Time ns3::DistributedSimulatorImpl::GetDelayLeft(ns3::EventId const & id) const [member function]
-    cls.add_method('GetDelayLeft', 
-                   'ns3::Time', 
-                   [param('ns3::EventId const &', 'id')], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::Time ns3::DistributedSimulatorImpl::GetMaximumSimulationTime() const [member function]
-    cls.add_method('GetMaximumSimulationTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::DistributedSimulatorImpl::GetSystemId() const [member function]
-    cls.add_method('GetSystemId', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): static ns3::TypeId ns3::DistributedSimulatorImpl::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## distributed-simulator-impl.h (module 'mpi'): bool ns3::DistributedSimulatorImpl::IsExpired(ns3::EventId const & ev) const [member function]
-    cls.add_method('IsExpired', 
-                   'bool', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): bool ns3::DistributedSimulatorImpl::IsFinished() const [member function]
-    cls.add_method('IsFinished', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::Time ns3::DistributedSimulatorImpl::Now() const [member function]
-    cls.add_method('Now', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Remove(ns3::EventId const & ev) [member function]
-    cls.add_method('Remove', 
-                   'void', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Run() [member function]
-    cls.add_method('Run', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::EventId ns3::DistributedSimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
-    cls.add_method('Schedule', 
-                   'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::EventId ns3::DistributedSimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleDestroy', 
-                   'ns3::EventId', 
-                   [param('ns3::EventImpl *', 'event')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::EventId ns3::DistributedSimulatorImpl::ScheduleNow(ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleNow', 
-                   'ns3::EventId', 
-                   [param('ns3::EventImpl *', 'event')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleWithContext', 
-                   'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
-    cls.add_method('SetScheduler', 
-                   'void', 
-                   [param('ns3::ObjectFactory', 'schedulerFactory')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Stop() [member function]
-    cls.add_method('Stop', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Stop(ns3::Time const & time) [member function]
-    cls.add_method('Stop', 
-                   'void', 
-                   [param('ns3::Time const &', 'time')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   visibility='private', is_virtual=True)
-    return
-
 def register_Ns3EmptyAttributeValue_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
@@ -2491,30 +2082,6 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
-def register_Ns3EventImpl_methods(root_module, cls):
-    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
-    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
-    cls.add_constructor([])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
-    cls.add_method('Invoke', 
-                   'void', 
-                   [])
-    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
-    cls.add_method('IsCancelled', 
-                   'bool', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
-    cls.add_method('Notify', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
-    return
-
 def register_Ns3MpiReceiver_methods(root_module, cls):
     ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver::MpiReceiver() [constructor]
     cls.add_constructor([])
@@ -2584,46 +2151,6 @@
                    is_const=True)
     return
 
-def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
-    cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
-    return
-
-def register_Ns3ObjectFactoryValue_methods(root_module, cls):
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
-    cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
-    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
-    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::ObjectFactory', 
-                   [], 
-                   is_const=True)
-    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::ObjectFactory const &', 'value')])
-    return
-
 def register_Ns3Packet_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
diff -Naur ns-3.18.1/src/mpi/bindings/modulegen__gcc_LP64.py ns-3.19/src/mpi/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/mpi/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -40,20 +40,14 @@
     module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
     ## callback.h (module 'core'): ns3::CallbackBase [class]
     module.add_class('CallbackBase', import_from_module='ns.core')
-    ## event-id.h (module 'core'): ns3::EventId [class]
-    module.add_class('EventId', import_from_module='ns.core')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::LbtsMessage [class]
-    module.add_class('LbtsMessage')
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface [class]
     module.add_class('MpiInterface')
     ## object-base.h (module 'core'): ns3::ObjectBase [class]
     module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
     ## object.h (module 'core'): ns3::ObjectDeleter [struct]
     module.add_class('ObjectDeleter', import_from_module='ns.core')
-    ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
-    module.add_class('ObjectFactory', import_from_module='ns.core')
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
     module.add_class('PacketMetadata', import_from_module='ns.network')
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
@@ -72,8 +66,8 @@
     module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
     ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
     module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
-    ## mpi-interface.h (module 'mpi'): ns3::SentBuffer [class]
-    module.add_class('SentBuffer')
+    ## parallel-communication-interface.h (module 'mpi'): ns3::ParallelCommunicationInterface [class]
+    module.add_class('ParallelCommunicationInterface', allow_subclassing=True)
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## tag.h (module 'network'): ns3::Tag [class]
@@ -100,12 +94,6 @@
     module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
     module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
-    ## scheduler.h (module 'core'): ns3::Scheduler [class]
-    module.add_class('Scheduler', import_from_module='ns.core', parent=root_module['ns3::Object'])
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event [struct]
-    module.add_class('Event', import_from_module='ns.core', outer_class=root_module['ns3::Scheduler'])
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey [struct]
-    module.add_class('EventKey', import_from_module='ns.core', outer_class=root_module['ns3::Scheduler'])
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
@@ -114,8 +102,6 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
-    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
@@ -124,12 +110,10 @@
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
     module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
-    ## simulator-impl.h (module 'core'): ns3::SimulatorImpl [class]
-    module.add_class('SimulatorImpl', import_from_module='ns.core', parent=root_module['ns3::Object'])
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -148,20 +132,12 @@
     module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
     ## callback.h (module 'core'): ns3::CallbackValue [class]
     module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::DistributedSimulatorImpl [class]
-    module.add_class('DistributedSimulatorImpl', parent=root_module['ns3::SimulatorImpl'])
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
     module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
-    ## event-impl.h (module 'core'): ns3::EventImpl [class]
-    module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver [class]
     module.add_class('MpiReceiver', parent=root_module['ns3::Object'])
     ## nix-vector.h (module 'network'): ns3::NixVector [class]
     module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
-    module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
-    module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
     ## packet.h (module 'network'): ns3::Packet [class]
     module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     ## nstime.h (module 'core'): ns3::TimeValue [class]
@@ -228,13 +204,10 @@
     register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
     register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
     register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
-    register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
-    register_Ns3LbtsMessage_methods(root_module, root_module['ns3::LbtsMessage'])
     register_Ns3MpiInterface_methods(root_module, root_module['ns3::MpiInterface'])
     register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
     register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
-    register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
     register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
     register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
     register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
@@ -242,7 +215,7 @@
     register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
     register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
     register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
-    register_Ns3SentBuffer_methods(root_module, root_module['ns3::SentBuffer'])
+    register_Ns3ParallelCommunicationInterface_methods(root_module, root_module['ns3::ParallelCommunicationInterface'])
     register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
     register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
     register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
@@ -255,19 +228,14 @@
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3Object_methods(root_module, root_module['ns3::Object'])
     register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
-    register_Ns3Scheduler_methods(root_module, root_module['ns3::Scheduler'])
-    register_Ns3SchedulerEvent_methods(root_module, root_module['ns3::Scheduler::Event'])
-    register_Ns3SchedulerEventKey_methods(root_module, root_module['ns3::Scheduler::EventKey'])
     register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
     register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
     register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
     register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
-    register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
     register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
     register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
     register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
     register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
-    register_Ns3SimulatorImpl_methods(root_module, root_module['ns3::SimulatorImpl'])
     register_Ns3Time_methods(root_module, root_module['ns3::Time'])
     register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
     register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
@@ -277,13 +245,9 @@
     register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
     register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
     register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
-    register_Ns3DistributedSimulatorImpl_methods(root_module, root_module['ns3::DistributedSimulatorImpl'])
     register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
-    register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
     register_Ns3MpiReceiver_methods(root_module, root_module['ns3::MpiReceiver'])
     register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
-    register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
-    register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
     register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
     register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
     register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
@@ -703,51 +667,6 @@
                    is_static=True, visibility='protected')
     return
 
-def register_Ns3EventId_methods(root_module, cls):
-    cls.add_binary_comparison_operator('!=')
-    cls.add_binary_comparison_operator('==')
-    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::EventId const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::EventId const &', 'arg0')])
-    ## event-id.h (module 'core'): ns3::EventId::EventId() [constructor]
-    cls.add_constructor([])
-    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::Ptr<ns3::EventImpl> const & impl, uint64_t ts, uint32_t context, uint32_t uid) [constructor]
-    cls.add_constructor([param('ns3::Ptr< ns3::EventImpl > const &', 'impl'), param('uint64_t', 'ts'), param('uint32_t', 'context'), param('uint32_t', 'uid')])
-    ## event-id.h (module 'core'): void ns3::EventId::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [])
-    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetContext() const [member function]
-    cls.add_method('GetContext', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): uint64_t ns3::EventId::GetTs() const [member function]
-    cls.add_method('GetTs', 
-                   'uint64_t', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetUid() const [member function]
-    cls.add_method('GetUid', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): bool ns3::EventId::IsExpired() const [member function]
-    cls.add_method('IsExpired', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): bool ns3::EventId::IsRunning() const [member function]
-    cls.add_method('IsRunning', 
-                   'bool', 
-                   [], 
-                   is_const=True)
-    ## event-id.h (module 'core'): ns3::EventImpl * ns3::EventId::PeekEventImpl() const [member function]
-    cls.add_method('PeekEventImpl', 
-                   'ns3::EventImpl *', 
-                   [], 
-                   is_const=True)
-    return
-
 def register_Ns3Hasher_methods(root_module, cls):
     ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
@@ -777,35 +696,6 @@
                    [])
     return
 
-def register_Ns3LbtsMessage_methods(root_module, cls):
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::LbtsMessage::LbtsMessage(ns3::LbtsMessage const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::LbtsMessage const &', 'arg0')])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::LbtsMessage::LbtsMessage() [constructor]
-    cls.add_constructor([])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::LbtsMessage::LbtsMessage(uint32_t rxc, uint32_t txc, uint32_t id, bool isFinished, ns3::Time const & t) [constructor]
-    cls.add_constructor([param('uint32_t', 'rxc'), param('uint32_t', 'txc'), param('uint32_t', 'id'), param('bool', 'isFinished'), param('ns3::Time const &', 't')])
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::LbtsMessage::GetMyId() [member function]
-    cls.add_method('GetMyId', 
-                   'uint32_t', 
-                   [])
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::LbtsMessage::GetRxCount() [member function]
-    cls.add_method('GetRxCount', 
-                   'uint32_t', 
-                   [])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::Time ns3::LbtsMessage::GetSmallestTime() [member function]
-    cls.add_method('GetSmallestTime', 
-                   'ns3::Time', 
-                   [])
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::LbtsMessage::GetTxCount() [member function]
-    cls.add_method('GetTxCount', 
-                   'uint32_t', 
-                   [])
-    ## distributed-simulator-impl.h (module 'mpi'): bool ns3::LbtsMessage::IsFinished() [member function]
-    cls.add_method('IsFinished', 
-                   'bool', 
-                   [])
-    return
-
 def register_Ns3MpiInterface_methods(root_module, cls):
     ## mpi-interface.h (module 'mpi'): ns3::MpiInterface::MpiInterface() [constructor]
     cls.add_constructor([])
@@ -826,11 +716,6 @@
                    'void', 
                    [param('int *', 'pargc'), param('char * * *', 'pargv')], 
                    is_static=True)
-    ## mpi-interface.h (module 'mpi'): static uint32_t ns3::MpiInterface::GetRxCount() [member function]
-    cls.add_method('GetRxCount', 
-                   'uint32_t', 
-                   [], 
-                   is_static=True)
     ## mpi-interface.h (module 'mpi'): static uint32_t ns3::MpiInterface::GetSize() [member function]
     cls.add_method('GetSize', 
                    'uint32_t', 
@@ -841,31 +726,16 @@
                    'uint32_t', 
                    [], 
                    is_static=True)
-    ## mpi-interface.h (module 'mpi'): static uint32_t ns3::MpiInterface::GetTxCount() [member function]
-    cls.add_method('GetTxCount', 
-                   'uint32_t', 
-                   [], 
-                   is_static=True)
     ## mpi-interface.h (module 'mpi'): static bool ns3::MpiInterface::IsEnabled() [member function]
     cls.add_method('IsEnabled', 
                    'bool', 
                    [], 
                    is_static=True)
-    ## mpi-interface.h (module 'mpi'): static void ns3::MpiInterface::ReceiveMessages() [member function]
-    cls.add_method('ReceiveMessages', 
-                   'void', 
-                   [], 
-                   is_static=True)
     ## mpi-interface.h (module 'mpi'): static void ns3::MpiInterface::SendPacket(ns3::Ptr<ns3::Packet> p, ns3::Time const & rxTime, uint32_t node, uint32_t dev) [member function]
     cls.add_method('SendPacket', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Time const &', 'rxTime'), param('uint32_t', 'node'), param('uint32_t', 'dev')], 
                    is_static=True)
-    ## mpi-interface.h (module 'mpi'): static void ns3::MpiInterface::TestSendComplete() [member function]
-    cls.add_method('TestSendComplete', 
-                   'void', 
-                   [], 
-                   is_static=True)
     return
 
 def register_Ns3ObjectBase_methods(root_module, cls):
@@ -941,42 +811,6 @@
                    is_static=True)
     return
 
-def register_Ns3ObjectFactory_methods(root_module, cls):
-    cls.add_output_stream_operator()
-    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(ns3::ObjectFactory const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
-    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
-    cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
-    cls.add_constructor([param('std::string', 'typeId')])
-    ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::Object >', 
-                   [], 
-                   is_const=True)
-    ## object-factory.h (module 'core'): ns3::TypeId ns3::ObjectFactory::GetTypeId() const [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_const=True)
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
-    cls.add_method('SetTypeId', 
-                   'void', 
-                   [param('ns3::TypeId', 'tid')])
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(char const * tid) [member function]
-    cls.add_method('SetTypeId', 
-                   'void', 
-                   [param('char const *', 'tid')])
-    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(std::string tid) [member function]
-    cls.add_method('SetTypeId', 
-                   'void', 
-                   [param('std::string', 'tid')])
-    return
-
 def register_Ns3PacketMetadata_methods(root_module, cls):
     ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
     cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
@@ -1168,23 +1002,46 @@
     cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
     return
 
-def register_Ns3SentBuffer_methods(root_module, cls):
-    ## mpi-interface.h (module 'mpi'): ns3::SentBuffer::SentBuffer(ns3::SentBuffer const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::SentBuffer const &', 'arg0')])
-    ## mpi-interface.h (module 'mpi'): ns3::SentBuffer::SentBuffer() [constructor]
-    cls.add_constructor([])
-    ## mpi-interface.h (module 'mpi'): uint8_t * ns3::SentBuffer::GetBuffer() [member function]
-    cls.add_method('GetBuffer', 
-                   'uint8_t *', 
-                   [])
-    ## mpi-interface.h (module 'mpi'): MPI_Request * ns3::SentBuffer::GetRequest() [member function]
-    cls.add_method('GetRequest', 
-                   'MPI_Request *', 
-                   [])
-    ## mpi-interface.h (module 'mpi'): void ns3::SentBuffer::SetBuffer(uint8_t * buffer) [member function]
-    cls.add_method('SetBuffer', 
+def register_Ns3ParallelCommunicationInterface_methods(root_module, cls):
+    ## parallel-communication-interface.h (module 'mpi'): ns3::ParallelCommunicationInterface::ParallelCommunicationInterface() [constructor]
+    cls.add_constructor([])
+    ## parallel-communication-interface.h (module 'mpi'): ns3::ParallelCommunicationInterface::ParallelCommunicationInterface(ns3::ParallelCommunicationInterface const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ParallelCommunicationInterface const &', 'arg0')])
+    ## parallel-communication-interface.h (module 'mpi'): void ns3::ParallelCommunicationInterface::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): void ns3::ParallelCommunicationInterface::Disable() [member function]
+    cls.add_method('Disable', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): void ns3::ParallelCommunicationInterface::Enable(int * pargc, char * * * pargv) [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [param('int *', 'pargc'), param('char * * *', 'pargv')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): uint32_t ns3::ParallelCommunicationInterface::GetSize() [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): uint32_t ns3::ParallelCommunicationInterface::GetSystemId() [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): bool ns3::ParallelCommunicationInterface::IsEnabled() [member function]
+    cls.add_method('IsEnabled', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## parallel-communication-interface.h (module 'mpi'): void ns3::ParallelCommunicationInterface::SendPacket(ns3::Ptr<ns3::Packet> p, ns3::Time const & rxTime, uint32_t node, uint32_t dev) [member function]
+    cls.add_method('SendPacket', 
                    'void', 
-                   [param('uint8_t *', 'buffer')])
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Time const &', 'rxTime'), param('uint32_t', 'node'), param('uint32_t', 'dev')], 
+                   is_pure_virtual=True, is_virtual=True)
     return
 
 def register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, cls):
@@ -1718,71 +1575,6 @@
                    [])
     return
 
-def register_Ns3Scheduler_methods(root_module, cls):
-    ## scheduler.h (module 'core'): ns3::Scheduler::Scheduler() [constructor]
-    cls.add_constructor([])
-    ## scheduler.h (module 'core'): ns3::Scheduler::Scheduler(ns3::Scheduler const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Scheduler const &', 'arg0')])
-    ## scheduler.h (module 'core'): static ns3::TypeId ns3::Scheduler::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## scheduler.h (module 'core'): void ns3::Scheduler::Insert(ns3::Scheduler::Event const & ev) [member function]
-    cls.add_method('Insert', 
-                   'void', 
-                   [param('ns3::Scheduler::Event const &', 'ev')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## scheduler.h (module 'core'): bool ns3::Scheduler::IsEmpty() const [member function]
-    cls.add_method('IsEmpty', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event ns3::Scheduler::PeekNext() const [member function]
-    cls.add_method('PeekNext', 
-                   'ns3::Scheduler::Event', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## scheduler.h (module 'core'): void ns3::Scheduler::Remove(ns3::Scheduler::Event const & ev) [member function]
-    cls.add_method('Remove', 
-                   'void', 
-                   [param('ns3::Scheduler::Event const &', 'ev')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event ns3::Scheduler::RemoveNext() [member function]
-    cls.add_method('RemoveNext', 
-                   'ns3::Scheduler::Event', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    return
-
-def register_Ns3SchedulerEvent_methods(root_module, cls):
-    cls.add_binary_comparison_operator('<')
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event::Event() [constructor]
-    cls.add_constructor([])
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event::Event(ns3::Scheduler::Event const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Scheduler::Event const &', 'arg0')])
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event::impl [variable]
-    cls.add_instance_attribute('impl', 'ns3::EventImpl *', is_const=False)
-    ## scheduler.h (module 'core'): ns3::Scheduler::Event::key [variable]
-    cls.add_instance_attribute('key', 'ns3::Scheduler::EventKey', is_const=False)
-    return
-
-def register_Ns3SchedulerEventKey_methods(root_module, cls):
-    cls.add_binary_comparison_operator('<')
-    cls.add_binary_comparison_operator('>')
-    cls.add_binary_comparison_operator('!=')
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::EventKey() [constructor]
-    cls.add_constructor([])
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::EventKey(ns3::Scheduler::EventKey const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::Scheduler::EventKey const &', 'arg0')])
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::m_context [variable]
-    cls.add_instance_attribute('m_context', 'uint32_t', is_const=False)
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::m_ts [variable]
-    cls.add_instance_attribute('m_ts', 'uint64_t', is_const=False)
-    ## scheduler.h (module 'core'): ns3::Scheduler::EventKey::m_uid [variable]
-    cls.add_instance_attribute('m_uid', 'uint32_t', is_const=False)
-    return
-
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -1831,18 +1623,6 @@
                    is_static=True)
     return
 
-def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
-    cls.add_constructor([])
-    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [copy constructor]
-    cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
-    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::Cleanup() [member function]
-    cls.add_method('Cleanup', 
-                   'void', 
-                   [], 
-                   is_static=True)
-    return
-
 def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
     ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
     cls.add_constructor([])
@@ -1891,108 +1671,6 @@
                    is_static=True)
     return
 
-def register_Ns3SimulatorImpl_methods(root_module, cls):
-    ## simulator-impl.h (module 'core'): ns3::SimulatorImpl::SimulatorImpl() [constructor]
-    cls.add_constructor([])
-    ## simulator-impl.h (module 'core'): ns3::SimulatorImpl::SimulatorImpl(ns3::SimulatorImpl const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::SimulatorImpl const &', 'arg0')])
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Cancel(ns3::EventId const & ev) [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Destroy() [member function]
-    cls.add_method('Destroy', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): uint32_t ns3::SimulatorImpl::GetContext() const [member function]
-    cls.add_method('GetContext', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::Time ns3::SimulatorImpl::GetDelayLeft(ns3::EventId const & id) const [member function]
-    cls.add_method('GetDelayLeft', 
-                   'ns3::Time', 
-                   [param('ns3::EventId const &', 'id')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::Time ns3::SimulatorImpl::GetMaximumSimulationTime() const [member function]
-    cls.add_method('GetMaximumSimulationTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): uint32_t ns3::SimulatorImpl::GetSystemId() const [member function]
-    cls.add_method('GetSystemId', 
-                   'uint32_t', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): static ns3::TypeId ns3::SimulatorImpl::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## simulator-impl.h (module 'core'): bool ns3::SimulatorImpl::IsExpired(ns3::EventId const & ev) const [member function]
-    cls.add_method('IsExpired', 
-                   'bool', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): bool ns3::SimulatorImpl::IsFinished() const [member function]
-    cls.add_method('IsFinished', 
-                   'bool', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::Time ns3::SimulatorImpl::Now() const [member function]
-    cls.add_method('Now', 
-                   'ns3::Time', 
-                   [], 
-                   is_pure_virtual=True, is_const=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Remove(ns3::EventId const & ev) [member function]
-    cls.add_method('Remove', 
-                   'void', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Run() [member function]
-    cls.add_method('Run', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
-    cls.add_method('Schedule', 
-                   'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleDestroy', 
-                   'ns3::EventId', 
-                   [param('ns3::EventImpl *', 'event')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): ns3::EventId ns3::SimulatorImpl::ScheduleNow(ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleNow', 
-                   'ns3::EventId', 
-                   [param('ns3::EventImpl *', 'event')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleWithContext', 
-                   'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
-    cls.add_method('SetScheduler', 
-                   'void', 
-                   [param('ns3::ObjectFactory', 'schedulerFactory')], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Stop() [member function]
-    cls.add_method('Stop', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, is_virtual=True)
-    ## simulator-impl.h (module 'core'): void ns3::SimulatorImpl::Stop(ns3::Time const & time) [member function]
-    cls.add_method('Stop', 
-                   'void', 
-                   [param('ns3::Time const &', 'time')], 
-                   is_pure_virtual=True, is_virtual=True)
-    return
-
 def register_Ns3Time_methods(root_module, cls):
     cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
     cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
@@ -2052,6 +1730,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2062,6 +1745,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2077,6 +1765,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2102,6 +1795,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -2362,113 +2060,6 @@
                    [param('ns3::CallbackBase', 'base')])
     return
 
-def register_Ns3DistributedSimulatorImpl_methods(root_module, cls):
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::DistributedSimulatorImpl::DistributedSimulatorImpl(ns3::DistributedSimulatorImpl const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::DistributedSimulatorImpl const &', 'arg0')])
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::DistributedSimulatorImpl::DistributedSimulatorImpl() [constructor]
-    cls.add_constructor([])
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Cancel(ns3::EventId const & ev) [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Destroy() [member function]
-    cls.add_method('Destroy', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::DistributedSimulatorImpl::GetContext() const [member function]
-    cls.add_method('GetContext', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::Time ns3::DistributedSimulatorImpl::GetDelayLeft(ns3::EventId const & id) const [member function]
-    cls.add_method('GetDelayLeft', 
-                   'ns3::Time', 
-                   [param('ns3::EventId const &', 'id')], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::Time ns3::DistributedSimulatorImpl::GetMaximumSimulationTime() const [member function]
-    cls.add_method('GetMaximumSimulationTime', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): uint32_t ns3::DistributedSimulatorImpl::GetSystemId() const [member function]
-    cls.add_method('GetSystemId', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): static ns3::TypeId ns3::DistributedSimulatorImpl::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
-    ## distributed-simulator-impl.h (module 'mpi'): bool ns3::DistributedSimulatorImpl::IsExpired(ns3::EventId const & ev) const [member function]
-    cls.add_method('IsExpired', 
-                   'bool', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): bool ns3::DistributedSimulatorImpl::IsFinished() const [member function]
-    cls.add_method('IsFinished', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::Time ns3::DistributedSimulatorImpl::Now() const [member function]
-    cls.add_method('Now', 
-                   'ns3::Time', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Remove(ns3::EventId const & ev) [member function]
-    cls.add_method('Remove', 
-                   'void', 
-                   [param('ns3::EventId const &', 'ev')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Run() [member function]
-    cls.add_method('Run', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::EventId ns3::DistributedSimulatorImpl::Schedule(ns3::Time const & time, ns3::EventImpl * event) [member function]
-    cls.add_method('Schedule', 
-                   'ns3::EventId', 
-                   [param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::EventId ns3::DistributedSimulatorImpl::ScheduleDestroy(ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleDestroy', 
-                   'ns3::EventId', 
-                   [param('ns3::EventImpl *', 'event')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): ns3::EventId ns3::DistributedSimulatorImpl::ScheduleNow(ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleNow', 
-                   'ns3::EventId', 
-                   [param('ns3::EventImpl *', 'event')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::ScheduleWithContext(uint32_t context, ns3::Time const & time, ns3::EventImpl * event) [member function]
-    cls.add_method('ScheduleWithContext', 
-                   'void', 
-                   [param('uint32_t', 'context'), param('ns3::Time const &', 'time'), param('ns3::EventImpl *', 'event')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
-    cls.add_method('SetScheduler', 
-                   'void', 
-                   [param('ns3::ObjectFactory', 'schedulerFactory')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Stop() [member function]
-    cls.add_method('Stop', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::Stop(ns3::Time const & time) [member function]
-    cls.add_method('Stop', 
-                   'void', 
-                   [param('ns3::Time const &', 'time')], 
-                   is_virtual=True)
-    ## distributed-simulator-impl.h (module 'mpi'): void ns3::DistributedSimulatorImpl::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   visibility='private', is_virtual=True)
-    return
-
 def register_Ns3EmptyAttributeValue_methods(root_module, cls):
     ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
     cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
@@ -2491,30 +2082,6 @@
                    is_const=True, visibility='private', is_virtual=True)
     return
 
-def register_Ns3EventImpl_methods(root_module, cls):
-    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
-    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
-    cls.add_constructor([])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
-    cls.add_method('Cancel', 
-                   'void', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
-    cls.add_method('Invoke', 
-                   'void', 
-                   [])
-    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
-    cls.add_method('IsCancelled', 
-                   'bool', 
-                   [])
-    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
-    cls.add_method('Notify', 
-                   'void', 
-                   [], 
-                   is_pure_virtual=True, visibility='protected', is_virtual=True)
-    return
-
 def register_Ns3MpiReceiver_methods(root_module, cls):
     ## mpi-receiver.h (module 'mpi'): ns3::MpiReceiver::MpiReceiver() [constructor]
     cls.add_constructor([])
@@ -2584,46 +2151,6 @@
                    is_const=True)
     return
 
-def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
-    cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
-    return
-
-def register_Ns3ObjectFactoryValue_methods(root_module, cls):
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
-    cls.add_constructor([])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [copy constructor]
-    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
-    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
-    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
-    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
-    cls.add_method('Copy', 
-                   'ns3::Ptr< ns3::AttributeValue >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
-    cls.add_method('DeserializeFromString', 
-                   'bool', 
-                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_virtual=True)
-    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
-    cls.add_method('Get', 
-                   'ns3::ObjectFactory', 
-                   [], 
-                   is_const=True)
-    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
-    cls.add_method('SerializeToString', 
-                   'std::string', 
-                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
-                   is_const=True, is_virtual=True)
-    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
-    cls.add_method('Set', 
-                   'void', 
-                   [param('ns3::ObjectFactory const &', 'value')])
-    return
-
 def register_Ns3Packet_methods(root_module, cls):
     cls.add_output_stream_operator()
     ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
diff -Naur ns-3.18.1/src/mpi/doc/distributed.rst ns-3.19/src/mpi/doc/distributed.rst
--- ns-3.18.1/src/mpi/doc/distributed.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/doc/distributed.rst	2013-12-20 09:44:50.000000000 -0800
@@ -32,10 +32,39 @@
 events in time-stamped order to ensure proper simulation execution. If a LP
 receives a message containing an event from the past, clearly this is an issue,
 since this event could change other events which have already been executed. To
-address this problem, a conservative synchronization algorithm with lookahead is
+address this problem, two conservative synchronization algorithm with lookahead are
 used in |ns3|. For more information on different synchronization approaches and
 parallel and distributed simulation in general, please refer to "Parallel and
-Distributed Simulation Systems" by Richard Fujimoto.
+Distributed Simulation Systems" by Richard Fujimoto.   
+
+The default parallel synchronization strategy implemented in the
+DistributedSimulatorImpl class is based on a globally synchronized
+algorithm using an MPI collective operation to synchronize simulation
+time across all LPs.  A second synchronization strategy based on local
+communication and null messages is implemented in the
+NullMessageSimulatorImpl class, For the null message strategy the
+global all to all gather is not required; LPs only need to
+communication with LPs that have shared point-to-point links.  The
+algorithm to use is controlled by which the |ns3| global value
+SimulatorImplementationType.
+
+The best algorithm to use is dependent on the communication and event
+scheduling pattern for the application.  In general, null message
+synchronization algorithms will scale better due to local
+communication scaling better than a global all-to-all gather that is
+required by DistributedSimulatorImpl.  There are two known cases where
+the global synchronization performs better.  The first is when most
+LPs have point-to-point link with most other LPs, in other words the
+LPs are nearly fully connected.  In this case the null message
+algorithm will generate more message passing traffic than the
+all-to-all gather.  A second case where the global all-to-all gather
+is more efficient is when there are long periods of simulation time
+when no events are occurring.  The all-to-all gather algorithm is able
+to quickly determine then next event time globally.  The nearest
+neighbor behavior of the null message algorithm will require more
+communications to propagate that knowledge; each LP is only aware of
+neighbor next event times.
+
 
 Remote point-to-point links
 +++++++++++++++++++++++++++
@@ -68,6 +97,7 @@
 
 Prerequisites
 +++++++++++++
+.. highlight:: bash
 
 Ensure that MPI is installed, as well as mpic++. In Ubuntu repositories, 
 these are openmpi-bin, openmpi-common, openmpi-doc, libopenmpi-dev. In 
@@ -78,31 +108,33 @@
 There is a conflict on some Fedora systems between libotf and openmpi. A 
 possible "quick-fix" is to yum remove libotf before installing openmpi. 
 This will remove conflict, but it will also remove emacs. Alternatively, 
-these steps could be followed to resolve the conflict:::
+these steps could be followed to resolve the conflict:
 
-    1) Rename the tiny otfdump which emacs says it needs:
+    1) Rename the tiny otfdump which emacs says it needs::
 
-         mv /usr/bin/otfdump /usr/bin/otfdump.emacs-version
+         $ mv /usr/bin/otfdump /usr/bin/otfdump.emacs-version
 
-    2) Manually resolve openmpi dependencies:
+    2) Manually resolve openmpi dependencies::
 
-         sudo yum install libgfortran libtorque numactl
+         $ sudo yum install libgfortran libtorque numactl
 
     3) Download rpm packages: 
 
+       .. sourcecode:: text
+
          openmpi-1.3.1-1.fc11.i586.rpm
          openmpi-devel-1.3.1-1.fc11.i586.rpm
          openmpi-libs-1.3.1-1.fc11.i586.rpm
          openmpi-vt-1.3.1-1.fc11.i586.rpm
 
-         from
+       from http://mirrors.kernel.org/fedora/releases/11/Everything/i386/os/Packages/
 
-         http://mirrors.kernel.org/fedora/releases/11/Everything/i386/os/Packages/
+    4) Force the packages in::
 
-    4) Force the packages in:
-
-         sudo rpm -ivh --force openmpi-1.3.1-1.fc11.i586.rpm
-         openmpi-libs-1.3.1-1.fc11.i586.rpm openmpi-devel-1.3.1-1.fc11.i586.rpm
+         $ sudo rpm -ivh --force \
+         openmpi-1.3.1-1.fc11.i586.rpm \
+         openmpi-libs-1.3.1-1.fc11.i586.rpm \
+         openmpi-devel-1.3.1-1.fc11.i586.rpm \
          openmpi-vt-1.3.1-1.fc11.i586.rpm
 
 Also, it may be necessary to add the openmpi bin directory to PATH in order to
@@ -111,17 +143,17 @@
 to open shared libraries, such as libmpi_cxx.so.0, it may be necessary to add
 the openmpi lib directory to LD_LIBRARY_PATH.
 
-Here is an example of setting up PATH and LD_LIBRARY_PATH using a bash shell:::
+Here is an example of setting up PATH and LD_LIBRARY_PATH using a bash shell:
 
-     For a 32-bit Linux distribution:
+    * For a 32-bit Linux distribution::
          
-          export PATH=$PATH:/usr/lib/openmpi/bin
-          export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/openmpi/lib      
+         $ export PATH=$PATH:/usr/lib/openmpi/bin
+         $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/openmpi/lib      
     
-     For a 64-bit Linux distribution:
+     For a 64-bit Linux distribution::
      
-          export PATH=$PATH:/usr/lib64/openmpi/bin
-          export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64/openmpi/lib          
+         $ export PATH=$PATH:/usr/lib64/openmpi/bin
+         $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64/openmpi/lib          
 
 These lines can be added into ~/.bash_profile or ~/.bashrc to avoid having to
 retype them when a new shell is opened.
@@ -129,30 +161,37 @@
 Building and Running Examples
 +++++++++++++++++++++++++++++
 
-If you already built |ns3| without MPI enabled, you must re-build:::
+If you already built |ns3| without MPI enabled, you must re-build::
 
-    ./waf distclean
+    $ ./waf distclean
 
-Configure |ns3| with the --enable-mpi option:::
+Configure |ns3| with the --enable-mpi option::
 
-    ./waf -d debug configure --enable-examples --enable-tests --enable-mpi
+    $ ./waf -d debug configure --enable-examples --enable-tests --enable-mpi
 
 Ensure that MPI is enabled by checking the optional features shown from the
 output of configure.
 
-Next, build |ns3|:::
+Next, build |ns3|::
 
-    ./waf
+    $ ./waf
 
-After building |ns3| with mpi enabled, the example programs are now ready to run
-with mpirun. Here are a few examples (from the root |ns3| directory):::
+After building |ns3| with mpi enabled, the example programs are now
+ready to run with mpirun. Here are a few examples (from the root |ns3|
+directory)::
 
-    mpirun -np 2 ./waf --run simple-distributed
-    mpirun -np 4 -machinefile mpihosts ./waf --run 'nms-udp-nix --LAN=2 --CN=4 --nix=1'
+    $ mpirun -np 2 ./waf --run simple-distributed
+    $ mpirun -np 4 -machinefile mpihosts ./waf --run 'nms-udp-nix --LAN=2 --CN=4 --nix=1'
             
+An examle using the null message synchronization algorithm::
+
+    $ mpirun -np 2 ./waf --run simple-distributed --nullmsg
+
 The np switch is the number of logical processors to use. The machinefile switch
 is which machines to use. In order to use machinefile, the target file must
-exist (in this case mpihosts). This can simply contain something like:::
+exist (in this case mpihosts). This can simply contain something like:
+
+.. sourcecode:: text
 
     localhost
     localhost
@@ -162,14 +201,42 @@
 Or if you have a cluster of machines, you can name them.
 
 NOTE: Some users have experienced issues using mpirun and waf together. An
-alternative way to run distributed examples is shown below:::
+alternative way to run distributed examples is shown below::
+
+    $ ./waf shell
+    $ cd build/debug
+    $ mpirun -np 2 src/mpi/examples/simple-distributed
+
+Setting synchronization algorithm to use
+++++++++++++++++++++++++++++++++++++++++
+
+The global value SimulatorImplementationType is used to set the
+synchronization algorithm to use.  This value must be set before the
+MpiInterface::Enable method is invoked if the default
+DistributedSimulatorImpl is not used.  Here is an example code snippet
+showing how to add a command line argument to control the
+synchronization algorithm choice:::
+
+  cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
+  if(nullmsg) 
+    {
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::NullMessageSimulatorImpl"));
+    } 
+  else 
+    {
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::DistributedSimulatorImpl"));
+    }
+
+  // Enable parallel simulator with the command line arguments
+  MpiInterface::Enable (&argc, &argv);
+
 
-    ./waf shell
-    cd build/debug
-    mpirun -np 2 src/mpi/examples/simple-distributed
 
 Creating custom topologies
 ++++++++++++++++++++++++++
+.. highlight:: cpp
 
 The example programs in src/mpi/examples give a good idea of how to create different
 topologies for distributed simulation. The main points are assigning system ids
@@ -178,14 +245,14 @@
 target node.
 
 Assigning system ids to nodes is simple and can be handled two different ways.
-First, a NodeContainer can be used to create the nodes and assign system ids:::
+First, a NodeContainer can be used to create the nodes and assign system ids::
 
     NodeContainer nodes;
     nodes.Create (5, 1); // Creates 5 nodes with system id 1.
 
 Alternatively, nodes can be created individually, assigned system ids, and added
 to a NodeContainer. This is useful if a NodeContainer holds nodes with different
-system ids:::
+system ids::
 
     NodeContainer nodes;
     Ptr<Node> node1 = CreateObject<Node> (0); // Create node1 with system id 0
@@ -213,7 +280,7 @@
 keep track of different traces is to just name the trace files or pcaps
 differently, based on the system id of the simulator. For example, something
 like this should work well, assuming all of these local variables were
-previously defined:::
+previously defined::
 
     if (MpiInterface::GetSystemId () == 0)
       {
diff -Naur ns-3.18.1/src/mpi/examples/nms-p2p-nix-distributed.cc ns-3.19/src/mpi/examples/nms-p2p-nix-distributed.cc
--- ns-3.18.1/src/mpi/examples/nms-p2p-nix-distributed.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/examples/nms-p2p-nix-distributed.cc	2013-12-20 09:44:50.000000000 -0800
@@ -37,6 +37,7 @@
 #include <cstdlib>
 #include <sys/time.h>
 #include <fstream>
+#include <vector>
 
 #include "ns3/core-module.h"
 #include "ns3/internet-module.h"
@@ -49,10 +50,6 @@
 #include "ns3/ipv4-list-routing-helper.h"
 #include "ns3/ipv4-nix-vector-helper.h"
 
-#ifdef NS3_MPI
-#include <mpi.h>
-#endif
-
 using namespace ns3;
 
 typedef struct timeval TIMER_TYPE;
@@ -62,16 +59,23 @@
 
 NS_LOG_COMPONENT_DEFINE ("CampusNetworkModelDistributed");
 
-  /**
-   *  \internal
-   *  \c #defines for \c nCN and \c nLANClients are a temporary fix,
-   *  see \bugid{1560}
-   */
 int
 main (int argc, char *argv[])
 {
 #ifdef NS3_MPI
-  // Enable MPI with the command line arguments
+
+  typedef std::vector<NodeContainer> vectorOfNodeContainer;
+  typedef std::vector<vectorOfNodeContainer> vectorOfVectorOfNodeContainer;
+  typedef std::vector<vectorOfVectorOfNodeContainer> vectorOfVectorOfVectorOfNodeContainer;  
+
+  typedef std::vector<Ipv4InterfaceContainer> vectorOfIpv4InterfaceContainer;
+  typedef std::vector<vectorOfIpv4InterfaceContainer> vectorOfVectorOfIpv4InterfaceContainer;
+  typedef std::vector<vectorOfVectorOfIpv4InterfaceContainer> vectorOfVectorOfVectorOfIpv4InterfaceContainer;
+ 
+  typedef std::vector<NetDeviceContainer> vectorOfNetDeviceContainer;
+  typedef std::vector<vectorOfNetDeviceContainer> vectorOfVectorOfNetDeviceContainer;
+
+  // Enable parallel simulator with the command line arguments
   MpiInterface::Enable (&argc, &argv);
 
   TIMER_TYPE t0, t1, t2;
@@ -84,17 +88,14 @@
   uint32_t systemId = MpiInterface::GetSystemId ();
   uint32_t systemCount = MpiInterface::GetSize ();
 
-  //temporary fix see bug 1560
-  #define nCN (2)
-  #define nLANClients (42)
-  //uint32_t nCN = 2, nLANClients = 42;
+  uint32_t nCN = 2, nLANClients = 42;
   int32_t single = 0;
   int nBytes = 500000; // Bytes for each on/off app
   bool nix = true;
 
   CommandLine cmd;
-  //cmd.AddValue ("CN", "Number of total CNs [2]", nCN);
-  //cmd.AddValue ("LAN", "Number of nodes per LAN [42]", nLANClients);
+  cmd.AddValue ("CN", "Number of total CNs [2]", nCN);
+  cmd.AddValue ("LAN", "Number of nodes per LAN [42]", nLANClients);
   cmd.AddValue ("single", "1 if use single flow", single);
   cmd.AddValue ("nBytes", "Number of bytes for each on/off app", nBytes);
   cmd.AddValue ("nix", "Toggle the use of nix-vector or global routing", nix);
@@ -114,15 +115,30 @@
     }
 
   std::cout << "Number of CNs: " << nCN << ", LAN nodes: " << nLANClients << std::endl;
+  
+
 
-  NodeContainer nodes_net0[nCN][3], nodes_net1[nCN][6], nodes_netLR[nCN],
-                nodes_net2[nCN][14], nodes_net2LAN[nCN][7][nLANClients],
-                nodes_net3[nCN][9], nodes_net3LAN[nCN][5][nLANClients];
+  vectorOfNodeContainer nodes_netLR(nCN);
+  vectorOfVectorOfNodeContainer nodes_net0(nCN,vectorOfNodeContainer(3));
+  vectorOfVectorOfNodeContainer nodes_net1(nCN,vectorOfNodeContainer(6));
+  vectorOfVectorOfNodeContainer nodes_net2(nCN,vectorOfNodeContainer(14));
+  vectorOfVectorOfNodeContainer nodes_net3(nCN,vectorOfNodeContainer(9));
+     
+  vectorOfVectorOfVectorOfNodeContainer nodes_net2LAN(nCN,vectorOfVectorOfNodeContainer(7,vectorOfNodeContainer(nLANClients)));
+  vectorOfVectorOfVectorOfNodeContainer nodes_net3LAN(nCN,vectorOfVectorOfNodeContainer(5,vectorOfNodeContainer(nLANClients)));
+  
   PointToPointHelper p2p_2gb200ms, p2p_1gb5ms, p2p_100mb1ms;
   InternetStackHelper stack;
-  Ipv4InterfaceContainer ifs, ifs0[nCN][3], ifs1[nCN][6], ifs2[nCN][14],
-                         ifs3[nCN][9], ifs2LAN[nCN][7][nLANClients],
-                         ifs3LAN[nCN][5][nLANClients];
+  
+  Ipv4InterfaceContainer ifs;  
+
+  vectorOfVectorOfIpv4InterfaceContainer ifs0(nCN,vectorOfIpv4InterfaceContainer(3));
+  vectorOfVectorOfIpv4InterfaceContainer ifs1(nCN,vectorOfIpv4InterfaceContainer(6));
+  vectorOfVectorOfIpv4InterfaceContainer ifs2(nCN,vectorOfIpv4InterfaceContainer(14));
+  vectorOfVectorOfIpv4InterfaceContainer ifs3(nCN,vectorOfIpv4InterfaceContainer(9));
+  vectorOfVectorOfVectorOfIpv4InterfaceContainer ifs2LAN(nCN,vectorOfVectorOfIpv4InterfaceContainer(7,vectorOfIpv4InterfaceContainer(nLANClients)));
+  vectorOfVectorOfVectorOfIpv4InterfaceContainer ifs3LAN(nCN,vectorOfVectorOfIpv4InterfaceContainer(5,vectorOfIpv4InterfaceContainer(nLANClients)));
+  
   Ipv4AddressHelper address;
   std::ostringstream oss;
   p2p_1gb5ms.SetDeviceAttribute ("DataRate", StringValue ("1Gbps"));
@@ -223,7 +239,7 @@
         {
           ndc2[i] = p2p_1gb5ms.Install (nodes_net2[z][i]);
         }
-      NetDeviceContainer ndc2LAN[7][nLANClients];
+      vectorOfVectorOfNetDeviceContainer ndc2LAN(7, vectorOfNetDeviceContainer(nLANClients));
       for (int i = 0; i < 7; ++i)
         {
           oss.str ("");
@@ -261,7 +277,7 @@
         {
           ndc3[i] = p2p_1gb5ms.Install (nodes_net3[z][i]);
         }
-      NetDeviceContainer ndc3LAN[5][nLANClients];
+      vectorOfVectorOfNetDeviceContainer ndc3LAN(5, vectorOfNetDeviceContainer(nLANClients));
       for (int i = 0; i < 5; ++i)
         {
           oss.str ("");
@@ -374,7 +390,7 @@
   if (nCN > 1)
     {
       std::cout << "Forming Ring Topology..." << std::endl;
-      NodeContainer nodes_ring[nCN];
+      vectorOfNodeContainer nodes_ring(nCN);
       for (uint32_t z = 0; z < nCN - 1; ++z)
         {
           nodes_ring[z].Add (nodes_net0[z][0].Get (0));
@@ -382,7 +398,7 @@
         }
       nodes_ring[nCN - 1].Add (nodes_net0[nCN - 1][0].Get (0));
       nodes_ring[nCN - 1].Add (nodes_net0[0][0].Get (0));
-      NetDeviceContainer ndc_ring[nCN];
+      vectorOfNetDeviceContainer ndc_ring(nCN);
       for (uint32_t z = 0; z < nCN; ++z)
         {
           ndc_ring[z] = p2p_2gb200ms.Install (nodes_ring[z]);
@@ -608,7 +624,7 @@
   TIMER_NOW (t2);
   std::cout << "Simulator finished." << std::endl;
   Simulator::Destroy ();
-  // Exit the MPI execution environment
+  // Exit the parallel execution environment
   MpiInterface::Disable ();
   double d1 = TIMER_DIFF (t1, t0), d2 = TIMER_DIFF (t2, t1);
   std::cout << "-----" << std::endl << "Runtime Stats:" << std::endl;
diff -Naur ns-3.18.1/src/mpi/examples/simple-distributed.cc ns-3.19/src/mpi/examples/simple-distributed.cc
--- ns-3.18.1/src/mpi/examples/simple-distributed.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/examples/simple-distributed.cc	2013-12-20 09:44:50.000000000 -0800
@@ -66,10 +66,32 @@
 main (int argc, char *argv[])
 {
 #ifdef NS3_MPI
-  // Distributed simulation setup
+
+  bool nix = true;
+  bool nullmsg = false;
+  bool tracing = false;
+
+  // Parse command line
+  CommandLine cmd;
+  cmd.AddValue ("nix", "Enable the use of nix-vector or global routing", nix);
+  cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
+  cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
+  cmd.Parse (argc, argv);
+
+  // Distributed simulation setup; by default use granted time window algorithm.
+  if(nullmsg) 
+    {
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::NullMessageSimulatorImpl"));
+    } 
+  else 
+    {
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::DistributedSimulatorImpl"));
+    }
+
+  // Enable parallel simulator with the command line arguments
   MpiInterface::Enable (&argc, &argv);
-  GlobalValue::Bind ("SimulatorImplementationType",
-                     StringValue ("ns3::DistributedSimulatorImpl"));
 
   LogComponentEnable ("PacketSink", LOG_LEVEL_INFO);
 
@@ -88,12 +110,6 @@
   Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (512));
   Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("1Mbps"));
   Config::SetDefault ("ns3::OnOffApplication::MaxBytes", UintegerValue (512));
-  bool nix = true;
-
-  // Parse command line
-  CommandLine cmd;
-  cmd.AddValue ("nix", "Enable the use of nix-vector or global routing", nix);
-  cmd.Parse (argc, argv);
 
   // Create leaf nodes on left with system id 0
   NodeContainer leftLeafNodes;
@@ -206,6 +222,21 @@
       Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
     }
 
+  if (tracing == true)
+    {
+      if (systemId == 0)
+        {
+          routerLink.EnablePcap("router-left", routerDevices, true);
+          leafLink.EnablePcap("leaf-left", leftLeafDevices, true);
+        }
+      
+      if (systemId == 1)
+        {
+          routerLink.EnablePcap("router-right", routerDevices, true);
+          leafLink.EnablePcap("leaf-right", rightLeafDevices, true);
+        }
+    }
+
   // Create a packet sink on the right leafs to receive packets from left leafs
   uint16_t port = 50000;
   if (systemId == 1)
diff -Naur ns-3.18.1/src/mpi/examples/simple-distributed-empty-node.cc ns-3.19/src/mpi/examples/simple-distributed-empty-node.cc
--- ns-3.18.1/src/mpi/examples/simple-distributed-empty-node.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/examples/simple-distributed-empty-node.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,309 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *
+ * This test is equivalent to simple-distributed but tests boundary cases
+ * when one of the ranks has no Nodes on it.   When run on two tasks
+ * rank 0 will have all the Nodes and rank 1 will be empty:
+ * 
+ *                 -------   -------
+ *                  RANK 0    RANK 0
+ *                 ------- | -------
+ *                         |
+ * n0 ---------|           |           |---------- n6
+ *             |           |           |
+ * n1 -------\ |           |           | /------- n7
+ *            n4 ----------|---------- n5
+ * n2 -------/ |           |           | \------- n8
+ *             |           |           |
+ * n3 ---------|           |           |---------- n9
+ *
+ *
+ * When run on three tasks rank 1 has the left half of the Nodes and rank 2
+ * will be empty.
+ *
+ *                 -------   -------
+ *                  RANK 0    RANK 1
+ *                 ------- | -------
+ *                         |
+ * n0 ---------|           |           |---------- n6
+ *             |           |           |
+ * n1 -------\ |           |           | /------- n7
+ *            n4 ----------|---------- n5
+ * n2 -------/ |           |           | \------- n8
+ *             |           |           |
+ * n3 ---------|           |           |---------- n9
+ *
+ * OnOff clients are placed on each left leaf node. Each right leaf node
+ * is a packet sink for a left leaf node.  As a packet travels from one
+ * logical processor to another (the link between n4 and n5), MPI messages
+ * are passed containing the serialized packet. The message is then
+ * deserialized into a new packet and sent on as normal.
+ *
+ * One packet is sent from each left leaf node.  The packet sinks on the
+ * right leaf nodes output logging information when they receive the packet.
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/mpi-interface.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/ipv4-static-routing-helper.h"
+#include "ns3/ipv4-list-routing-helper.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/on-off-helper.h"
+#include "ns3/packet-sink-helper.h"
+
+#ifdef NS3_MPI
+#include <mpi.h>
+#endif
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("SimpleDistributed");
+
+int
+main (int argc, char *argv[])
+{
+#ifdef NS3_MPI
+
+  bool nix = true;
+  bool nullmsg = false;
+  bool tracing = false;
+
+  // Parse command line
+  CommandLine cmd;
+  cmd.AddValue ("nix", "Enable the use of nix-vector or global routing", nix);
+  cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
+  cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
+  cmd.Parse (argc, argv);
+
+  // Distributed simulation setup; by default use granted time window algorithm.
+  if(nullmsg) 
+    {
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::NullMessageSimulatorImpl"));
+    } 
+  else 
+    {
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::DistributedSimulatorImpl"));
+    }
+
+  MpiInterface::Enable (&argc, &argv);
+
+  LogComponentEnable ("PacketSink", LOG_LEVEL_INFO);
+
+  uint32_t systemId = MpiInterface::GetSystemId ();
+  uint32_t systemCount = MpiInterface::GetSize ();
+
+  uint32_t rightHalfSystemId = 777;
+
+  // Check for valid distributed parameters.
+  // Must have 2 or 3 tasks.
+  if (systemCount == 2)
+    {
+      rightHalfSystemId = 0;
+    }
+  else if (systemCount == 3)
+    {
+      rightHalfSystemId = 1;
+    }
+  else
+    {
+      std::cout << "This simulation requires 2 or 3 logical processors." << std::endl;
+      return 1;
+    }
+    
+  // Some default values
+  Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (512));
+  Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("1Mbps"));
+  Config::SetDefault ("ns3::OnOffApplication::MaxBytes", UintegerValue (512));
+
+  // Create leaf nodes on left with system id 0
+  NodeContainer leftLeafNodes;
+  leftLeafNodes.Create (4, 0);
+
+  // Create router nodes.  Left router with system id 0, right router
+  // with system id dependent on number of processors using
+  // rightHalfSystemId
+  NodeContainer routerNodes;
+  Ptr<Node> routerNode1 = CreateObject<Node> (0);
+  Ptr<Node> routerNode2 = CreateObject<Node> (rightHalfSystemId);
+  routerNodes.Add (routerNode1);
+  routerNodes.Add (routerNode2);
+
+  // Create leaf nodes on left with system id rightHalfSystemId
+  NodeContainer rightLeafNodes;
+  rightLeafNodes.Create (4, rightHalfSystemId);
+
+  PointToPointHelper routerLink;
+  routerLink.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+  routerLink.SetChannelAttribute ("Delay", StringValue ("5ms"));
+
+  PointToPointHelper leafLink;
+  leafLink.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
+  leafLink.SetChannelAttribute ("Delay", StringValue ("2ms"));
+
+  // Add link connecting routers
+  NetDeviceContainer routerDevices;
+  routerDevices = routerLink.Install (routerNodes);
+
+  // Add links for left side leaf nodes to left router
+  NetDeviceContainer leftRouterDevices;
+  NetDeviceContainer leftLeafDevices;
+  for (uint32_t i = 0; i < 4; ++i)
+    {
+      NetDeviceContainer temp = leafLink.Install (leftLeafNodes.Get (i), routerNodes.Get (0));
+      leftLeafDevices.Add (temp.Get (0));
+      leftRouterDevices.Add (temp.Get (1));
+    }
+
+  // Add links for right side leaf nodes to right router
+  NetDeviceContainer rightRouterDevices;
+  NetDeviceContainer rightLeafDevices;
+  for (uint32_t i = 0; i < 4; ++i)
+    {
+      NetDeviceContainer temp = leafLink.Install (rightLeafNodes.Get (i), routerNodes.Get (1));
+      rightLeafDevices.Add (temp.Get (0));
+      rightRouterDevices.Add (temp.Get (1));
+    }
+
+  InternetStackHelper stack;
+  Ipv4NixVectorHelper nixRouting;
+  Ipv4StaticRoutingHelper staticRouting;
+
+  Ipv4ListRoutingHelper list;
+  list.Add (staticRouting, 0);
+  list.Add (nixRouting, 10);
+
+  if (nix)
+    {
+      stack.SetRoutingHelper (list); // has effect on the next Install ()
+    }
+
+  stack.InstallAll ();
+
+  Ipv4InterfaceContainer routerInterfaces;
+  Ipv4InterfaceContainer leftLeafInterfaces;
+  Ipv4InterfaceContainer leftRouterInterfaces;
+  Ipv4InterfaceContainer rightLeafInterfaces;
+  Ipv4InterfaceContainer rightRouterInterfaces;
+
+  Ipv4AddressHelper leftAddress;
+  leftAddress.SetBase ("10.1.1.0", "255.255.255.0");
+
+  Ipv4AddressHelper routerAddress;
+  routerAddress.SetBase ("10.2.1.0", "255.255.255.0");
+
+  Ipv4AddressHelper rightAddress;
+  rightAddress.SetBase ("10.3.1.0", "255.255.255.0");
+
+  // Router-to-Router interfaces
+  routerInterfaces = routerAddress.Assign (routerDevices);
+
+  // Left interfaces
+  for (uint32_t i = 0; i < 4; ++i)
+    {
+      NetDeviceContainer ndc;
+      ndc.Add (leftLeafDevices.Get (i));
+      ndc.Add (leftRouterDevices.Get (i));
+      Ipv4InterfaceContainer ifc = leftAddress.Assign (ndc);
+      leftLeafInterfaces.Add (ifc.Get (0));
+      leftRouterInterfaces.Add (ifc.Get (1));
+      leftAddress.NewNetwork ();
+    }
+
+  // Right interfaces
+  for (uint32_t i = 0; i < 4; ++i)
+    {
+      NetDeviceContainer ndc;
+      ndc.Add (rightLeafDevices.Get (i));
+      ndc.Add (rightRouterDevices.Get (i));
+      Ipv4InterfaceContainer ifc = rightAddress.Assign (ndc);
+      rightLeafInterfaces.Add (ifc.Get (0));
+      rightRouterInterfaces.Add (ifc.Get (1));
+      rightAddress.NewNetwork ();
+    }
+
+  if (!nix)
+    {
+      Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
+    }
+
+  if (tracing == true)
+    {
+      if (systemId == 0)
+        {
+          routerLink.EnablePcap("router-left", routerDevices, true);
+          leafLink.EnablePcap("leaf-left", leftLeafDevices, true);
+        }
+      
+      if (systemId == rightHalfSystemId)
+        {
+          routerLink.EnablePcap("router-right", routerDevices, true);
+          leafLink.EnablePcap("leaf-right", rightLeafDevices, true);
+        }
+    }
+
+  // Create a packet sink on the right leafs to receive packets from left leafs
+  uint16_t port = 50000;
+  if (systemId == rightHalfSystemId)
+    {
+      Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
+      PacketSinkHelper sinkHelper ("ns3::UdpSocketFactory", sinkLocalAddress);
+      ApplicationContainer sinkApp;
+      for (uint32_t i = 0; i < 4; ++i)
+        {
+          sinkApp.Add (sinkHelper.Install (rightLeafNodes.Get (i)));
+        }
+      sinkApp.Start (Seconds (1.0));
+      sinkApp.Stop (Seconds (5));
+    }
+
+  // Create the OnOff applications to send
+  if (systemId == 0)
+    {
+      OnOffHelper clientHelper ("ns3::UdpSocketFactory", Address ());
+      clientHelper.SetAttribute
+        ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
+      clientHelper.SetAttribute
+        ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
+
+      ApplicationContainer clientApps;
+      for (uint32_t i = 0; i < 4; ++i)
+        {
+          AddressValue remoteAddress
+            (InetSocketAddress (rightLeafInterfaces.GetAddress (i), port));
+          clientHelper.SetAttribute ("Remote", remoteAddress);
+          clientApps.Add (clientHelper.Install (leftLeafNodes.Get (i)));
+        }
+      clientApps.Start (Seconds (1.0));
+      clientApps.Stop (Seconds (5));
+    }
+
+  Simulator::Stop (Seconds (5));
+  Simulator::Run ();
+  Simulator::Destroy ();
+  // Exit the MPI execution environment
+  MpiInterface::Disable ();
+  return 0;
+#else
+  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
+#endif
+}
diff -Naur ns-3.18.1/src/mpi/examples/third-distributed.cc ns-3.19/src/mpi/examples/third-distributed.cc
--- ns-3.18.1/src/mpi/examples/third-distributed.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/examples/third-distributed.cc	2013-12-20 09:44:50.000000000 -0800
@@ -55,31 +55,18 @@
 main (int argc, char *argv[])
 {
 #ifdef NS3_MPI
-  // Distributed simulation setup
-  MpiInterface::Enable (&argc, &argv);
-  GlobalValue::Bind ("SimulatorImplementationType",
-                     StringValue ("ns3::DistributedSimulatorImpl"));
-
-  uint32_t systemId = MpiInterface::GetSystemId ();
-  uint32_t systemCount = MpiInterface::GetSize ();
-
-  // Check for valid distributed parameters.
-  // Must have 2 and only 2 Logical Processors (LPs)
-  if (systemCount != 2)
-    {
-      std::cout << "This simulation requires 2 and only 2 logical processors." << std::endl;
-      return 1;
-    }
 
   bool verbose = true;
   uint32_t nCsma = 3;
   uint32_t nWifi = 3;
+  bool nullmsg = false;
   bool tracing = false;
 
   CommandLine cmd;
   cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
   cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);
   cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
+  cmd.AddValue ("nullmsg", "Enable the use of null-message synchronization", nullmsg);
   cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
   cmd.Parse (argc,argv);
 
@@ -98,6 +85,32 @@
       LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
     }
 
+  // Distributed simulation setup; by default use granted time window algorithm.
+  if(nullmsg) 
+    {
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::NullMessageSimulatorImpl"));
+    } 
+  else 
+    {
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::DistributedSimulatorImpl"));
+    }
+
+  MpiInterface::Enable (&argc, &argv);
+
+  uint32_t systemId = MpiInterface::GetSystemId ();
+  uint32_t systemCount = MpiInterface::GetSize ();
+
+  // Check for valid distributed parameters.
+  // Must have 2 and only 2 Logical Processors (LPs)
+  if (systemCount != 2)
+    {
+      std::cout << "This simulation requires 2 and only 2 logical processors." << std::endl;
+      return 1;
+    }
+
+
   NodeContainer p2pNodes;
   Ptr<Node> p2pNode1 = CreateObject<Node> (0); // Create node with rank 0
   Ptr<Node> p2pNode2 = CreateObject<Node> (1); // Create node with rank 1
diff -Naur ns-3.18.1/src/mpi/examples/wscript ns-3.19/src/mpi/examples/wscript
--- ns-3.18.1/src/mpi/examples/wscript	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/examples/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -12,3 +12,7 @@
     obj = bld.create_ns3_program('nms-p2p-nix-distributed',
                                  ['point-to-point', 'internet', 'nix-vector-routing', 'applications'])
     obj.source = 'nms-p2p-nix-distributed.cc'
+
+    obj = bld.create_ns3_program('simple-distributed-empty-node',
+                                 ['point-to-point', 'internet', 'nix-vector-routing', 'applications'])
+    obj.source = 'simple-distributed-empty-node.cc'
diff -Naur ns-3.18.1/src/mpi/model/distributed-simulator-impl.cc ns-3.19/src/mpi/model/distributed-simulator-impl.cc
--- ns-3.18.1/src/mpi/model/distributed-simulator-impl.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/model/distributed-simulator-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -14,9 +14,11 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: George Riley <riley@ece.gatech.edu>
+ *
  */
 
 #include "distributed-simulator-impl.h"
+#include "granted-time-window-mpi-interface.h"
 #include "mpi-interface.h"
 
 #include "ns3/simulator.h"
@@ -39,7 +41,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (DistributedSimulatorImpl);
+NS_OBJECT_ENSURE_REGISTERED (DistributedSimulatorImpl)
+  ;
 
 LbtsMessage::~LbtsMessage ()
 {
@@ -88,6 +91,8 @@
 
 DistributedSimulatorImpl::DistributedSimulatorImpl ()
 {
+  NS_LOG_FUNCTION (this);
+
 #ifdef NS3_MPI
   m_myId = MpiInterface::GetSystemId ();
   m_systemCount = MpiInterface::GetSize ();
@@ -101,6 +106,7 @@
 #endif
 
   m_stop = false;
+  m_globalFinished = false;
   // uids are allocated from 4.
   // uid 0 is "invalid" events
   // uid 1 is "now" events
@@ -116,11 +122,14 @@
 
 DistributedSimulatorImpl::~DistributedSimulatorImpl ()
 {
+  NS_LOG_FUNCTION (this);
 }
 
 void
 DistributedSimulatorImpl::DoDispose (void)
 {
+  NS_LOG_FUNCTION (this);
+
   while (!m_events->IsEmpty ())
     {
       Scheduler::Event next = m_events->RemoveNext ();
@@ -134,6 +143,8 @@
 void
 DistributedSimulatorImpl::Destroy ()
 {
+  NS_LOG_FUNCTION (this);
+
   while (!m_destroyEvents.empty ())
     {
       Ptr<EventImpl> ev = m_destroyEvents.front ().PeekEventImpl ();
@@ -152,6 +163,8 @@
 void
 DistributedSimulatorImpl::CalculateLookAhead (void)
 {
+  NS_LOG_FUNCTION (this);
+
 #ifdef NS3_MPI
   if (MpiInterface::GetSize () <= 1)
     {
@@ -161,6 +174,7 @@
   else
     {
       DistributedSimulatorImpl::m_lookAhead = GetMaximumSimulationTime ();
+
       m_grantedTime = GetMaximumSimulationTime ();
 
       NodeContainer c = NodeContainer::GetGlobal ();
@@ -236,7 +250,7 @@
   long recvbuf;
 
   /* Tasks with no inter-task links do not contribute to max */
-  if (m_lookAhead == GetMaximumSimulationTime ()) 
+  if (m_lookAhead == GetMaximumSimulationTime ())
     {
       sendbuf = 0;
     }
@@ -253,7 +267,7 @@
    * will proceed without synchronization until a single AllGather
    * occurs when all tasks have finished.
    */
-  if (m_lookAhead == GetMaximumSimulationTime () && recvbuf != 0) 
+  if (m_lookAhead == GetMaximumSimulationTime () && recvbuf != 0)
     {
       m_lookAhead = Time (recvbuf);
       m_grantedTime = m_lookAhead;
@@ -267,6 +281,8 @@
 void
 DistributedSimulatorImpl::SetScheduler (ObjectFactory schedulerFactory)
 {
+  NS_LOG_FUNCTION (this << schedulerFactory);
+
   Ptr<Scheduler> scheduler = schedulerFactory.Create<Scheduler> ();
 
   if (m_events != 0)
@@ -283,6 +299,8 @@
 void
 DistributedSimulatorImpl::ProcessOneEvent (void)
 {
+  NS_LOG_FUNCTION (this);
+
   Scheduler::Event next = m_events->RemoveNext ();
 
   NS_ASSERT (next.key.m_ts >= m_currentTs);
@@ -311,11 +329,14 @@
 uint64_t
 DistributedSimulatorImpl::NextTs (void) const
 {
-  // If local MPI task is has no more events or stop was called 
+  // If local MPI task is has no more events or stop was called
   // next event time is infinity.
-  if (IsLocalFinished ()) {
+  if (IsLocalFinished ())
+    {
       return GetMaximumSimulationTime ().GetTimeStep ();
-    } else  {
+    }
+  else
+    {
       Scheduler::Event ev = m_events->PeekNext ();
       return ev.key.m_ts;
     }
@@ -330,6 +351,8 @@
 void
 DistributedSimulatorImpl::Run (void)
 {
+  NS_LOG_FUNCTION (this);
+
 #ifdef NS3_MPI
   CalculateLookAhead ();
   m_stop = false;
@@ -343,17 +366,17 @@
       // synchronizations with other tasks until all tasks have
       // completed.
       if (nextTime > m_grantedTime || IsLocalFinished () )
-        { 
-
+        {
           // Can't process next event, calculate a new LBTS
           // First receive any pending messages
-          MpiInterface::ReceiveMessages ();
+          GrantedTimeWindowMpiInterface::ReceiveMessages ();
           // reset next time
           nextTime = Next ();
           // And check for send completes
-          MpiInterface::TestSendComplete ();
+          GrantedTimeWindowMpiInterface::TestSendComplete ();
           // Finally calculate the lbts
-          LbtsMessage lMsg (MpiInterface::GetRxCount (), MpiInterface::GetTxCount (), m_myId, IsLocalFinished (), nextTime);
+          LbtsMessage lMsg (GrantedTimeWindowMpiInterface::GetRxCount (), GrantedTimeWindowMpiInterface::GetTxCount (), 
+                            m_myId, IsLocalFinished (), nextTime);
           m_pLBTS[m_myId] = lMsg;
           MPI_Allgather (&lMsg, sizeof (LbtsMessage), MPI_BYTE, m_pLBTS,
                          sizeof (LbtsMessage), MPI_BYTE, MPI_COMM_WORLD);
@@ -378,7 +401,7 @@
           if (totRx == totTx)
             {
               // If lookahead is infinite then granted time should be as well.
-              // Covers the edge case if all the tasks have no inter tasks 
+              // Covers the edge case if all the tasks have no inter tasks
               // links, prevents overflow of granted time.
               if (m_lookAhead == GetMaximumSimulationTime ())
                 {
@@ -416,12 +439,16 @@
 void
 DistributedSimulatorImpl::Stop (void)
 {
+  NS_LOG_FUNCTION (this);
+
   m_stop = true;
 }
 
 void
 DistributedSimulatorImpl::Stop (Time const &time)
 {
+  NS_LOG_FUNCTION (this << time.GetTimeStep ());
+
   Simulator::Schedule (time, &Simulator::Stop);
 }
 
@@ -431,6 +458,8 @@
 EventId
 DistributedSimulatorImpl::Schedule (Time const &time, EventImpl *event)
 {
+  NS_LOG_FUNCTION (this << time.GetTimeStep () << event);
+
   Time tAbsolute = time + TimeStep (m_currentTs);
 
   NS_ASSERT (tAbsolute.IsPositive ());
@@ -464,6 +493,8 @@
 EventId
 DistributedSimulatorImpl::ScheduleNow (EventImpl *event)
 {
+  NS_LOG_FUNCTION (this << event);
+
   Scheduler::Event ev;
   ev.impl = event;
   ev.key.m_ts = m_currentTs;
@@ -478,6 +509,8 @@
 EventId
 DistributedSimulatorImpl::ScheduleDestroy (EventImpl *event)
 {
+  NS_LOG_FUNCTION (this << event);
+
   EventId id (Ptr<EventImpl> (event, false), m_currentTs, 0xffffffff, 2);
   m_destroyEvents.push_back (id);
   m_uid++;
diff -Naur ns-3.18.1/src/mpi/model/distributed-simulator-impl.h ns-3.19/src/mpi/model/distributed-simulator-impl.h
--- ns-3.18.1/src/mpi/model/distributed-simulator-impl.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/model/distributed-simulator-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -14,10 +14,11 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: George Riley <riley@ece.gatech.edu>
+ *
  */
 
-#ifndef DISTRIBUTED_SIMULATOR_IMPL_H
-#define DISTRIBUTED_SIMULATOR_IMPL_H
+#ifndef NS3_DISTRIBUTED_SIMULATOR_IMPL_H
+#define NS3_DISTRIBUTED_SIMULATOR_IMPL_H
 
 #include "ns3/simulator-impl.h"
 #include "ns3/scheduler.h"
@@ -48,6 +49,7 @@
    * \param rxc received count
    * \param txc transmitted count
    * \param id mpi rank
+   * \param isFinished whether message is finished
    * \param t smallest time
    */
   LbtsMessage (uint32_t rxc, uint32_t txc, uint32_t id, bool isFinished, const Time& t)
@@ -70,14 +72,16 @@
    */
   uint32_t GetTxCount ();
   /**
-   * \return receieved count
+   * \return received count
    */
   uint32_t GetRxCount ();
   /**
    * \return id which corresponds to mpi rank
    */
   uint32_t GetMyId ();
-
+  /**
+   * \return true if system is finished
+   */
   bool IsFinished ();
 
 private:
@@ -92,7 +96,7 @@
  * \ingroup simulator
  * \ingroup mpi
  *
- * \brief distributed simulator implementation using lookahead
+ * \brief Distributed simulator implementation using lookahead
  */
 class DistributedSimulatorImpl : public SimulatorImpl
 {
@@ -154,4 +158,4 @@
 
 } // namespace ns3
 
-#endif /* DISTRIBUTED_SIMULATOR_IMPL_H */
+#endif /* NS3_DISTRIBUTED_SIMULATOR_IMPL_H */
diff -Naur ns-3.18.1/src/mpi/model/granted-time-window-mpi-interface.cc ns-3.19/src/mpi/model/granted-time-window-mpi-interface.cc
--- ns-3.18.1/src/mpi/model/granted-time-window-mpi-interface.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/granted-time-window-mpi-interface.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,337 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: George Riley <riley@ece.gatech.edu>
+ *
+ */
+
+// This object contains static methods that provide an easy interface
+// to the necessary MPI information.
+
+#include <iostream>
+#include <iomanip>
+#include <list>
+
+#include "granted-time-window-mpi-interface.h"
+#include "mpi-receiver.h"
+#include "mpi-interface.h"
+
+#include "ns3/node.h"
+#include "ns3/node-list.h"
+#include "ns3/net-device.h"
+#include "ns3/simulator.h"
+#include "ns3/simulator-impl.h"
+#include "ns3/nstime.h"
+#include "ns3/log.h"
+
+#ifdef NS3_MPI
+#include <mpi.h>
+#endif
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("GrantedTimeWindowMpiInterface");
+
+
+SentBuffer::SentBuffer ()
+{
+  m_buffer = 0;
+  m_request = 0;
+}
+
+SentBuffer::~SentBuffer ()
+{
+  delete [] m_buffer;
+}
+
+uint8_t*
+SentBuffer::GetBuffer ()
+{
+  return m_buffer;
+}
+
+void
+SentBuffer::SetBuffer (uint8_t* buffer)
+{
+  m_buffer = buffer;
+}
+
+#ifdef NS3_MPI
+MPI_Request*
+SentBuffer::GetRequest ()
+{
+  return &m_request;
+}
+#endif
+
+uint32_t              GrantedTimeWindowMpiInterface::m_sid = 0;
+uint32_t              GrantedTimeWindowMpiInterface::m_size = 1;
+bool                  GrantedTimeWindowMpiInterface::m_initialized = false;
+bool                  GrantedTimeWindowMpiInterface::m_enabled = false;
+uint32_t              GrantedTimeWindowMpiInterface::m_rxCount = 0;
+uint32_t              GrantedTimeWindowMpiInterface::m_txCount = 0;
+std::list<SentBuffer> GrantedTimeWindowMpiInterface::m_pendingTx;
+
+#ifdef NS3_MPI
+MPI_Request* GrantedTimeWindowMpiInterface::m_requests;
+char**       GrantedTimeWindowMpiInterface::m_pRxBuffers;
+#endif
+
+TypeId 
+GrantedTimeWindowMpiInterface::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::GrantedTimeWindowMpiInterface")
+    .SetParent<Object> ()
+  ;
+  return tid;
+}
+
+void
+GrantedTimeWindowMpiInterface::Destroy ()
+{
+  NS_LOG_FUNCTION (this);
+
+#ifdef NS3_MPI
+  for (uint32_t i = 0; i < GetSize (); ++i)
+    {
+      delete [] m_pRxBuffers[i];
+    }
+  delete [] m_pRxBuffers;
+  delete [] m_requests;
+
+  m_pendingTx.clear ();
+#endif
+}
+
+uint32_t
+GrantedTimeWindowMpiInterface::GetRxCount ()
+{
+  return m_rxCount;
+}
+
+uint32_t
+GrantedTimeWindowMpiInterface::GetTxCount ()
+{
+  return m_txCount;
+}
+
+uint32_t
+GrantedTimeWindowMpiInterface::GetSystemId ()
+{
+  if (!m_initialized)
+    {
+      Simulator::GetImplementation ();
+      m_initialized = true;
+    }
+  return m_sid;
+}
+
+uint32_t
+GrantedTimeWindowMpiInterface::GetSize ()
+{
+  if (!m_initialized)
+    {
+      Simulator::GetImplementation ();
+      m_initialized = true;
+    }
+  return m_size;
+}
+
+bool
+GrantedTimeWindowMpiInterface::IsEnabled ()
+{
+  if (!m_initialized)
+    {
+      Simulator::GetImplementation ();
+      m_initialized = true;
+    }
+  return m_enabled;
+}
+
+void
+GrantedTimeWindowMpiInterface::Enable (int* pargc, char*** pargv)
+{
+  NS_LOG_FUNCTION (this << pargc << pargv); 
+
+#ifdef NS3_MPI
+  // Initialize the MPI interface
+  MPI_Init (pargc, pargv);
+  MPI_Barrier (MPI_COMM_WORLD);
+  MPI_Comm_rank (MPI_COMM_WORLD, reinterpret_cast <int *> (&m_sid));
+  MPI_Comm_size (MPI_COMM_WORLD, reinterpret_cast <int *> (&m_size));
+  m_enabled = true;
+  m_initialized = true;
+  // Post a non-blocking receive for all peers
+  m_pRxBuffers = new char*[m_size];
+  m_requests = new MPI_Request[m_size];
+  for (uint32_t i = 0; i < GetSize (); ++i)
+    {
+      m_pRxBuffers[i] = new char[MAX_MPI_MSG_SIZE];
+      MPI_Irecv (m_pRxBuffers[i], MAX_MPI_MSG_SIZE, MPI_CHAR, MPI_ANY_SOURCE, 0,
+                 MPI_COMM_WORLD, &m_requests[i]);
+    }
+#else
+  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
+#endif
+}
+
+void
+GrantedTimeWindowMpiInterface::SendPacket (Ptr<Packet> p, const Time& rxTime, uint32_t node, uint32_t dev)
+{
+  NS_LOG_FUNCTION (this << p << rxTime.GetTimeStep () << node << dev);
+
+#ifdef NS3_MPI
+  SentBuffer sendBuf;
+  m_pendingTx.push_back (sendBuf);
+  std::list<SentBuffer>::reverse_iterator i = m_pendingTx.rbegin (); // Points to the last element
+
+  uint32_t serializedSize = p->GetSerializedSize ();
+  uint8_t* buffer =  new uint8_t[serializedSize + 16];
+  i->SetBuffer (buffer);
+  // Add the time, dest node and dest device
+  uint64_t t = rxTime.GetInteger ();
+  uint64_t* pTime = reinterpret_cast <uint64_t *> (buffer);
+  *pTime++ = t;
+  uint32_t* pData = reinterpret_cast<uint32_t *> (pTime);
+  *pData++ = node;
+  *pData++ = dev;
+  // Serialize the packet
+  p->Serialize (reinterpret_cast<uint8_t *> (pData), serializedSize);
+
+  // Find the system id for the destination node
+  Ptr<Node> destNode = NodeList::GetNode (node);
+  uint32_t nodeSysId = destNode->GetSystemId ();
+
+  MPI_Isend (reinterpret_cast<void *> (i->GetBuffer ()), serializedSize + 16, MPI_CHAR, nodeSysId,
+             0, MPI_COMM_WORLD, (i->GetRequest ()));
+  m_txCount++;
+#else
+  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
+#endif
+}
+
+void
+GrantedTimeWindowMpiInterface::ReceiveMessages ()
+{ 
+  NS_LOG_FUNCTION_NOARGS ();
+
+#ifdef NS3_MPI
+  // Poll the non-block reads to see if data arrived
+  while (true)
+    {
+      int flag = 0;
+      int index = 0;
+      MPI_Status status;
+
+      MPI_Testany (MpiInterface::GetSize (), m_requests, &index, &flag, &status);
+      if (!flag)
+        {
+          break;        // No more messages
+        }
+      int count;
+      MPI_Get_count (&status, MPI_CHAR, &count);
+      m_rxCount++; // Count this receive
+
+      // Get the meta data first
+      uint64_t* pTime = reinterpret_cast<uint64_t *> (m_pRxBuffers[index]);
+      uint64_t time = *pTime++;
+      uint32_t* pData = reinterpret_cast<uint32_t *> (pTime);
+      uint32_t node = *pData++;
+      uint32_t dev  = *pData++;
+
+      Time rxTime (time);
+
+      count -= sizeof (time) + sizeof (node) + sizeof (dev);
+
+      Ptr<Packet> p = Create<Packet> (reinterpret_cast<uint8_t *> (pData), count, true);
+
+      // Find the correct node/device to schedule receive event
+      Ptr<Node> pNode = NodeList::GetNode (node);
+      Ptr<MpiReceiver> pMpiRec = 0;
+      uint32_t nDevices = pNode->GetNDevices ();
+      for (uint32_t i = 0; i < nDevices; ++i)
+        {
+          Ptr<NetDevice> pThisDev = pNode->GetDevice (i);
+          if (pThisDev->GetIfIndex () == dev)
+            {
+              pMpiRec = pThisDev->GetObject<MpiReceiver> ();
+              break;
+            }
+        }
+
+      NS_ASSERT (pNode && pMpiRec);
+
+      // Schedule the rx event
+      Simulator::ScheduleWithContext (pNode->GetId (), rxTime - Simulator::Now (),
+                                      &MpiReceiver::Receive, pMpiRec, p);
+
+      // Re-queue the next read
+      MPI_Irecv (m_pRxBuffers[index], MAX_MPI_MSG_SIZE, MPI_CHAR, MPI_ANY_SOURCE, 0,
+                 MPI_COMM_WORLD, &m_requests[index]);
+    }
+#else
+  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
+#endif
+}
+
+void
+GrantedTimeWindowMpiInterface::TestSendComplete ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+#ifdef NS3_MPI
+  std::list<SentBuffer>::iterator i = m_pendingTx.begin ();
+  while (i != m_pendingTx.end ())
+    {
+      MPI_Status status;
+      int flag = 0;
+      MPI_Test (i->GetRequest (), &flag, &status);
+      std::list<SentBuffer>::iterator current = i; // Save current for erasing
+      i++;                                    // Advance to next
+      if (flag)
+        { // This message is complete
+          m_pendingTx.erase (current);
+        }
+    }
+#else
+  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
+#endif
+}
+
+void
+GrantedTimeWindowMpiInterface::Disable ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+#ifdef NS3_MPI
+  int flag = 0;
+  MPI_Initialized (&flag);
+  if (flag)
+    {
+      MPI_Finalize ();
+      m_enabled = false;
+      m_initialized = false;
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Cannot disable MPI environment without Initializing it first");
+    }
+#else
+  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
+#endif
+}
+
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/mpi/model/granted-time-window-mpi-interface.h ns-3.19/src/mpi/model/granted-time-window-mpi-interface.h
--- ns-3.18.1/src/mpi/model/granted-time-window-mpi-interface.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/granted-time-window-mpi-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,175 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: George Riley <riley@ece.gatech.edu>
+ *
+ */
+
+// This object contains static methods that provide an easy interface
+// to the necessary MPI information.
+
+#ifndef NS3_GRANTED_TIME_WINDOW_MPI_INTERFACE_H
+#define NS3_GRANTED_TIME_WINDOW_MPI_INTERFACE_H
+
+#include <stdint.h>
+#include <list>
+
+#include "ns3/nstime.h"
+#include "ns3/buffer.h"
+
+#include "parallel-communication-interface.h"
+
+#ifdef NS3_MPI
+#include "mpi.h"
+#else
+typedef void* MPI_Request;
+#endif
+
+namespace ns3 {
+
+/**
+ * maximum MPI message size for easy
+ * buffer creation
+ */
+const uint32_t MAX_MPI_MSG_SIZE = 2000;
+
+/**
+ * \ingroup mpi
+ *
+ * \brief Tracks non-blocking sends
+ *
+ * This class is used to keep track of the asynchronous non-blocking
+ * sends that have been posted.
+ */
+class SentBuffer
+{
+public:
+  SentBuffer ();
+  ~SentBuffer ();
+
+  /**
+   * \return pointer to sent buffer
+   */
+  uint8_t* GetBuffer ();
+  /**
+   * \param buffer pointer to sent buffer
+   */
+  void SetBuffer (uint8_t* buffer);
+  /**
+   * \return MPI request
+   */
+  MPI_Request* GetRequest ();
+
+private:
+  uint8_t* m_buffer;
+  MPI_Request m_request;
+};
+
+class Packet;
+
+/**
+ * \ingroup mpi
+ *
+ * \brief Interface between ns-3 and MPI
+ *
+ * Implements the interface used by the singleton parallel controller
+ * to interface between NS3 and the communications layer being
+ * used for inter-task packet transfers.
+ */
+class GrantedTimeWindowMpiInterface : public ParallelCommunicationInterface, Object
+{
+public:
+  static TypeId GetTypeId (void);
+
+  /**
+   * Delete all buffers
+   */
+  virtual void Destroy ();
+  /**
+   * \return MPI rank
+   */
+  virtual uint32_t GetSystemId ();
+  /**
+   * \return MPI size (number of systems)
+   */
+  virtual uint32_t GetSize ();
+  /**
+   * \return true if using MPI
+   */
+  virtual bool IsEnabled ();
+  /**
+   * \param pargc number of command line arguments
+   * \param pargv command line arguments
+   *
+   * Sets up MPI interface
+   */
+  virtual void Enable (int* pargc, char*** pargv);
+  /**
+   * Terminates the MPI environment by calling MPI_Finalize
+   * This function must be called after Destroy ()
+   * It also resets m_initialized, m_enabled
+   */
+  virtual void Disable ();
+  /**
+   * \param p packet to send
+   * \param rxTime received time at destination node
+   * \param node destination node
+   * \param dev destination device
+   *
+   * Serialize and send a packet to the specified node and net device
+   */
+  virtual void SendPacket (Ptr<Packet> p, const Time &rxTime, uint32_t node, uint32_t dev);
+  /**
+   * Check for received messages complete
+   */
+  static void ReceiveMessages ();
+  /**
+   * Check for completed sends
+   */
+  static void TestSendComplete ();
+  /**
+   * \return received count in packets
+   */
+  static uint32_t GetRxCount ();
+  /**
+   * \return transmitted count in packets
+   */
+  static uint32_t GetTxCount ();
+
+private:
+  static uint32_t m_sid;
+  static uint32_t m_size;
+
+  // Total packets received
+  static uint32_t m_rxCount;
+
+  // Total packets sent
+  static uint32_t m_txCount;
+  static bool     m_initialized;
+  static bool     m_enabled;
+
+  // Pending non-blocking receives
+  static MPI_Request* m_requests;
+
+  // Data buffers for non-blocking reads
+  static char**   m_pRxBuffers;
+
+  // List of pending non-blocking sends
+  static std::list<SentBuffer> m_pendingTx;
+};
+
+} // namespace ns3
+
+#endif /* NS3_GRANTED_TIME_WINDOW_MPI_INTERFACE_H */
diff -Naur ns-3.18.1/src/mpi/model/mpi-interface.cc ns-3.19/src/mpi/model/mpi-interface.cc
--- ns-3.18.1/src/mpi/model/mpi-interface.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/model/mpi-interface.cc	2013-12-20 09:44:50.000000000 -0800
@@ -1,5 +1,7 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation;
@@ -13,296 +15,114 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: George Riley <riley@ece.gatech.edu>
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
  */
 
-// This object contains static methods that provide an easy interface
-// to the necessary MPI information.
-
-#include <iostream>
-#include <iomanip>
-#include <list>
-
 #include "mpi-interface.h"
-#include "mpi-receiver.h"
 
-#include "ns3/node.h"
-#include "ns3/node-list.h"
-#include "ns3/net-device.h"
-#include "ns3/simulator.h"
-#include "ns3/simulator-impl.h"
-#include "ns3/nstime.h"
-
-#ifdef NS3_MPI
-#include <mpi.h>
-#endif
-
-namespace ns3 {
-
-SentBuffer::SentBuffer ()
-{
-  m_buffer = 0;
-  m_request = 0;
-}
+#include <ns3/global-value.h>
+#include <ns3/string.h>
+#include <ns3/log.h>
 
-SentBuffer::~SentBuffer ()
-{
-  delete [] m_buffer;
-}
+#include "null-message-mpi-interface.h"
+#include "granted-time-window-mpi-interface.h"
 
-uint8_t*
-SentBuffer::GetBuffer ()
-{
-  return m_buffer;
-}
+NS_LOG_COMPONENT_DEFINE ("MpiInterface");
 
-void
-SentBuffer::SetBuffer (uint8_t* buffer)
-{
-  m_buffer = buffer;
-}
-
-#ifdef NS3_MPI
-MPI_Request*
-SentBuffer::GetRequest ()
-{
-  return &m_request;
-}
-#endif
+namespace ns3 {
 
-uint32_t              MpiInterface::m_sid = 0;
-uint32_t              MpiInterface::m_size = 1;
-bool                  MpiInterface::m_initialized = false;
-bool                  MpiInterface::m_enabled = false;
-uint32_t              MpiInterface::m_rxCount = 0;
-uint32_t              MpiInterface::m_txCount = 0;
-std::list<SentBuffer> MpiInterface::m_pendingTx;
-
-#ifdef NS3_MPI
-MPI_Request* MpiInterface::m_requests;
-char**       MpiInterface::m_pRxBuffers;
-#endif
+ParallelCommunicationInterface* MpiInterface::g_parallelCommunicationInterface = 0;
 
 void
 MpiInterface::Destroy ()
 {
-#ifdef NS3_MPI
-  for (uint32_t i = 0; i < GetSize (); ++i)
-    {
-      delete [] m_pRxBuffers[i];
-    }
-  delete [] m_pRxBuffers;
-  delete [] m_requests;
-
-  m_pendingTx.clear ();
-#endif
-}
-
-uint32_t
-MpiInterface::GetRxCount ()
-{
-  return m_rxCount;
-}
-
-uint32_t
-MpiInterface::GetTxCount ()
-{
-  return m_txCount;
+  NS_ASSERT (g_parallelCommunicationInterface);
+  g_parallelCommunicationInterface->Destroy ();
 }
 
 uint32_t
 MpiInterface::GetSystemId ()
 {
-  if (!m_initialized)
-    {
-      Simulator::GetImplementation ();
-      m_initialized = true;
-    }
-  return m_sid;
+  if ( g_parallelCommunicationInterface )
+    return g_parallelCommunicationInterface->GetSystemId ();
+  else
+    return 0;
 }
 
 uint32_t
 MpiInterface::GetSize ()
 {
-  if (!m_initialized)
-    {
-      Simulator::GetImplementation ();
-      m_initialized = true;
-    }
-  return m_size;
+  if ( g_parallelCommunicationInterface )
+    return g_parallelCommunicationInterface->GetSize ();
+  else
+    return 1;
 }
 
 bool
 MpiInterface::IsEnabled ()
 {
-  if (!m_initialized)
+  if (g_parallelCommunicationInterface)
     {
-      Simulator::GetImplementation ();
-      m_initialized = true;
+      return g_parallelCommunicationInterface->IsEnabled ();
     }
-  return m_enabled;
-}
-
-void
-MpiInterface::Enable (int* pargc, char*** pargv)
-{
-#ifdef NS3_MPI
-  // Initialize the MPI interface
-  MPI_Init (pargc, pargv);
-  MPI_Barrier (MPI_COMM_WORLD);
-  MPI_Comm_rank (MPI_COMM_WORLD, reinterpret_cast <int *> (&m_sid));
-  MPI_Comm_size (MPI_COMM_WORLD, reinterpret_cast <int *> (&m_size));
-  m_enabled = true;
-  m_initialized = true;
-  // Post a non-blocking receive for all peers
-  m_pRxBuffers = new char*[m_size];
-  m_requests = new MPI_Request[m_size];
-  for (uint32_t i = 0; i < GetSize (); ++i)
+  else
     {
-      m_pRxBuffers[i] = new char[MAX_MPI_MSG_SIZE];
-      MPI_Irecv (m_pRxBuffers[i], MAX_MPI_MSG_SIZE, MPI_CHAR, MPI_ANY_SOURCE, 0,
-                 MPI_COMM_WORLD, &m_requests[i]);
+      return false;
     }
-#else
-  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
-#endif
 }
 
 void
-MpiInterface::SendPacket (Ptr<Packet> p, const Time& rxTime, uint32_t node, uint32_t dev)
+MpiInterface::Enable (int* pargc, char*** pargv)
 {
-#ifdef NS3_MPI
-  SentBuffer sendBuf;
-  m_pendingTx.push_back (sendBuf);
-  std::list<SentBuffer>::reverse_iterator i = m_pendingTx.rbegin (); // Points to the last element
-
-  uint32_t serializedSize = p->GetSerializedSize ();
-  uint8_t* buffer =  new uint8_t[serializedSize + 16];
-  i->SetBuffer (buffer);
-  // Add the time, dest node and dest device
-  uint64_t t = rxTime.GetNanoSeconds ();
-  uint64_t* pTime = reinterpret_cast <uint64_t *> (buffer);
-  *pTime++ = t;
-  uint32_t* pData = reinterpret_cast<uint32_t *> (pTime);
-  *pData++ = node;
-  *pData++ = dev;
-  // Serialize the packet
-  p->Serialize (reinterpret_cast<uint8_t *> (pData), serializedSize);
-
-  // Find the system id for the destination node
-  Ptr<Node> destNode = NodeList::GetNode (node);
-  uint32_t nodeSysId = destNode->GetSystemId ();
-
-  MPI_Isend (reinterpret_cast<void *> (i->GetBuffer ()), serializedSize + 16, MPI_CHAR, nodeSysId,
-             0, MPI_COMM_WORLD, (i->GetRequest ()));
-  m_txCount++;
-#else
-  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
-#endif
-}
+  StringValue simulationTypeValue;
+  bool useDefault = true;
 
-void
-MpiInterface::ReceiveMessages ()
-{ // Poll the non-block reads to see if data arrived
-#ifdef NS3_MPI
-  while (true)
+  if (GlobalValue::GetValueByNameFailSafe ("SimulatorImplementationType", simulationTypeValue))
     {
-      int flag = 0;
-      int index = 0;
-      MPI_Status status;
+      std::string simulationType = simulationTypeValue.Get ();
 
-      MPI_Testany (GetSize (), m_requests, &index, &flag, &status);
-      if (!flag)
+      // Set communication interface based on the simulation type being used.
+      // Defaults to synchronous.
+      if (simulationType.compare ("ns3::NullMessageSimulatorImpl") == 0)
         {
-          break;        // No more messages
+          g_parallelCommunicationInterface = new NullMessageMpiInterface ();
+          useDefault = false;
         }
-      int count;
-      MPI_Get_count (&status, MPI_CHAR, &count);
-      m_rxCount++; // Count this receive
-
-      // Get the meta data first
-      uint64_t* pTime = reinterpret_cast<uint64_t *> (m_pRxBuffers[index]);
-      uint64_t nanoSeconds = *pTime++;
-      uint32_t* pData = reinterpret_cast<uint32_t *> (pTime);
-      uint32_t node = *pData++;
-      uint32_t dev  = *pData++;
-
-      Time rxTime = NanoSeconds (nanoSeconds);
-
-      count -= sizeof (nanoSeconds) + sizeof (node) + sizeof (dev);
-
-      Ptr<Packet> p = Create<Packet> (reinterpret_cast<uint8_t *> (pData), count, true);
-
-      // Find the correct node/device to schedule receive event
-      Ptr<Node> pNode = NodeList::GetNode (node);
-      Ptr<MpiReceiver> pMpiRec = 0;
-      uint32_t nDevices = pNode->GetNDevices ();
-      for (uint32_t i = 0; i < nDevices; ++i)
+      else if (simulationType.compare ("ns3::DistributedSimulatorImpl") == 0)
         {
-          Ptr<NetDevice> pThisDev = pNode->GetDevice (i);
-          if (pThisDev->GetIfIndex () == dev)
-            {
-              pMpiRec = pThisDev->GetObject<MpiReceiver> ();
-              break;
-            }
+          g_parallelCommunicationInterface = new GrantedTimeWindowMpiInterface ();
+          useDefault = false;
         }
+    }
 
-      NS_ASSERT (pNode && pMpiRec);
-
-      // Schedule the rx event
-      Simulator::ScheduleWithContext (pNode->GetId (), rxTime - Simulator::Now (),
-                                      &MpiReceiver::Receive, pMpiRec, p);
-
-      // Re-queue the next read
-      MPI_Irecv (m_pRxBuffers[index], MAX_MPI_MSG_SIZE, MPI_CHAR, MPI_ANY_SOURCE, 0,
-                 MPI_COMM_WORLD, &m_requests[index]);
+  // User did not specify a valid parallel simulator; use the default.
+  if (useDefault)
+    {
+      g_parallelCommunicationInterface = new GrantedTimeWindowMpiInterface ();
+      GlobalValue::Bind ("SimulatorImplementationType",
+                         StringValue ("ns3::DistributedSimulatorImpl"));
+      NS_LOG_WARN ("SimulatorImplementationType was set to non-parallel simulator; setting type to ns3::DistributedSimulatorImp");
     }
-#else
-  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
-#endif
+
+  g_parallelCommunicationInterface->Enable (pargc, pargv);
 }
 
 void
-MpiInterface::TestSendComplete ()
+MpiInterface::SendPacket (Ptr<Packet> p, const Time& rxTime, uint32_t node, uint32_t dev)
 {
-#ifdef NS3_MPI
-  std::list<SentBuffer>::iterator i = m_pendingTx.begin ();
-  while (i != m_pendingTx.end ())
-    {
-      MPI_Status status;
-      int flag = 0;
-      MPI_Test (i->GetRequest (), &flag, &status);
-      std::list<SentBuffer>::iterator current = i; // Save current for erasing
-      i++;                                    // Advance to next
-      if (flag)
-        { // This message is complete
-          m_pendingTx.erase (current);
-        }
-    }
-#else
-  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
-#endif
+  NS_ASSERT (g_parallelCommunicationInterface);
+  g_parallelCommunicationInterface->SendPacket (p, rxTime, node, dev);
 }
 
-void 
+
+void
 MpiInterface::Disable ()
 {
-#ifdef NS3_MPI
-  int flag = 0;
-  MPI_Initialized (&flag);
-  if (flag)
-    {
-      MPI_Finalize ();
-      m_enabled = false;
-      m_initialized = false;
-    }
-  else
-    {
-      NS_FATAL_ERROR ("Cannot disable MPI environment without Initializing it first");
-    }
-#else
-  NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
-#endif
+  NS_ASSERT (g_parallelCommunicationInterface);
+  g_parallelCommunicationInterface->Disable ();
+  delete g_parallelCommunicationInterface;
+  g_parallelCommunicationInterface = 0;
 }
 
 
diff -Naur ns-3.18.1/src/mpi/model/mpi-interface.h ns-3.19/src/mpi/model/mpi-interface.h
--- ns-3.18.1/src/mpi/model/mpi-interface.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/model/mpi-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -1,5 +1,7 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation;
@@ -13,109 +15,74 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: George Riley <riley@ece.gatech.edu>
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
  */
 
-// This object contains static methods that provide an easy interface
-// to the necessary MPI information.
-
 #ifndef NS3_MPI_INTERFACE_H
 #define NS3_MPI_INTERFACE_H
 
-#include <stdint.h>
-#include <list>
-
-#include "ns3/nstime.h"
-#include "ns3/buffer.h"
-
-#if defined(NS3_OPENMPI)
-struct ompi_request_t;
-typedef struct ompi_request_t* MPI_Request;
-#elif defined(NS3_MPICH)
-typedef int MPI_Request;
-#else
-typedef void* MPI_Request;
-#endif
+#include <ns3/nstime.h>
+#include <ns3/packet.h>
 
 namespace ns3 {
-
 /**
  * \defgroup mpi MPI Distributed Simulation
  *
  */
 
-/**
- * maximum MPI message size for easy
- * buffer creation
- */
-const uint32_t MAX_MPI_MSG_SIZE = 2000;
+class ParallelCommunicationInterface;
 
 /**
  * \ingroup mpi
  *
- * Define a class for tracking the non-block sends
- */
-class SentBuffer
-{
-public:
-  SentBuffer ();
-  ~SentBuffer ();
-
-  /**
-   * \return pointer to sent buffer
-   */
-  uint8_t* GetBuffer ();
-  /**
-   * \param buffer pointer to sent buffer
-   */
-  void SetBuffer (uint8_t* buffer);
-  /**
-   * \return MPI request
-   */
-  MPI_Request* GetRequest ();
-
-private:
-  uint8_t* m_buffer;
-  MPI_Request m_request;
-};
-
-class Packet;
-
-/**
- * \ingroup mpi
+ * \brief Singleton used to interface to the communications infrastructure
+ * when running NS3 in parallel.  
  *
- * Interface between ns-3 and MPI
+ * Delegates the implementation to the specific parallel
+ * infrastructure being used.  Implementation is defined in the
+ * ParallelCommunicationInterface virtual base class; this API mirrors
+ * that interface.  This singleton is responsible for instantiating an
+ * instance of the communication interface based on
+ * SimulatorImplementationType attribute in ns3::GlobalValues.  The
+ * attribute must be set before Enable is invoked.
  */
 class MpiInterface
 {
 public:
   /**
-   * Delete all buffers
+   * Deletes storage used by the parallel environment.
    */
   static void Destroy ();
   /**
-   * \return MPI rank
+   * \return system identification
+   *
+   * When running a sequential simulation this will return a systemID of 0.
    */
   static uint32_t GetSystemId ();
   /**
-   * \return MPI size (number of systems)
+   * \return number of parallel tasks
+   *
+   * When running a sequential simulation this will return a size of 1.
    */
   static uint32_t GetSize ();
   /**
-   * \return true if using MPI
+   * \return true if parallel communication is enabled
    */
   static bool IsEnabled ();
   /**
    * \param pargc number of command line arguments
    * \param pargv command line arguments
    *
-   * Sets up MPI interface
+   * \brief Sets up parallel communication interface.
+   *
+   * SimulatorImplementationType attribute in ns3::GlobalValues must be set before
+   * Enable is invoked.
    */
   static void Enable (int* pargc, char*** pargv);
   /**
-   * Terminates the MPI environment by calling MPI_Finalize
+   * Terminates the parallel environment.
    * This function must be called after Destroy ()
-   * It also resets m_initialized, m_enabled
    */
   static void Disable ();
   /**
@@ -127,43 +94,12 @@
    * Serialize and send a packet to the specified node and net device
    */
   static void SendPacket (Ptr<Packet> p, const Time &rxTime, uint32_t node, uint32_t dev);
-  /**
-   * Check for received messages complete
-   */
-  static void ReceiveMessages ();
-  /**
-   * Check for completed sends
-   */
-  static void TestSendComplete ();
-  /**
-   * \return received count in packets
-   */
-  static uint32_t GetRxCount ();
-  /**
-   * \return transmitted count in packets
-   */
-  static uint32_t GetTxCount ();
-
 private:
-  static uint32_t m_sid;
-  static uint32_t m_size;
-
-  // Total packets received
-  static uint32_t m_rxCount;
 
-  // Total packets sent
-  static uint32_t m_txCount;
-  static bool     m_initialized;
-  static bool     m_enabled;
-
-  // Pending non-blocking receives
-  static MPI_Request* m_requests;
-
-  // Data buffers for non-blocking reads
-  static char**   m_pRxBuffers;
-
-  // List of pending non-blocking sends
-  static std::list<SentBuffer> m_pendingTx;
+  /**
+   * Static instance of the instantiated parallel controller.
+   */
+  static ParallelCommunicationInterface* g_parallelCommunicationInterface;
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/mpi/model/mpi-receiver.cc ns-3.19/src/mpi/model/mpi-receiver.cc
--- ns-3.18.1/src/mpi/model/mpi-receiver.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/model/mpi-receiver.cc	2013-12-20 09:44:50.000000000 -0800
@@ -33,13 +33,13 @@
 {
 }
 
-void 
+void
 MpiReceiver::SetReceiveCallback (Callback<void, Ptr<Packet> > callback)
 {
   m_rxCallback = callback;
 }
 
-void 
+void
 MpiReceiver::Receive (Ptr<Packet> p)
 {
   NS_ASSERT (!m_rxCallback.IsNull ());
diff -Naur ns-3.18.1/src/mpi/model/mpi-receiver.h ns-3.19/src/mpi/model/mpi-receiver.h
--- ns-3.18.1/src/mpi/model/mpi-receiver.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/model/mpi-receiver.h	2013-12-20 09:44:50.000000000 -0800
@@ -16,7 +16,7 @@
  * Author: George Riley <riley@ece.gatech.edu>
  */
 
-// Provides an interface to aggregate to MPI-compatible NetDevices 
+// Provides an interface to aggregate to MPI-compatible NetDevices
 
 #ifndef NS3_MPI_RECEIVER_H
 #define NS3_MPI_RECEIVER_H
@@ -29,8 +29,8 @@
 /**
  * \ingroup mpi
  *
- * Class to aggregate to a NetDevice if it supports MPI capability
- * 
+ * \brief Class to aggregate to a NetDevice if it supports MPI capability
+ *
  * MpiInterface::ReceiveMessages () needs to send packets to a NetDevice
  * Receive() method.  Since each NetDevice's Receive() method is specific
  * to the derived class, and since we do not know whether such a NetDevice
diff -Naur ns-3.18.1/src/mpi/model/null-message-mpi-interface.cc ns-3.19/src/mpi/model/null-message-mpi-interface.cc
--- ns-3.18.1/src/mpi/model/null-message-mpi-interface.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/null-message-mpi-interface.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,460 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#include "null-message-mpi-interface.h"
+
+#include "null-message-simulator-impl.h"
+#include "remote-channel-bundle-manager.h"
+#include "remote-channel-bundle.h"
+
+#include "ns3/mpi-receiver.h"
+#include "ns3/node.h"
+#include "ns3/node-list.h"
+#include "ns3/net-device.h"
+#include "ns3/nstime.h"
+#include "ns3/simulator.h"
+#include "ns3/log.h"
+
+#ifdef NS3_MPI
+#include <mpi.h>
+#endif
+
+#include <iostream>
+#include <iomanip>
+#include <list>
+
+NS_LOG_COMPONENT_DEFINE ("NullMessageMpiInterface");
+
+namespace ns3 {
+
+/**
+ * maximum MPI message size for easy
+ * buffer creation
+ */
+const uint32_t NULL_MESSAGE_MAX_MPI_MSG_SIZE = 2000;
+
+
+NullMessageSentBuffer::NullMessageSentBuffer ()
+{
+  m_buffer = 0;
+  m_request = 0;
+}
+
+NullMessageSentBuffer::~NullMessageSentBuffer ()
+{
+  delete [] m_buffer;
+}
+
+uint8_t*
+NullMessageSentBuffer::GetBuffer ()
+{
+  return m_buffer;
+}
+
+void
+NullMessageSentBuffer::SetBuffer (uint8_t* buffer)
+{
+  m_buffer = buffer;
+}
+
+MPI_Request*
+NullMessageSentBuffer::GetRequest ()
+{
+  return &m_request;
+}
+
+uint32_t              NullMessageMpiInterface::g_sid = 0;
+uint32_t              NullMessageMpiInterface::g_size = 1;
+uint32_t              NullMessageMpiInterface::g_numNeighbors = 0;
+bool                  NullMessageMpiInterface::g_initialized = false;
+bool                  NullMessageMpiInterface::g_enabled = false;
+std::list<NullMessageSentBuffer> NullMessageMpiInterface::g_pendingTx;
+
+MPI_Request* NullMessageMpiInterface::g_requests;
+char**       NullMessageMpiInterface::g_pRxBuffers;
+
+NullMessageMpiInterface::NullMessageMpiInterface ()
+{
+  NS_LOG_FUNCTION (this);
+
+#ifndef NS3_MPI
+  /*
+   * This class can only be constructed if MPI is available.  Fail if an 
+   * attempt is made to instantiate this class without MPI.
+   */
+  NS_FATAL_ERROR ("Must compile with MPI if Null Message simulator is used, see --enable-mpi option for waf");
+#endif
+}
+
+NullMessageMpiInterface::~NullMessageMpiInterface ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+NullMessageMpiInterface::Destroy ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+uint32_t
+NullMessageMpiInterface::GetSystemId ()
+{
+  NS_ASSERT (g_enabled);
+  return g_sid;
+}
+
+uint32_t
+NullMessageMpiInterface::GetSize ()
+{
+  NS_ASSERT (g_enabled);
+  return g_size;
+}
+
+bool
+NullMessageMpiInterface::IsEnabled ()
+{
+  if (!g_initialized)
+    {
+      Simulator::GetImplementation ();
+      g_initialized = true;
+    }
+  return g_enabled;
+}
+
+void
+NullMessageMpiInterface::Enable (int* pargc, char*** pargv)
+{
+  NS_LOG_FUNCTION (this << *pargc);
+#ifdef NS3_MPI
+
+  // Initialize the MPI interface
+  MPI_Init (pargc, pargv);
+  MPI_Barrier (MPI_COMM_WORLD);
+
+  // SystemId and Size are unit32_t in interface but MPI uses int so convert.
+  int mpiSystemId;
+  int mpiSize;
+  MPI_Comm_rank (MPI_COMM_WORLD, &mpiSystemId);
+  MPI_Comm_size (MPI_COMM_WORLD, &mpiSize);
+
+  g_sid = mpiSystemId;
+  g_size = mpiSize;
+
+  g_enabled = true;
+  g_initialized = true;
+
+#endif
+}
+
+void 
+NullMessageMpiInterface::InitializeSendReceiveBuffers(void)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+#ifdef NS3_MPI
+  NS_ASSERT (g_enabled);
+
+  g_numNeighbors = RemoteChannelBundleManager::Size();
+
+  // Post a non-blocking receive for all peers
+  g_requests = new MPI_Request[g_numNeighbors];
+  g_pRxBuffers = new char*[g_numNeighbors];
+  int index = 0;
+  for (uint32_t rank = 0; rank < g_size; ++rank)
+    {
+      Ptr<RemoteChannelBundle> bundle = RemoteChannelBundleManager::Find(rank);
+      if (bundle) 
+        {
+          g_pRxBuffers[index] = new char[NULL_MESSAGE_MAX_MPI_MSG_SIZE];
+          MPI_Irecv (g_pRxBuffers[index], NULL_MESSAGE_MAX_MPI_MSG_SIZE, MPI_CHAR, rank, 0,
+                     MPI_COMM_WORLD, &g_requests[index]);
+          ++index;
+        }
+    }
+#endif
+}
+
+void
+NullMessageMpiInterface::SendPacket (Ptr<Packet> p, const Time& rxTime, uint32_t node, uint32_t dev)
+{
+  NS_LOG_FUNCTION (this << p << rxTime.GetTimeStep () << node << dev);
+
+  NS_ASSERT (g_enabled);
+
+#ifdef NS3_MPI
+
+  // Find the system id for the destination node
+  Ptr<Node> destNode = NodeList::GetNode (node);
+  uint32_t nodeSysId = destNode->GetSystemId ();
+
+  NullMessageSentBuffer sendBuf;
+  g_pendingTx.push_back (sendBuf);
+  std::list<NullMessageSentBuffer>::reverse_iterator iter = g_pendingTx.rbegin (); // Points to the last element
+
+  uint32_t serializedSize = p->GetSerializedSize ();
+  uint32_t bufferSize = serializedSize + ( 2 * sizeof (uint64_t) ) + ( 2 * sizeof (uint32_t) );
+  uint8_t* buffer =  new uint8_t[bufferSize];
+  iter->SetBuffer (buffer);
+  // Add the time, dest node and dest device
+  uint64_t t = rxTime.GetInteger ();
+  uint64_t* pTime = reinterpret_cast <uint64_t *> (buffer);
+  *pTime++ = t;
+
+  Time guarantee_update = NullMessageSimulatorImpl::GetInstance ()->CalculateGuaranteeTime (nodeSysId);
+  *pTime++ = guarantee_update.GetTimeStep ();
+
+  uint32_t* pData = reinterpret_cast<uint32_t *> (pTime);
+  *pData++ = node;
+  *pData++ = dev;
+  // Serialize the packet
+  p->Serialize (reinterpret_cast<uint8_t *> (pData), serializedSize);
+
+  MPI_Isend (reinterpret_cast<void *> (iter->GetBuffer ()), bufferSize, MPI_CHAR, nodeSysId,
+             0, MPI_COMM_WORLD, (iter->GetRequest ()));
+
+  NullMessageSimulatorImpl::GetInstance ()->RescheduleNullMessageEvent (nodeSysId);
+
+#endif
+}
+
+void
+NullMessageMpiInterface::SendNullMessage (const Time& guarantee_update, Ptr<RemoteChannelBundle> bundle)
+{
+  NS_LOG_FUNCTION (guarantee_update.GetTimeStep () << bundle);
+
+  NS_ASSERT (g_enabled);
+
+#ifdef NS3_MPI
+
+  NullMessageSentBuffer sendBuf;
+  g_pendingTx.push_back (sendBuf);
+  std::list<NullMessageSentBuffer>::reverse_iterator iter = g_pendingTx.rbegin (); // Points to the last element
+
+  uint32_t bufferSize = 2 * sizeof (uint64_t) + 2 * sizeof (uint32_t);
+  uint8_t* buffer =  new uint8_t[bufferSize];
+  iter->SetBuffer (buffer);
+  // Add the time, dest node and dest device
+  uint64_t* pTime = reinterpret_cast <uint64_t *> (buffer);
+  *pTime++ = 0;
+  *pTime++ = guarantee_update.GetInteger ();
+  uint32_t* pData = reinterpret_cast<uint32_t *> (pTime);
+  *pData++ = 0;
+  *pData++ = 0;
+
+  // Find the system id for the destination MPI rank
+  uint32_t nodeSysId = bundle->GetSystemId ();
+
+  MPI_Isend (reinterpret_cast<void *> (iter->GetBuffer ()), bufferSize, MPI_CHAR, nodeSysId,
+             0, MPI_COMM_WORLD, (iter->GetRequest ()));
+#endif
+}
+
+void
+NullMessageMpiInterface::ReceiveMessagesBlocking ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  ReceiveMessages(true);
+}
+
+
+void
+NullMessageMpiInterface::ReceiveMessagesNonBlocking ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  ReceiveMessages(false);
+}
+
+
+void
+NullMessageMpiInterface::ReceiveMessages (bool blocking)
+{
+  NS_LOG_FUNCTION (blocking);
+
+  NS_ASSERT (g_enabled);
+
+#ifdef NS3_MPI
+
+  // stop flag set to true when no more messages are found to
+  // process.
+  bool stop = false;
+
+
+  if (!g_numNeighbors) {
+    // Not communicating with anyone.
+    return;
+  }
+
+  do
+    {
+      int messageReceived = 0;
+      int index = 0;
+      MPI_Status status;
+
+      if (blocking)
+        {
+          MPI_Waitany (g_numNeighbors, g_requests, &index, &status);
+          messageReceived = 1; /* Wait always implies message was received */
+          stop = true;
+        }
+      else
+        {
+          MPI_Testany (g_numNeighbors, g_requests, &index, &messageReceived, &status);
+        }
+
+      if (messageReceived)
+        {
+          int count;
+          MPI_Get_count (&status, MPI_CHAR, &count);
+
+          // Get the meta data first
+          uint64_t* pTime = reinterpret_cast<uint64_t *> (g_pRxBuffers[index]);
+          uint64_t time = *pTime++;
+          uint64_t guaranteeUpdate = *pTime++;
+
+          uint32_t* pData = reinterpret_cast<uint32_t *> (pTime);
+          uint32_t node = *pData++;
+          uint32_t dev  = *pData++;
+
+          Time rxTime (time);
+
+          // rxtime == 0 means this is a Null Message
+          if (rxTime > 0)
+            {
+              count -= sizeof (time) + sizeof (guaranteeUpdate) + sizeof (node) + sizeof (dev);
+
+              Ptr<Packet> p = Create<Packet> (reinterpret_cast<uint8_t *> (pData), count, true);
+
+              // Find the correct node/device to schedule receive event
+              Ptr<Node> pNode = NodeList::GetNode (node);
+              Ptr<MpiReceiver> pMpiRec = 0;
+              uint32_t nDevices = pNode->GetNDevices ();
+              for (uint32_t i = 0; i < nDevices; ++i)
+                {
+                  Ptr<NetDevice> pThisDev = pNode->GetDevice (i);
+                  if (pThisDev->GetIfIndex () == dev)
+                    {
+                      pMpiRec = pThisDev->GetObject<MpiReceiver> ();
+                      break;
+                    }
+                }
+              NS_ASSERT (pNode && pMpiRec);
+
+              // Schedule the rx event
+              Simulator::ScheduleWithContext (pNode->GetId (), rxTime - Simulator::Now (),
+                                              &MpiReceiver::Receive, pMpiRec, p);
+
+            }
+
+          // Update guarantee time for both packet receives and Null Messages.
+          Ptr<RemoteChannelBundle> bundle = RemoteChannelBundleManager::Find (status.MPI_SOURCE);
+          NS_ASSERT (bundle);
+
+          bundle->SetGuaranteeTime (Time (guaranteeUpdate));
+
+          // Re-queue the next read
+          MPI_Irecv (g_pRxBuffers[index], NULL_MESSAGE_MAX_MPI_MSG_SIZE, MPI_CHAR, status.MPI_SOURCE, 0,
+                     MPI_COMM_WORLD, &g_requests[index]);
+
+        }
+      else
+        {
+          // if non-blocking and no message received in testany then stop message loop
+          stop = true;
+        }
+    }
+  while (!stop);
+#endif
+}
+
+void
+NullMessageMpiInterface::TestSendComplete ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  NS_ASSERT (g_enabled);
+
+#ifdef NS3_MPI
+  std::list<NullMessageSentBuffer>::iterator iter = g_pendingTx.begin ();
+  while (iter != g_pendingTx.end ())
+    {
+      MPI_Status status;
+      int flag = 0;
+      MPI_Test (iter->GetRequest (), &flag, &status);
+      std::list<NullMessageSentBuffer>::iterator current = iter; // Save current for erasing
+      ++iter; // Advance to next
+      if (flag)
+        { // This message is complete
+          g_pendingTx.erase (current);
+        }
+    }
+#endif
+}
+
+void
+NullMessageMpiInterface::Disable ()
+{
+  NS_LOG_FUNCTION (this);
+
+#ifdef NS3_MPI
+  int flag = 0;
+  MPI_Initialized (&flag);
+  if (flag)
+    {
+
+      for (std::list<NullMessageSentBuffer>::iterator iter = g_pendingTx.begin ();
+           iter != g_pendingTx.end ();
+           ++iter)
+        {
+          MPI_Cancel (iter->GetRequest ());
+          MPI_Request_free (iter->GetRequest ());
+        }
+
+      for (uint32_t i = 0; i < g_numNeighbors; ++i)
+        {
+          MPI_Cancel (&g_requests[i]);
+          MPI_Request_free (&g_requests[i]);
+        }
+
+      MPI_Finalize ();
+
+      for (uint32_t i = 0; i < g_numNeighbors; ++i)
+        {
+          delete [] g_pRxBuffers[i];
+        }
+      delete [] g_pRxBuffers;
+      delete [] g_requests;
+
+      g_pendingTx.clear ();
+
+      g_enabled = false;
+      g_initialized = false;
+
+    }
+  else
+    {
+      NS_FATAL_ERROR ("Cannot disable MPI environment without Initializing it first");
+    }
+#endif
+}
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/mpi/model/null-message-mpi-interface.h ns-3.19/src/mpi/model/null-message-mpi-interface.h
--- ns-3.18.1/src/mpi/model/null-message-mpi-interface.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/null-message-mpi-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,228 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#ifndef NS3_NULLMESSAGE_MPI_INTERFACE_H
+#define NS3_NULLMESSAGE_MPI_INTERFACE_H
+
+#include "parallel-communication-interface.h"
+
+#include <ns3/nstime.h>
+#include <ns3/buffer.h>
+
+#ifdef NS3_MPI
+#include "mpi.h"
+#else
+typedef void* MPI_Request;
+#endif
+
+#include <list>
+
+namespace ns3 {
+
+class RemoteChannelBundle;
+class Packet;
+
+/**
+ * \ingroup mpi
+ *
+ * \brief Non-blocking send buffers for Null Message implementation.
+ * 
+ * One buffer is allocated for each non-blocking send.
+ */
+class NullMessageSentBuffer
+{
+public:
+  NullMessageSentBuffer ();
+  ~NullMessageSentBuffer ();
+
+  /**
+   * \return pointer to sent buffer
+   */
+  uint8_t* GetBuffer ();
+  /**
+   * \param buffer pointer to sent buffer
+   */
+  void SetBuffer (uint8_t* buffer);
+  /**
+   * \return MPI request
+   */
+  MPI_Request* GetRequest ();
+
+private:
+
+  /**
+   * Buffer for send.
+   */
+  uint8_t* m_buffer;
+
+  /**
+   * MPI request posted for the send.
+   */
+  MPI_Request m_request;
+};
+
+/**
+ * \ingroup mpi
+ *
+ * \brief Interface between ns-3 and MPI for the Null Message
+ * distributed simulation implementation.
+ */
+class NullMessageMpiInterface : public ParallelCommunicationInterface
+{
+public:
+
+  NullMessageMpiInterface ();
+  ~NullMessageMpiInterface ();
+
+  /**
+   * Delete all buffers
+   */
+  virtual void Destroy ();
+  /**
+   * \return system id (MPI rank)
+   */
+  virtual uint32_t GetSystemId ();
+  /**
+   * \return number of systems (MPI size)
+   */
+  virtual uint32_t GetSize ();
+  /**
+   * \return true if interface is enabled
+   */
+  virtual bool IsEnabled ();
+  /**
+   * \param pargc number of command line arguments
+   * \param pargv command line arguments
+   *
+   * Sets up interface.   Calls MPI Init and 
+   * posts receives.
+   */
+  virtual void Enable (int* pargc, char*** pargv);
+  /**
+   * Terminates the MPI environment by calling MPI_Finalize This
+   * function must be called after Destroy ().  Resets m_initialized
+   * and m_enabled.
+   */
+  virtual void Disable ();
+  /**
+   * \param p packet to send
+   * \param rxTime received time at destination node
+   * \param node destination node
+   * \param dev destination device
+   *
+   * Serialize and send a packet to the specified node and net device.
+   *
+   * \internal
+   * The MPI buffer format packs a delivery information and the serialized packet.
+   *
+   * uint64_t time the packed should be delivered
+   * uint64_t guarantee time for the Null Message algorithm.
+   * uint32_t node id of destination
+   * unit32_t dev id on destination
+   * uint8_t[] serialized packet
+   * \endinternal
+   */
+  virtual void SendPacket (Ptr<Packet> p, const Time &rxTime, uint32_t node, uint32_t dev);
+  /**
+   * \param guaranteeUpdate guarantee update time for the Null Message
+   * \bundle the destination bundle for the Null Message.
+   *
+   * \brief Send a Null Message to across the specified bundle.  
+   *
+   * Guarantee update time is the lower bound time on the next
+   * possible event from this MPI task to the remote MPI task across
+   * the bundle.  Remote task may execute events up to time.
+   *
+   * Null Messages are sent when a packet has not been sent across
+   * this bundle in order to allow time advancement on the remote
+   * MPI task.
+   *
+   * \internal
+   * The Null Message MPI buffer format is based on the format for sending a packet with
+   * several fields set to 0 to signal that it is a Null Message.  Overloading the normal packet
+   * format simplifies receive logic.
+   *
+   * uint64_t 0 must be zero for Null Message
+   * uint64_t guarantee time
+   * uint32_t 0 must be zero for Null Message
+   * uint32_t 0 must be zero for Null Message
+   * \endinternal
+   */
+  static void SendNullMessage (const Time& guaranteeUpdate, Ptr<RemoteChannelBundle> bundle);
+  /**
+   * Non-blocking check for received messages complete.  Will
+   * receive all messages that are queued up locally.
+   */
+  static void ReceiveMessagesNonBlocking ();
+  /**
+   * Blocking message receive.  Will block until at least one message
+   * has been received.
+   */
+  static void ReceiveMessagesBlocking ();
+  /**
+   * Check for completed sends
+   */
+  static void TestSendComplete ();
+
+  /**
+   * \brief Initialize send and receive buffers.
+   *
+   * This method should be called after all links have been added to the RemoteChannelBundle
+   * manager to setup any required send and receive buffers.
+   */
+  static void InitializeSendReceiveBuffers (void);
+
+private:
+
+  /**
+   * Check for received messages complete.  Will block until message
+   * has been received if blocking flag is true.  When blocking will
+   * return after the first message is received.   Non-blocking mode will
+   * Non-blocking check for received messages complete.  Will
+   * receive all messages that are queued up locally.
+   */
+  static void ReceiveMessages (bool blocking = false);
+
+  // System ID (rank) for this task
+  static uint32_t g_sid;
+
+  // Size of the MPI COM_WORLD group.
+  static uint32_t g_size;
+
+  // Number of neighbor tasks, tasks that this task shares a link with.
+  static uint32_t g_numNeighbors;
+
+  static bool     g_initialized;
+  static bool     g_enabled;
+
+  // Pending non-blocking receives
+  static MPI_Request* g_requests;
+
+  // Data buffers for non-blocking receives
+  static char**   g_pRxBuffers;
+
+  // List of pending non-blocking sends
+  static std::list<NullMessageSentBuffer> g_pendingTx;
+};
+
+} // namespace ns3
+
+#endif /* NS3_NULL_MESSAGE_MPI_INTERFACE_H */
diff -Naur ns-3.18.1/src/mpi/model/null-message-simulator-impl.cc ns-3.19/src/mpi/model/null-message-simulator-impl.cc
--- ns-3.18.1/src/mpi/model/null-message-simulator-impl.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/null-message-simulator-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,603 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#include "null-message-simulator-impl.h"
+
+#include "null-message-mpi-interface.h"
+#include "remote-channel-bundle-manager.h"
+#include "remote-channel-bundle.h"
+#include "mpi-interface.h"
+
+#include <ns3/simulator.h>
+#include <ns3/scheduler.h>
+#include <ns3/event-impl.h>
+#include <ns3/channel.h>
+#include <ns3/node-container.h>
+#include <ns3/double.h>
+#include <ns3/ptr.h>
+#include <ns3/pointer.h>
+#include <ns3/assert.h>
+#include <ns3/log.h>
+
+#include <cmath>
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+
+NS_LOG_COMPONENT_DEFINE ("NullMessageSimulatorImpl");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (NullMessageSimulatorImpl);
+
+NullMessageSimulatorImpl* NullMessageSimulatorImpl::g_instance = 0;
+
+TypeId
+NullMessageSimulatorImpl::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::NullMessageSimulatorImpl")
+    .SetParent<Object> ()
+    .AddConstructor<NullMessageSimulatorImpl> ()
+    .AddAttribute ("SchedulerTune", "Null Message scheduler tuning parameter",
+                   DoubleValue (1.0),
+                   MakeDoubleAccessor (&NullMessageSimulatorImpl::m_schedulerTune),
+                   MakeDoubleChecker<double> (0.01,1.0))
+  ;
+  return tid;
+}
+
+NullMessageSimulatorImpl::NullMessageSimulatorImpl ()
+{
+#ifdef NS3_MPI
+  NS_LOG_FUNCTION (this);
+
+  m_myId = MpiInterface::GetSystemId ();
+  m_systemCount = MpiInterface::GetSize ();
+
+  m_stop = false;
+  // uids are allocated from 4.
+  // uid 0 is "invalid" events
+  // uid 1 is "now" events
+  // uid 2 is "destroy" events
+  m_uid = 4;
+  // before ::Run is entered, the m_currentUid will be zero
+  m_currentUid = 0;
+  m_currentTs = 0;
+  m_currentContext = 0xffffffff;
+  m_unscheduledEvents = 0;
+  m_events = 0;
+
+  m_safeTime = Seconds (0);
+
+  NS_ASSERT (g_instance == 0);
+  g_instance = this;
+
+#else
+  NS_FATAL_ERROR ("Can't use Null Message simulator without MPI compiled in");
+#endif
+}
+
+NullMessageSimulatorImpl::~NullMessageSimulatorImpl ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+NullMessageSimulatorImpl::DoDispose (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  while (!m_events->IsEmpty ())
+    {
+      Scheduler::Event next = m_events->RemoveNext ();
+      next.impl->Unref ();
+    }
+  m_events = 0;
+  SimulatorImpl::DoDispose ();
+}
+
+void
+NullMessageSimulatorImpl::Destroy ()
+{
+  NS_LOG_FUNCTION (this);
+
+  while (!m_destroyEvents.empty ())
+    {
+      Ptr<EventImpl> ev = m_destroyEvents.front ().PeekEventImpl ();
+      m_destroyEvents.pop_front ();
+      NS_LOG_LOGIC ("handle destroy " << ev);
+      if (!ev->IsCancelled ())
+        {
+          ev->Invoke ();
+        }
+    }
+
+  RemoteChannelBundleManager::Destroy();
+  MpiInterface::Destroy ();
+}
+
+void
+NullMessageSimulatorImpl::CalculateLookAhead (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  int num_local_nodes = 0;
+
+  if (MpiInterface::GetSize () > 1)
+    {
+      NodeContainer c = NodeContainer::GetGlobal ();
+      for (NodeContainer::Iterator iter = c.Begin (); iter != c.End (); ++iter)
+        {
+          if ((*iter)->GetSystemId () != MpiInterface::GetSystemId ())
+            {
+              continue;
+            }
+
+          num_local_nodes++;
+
+          for (uint32_t i = 0; i < (*iter)->GetNDevices (); ++i)
+            {
+              Ptr<NetDevice> localNetDevice = (*iter)->GetDevice (i);
+              // only works for p2p links currently
+              if (!localNetDevice->IsPointToPoint ())
+                {
+                  continue;
+                }
+              Ptr<Channel> channel = localNetDevice->GetChannel ();
+              if (channel == 0)
+                {
+                  continue;
+                }
+
+              // grab the adjacent node
+              Ptr<Node> remoteNode;
+              if (channel->GetDevice (0) == localNetDevice)
+                {
+                  remoteNode = (channel->GetDevice (1))->GetNode ();
+                }
+              else
+                {
+                  remoteNode = (channel->GetDevice (0))->GetNode ();
+                }
+
+              // if it's not remote, don't consider it
+              if (remoteNode->GetSystemId () == MpiInterface::GetSystemId ())
+                {
+                  continue;
+                }
+
+              /**
+               * Add this channel to the remote channel bundle from this task to MPI task on other side of the channel.
+               */
+              Ptr<RemoteChannelBundle> remoteChannelBundle = RemoteChannelBundleManager::Find (remoteNode->GetSystemId ());
+              if (!remoteChannelBundle)
+                {
+                  remoteChannelBundle = RemoteChannelBundleManager::Add (remoteNode->GetSystemId ());
+                }
+
+              TimeValue delay;
+              channel->GetAttribute ("Delay", delay);
+              remoteChannelBundle->AddChannel (channel, delay.Get () );
+            }
+        }
+    }
+
+  // Completed setup of remote channel bundles.  Setup send and receive buffers.
+  NullMessageMpiInterface::InitializeSendReceiveBuffers ();
+
+  // Initialized to 0 as we don't have a simulation start time.
+  m_safeTime = Time (0);
+}
+
+void
+NullMessageSimulatorImpl::SetScheduler (ObjectFactory schedulerFactory)
+{
+  NS_LOG_FUNCTION (this << schedulerFactory);
+
+  Ptr<Scheduler> scheduler = schedulerFactory.Create<Scheduler> ();
+
+  if (m_events != 0)
+    {
+      while (!m_events->IsEmpty ())
+        {
+          Scheduler::Event next = m_events->RemoveNext ();
+          scheduler->Insert (next);
+        }
+    }
+  m_events = scheduler;
+}
+
+void
+NullMessageSimulatorImpl::ProcessOneEvent (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  Scheduler::Event next = m_events->RemoveNext ();
+
+  NS_ASSERT (next.key.m_ts >= m_currentTs);
+  m_unscheduledEvents--;
+
+  NS_LOG_LOGIC ("handle " << next.key.m_ts);
+  m_currentTs = next.key.m_ts;
+  m_currentContext = next.key.m_context;
+  m_currentUid = next.key.m_uid;
+  next.impl->Invoke ();
+  next.impl->Unref ();
+}
+
+bool
+NullMessageSimulatorImpl::IsFinished (void) const
+{
+  return m_events->IsEmpty () || m_stop;
+}
+
+Time
+NullMessageSimulatorImpl::Next (void) const
+{
+  NS_LOG_FUNCTION (this);
+
+  NS_ASSERT (!m_events->IsEmpty ());
+
+  Scheduler::Event ev = m_events->PeekNext ();
+  return TimeStep (ev.key.m_ts);
+}
+
+void
+NullMessageSimulatorImpl::ScheduleNullMessageEvent (Ptr<RemoteChannelBundle> bundle)
+{
+  NS_LOG_FUNCTION (this << bundle);
+
+  Time time (m_schedulerTune * bundle->GetDelay ().GetTimeStep ());
+
+  bundle->SetEventId (Simulator::Schedule (time, &NullMessageSimulatorImpl::NullMessageEventHandler, 
+                                           this, PeekPointer(bundle)));
+}
+
+void
+NullMessageSimulatorImpl::RescheduleNullMessageEvent (Ptr<RemoteChannelBundle> bundle)
+{
+  NS_LOG_FUNCTION (this << bundle);
+
+  Simulator::Cancel (bundle->GetEventId ());
+
+  Time time (m_schedulerTune * bundle->GetDelay ().GetTimeStep ());
+
+  bundle->SetEventId (Simulator::Schedule (time, &NullMessageSimulatorImpl::NullMessageEventHandler, 
+                                           this, PeekPointer(bundle)));
+}
+
+void
+NullMessageSimulatorImpl::RescheduleNullMessageEvent (uint32_t nodeSysId)
+{
+  NS_LOG_FUNCTION (this << nodeSysId);
+
+  Ptr<RemoteChannelBundle> bundle = RemoteChannelBundleManager::Find (nodeSysId);
+  NS_ASSERT (bundle);
+
+  RescheduleNullMessageEvent (bundle);
+}
+
+void
+NullMessageSimulatorImpl::Run (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  CalculateLookAhead ();
+
+  RemoteChannelBundleManager::InitializeNullMessageEvents ();
+
+  // Stop will be set if stop is called by simulation.
+  m_stop = false;
+  while (!IsFinished ())
+    {
+      Time nextTime = Next ();
+
+      if ( nextTime <= GetSafeTime () )
+        {
+          ProcessOneEvent ();
+          HandleArrivingMessagesNonBlocking ();
+        }
+      else
+        {
+          // Block until packet or Null Message has been received.
+          HandleArrivingMessagesBlocking ();
+        }
+    }
+}
+
+void
+NullMessageSimulatorImpl::HandleArrivingMessagesNonBlocking (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  NullMessageMpiInterface::ReceiveMessagesNonBlocking ();
+
+  CalculateSafeTime ();
+
+  // Check for send completes
+  NullMessageMpiInterface::TestSendComplete ();
+}
+
+void
+NullMessageSimulatorImpl::HandleArrivingMessagesBlocking (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  NullMessageMpiInterface::ReceiveMessagesBlocking ();
+
+  CalculateSafeTime ();
+
+  // Check for send completes
+  NullMessageMpiInterface::TestSendComplete ();
+}
+
+void
+NullMessageSimulatorImpl::CalculateSafeTime ()
+{
+  NS_LOG_FUNCTION (this);
+
+  m_safeTime = RemoteChannelBundleManager::GetSafeTime ();
+  NS_ASSERT (m_safeTime >= m_currentTs);
+}
+
+Time
+NullMessageSimulatorImpl::GetSafeTime ()
+{
+  return m_safeTime;
+}
+
+
+uint32_t
+NullMessageSimulatorImpl::GetSystemId () const
+{
+  return m_myId;
+}
+
+void
+NullMessageSimulatorImpl::RunOneEvent (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  ProcessOneEvent ();
+}
+
+void
+NullMessageSimulatorImpl::Stop (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  m_stop = true;
+}
+
+void
+NullMessageSimulatorImpl::Stop (Time const &time)
+{
+  NS_LOG_FUNCTION (this << time.GetTimeStep ());
+
+  Simulator::Schedule (time, &Simulator::Stop);
+}
+
+//
+// Schedule an event for a _relative_ time in the future.
+//
+EventId
+NullMessageSimulatorImpl::Schedule (Time const &time, EventImpl *event)
+{
+  NS_LOG_FUNCTION (this << time.GetTimeStep () << event);
+
+  Time tAbsolute = time + TimeStep (m_currentTs);
+
+  NS_ASSERT (tAbsolute.IsPositive ());
+  NS_ASSERT (tAbsolute >= TimeStep (m_currentTs));
+  Scheduler::Event ev;
+  ev.impl = event;
+  ev.key.m_ts = static_cast<uint64_t> (tAbsolute.GetTimeStep ());
+  ev.key.m_context = GetContext ();
+  ev.key.m_uid = m_uid;
+  m_uid++;
+  m_unscheduledEvents++;
+  m_events->Insert (ev);
+  return EventId (event, ev.key.m_ts, ev.key.m_context, ev.key.m_uid);
+}
+
+void
+NullMessageSimulatorImpl::ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event)
+{
+  NS_LOG_FUNCTION (this << context << time.GetTimeStep () << m_currentTs << event);
+
+  Time tAbsolute(m_currentTs + time.GetTimeStep ());
+
+  NS_ASSERT (tAbsolute.IsPositive ());
+  NS_ASSERT (tAbsolute >= TimeStep (m_currentTs));
+
+  Scheduler::Event ev;
+  ev.impl = event;
+  ev.key.m_ts = tAbsolute.GetTimeStep ();
+  ev.key.m_context = context;
+  ev.key.m_uid = m_uid;
+  m_uid++;
+  m_unscheduledEvents++;
+  m_events->Insert (ev);
+}
+
+EventId
+NullMessageSimulatorImpl::ScheduleNow (EventImpl *event)
+{
+  NS_LOG_FUNCTION (this << event);
+
+  Scheduler::Event ev;
+  ev.impl = event;
+  ev.key.m_ts = m_currentTs;
+  ev.key.m_context = GetContext ();
+  ev.key.m_uid = m_uid;
+  m_uid++;
+  m_unscheduledEvents++;
+  m_events->Insert (ev);
+  return EventId (event, ev.key.m_ts, ev.key.m_context, ev.key.m_uid);
+}
+
+EventId
+NullMessageSimulatorImpl::ScheduleDestroy (EventImpl *event)
+{
+  NS_LOG_FUNCTION (this << event);
+
+  EventId id (Ptr<EventImpl> (event, false), m_currentTs, 0xffffffff, 2);
+  m_destroyEvents.push_back (id);
+  m_uid++;
+  return id;
+}
+
+Time
+NullMessageSimulatorImpl::Now (void) const
+{
+  return TimeStep (m_currentTs);
+}
+
+Time
+NullMessageSimulatorImpl::GetDelayLeft (const EventId &id) const
+{
+  if (IsExpired (id))
+    {
+      return TimeStep (0);
+    }
+  else
+    {
+      return TimeStep (id.GetTs () - m_currentTs);
+    }
+}
+
+void
+NullMessageSimulatorImpl::Remove (const EventId &id)
+{
+  if (id.GetUid () == 2)
+    {
+      // destroy events.
+      for (DestroyEvents::iterator i = m_destroyEvents.begin (); i != m_destroyEvents.end (); i++)
+        {
+          if (*i == id)
+            {
+              m_destroyEvents.erase (i);
+              break;
+            }
+        }
+      return;
+    }
+  if (IsExpired (id))
+    {
+      return;
+    }
+  Scheduler::Event event;
+  event.impl = id.PeekEventImpl ();
+  event.key.m_ts = id.GetTs ();
+  event.key.m_context = id.GetContext ();
+  event.key.m_uid = id.GetUid ();
+  m_events->Remove (event);
+  event.impl->Cancel ();
+  // whenever we remove an event from the event list, we have to unref it.
+  event.impl->Unref ();
+
+  m_unscheduledEvents--;
+}
+
+void
+NullMessageSimulatorImpl::Cancel (const EventId &id)
+{
+  if (!IsExpired (id))
+    {
+      id.PeekEventImpl ()->Cancel ();
+    }
+}
+
+bool
+NullMessageSimulatorImpl::IsExpired (const EventId &ev) const
+{
+  if (ev.GetUid () == 2)
+    {
+      if (ev.PeekEventImpl () == 0
+          || ev.PeekEventImpl ()->IsCancelled ())
+        {
+          return true;
+        }
+      // destroy events.
+      for (DestroyEvents::const_iterator i = m_destroyEvents.begin (); i != m_destroyEvents.end (); i++)
+        {
+          if (*i == ev)
+            {
+              return false;
+            }
+        }
+      return true;
+    }
+  if (ev.PeekEventImpl () == 0
+      || ev.GetTs () < m_currentTs
+      || (ev.GetTs () == m_currentTs
+          && ev.GetUid () <= m_currentUid)
+      || ev.PeekEventImpl ()->IsCancelled ())
+    {
+      return true;
+    }
+  else
+    {
+      return false;
+    }
+}
+
+Time
+NullMessageSimulatorImpl::GetMaximumSimulationTime (void) const
+{
+  // XXX: I am fairly certain other compilers use other non-standard
+  // post-fixes to indicate 64 bit constants.
+  return TimeStep (0x7fffffffffffffffLL);
+}
+
+uint32_t
+NullMessageSimulatorImpl::GetContext (void) const
+{
+  return m_currentContext;
+}
+
+Time NullMessageSimulatorImpl::CalculateGuaranteeTime (uint32_t nodeSysId)
+{
+  Ptr<RemoteChannelBundle> bundle = RemoteChannelBundleManager::Find (nodeSysId);
+  NS_ASSERT (bundle);
+
+  return Min (NullMessageSimulatorImpl::GetInstance ()->Next (), GetSafeTime ()) + bundle->GetDelay ();
+}
+
+void NullMessageSimulatorImpl::NullMessageEventHandler(RemoteChannelBundle* bundle)
+{
+  NS_LOG_FUNCTION (this << bundle);
+
+  Time time = Min (Next (), GetSafeTime ()) + bundle->GetDelay ();
+  NullMessageMpiInterface::SendNullMessage (time, bundle);
+
+  ScheduleNullMessageEvent (bundle);
+}
+
+
+NullMessageSimulatorImpl*
+NullMessageSimulatorImpl::GetInstance (void)
+{
+  NS_ASSERT (g_instance != 0);
+  return g_instance;
+}
+} // namespace ns3
+
diff -Naur ns-3.18.1/src/mpi/model/null-message-simulator-impl.h ns-3.19/src/mpi/model/null-message-simulator-impl.h
--- ns-3.18.1/src/mpi/model/null-message-simulator-impl.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/null-message-simulator-impl.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,212 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#ifndef NULLMESSAGE_SIMULATOR_IMPL_H
+#define NULLMESSAGE_SIMULATOR_IMPL_H
+
+#include <ns3/simulator-impl.h>
+#include <ns3/scheduler.h>
+#include <ns3/event-impl.h>
+#include <ns3/ptr.h>
+
+#include <list>
+#include <iostream>
+#include <fstream>
+
+namespace ns3 {
+
+class NullMessageEvent;
+class NullMessageMpiInterface;
+class RemoteChannelBundle;
+
+/**
+ * \ingroup mpi
+ *
+ * \brief Simulator implementation using MPI and a Null Message algorithm.
+ */
+class NullMessageSimulatorImpl : public SimulatorImpl
+{
+public:
+  static TypeId GetTypeId (void);
+
+  NullMessageSimulatorImpl ();
+
+  ~NullMessageSimulatorImpl ();
+
+  // virtual from SimulatorImpl
+  virtual void Destroy ();
+  virtual bool IsFinished (void) const;
+  virtual void Stop (void);
+  virtual void Stop (Time const &time);
+  virtual EventId Schedule (Time const &time, EventImpl *event);
+  virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
+  virtual EventId ScheduleNow (EventImpl *event);
+  virtual EventId ScheduleDestroy (EventImpl *event);
+  virtual void Remove (const EventId &ev);
+  virtual void Cancel (const EventId &ev);
+  virtual bool IsExpired (const EventId &ev) const;
+  virtual void Run (void);
+  virtual void RunOneEvent (void);
+  virtual Time Now (void) const;
+  virtual Time GetDelayLeft (const EventId &id) const;
+  virtual Time GetMaximumSimulationTime (void) const;
+  virtual void SetScheduler (ObjectFactory schedulerFactory);
+  virtual uint32_t GetSystemId (void) const;
+  virtual uint32_t GetContext (void) const;
+
+  /**
+   * \return singleton instance
+   *
+   * Singleton accessor.
+   */
+  static NullMessageSimulatorImpl * GetInstance (void);
+
+private:
+  friend class NullMessageEvent;
+  friend class NullMessageMpiInterface;
+  friend class RemoteChannelBundleManager;
+
+  /**
+   * Non blocking receive of pending messages.  
+   */
+  void HandleArrivingMessagesNonBlocking (void);
+
+  /**
+   * Blocking receive of arriving messages.
+   */
+  void HandleArrivingMessagesBlocking (void);
+
+  virtual void DoDispose (void);
+
+  /**
+   * Calculate the look ahead allowable for this MPI task.   Basically
+   * the minimum latency on links to neighbor MPI tasks.
+   */
+  void CalculateLookAhead (void);
+
+  /**
+   * Process the next event on the queue.
+   */
+  void ProcessOneEvent (void);
+
+  /**
+   * \return next local event time.
+   */
+  Time Next (void) const;
+
+  /**
+   * Calculate the SafeTime. Should be called after message receives.
+   */
+  void CalculateSafeTime (void);
+
+  /**
+   * Get the current SafeTime; the maximum time that events can
+   * be processed based on information received from neighboring
+   * MPI tasks.
+   */
+  Time GetSafeTime (void);
+
+  /**
+   * \param bundle Bundle to schedule Null Message event for
+   *
+   * Schedule Null Message event for the specified RemoteChannelBundle.
+   */
+  void ScheduleNullMessageEvent (Ptr<RemoteChannelBundle> bundle);
+
+  /**
+   * \param bundle Bundle to reschedule Null Message event for
+   *
+   * Reschedule Null Message event for the specified
+   * RemoteChannelBundel.  Existing event will be canceled.
+   */
+  void RescheduleNullMessageEvent (Ptr<RemoteChannelBundle> bundle);
+
+  /**
+   * \param nodeSysId SystemID to reschedule null event for
+   *
+   * Reschedule Null Message event for the RemoteChannelBundel to the
+   * task nodeSysId.  Existing event will be canceled.
+   */
+  void RescheduleNullMessageEvent (uint32_t nodeSysId);
+
+  /**
+   * \param systemId SystemID to compute guarentee time for
+   *
+   * \return Guarentee time
+   *
+   * Calculate the guarantee time for incoming RemoteChannelBundel
+   * from task nodeSysId.  No message should arrive from task
+   * nodeSysId with a receive time less than the guarantee time.
+   */
+  Time CalculateGuaranteeTime (uint32_t systemId);
+
+  /**
+   * \param bundle remote channel bundle to schedule an event for.
+   *
+   * Null message event handler.   Scheduled to send a null message
+   * for the specified bundle at regular intervals.   Will canceled
+   * and rescheduled when packets are sent.
+   */
+  void NullMessageEventHandler(RemoteChannelBundle* bundle);
+
+  typedef std::list<EventId> DestroyEvents;
+
+  DestroyEvents m_destroyEvents;
+  bool m_stop;
+  Ptr<Scheduler> m_events;
+  uint32_t m_uid;
+  uint32_t m_currentUid;
+  uint64_t m_currentTs;
+  uint32_t m_currentContext;
+  // number of events that have been inserted but not yet scheduled,
+  // not counting the "destroy" events; this is used for validation
+  int m_unscheduledEvents;
+
+  uint32_t     m_myId;        // MPI Rank
+  uint32_t     m_systemCount; // MPI Size
+
+  /*
+   * The time for which it is safe for this task to execute events
+   * without danger of out-of-order events.
+   */
+  Time m_safeTime;
+
+  /*
+   * Null Message performance tuning parameter.  Controls when Null
+   * messages are sent.  When value is 1 the minimum number of Null
+   * messages are sent conserving bandwidth.  The delay in arrival of
+   * lookahead information is the greatest resulting in maximum
+   * unnecessary blocking of the receiver.  When the value is near 0
+   * Null Messages are sent with high frequency, costing more
+   * bandwidth and Null Message processing time, but there is minimum
+   * unnecessary block of the receiver.
+   */
+  double m_schedulerTune;
+
+  /*
+   * Singleton instance.
+   */
+  static NullMessageSimulatorImpl* g_instance;
+};
+
+} // namespace ns3
+
+#endif /* NULLMESSAGE_SIMULATOR_IMPL_H */
diff -Naur ns-3.18.1/src/mpi/model/parallel-communication-interface.h ns-3.19/src/mpi/model/parallel-communication-interface.h
--- ns-3.18.1/src/mpi/model/parallel-communication-interface.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/parallel-communication-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,99 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#ifndef NS3_PARALLEL_COMMUNICATION_INTERFACE_H
+#define NS3_PARALLEL_COMMUNICATION_INTERFACE_H
+
+#include <stdint.h>
+#include <list>
+
+#include <ns3/object.h>
+#include <ns3/nstime.h>
+#include <ns3/buffer.h>
+#include <ns3/packet.h>
+
+#if defined(NS3_MPI)
+#include "mpi.h"
+#endif
+
+namespace ns3 {
+
+/**
+ * \ingroup mpi
+ *
+ * \brief Pure virtual base class for the interface between ns-3 and
+ * the parallel communication layer being used.
+ *
+ * Each type of parallel communication layer is required to implement
+ * this interface.  This interface is called through the
+ * MpiInterface.
+ */
+  class ParallelCommunicationInterface
+{
+public:
+  /**
+    * Destructor
+    */
+  virtual ~ParallelCommunicationInterface() {}
+  /**
+   * Deletes storage used by the parallel environment.
+   */
+  virtual void Destroy () = 0;
+  /**
+   * \return system identification
+   */
+  virtual uint32_t GetSystemId () = 0;
+  /**
+   * \return number of parallel tasks
+   */
+  virtual uint32_t GetSize () = 0;
+  /**
+   * \return true if parallel communication is enabled
+   */
+  virtual bool IsEnabled () = 0;
+  /**
+   * \param pargc number of command line arguments
+   * \param pargv command line arguments
+   *
+   * Sets up parallel communication interface
+   */
+  virtual void Enable (int* pargc, char*** pargv) = 0;
+  /**
+   * Terminates the parallel environment.
+   * This function must be called after Destroy ()
+   */
+  virtual void Disable () = 0;
+  /**
+   * \param p packet to send
+   * \param rxTime received time at destination node
+   * \param node destination node
+   * \param dev destination device
+   *
+   * Serialize and send a packet to the specified node and net device
+   */
+  virtual void SendPacket (Ptr<Packet> p, const Time &rxTime, uint32_t node, uint32_t dev) = 0;
+
+private:
+};
+
+} // namespace ns3
+
+#endif /* NS3_PARALLEL_COMMUNICATION_INTERFACE_H */
diff -Naur ns-3.18.1/src/mpi/model/remote-channel-bundle.cc ns-3.19/src/mpi/model/remote-channel-bundle.cc
--- ns-3.18.1/src/mpi/model/remote-channel-bundle.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/remote-channel-bundle.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,130 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#include "remote-channel-bundle.h"
+
+#include "null-message-mpi-interface.h"
+#include "null-message-simulator-impl.h"
+
+#include <ns3/simulator.h>
+
+namespace ns3 {
+
+#define NS_TIME_INFINITY ns3::Time (0x7fffffffffffffffLL)
+
+TypeId RemoteChannelBundle::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::RemoteChannelBundle")
+    .SetParent<Object> ()
+    .AddConstructor <RemoteChannelBundle> ();
+  return tid;
+}
+
+RemoteChannelBundle::RemoteChannelBundle ()
+  : m_remoteSystemId (-1),
+    m_guaranteeTime (0),
+    m_delay (NS_TIME_INFINITY)
+{
+}
+
+RemoteChannelBundle::RemoteChannelBundle (const uint32_t remoteSystemId)
+  : m_remoteSystemId (remoteSystemId),
+    m_guaranteeTime (0),
+    m_delay (NS_TIME_INFINITY)
+{
+}
+
+void
+RemoteChannelBundle::AddChannel (Ptr<Channel> channel, Time delay)
+{
+  m_channels[channel->GetId ()] = channel;
+  m_delay = ns3::Min (m_delay, delay);
+}
+
+uint32_t
+RemoteChannelBundle::GetSystemId () const
+{
+  return m_remoteSystemId;
+}
+
+Time
+RemoteChannelBundle::GetGuaranteeTime (void) const
+{
+  return m_guaranteeTime;
+}
+
+void
+RemoteChannelBundle::SetGuaranteeTime (Time time)
+{
+  NS_ASSERT (time >= Simulator::Now ());
+
+  m_guaranteeTime = time;
+}
+
+Time
+RemoteChannelBundle::GetDelay (void) const
+{
+  return m_delay;
+}
+
+void
+RemoteChannelBundle::SetEventId (EventId id)
+{
+  m_nullEventId = id;
+}
+
+EventId
+RemoteChannelBundle::GetEventId (void) const
+{
+  return m_nullEventId;
+}
+
+int
+RemoteChannelBundle::GetSize (void) const
+{
+  return m_channels.size ();
+}
+
+void 
+RemoteChannelBundle::Send(Time time)
+{
+  NullMessageMpiInterface::SendNullMessage (time, this);  
+}
+
+std::ostream& operator<< (std::ostream& out, ns3::RemoteChannelBundle& bundle )
+{
+  out << "RemoteChannelBundle Rank = " << bundle.m_remoteSystemId
+      << ", GuaranteeTime = "  << bundle.m_guaranteeTime
+      << ", Delay = " << bundle.m_delay << std::endl;
+  
+  for (std::map < uint32_t, Ptr < Channel > > ::const_iterator pair = bundle.m_channels.begin ();
+       pair != bundle.m_channels.end ();
+       ++pair)
+    {
+      out << "\t" << (*pair).second << std::endl;
+    }
+  
+  return out;
+}
+
+
+} // namespace ns3
+
diff -Naur ns-3.18.1/src/mpi/model/remote-channel-bundle.h ns-3.19/src/mpi/model/remote-channel-bundle.h
--- ns-3.18.1/src/mpi/model/remote-channel-bundle.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/remote-channel-bundle.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,151 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#ifndef NS3_REMOTE_CHANNEL_BUNDLE
+#define NS3_REMOTE_CHANNEL_BUNDLE
+
+#include "null-message-simulator-impl.h"
+
+#include <ns3/channel.h>
+#include <ns3/ptr.h>
+#include <ns3/pointer.h>
+
+#include <map>
+
+namespace ns3 {
+
+/**
+ * \ingroup mpi
+ * 
+ * \brief Collection of NS3 channels between local and remote nodes.
+ * 
+ * An instance exists for each remote system that the local system is
+ * in communication with.  These are created and managed by the
+ * RemoteChannelBundleManager class.  Stores time information for each
+ * bundle.
+ */
+class RemoteChannelBundle : public Object
+{
+public:
+  static TypeId GetTypeId (void);
+
+  RemoteChannelBundle ();
+
+  RemoteChannelBundle (const uint32_t remoteSystemId);
+
+  ~RemoteChannelBundle ()
+  {
+  }
+
+  /**
+   * \param channel to add to the bundle
+   * \param delay time for the channel (usually the latency)
+   */
+  void AddChannel (Ptr<Channel> channel, Time delay);
+
+  /**
+   * \return SystemID for remote side of this bundle
+   */
+  uint32_t GetSystemId () const;
+
+  /**
+   * \return guarantee time
+   */
+  Time GetGuaranteeTime (void) const;
+
+  /**
+   * \param guarantee time
+   *
+   * Set the guarantee time for the bundle.  This should be called
+   * after a packet or Null Message received.
+   */
+  void SetGuaranteeTime (Time time);
+
+  /**
+   * \return the minimum delay along any channel in this bundle
+   */
+  Time GetDelay (void) const;
+
+  /**
+   * Set the event ID of the Null Message send event current scheduled
+   * for this channel.
+   */
+  void SetEventId (EventId id);
+
+  /**
+   * \return the event ID of the Null Message send event for this bundle
+   */
+  EventId GetEventId (void) const;
+
+  /**
+   * \return number of NS3 channels in this bundle
+   */
+  int GetSize (void) const;
+
+  /**
+   * \param time 
+   *
+   * Send Null Message to the remote task associated with this bundle.
+   * Message will be delivered at current simulation time + the time
+   * passed in.
+   */
+  void Send(Time time);
+
+  /**
+   * Output for debugging purposes.
+   */
+  friend std::ostream& operator<< (std::ostream& out, ns3::RemoteChannelBundle& bundle );
+
+private:
+  /*
+   * Remote rank.
+   */
+  uint32_t m_remoteSystemId;
+
+  /*
+   * NS3 Channels that are connected from nodes in this MPI task to remote_rank.
+   *
+   * Would be more efficient to use unordered_map when C++11 is adopted by NS3.
+   */
+  std::map < uint32_t, Ptr < Channel > > m_channels;
+
+  /*
+   * Guarentee time for the incoming Channels from MPI task remote_rank.
+   * No PacketMessage will ever arrive on any incoming channel in this bundle with a
+   * ReceiveTime less than this.  Intialized to StartTime.
+   */
+  Time m_guaranteeTime;
+
+  /*
+   * Delay for this Channel bundle.   min link delay over all incoming channels;
+   */
+  Time m_delay;
+
+  /*
+   * Event scheduled to send Null Message for this bundle.
+   */
+  EventId m_nullEventId;
+
+};
+
+}
+
+#endif
diff -Naur ns-3.18.1/src/mpi/model/remote-channel-bundle-manager.cc ns-3.19/src/mpi/model/remote-channel-bundle-manager.cc
--- ns-3.18.1/src/mpi/model/remote-channel-bundle-manager.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/remote-channel-bundle-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,112 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#include "remote-channel-bundle-manager.h"
+
+#include "remote-channel-bundle.h"
+#include "null-message-simulator-impl.h"
+
+#include "ns3/simulator.h"
+
+namespace ns3 {
+
+bool ns3::RemoteChannelBundleManager::g_initialized = false;
+ns3::RemoteChannelBundleManager::RemoteChannelMap ns3::RemoteChannelBundleManager::g_remoteChannelBundles;
+
+Ptr<RemoteChannelBundle>
+RemoteChannelBundleManager::Find (uint32_t systemId)
+{
+  ns3::RemoteChannelBundleManager::RemoteChannelMap::iterator kv = g_remoteChannelBundles.find (systemId);
+
+  if ( kv == g_remoteChannelBundles.end ())
+    {
+      return 0;
+    }
+  else
+    {
+      return kv->second;
+    }
+}
+
+Ptr<RemoteChannelBundle>
+RemoteChannelBundleManager::Add (uint32_t systemId)
+{
+  NS_ASSERT (!g_initialized);
+  NS_ASSERT (g_remoteChannelBundles.find (systemId) == g_remoteChannelBundles.end ());
+
+  Ptr<RemoteChannelBundle> remoteChannelBundle = Create<RemoteChannelBundle> (systemId);
+
+  g_remoteChannelBundles[systemId] = remoteChannelBundle;
+
+  return remoteChannelBundle;
+}
+
+uint32_t 
+RemoteChannelBundleManager::Size (void) 
+{
+  return g_remoteChannelBundles.size();
+}
+
+void
+RemoteChannelBundleManager::InitializeNullMessageEvents (void)
+{
+  NS_ASSERT (!g_initialized);
+
+  for ( RemoteChannelMap::const_iterator iter = g_remoteChannelBundles.begin ();
+        iter != g_remoteChannelBundles.end ();
+        ++iter )
+    {
+      Ptr<RemoteChannelBundle> bundle = iter->second;
+      bundle->Send (bundle->GetDelay ());
+
+      NullMessageSimulatorImpl::GetInstance ()->ScheduleNullMessageEvent (bundle);
+    }
+
+  g_initialized = true;
+}
+
+Time
+RemoteChannelBundleManager::GetSafeTime (void)
+{
+  NS_ASSERT (g_initialized);
+
+  Time safeTime = Simulator::GetMaximumSimulationTime ();
+
+  for (RemoteChannelMap::const_iterator kv = g_remoteChannelBundles.begin ();
+       kv != g_remoteChannelBundles.end ();
+       ++kv)
+    {
+      safeTime = Min (safeTime, kv->second->GetGuaranteeTime ());
+    }
+
+  return safeTime;
+}
+
+void
+RemoteChannelBundleManager::Destroy (void)
+{
+  NS_ASSERT (g_initialized);
+
+  g_remoteChannelBundles.clear();
+  g_initialized = false;
+}
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/mpi/model/remote-channel-bundle-manager.h ns-3.19/src/mpi/model/remote-channel-bundle-manager.h
--- ns-3.18.1/src/mpi/model/remote-channel-bundle-manager.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/mpi/model/remote-channel-bundle-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,107 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ *  Copyright 2013. Lawrence Livermore National Security, LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Steven Smith <smith84@llnl.gov>
+ *
+ */
+
+#ifndef NS3_REMOTE_CHANNEL_BUNDLE_MANAGER
+#define NS3_REMOTE_CHANNEL_BUNDLE_MANAGER
+
+#include <ns3/nstime.h>
+#include <ns3/ptr.h>
+#include <map>
+
+namespace ns3 {
+
+class RemoteChannelBundle;
+
+/*
+ * \ingroup mpi
+ * 
+ * \brief Singleton for managing the RemoteChannelBundles for each process.
+ *
+ * Manages collective tasks associated with the bundle collection.
+ */
+class RemoteChannelBundleManager
+{
+
+public:
+  /**
+   * \return remote channel bundle for specified SystemId.
+   */
+  static Ptr<RemoteChannelBundle> Find (uint32_t systemId);
+
+  /**
+   * Add RemoteChannelBundle from this task to MPI task on other side of the link.
+   * Can not be invoked after InitializeNullMessageEvents has been invoked.
+   */
+  static Ptr<RemoteChannelBundle> Add (uint32_t systemId);
+
+  /**
+   * \return number of remote channel bundles
+   * 
+   */
+  static uint32_t Size (void);
+
+  /**
+   * Setup initial Null Message events for every RemoteChannelBundle.
+   * All RemoteChannelBundles should be added before this method is invoked.
+   */
+  static void InitializeNullMessageEvents (void);
+
+  /**
+   * \return safe time across all remote channels.
+   */
+  static Time GetSafeTime (void);
+
+  /**
+   * Destroy the singleton.
+   */
+  static void Destroy (void);
+
+private:
+
+  /**
+   * Private ctor to prevent creation outside of singleton pattern.
+   */
+  RemoteChannelBundleManager ()
+  {
+  }
+
+  ~RemoteChannelBundleManager ()
+  {
+  }
+
+  /*
+   * Container for all remote channel bundles for this task.
+   *
+   * Would be more efficient to use unordered_map when C++11 is adopted for NS3.
+   */
+  typedef std::map<uint32_t, Ptr<RemoteChannelBundle> > RemoteChannelMap;
+  static RemoteChannelMap g_remoteChannelBundles;
+
+  /*
+   * Protect manager class from being initialized twice or incorrect
+   * ordering of method calls.
+   */
+  static bool g_initialized;
+};
+
+} // namespace ns3
+
+#endif
diff -Naur ns-3.18.1/src/mpi/wscript ns-3.19/src/mpi/wscript
--- ns-3.18.1/src/mpi/wscript	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/mpi/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -36,16 +36,21 @@
     sim = bld.create_ns3_module('mpi', ['core', 'network'])
     sim.source = [
         'model/distributed-simulator-impl.cc',
-        'model/mpi-interface.cc',
+        'model/granted-time-window-mpi-interface.cc',
         'model/mpi-receiver.cc',
+        'model/null-message-simulator-impl.cc',
+        'model/null-message-mpi-interface.cc',
+        'model/remote-channel-bundle.cc',
+        'model/remote-channel-bundle-manager.cc',
+        'model/mpi-interface.cc', 
         ]
 
     headers = bld(features='ns3header')
     headers.module = 'mpi'
     headers.source = [
-        'model/distributed-simulator-impl.h',
-        'model/mpi-interface.h',
         'model/mpi-receiver.h',
+        'model/mpi-interface.h',
+        'model/parallel-communication-interface.h', 
         ]
 
     if env['ENABLE_MPI']:
diff -Naur ns-3.18.1/src/netanim/doc/animation.rst ns-3.19/src/netanim/doc/animation.rst
--- ns-3.18.1/src/netanim/doc/animation.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/netanim/doc/animation.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. toctree::
 
 Animation
 ---------
@@ -62,9 +63,11 @@
 If NetAnim is not already available in the |ns3| package you downloaded, you can do the following:
 
 Please ensure that you have installed mercurial.
-The latest version of NetAnim can be downloaded using mercurial with the following command::
+The latest version of NetAnim can be downloaded using mercurial with the following command:
 
-  hg clone http://code.nsnam.org/netanim
+.. sourcecode:: bash
+
+  $ hg clone http://code.nsnam.org/netanim
 
 Building NetAnim
 ================
@@ -72,35 +75,41 @@
 ~~~~~~~~~~~~~
 Qt4 (4.7 and over) is required to build NetAnim. This can be obtained using the following ways:
 
-For Debian/Ubuntu Linux distributions::
+For Debian/Ubuntu Linux distributions:
+
+.. sourcecode:: bash
 
-  apt-get install qt4-dev-tools
+  $ apt-get install qt4-dev-tools
 
-For Red Hat/Fedora based distribution::
+For Red Hat/Fedora based distribution:
 
-  yum install qt4
-  yum install qt4-devel
+.. sourcecode:: bash
 
-For Mac/OSX::
+  $ yum install qt4
+  $ yum install qt4-devel
 
-  http://qt.nokia.com/downloads/
+For Mac/OSX, see http://qt.nokia.com/downloads/
 
 Build steps
 ~~~~~~~~~~~
 
-To build NetAnim use the following commands::
+To build NetAnim use the following commands:
+
+.. sourcecode:: bash
 
-  cd netanim
-  make clean
-  qmake NetAnim.pro  (For MAC Users: qmake -spec macx-g++ NetAnim.pro)
-  make
+  $ cd netanim
+  $ make clean
+  $ qmake NetAnim.pro  (For MAC Users: qmake -spec macx-g++ NetAnim.pro)
+  $ make
 
 
 Note: qmake could be "qmake-qt4" in some systems
 
-This should create an executable named "NetAnim" in the same directory::
+This should create an executable named "NetAnim" in the same directory:
 
- john@john-VirtualBox:~/netanim$ ls -l NetAnim
+.. sourcecode:: bash
+
+  $ ls -l NetAnim
  -rwxr-xr-x 1 john john 390395 2012-05-22 08:32 NetAnim
 
 Usage
@@ -117,10 +126,12 @@
 to construct a timestamped ASCII file in XML format.
 
 Examples are found under src/netanim/examples
-Example::
+Example:
 
-  ./waf -d debug configure --enable-examples
-  ./waf --run "dumbbell-animation"
+.. sourcecode:: bash
+
+  $ ./waf -d debug configure --enable-examples
+  $ ./waf --run "dumbbell-animation"
 
 The above will create an XML file dumbbell-animation.xml
 
@@ -131,19 +142,22 @@
 2. Include the header [#include "ns3/netanim-module.h"] in your test program
 3. Add the statement
 
-::
+.. sourcecode:: cpp
 
-  AnimationInterface anim ("animation.xml"); 
-  where "animation.xml" is any arbitrary filename
+  AnimationInterface anim ("animation.xml");  // where "animation.xml" is any arbitrary filename
 
 [for versions before ns-3.13 you also have to use the line "anim.SetXMLOutput() to set the XML mode and also use anim.StartAnimation();]
 
 
 Optional
 ########
+
+.. highlight:: cpp
+
 The following are optional but useful steps::
 
-  1.anim.SetMobilityPollInterval (Seconds (1));
+  // Step 1
+  anim.SetMobilityPollInterval (Seconds (1));
 
 AnimationInterface records the position of all nodes every 250 ms by default. The statement above sets 
 the periodic interval at which AnimationInterface records the position of all nodes. If the nodes are 
@@ -151,31 +165,35 @@
 
 ::
 
-  2. anim.SetConstantPosition (Ptr< Node > n, double x, double y);
+  // Step 2
+  anim.SetConstantPosition (Ptr< Node > n, double x, double y);
 
 AnimationInterface requires that the position of all nodes be set. In |ns3| this is done by setting an associated MobilityModel. "SetConstantPosition" is a quick way to set the x-y coordinates of a node which is stationary.
 
 ::
 
-  3. anim.SetStartTime (Seconds(150)); and anim.SetStopTime (Seconds(150));
+  // Step 3
+  anim.SetStartTime (Seconds(150)); and anim.SetStopTime (Seconds(150));
 
 AnimationInterface can generate large XML files. The above statements restricts the window between which AnimationInterface does tracing. Restricting the window serves to focus only on relevant portions of the simulation and creating manageably small XML files
 
 ::
 
-  4. AnimationInterface anim ("animation.xml", 50000);
+  // Step 4
+  AnimationInterface anim ("animation.xml", 50000);
 
 Using the above constructor ensures that each animation XML trace file has only 50000 packets. For example, if AnimationInterface captures 150000 packets, using the above constructor splits the capture into 3 files
 
-animation.xml - containing the packet range 1-50000
+* animation.xml - containing the packet range 1-50000
 
-animation.xml-1 - containing the packet range 50001-100000 
+* animation.xml-1 - containing the packet range 50001-100000 
 
-animation.xml-2 - containing the packet range 100001-150000 
+* animation.xml-2 - containing the packet range 100001-150000 
 
 ::
 
-  5. anim.EnablePacketMetadata (true);
+  // Step 5
+  anim.EnablePacketMetadata (true);
 
 With the above statement, AnimationInterface records the meta-data of each packet in the xml trace file. Metadata can be used by NetAnim to provide better statistics and filter, along with providing some brief information about the packet such as TCP sequence number or source & destination IP address during packet animation.
 
@@ -229,16 +247,20 @@
 
 XML tags
 ~~~~~~~~
+.. highlight:: xml
+
 Nodes are identified by their unique Node id. The XML begins with the "information" element describing the rest of the elements
 
-1. <anim> element
+<anim> Element
+##############
 
 This is the XML root element. All other elements fall within this element.
   Attributes are::
 
     lp = Logical Processor Id (Used for distributed simulations only)
 
-2. <topology> element
+<topology> Element
+##################
 
 This elements contains the Node and Link elements.It describes, the co-ordinates of the canvas used for animation.
    Attributes are::
@@ -250,9 +272,10 @@
 
 Example::
 
- <topology minX = "-6.42025" minY = "-6.48444" maxX = "186.187" maxY = "188.049">
+  <topology minX = "-6.42025" minY = "-6.48444" maxX = "186.187" maxY = "188.049">
 
-3. <node> element
+<node> Element
+##############
 
 This element describes each Node's Id and X,Y co-ordinate (position).
   Attributes are::
@@ -265,7 +288,8 @@
 
   <node id = "8" locX = "107.599" locY = "96.9366" />
 
-4. <link> element
+<link> Element
+##############
 
 This element describes wired links between two nodes.
  Attributes are::
@@ -277,7 +301,8 @@
 
   <link fromId="0" toId="1"/>
 
-5. <p> element
+<p> Element
+###########
 
 This element describes a packet over wired links being transmitted at some node and received at another. 
 
@@ -298,7 +323,8 @@
 A packet over wired-links from Node 1 was received at Node 0. The first bit of the packet was transmitted at  the 1st second, the last bit was transmitted at the 1.000067199th second of the simulation Node 0 received the first bit of the packet at the 1.002th second and the last bit of the packet at the 1.002067199th second of the simulation
 NOTE: A packet with fromId == toId is a dummy packet used internally by the AnimationInterface. Please ignore this packet
 
-7. <wp> element
+<wp> Element
+############
 
 This element describes a packet over wireless links being transmitted at some node and received at another. 
 
diff -Naur ns-3.18.1/src/netanim/examples/uan-animation.cc ns-3.19/src/netanim/examples/uan-animation.cc
--- ns-3.18.1/src/netanim/examples/uan-animation.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/netanim/examples/uan-animation.cc	2013-12-20 09:44:50.000000000 -0800
@@ -47,7 +47,8 @@
 
 using namespace ns3;
 
-NS_LOG_COMPONENT_DEFINE ("UanCwExample");
+NS_LOG_COMPONENT_DEFINE ("UanCwExample")
+  ;
 
 NetAnimExperiment::NetAnimExperiment () 
   : m_numNodes (15),
diff -Naur ns-3.18.1/src/netanim/examples/wireless-animation.cc ns-3.19/src/netanim/examples/wireless-animation.cc
--- ns-3.18.1/src/netanim/examples/wireless-animation.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/netanim/examples/wireless-animation.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,6 +26,8 @@
 #include "ns3/mobility-module.h"
 #include "ns3/internet-module.h"
 #include "ns3/netanim-module.h"
+#include "ns3/basic-energy-source.h"
+#include "ns3/simple-device-energy-model.h"
 
 
 
@@ -115,6 +117,17 @@
   AnimationInterface::SetConstantPosition (p2pNodes.Get (1), 10, 30); 
   AnimationInterface::SetConstantPosition (csmaNodes.Get (1), 10, 33); 
 
+  Ptr<BasicEnergySource> energySource = CreateObject<BasicEnergySource>();
+  Ptr<SimpleDeviceEnergyModel> energyModel = CreateObject<SimpleDeviceEnergyModel>();
+
+  energySource->SetInitialEnergy (300);
+  energyModel->SetEnergySource (energySource);
+  energySource->AppendDeviceEnergyModel (energyModel);
+  energyModel->SetCurrentA (20);
+
+  // aggregate energy source to node
+  wifiApNode.Get (0)->AggregateObject (energySource);
+
   // Install internet stack
 
   InternetStackHelper stack;
@@ -152,7 +165,7 @@
   Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
   Simulator::Stop (Seconds (15.0));
   AnimationInterface::SetNodeDescription (wifiApNode, "AP"); // Optional
-  AnimationInterface::SetNodeDescription (wifiStaNodes, "STA"); // Optional
+  AnimationInterface::SetNodeDescription (wifiStaNodes, "STA"); //b Optional
   AnimationInterface::SetNodeDescription (csmaNodes, "CSMA"); // Optional
   AnimationInterface::SetNodeColor (wifiApNode, 0, 255, 0); // Optional
   AnimationInterface::SetNodeColor (wifiStaNodes, 255, 0, 0); // Optional
@@ -162,7 +175,7 @@
   AnimationInterface anim ("wireless-animation.xml"); // Mandatory
 
   anim.EnablePacketMetadata (true); // Optional
-  anim.EnableIpv4RouteTracking ("routingtable-wireless.xml", Seconds(0), Seconds(5), Seconds(0.25)); //Optional
+  anim.EnableIpv4RouteTracking ("routingtable-wireless.xml", Seconds (0), Seconds (5), Seconds (0.25)); //Optional
   Simulator::Run ();
   Simulator::Destroy ();
   return 0;
diff -Naur ns-3.18.1/src/netanim/model/animation-interface.cc ns-3.19/src/netanim/model/animation-interface.cc
--- ns-3.18.1/src/netanim/model/animation-interface.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/netanim/model/animation-interface.cc	2013-12-20 09:44:50.000000000 -0800
@@ -15,6 +15,7 @@
  *
  * Author: George F. Riley<riley@ece.gatech.edu>
  * Modified by: John Abraham <john.abraham@gatech.edu>
+ * Contributions: Eugene Kalishenko <ydginster@gmail.com> (Open Source and Linux Laboratory http://dev.osll.ru/)
  */
 
 // Interface between ns3 and the network animator
@@ -39,7 +40,8 @@
 #include "ns3/uan-net-device.h"
 #include "ns3/uan-mac.h"
 #include "ns3/ipv4.h"
-#include "ns3/ipv4-routing-protocol.h" 
+#include "ns3/ipv4-routing-protocol.h"
+#include "ns3/energy-source-container.h"
 
 #include <cstdio>
 #include <unistd.h>
@@ -63,11 +65,11 @@
 
 
 AnimationInterface::AnimationInterface (const std::string fn, uint64_t maxPktsPerFile, bool usingXML)
-  : m_routingF (0), m_xml (usingXML), m_mobilityPollInterval (Seconds(0.25)), 
+  : m_routingF (0), m_xml (usingXML), m_mobilityPollInterval (Seconds (0.25)), 
     m_outputFileName (fn),
     m_outputFileSet (false), gAnimUid (0), m_randomPosition (true),
     m_writeCallback (0), m_started (false), 
-    m_enablePacketMetadata (false), m_startTime (Seconds(0)), m_stopTime (Seconds(3600 * 1000)),
+    m_enablePacketMetadata (false), m_startTime (Seconds (0)), m_stopTime (Seconds (3600 * 1000)),
     m_maxPktsPerFile (maxPktsPerFile), m_originalFileName (fn),
     m_routingStopTime (Seconds (0)), m_routingFileName (""),
     m_routingPollInterval (Seconds (5))
@@ -116,7 +118,7 @@
   std::stringstream stream;
   Ptr<OutputStreamWrapper> routingstream = Create<OutputStreamWrapper> (&stream);
   ipv4->GetRoutingProtocol ()->PrintRoutingTable (routingstream);
-  return stream.str();
+  return stream.str ();
 
 }
 
@@ -315,7 +317,7 @@
 
 std::string AnimationInterface::GetNetAnimVersion ()
 {
-  return "netanim-3.103";
+  return "netanim-3.104";
 }
 
 void AnimationInterface::SetStartTime (Time t)
@@ -468,9 +470,9 @@
 Vector AnimationInterface::GetPosition (Ptr <Node> n)
 {
   #ifdef NS_LOG
-  if (m_nodeLocation.find (n->GetId()) == m_nodeLocation.end ())
+  if (m_nodeLocation.find (n->GetId ()) == m_nodeLocation.end ())
     {
-      NS_FATAL_ERROR ("Node:" <<n->GetId() << " not found in Location table");
+      NS_FATAL_ERROR ("Node:" <<n->GetId () << " not found in Location table");
     }  
   #endif
   return m_nodeLocation[n->GetId ()];
@@ -586,7 +588,7 @@
 
 std::string AnimationInterface::GetMacAddress (Ptr <NetDevice> nd)
 {
-  Address nodeAddr = nd->GetAddress();
+  Address nodeAddr = nd->GetAddress ();
   std::ostringstream oss;
   oss << nodeAddr;
   return oss.str ().substr (6); // Skip the first 6 chars to get the Mac
@@ -796,7 +798,7 @@
       uint32_t nDevices = n->GetNDevices ();
       for (uint32_t devIndex = 0; devIndex < nDevices; ++devIndex)
         {
-          Ptr <NetDevice> nd = n->GetDevice(devIndex);
+          Ptr <NetDevice> nd = n->GetDevice (devIndex);
           if (!nd)
             continue;
           Ptr<LteUeNetDevice> lteUeNetDevice = DynamicCast<LteUeNetDevice> (nd);
@@ -844,6 +846,8 @@
                    MakeCallback (&AnimationInterface::UanPhyGenTxTrace, this));
   Config::Connect ("/NodeList/*/DeviceList/*/$ns3::UanNetDevice/Phy/PhyRxBegin",
                    MakeCallback (&AnimationInterface::UanPhyGenRxTrace, this));
+  Config::Connect ("/NodeList/*/$ns3::BasicEnergySource/RemainingEnergy",
+                   MakeCallback (&AnimationInterface::RemainingEnergyTrace, this));
 
   ConnectLte ();
 
@@ -1016,6 +1020,19 @@
 }
 
 
+Ptr <Node>
+AnimationInterface::GetNodeFromContext (const std::string& context) const
+{
+  // Use "NodeList/*/ as reference
+  // where element [1] is the Node Id
+
+  std::vector <std::string> elements = GetElementsFromContext (context);
+  Ptr <Node> n = NodeList::GetNode (atoi (elements.at (1).c_str ()));
+  NS_ASSERT (n);
+
+  return n;
+}
+
 Ptr <NetDevice>
 AnimationInterface::GetNetDeviceFromContext (std::string context)
 {
@@ -1024,9 +1041,9 @@
   // element [2] is the NetDevice Id
 
   std::vector <std::string> elements = GetElementsFromContext (context);
-  Ptr <Node> n = NodeList::GetNode (atoi (elements[1].c_str ()));
-  NS_ASSERT (n);
-  return n->GetDevice (atoi (elements[3].c_str ()));
+  Ptr <Node> n = GetNodeFromContext (context);
+
+  return n->GetDevice (atoi (elements.at (3).c_str ()));
 }
 
 void AnimationInterface::AddPendingUanPacket (uint64_t AnimUid, AnimPacketInfo &pktinfo)
@@ -1123,6 +1140,27 @@
 
 }
 
+void AnimationInterface::RemainingEnergyTrace (std::string context, double previousEnergy, double currentEnergy)
+{
+  if (!m_started || !IsInTimeWindow ())
+    return;
+
+  const Ptr <const Node> node = GetNodeFromContext (context);
+  const uint32_t nodeId = node->GetId ();
+
+  NS_LOG_INFO ("Remaining energy on one of sources on node " << nodeId << ": " << currentEnergy);
+
+  const Ptr<EnergySource> energySource = node->GetObject<EnergySource> ();
+
+  NS_ASSERT (energySource);
+  // Don't call GetEnergyFraction () because of recursion
+  const double energyFraction = currentEnergy / energySource->GetInitialEnergy ();
+
+  NS_LOG_INFO ("Total energy fraction on node " << nodeId << ": " << energyFraction);
+
+  m_nodeEnergyFraction[nodeId] = energyFraction;
+  WriteNodeUpdate (nodeId);
+}
 
 void AnimationInterface::WifiPhyTxBeginTrace (std::string context,
                                           Ptr<const Packet> p)
@@ -1142,7 +1180,7 @@
   AnimPacketInfo pktinfo (ndev, Simulator::Now (), Simulator::Now (), UpdatePosition (n));
   AddPendingWifiPacket (gAnimUid, pktinfo);
   Ptr<WifiNetDevice> netDevice = DynamicCast<WifiNetDevice> (ndev);
-  Mac48Address nodeAddr = netDevice->GetMac()->GetAddress();
+  Mac48Address nodeAddr = netDevice->GetMac ()->GetAddress ();
   std::ostringstream oss; 
   oss << nodeAddr;
   m_macToNodeIdMap[oss.str ()] = n->GetId ();
@@ -1185,7 +1223,7 @@
       NS_LOG_WARN ("WifiPhyRxBeginTrace: unknown Uid");
       std::ostringstream oss;
       WifiMacHeader hdr;
-      if(!p->PeekHeader (hdr))
+      if (!p->PeekHeader (hdr))
       { 
         NS_LOG_WARN ("WifiMacHeader not present");
         return;
@@ -1589,6 +1627,14 @@
   return m_currentPktCount;
 }
 
+double AnimationInterface::GetNodeEnergyFraction (Ptr <const Node> node) const
+{
+  const EnergyFractionMap::const_iterator fractionIter = m_nodeEnergyFraction.find (node->GetId ());
+
+  NS_ASSERT (fractionIter != m_nodeEnergyFraction.end ());
+  return fractionIter->second;
+}
+
 int64_t
 AnimationInterface::AssignStreams (int64_t stream)
 {
@@ -1637,6 +1683,7 @@
     * g = Green component\n\
     * b = Blue component\n\
     * visible = Node visibility\n\
+    * rc = Residual energy (between 0 and 1)\n\
     p\n\
     * fId = From Node Id\n\
     * fbTx = First bit transmit time\n\
@@ -1736,10 +1783,7 @@
 {
   NS_ASSERT (NodeList::GetNode (nodeId));
   NS_LOG_INFO ("Setting node visibility for Node Id:" << nodeId); 
-  std::ostringstream oss;
-  oss << GetXMLOpenClose_nodeupdate (nodeId, show);
-  WriteN (oss.str (), m_f);
-
+  WriteNodeUpdate (nodeId);
 }
 
 void AnimationInterface::ShowNode (Ptr <Node> n, bool show)
@@ -1747,6 +1791,13 @@
   ShowNode (n, show);
 }
 
+void AnimationInterface::WriteNodeUpdate (uint32_t nodeId)
+{
+  std::ostringstream oss;
+  oss << GetXMLOpenClose_nodeupdate (nodeId);
+  WriteN (oss.str (), m_f);
+}
+
 void AnimationInterface::UpdateNodeColor (Ptr <Node> n, uint8_t r, uint8_t g, uint8_t b)
 {
   UpdateNodeColor (n->GetId (), r, g, b);
@@ -1758,9 +1809,7 @@
   NS_LOG_INFO ("Setting node color for Node Id:" << nodeId); 
   struct Rgb rgb = {r, g, b};
   nodeColors[nodeId] = rgb;
-  std::ostringstream oss;
-  oss << GetXMLOpenClose_nodeupdate (nodeId);
-  WriteN (oss.str (), m_f);
+  WriteNodeUpdate (nodeId);
 }
 
 
@@ -1808,7 +1857,7 @@
   /* DEBUG */
   /*
   for (std::map <P2pLinkNodeIdPair, LinkProperties>::const_iterator i = linkProperties.begin ();
-	i != linkProperties.end(); ++i)
+	i != linkProperties.end (); ++i)
    {
     P2pLinkNodeIdPair ppair = i->first;
     LinkProperties l = i->second;
@@ -1893,10 +1942,6 @@
 
 std::string AnimationInterface::GetXMLOpenClose_nodeupdate (uint32_t id, bool visible)
 {
-  struct Rgb rgb = nodeColors[id];
-  uint8_t r = rgb.r;
-  uint8_t g = rgb.g;
-  uint8_t b = rgb.b;
   std::ostringstream oss;
   oss << "<nodeupdate id=\"" << id << "\"";
   oss << " t=\"" << Simulator::Now ().GetSeconds () << "\"";
@@ -1904,16 +1949,12 @@
     oss << " visible=\"" << 1 << "\"";
   else
     oss << " visible=\"" << 0 << "\"";
-  if (nodeDescriptions.find (id) != nodeDescriptions.end ())
-    {
-      oss << " descr=\""<< nodeDescriptions[id] << "\"";
-    }
-  else
-    {
-      oss << " descr=\"\"";
-    }
-  oss << " r=\"" << (uint32_t)r << "\" "
-      << " g=\"" << (uint32_t)g << "\" b=\"" << (uint32_t)b <<"\"/>\n";
+  AppendXMLNodeDescription (oss, id);
+  AppendXMLNodeColor (oss, nodeColors[id]);
+  AppendXMLRemainingEnergy (oss, id);
+
+  oss  <<"/>\n";
+
   return oss.str ();
 
 }
@@ -1922,35 +1963,26 @@
 {
   std::ostringstream oss;
   oss <<"<node id=\"" << id << "\""; 
-  if (nodeDescriptions.find (id) != nodeDescriptions.end ())
-    {
-      oss << " descr=\""<< nodeDescriptions[id] << "\"";
-    }
-  else
-    {
-      oss << " descr=\"\"";
-    }
-  oss << " locX = \"" << locX << "\" " << "locY = \"" << locY << "\" />\n";
+  AppendXMLNodeDescription (oss, id);
+  oss << " locX = \"" << locX << "\" " << "locY = \"" << locY << "\"";
+  AppendXMLRemainingEnergy (oss, id);
+
+  oss  <<"/>\n";
+
   return oss.str ();
 }
 
 std::string AnimationInterface::GetXMLOpenClose_node (uint32_t lp, uint32_t id, double locX, double locY, struct Rgb rgb)
 {
-  uint8_t r = rgb.r;
-  uint8_t g = rgb.g;
-  uint8_t b = rgb.b;
   std::ostringstream oss;
   oss <<"<node id = \"" << id << "\"";
-  if (nodeDescriptions.find (id) != nodeDescriptions.end ())
-    {
-      oss << " descr=\""<< nodeDescriptions[id] << "\"";
-    }
-  else
-    {
-      oss << " descr=\"\"";
-    }
-  oss << " locX=\"" << locX << "\" " << "locY=\"" << locY << "\"" << " r=\"" << (uint32_t)r << "\" " 
-    << " g=\"" << (uint32_t)g << "\" b=\"" << (uint32_t)b <<"\"/>\n";
+  AppendXMLNodeDescription (oss, id);
+  oss << " locX=\"" << locX << "\" " << "locY=\"" << locY << "\"";
+  AppendXMLNodeColor (oss, rgb);
+  AppendXMLRemainingEnergy (oss, id);
+
+  oss  <<"/>\n";
+
   return oss.str ();
 }
 
@@ -1982,11 +2014,11 @@
 
   P2pLinkNodeIdPair p1 = { fromId, toId };
   P2pLinkNodeIdPair p2 = { toId, fromId };
-  if (linkProperties.find (p1) != linkProperties.end())
+  if (linkProperties.find (p1) != linkProperties.end ())
     {
       lprop = linkProperties[p1];
     }
-  else if (linkProperties.find (p2) != linkProperties.end())
+  else if (linkProperties.find (p2) != linkProperties.end ())
     {
       lprop = linkProperties[p2];
     }
@@ -2006,7 +2038,7 @@
   oss << "<p fId=\"" << fromId
       << "\" fbTx=\"" << fbTx
       << "\" lbTx=\"" << lbTx
-      << (auxInfo.empty()?"":"\" aux=\"") << auxInfo.c_str () << "\">";
+      << (auxInfo.empty ()?"":"\" aux=\"") << auxInfo.c_str () << "\">";
   return oss.str ();
 }
 
@@ -2105,7 +2137,7 @@
 }
 
 
-std::vector<std::string> AnimationInterface::GetElementsFromContext (std::string context)
+const std::vector<std::string> AnimationInterface::GetElementsFromContext (const std::string& context) const
 {
   std::vector <std::string> elements;
   size_t pos1=0, pos2;
@@ -2120,6 +2152,39 @@
   return elements;
 }
 
+void AnimationInterface::AppendXMLNodeDescription (std::ostream& ostream, uint32_t id) const
+{
+  if (nodeDescriptions.find (id) != nodeDescriptions.end ())
+    {
+      ostream << " descr=\""<< nodeDescriptions[id] << "\"";
+    }
+  else
+    {
+      ostream << " descr=\"\"";
+    }
+}
+
+void AnimationInterface::AppendXMLNodeColor (std::ostream& ostream, const Rgb& color) const
+{
+  const uint8_t r = color.r;
+  const uint8_t g = color.g;
+  const uint8_t b = color.b;
+
+  ostream << " r=\"" << (uint32_t)r << "\" "
+          << " g=\"" << (uint32_t)g << "\" "
+          << " b=\"" << (uint32_t)b <<"\" ";
+}
+
+void AnimationInterface::AppendXMLRemainingEnergy (std::ostream& ostream, uint32_t id) const
+{
+  const EnergyFractionMap::const_iterator fractionIter = m_nodeEnergyFraction.find (id);
+
+  if (fractionIter != m_nodeEnergyFraction.end ())
+    ostream << "rc = \"" << fractionIter->second <<"\" ";
+  else if (NodeList::GetNode (id)->GetObject<EnergySource>())
+    ostream << "rc = \"1\" ";
+}
+
 TypeId
 AnimByteTag::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/netanim/model/animation-interface.h ns-3.19/src/netanim/model/animation-interface.h
--- ns-3.18.1/src/netanim/model/animation-interface.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/netanim/model/animation-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -14,6 +14,7 @@
  *
  * Author: George F. Riley<riley@ece.gatech.edu>
  * Author: John Abraham <john.abraham@gatech.edu>
+ * Contributions: Eugene Kalishenko <ydginster@gmail.com> (Open Source and Linux Laboratory http://dev.osll.ru/)
  */
 
 // Interface between ns3 and the network animator
@@ -89,7 +90,7 @@
 } Ipv4RoutePathElement;
 
 /**
- * \defgroup netanim Netanim
+ * \defgroup netanim Network Animation
  *
  * This section documents the API of the ns-3 netanim module. For a generic functional description, please refer to the ns-3 manual.
  */
@@ -137,7 +138,7 @@
    *
    * \returns reference to this AnimationInterface object
    */
-  AnimationInterface & EnableIpv4RouteTracking (std::string fileName, Time startTime, Time stopTime, Time pollInterval = Seconds(5));
+  AnimationInterface & EnableIpv4RouteTracking (std::string fileName, Time startTime, Time stopTime, Time pollInterval = Seconds (5));
 
   /**
    * \brief Enable tracking of the Ipv4 routing table for a set of Nodes
@@ -151,7 +152,7 @@
    *
    * \returns reference to this AnimationInterface object
    */
-  AnimationInterface & EnableIpv4RouteTracking (std::string fileName, Time startTime, Time stopTime, NodeContainer nc, Time pollInterval = Seconds(5));
+  AnimationInterface & EnableIpv4RouteTracking (std::string fileName, Time startTime, Time stopTime, NodeContainer nc, Time pollInterval = Seconds (5));
 
   /**
    * \brief Check if AnimationInterface is initialized
@@ -233,7 +234,7 @@
    * \param minX X value of the lower left corner
    * \param minY Y value of the lower left corner
    * \param maxX X value of the upper right corner
-   * \param maxX Y value of the upper right corner
+   * \param maxY Y value of the upper right corner
    *
    */
   static void SetBoundary (double minX, double minY, double maxX, double maxY);
@@ -320,7 +321,7 @@
 
   /**
    * \brief Helper function to set the color of nodes in a container
-   * \param n Ptr to the node
+   * \param nc A Node Container of Nodes 
    * \param r Red component value (0-255)
    * \param g Green component value (0-255)
    * \param b Blue component value (0-255)
@@ -410,6 +411,15 @@
    */
   uint64_t GetTracePktCount ();
 
+  /**
+   *
+   * \brief Get node's energy fraction (This used only for testing)
+   *
+   * returns current node's remaining energy (between [0, 1])
+   *
+   */
+  double GetNodeEnergyFraction (Ptr <const Node> node) const;
+
  /**
   * Assign a fixed random variable stream number to the random variables
   * used by this model.  Return the number of streams (possibly zero) that
@@ -542,6 +552,8 @@
   void UanPhyGenRxTrace (std::string context,
                          Ptr<const Packet>);
 
+  void RemainingEnergyTrace (std::string context, double previousEnergy, double currentEnergy);
+
   void MobilityCourseChangeTrace (Ptr <const MobilityModel> mob);
 
   // Write a string to the specified handle;
@@ -606,20 +618,26 @@
   bool IsInTimeWindow ();
 
   // Path helper
-  std::vector<std::string> GetElementsFromContext (std::string context);
+  const std::vector<std::string> GetElementsFromContext (const std::string& context) const;
+  Ptr <Node> GetNodeFromContext (const std::string& context) const;
   Ptr <NetDevice> GetNetDeviceFromContext (std::string context);
 
+  typedef std::map <uint32_t, double> EnergyFractionMap;
+
   static std::map <uint32_t, Rgb> nodeColors;
   static std::map <uint32_t, std::string> nodeDescriptions;
   static std::map <P2pLinkNodeIdPair, LinkProperties, LinkPairCompare> linkProperties;
+  EnergyFractionMap m_nodeEnergyFraction;
   uint64_t m_currentPktCount;
 
-  void StartNewTraceFile();
+  void StartNewTraceFile ();
 
   std::string GetMacAddress (Ptr <NetDevice> nd);
   std::string GetIpv4Address (Ptr <NetDevice> nd);
   void WriteNonP2pLinkProperties (uint32_t id, std::string ipv4Address, std::string channelType);
 
+  void WriteNodeUpdate (uint32_t nodeId);
+
   std::string GetNetAnimVersion ();
 
   // XML helpers
@@ -651,7 +669,9 @@
   std::string GetXMLOpenClose_routing (uint32_t id, std::string routingInfo);
   std::string GetXMLOpenClose_rp (uint32_t nodeId, std::string destination, Ipv4RoutePathElements rpElements);
 
-
+  void AppendXMLNodeDescription (std::ostream& ostream, uint32_t id) const;
+  void AppendXMLNodeColor (std::ostream& ostream, const Rgb& color) const;
+  void AppendXMLRemainingEnergy (std::ostream& ostream, uint32_t id) const;
 
   /// Provides uniform random variables.
   Ptr<UniformRandomVariable> m_uniformRandomVariable;  
diff -Naur ns-3.18.1/src/netanim/test/netanim-test.cc ns-3.19/src/netanim/test/netanim-test.cc
--- ns-3.18.1/src/netanim/test/netanim-test.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/netanim/test/netanim-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -14,6 +14,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: John Abraham <john.abraham@gatech.edu>
+ * Contributions: Eugene Kalishenko <ydginster@gmail.com> (Open Source and Linux Laboratory http://dev.osll.ru/)
  */
 
 #include <iostream>
@@ -26,21 +27,23 @@
 #include "ns3/netanim-module.h"
 #include "ns3/applications-module.h"
 #include "ns3/point-to-point-layout-module.h"
+#include "ns3/basic-energy-source.h"
+#include "ns3/simple-device-energy-model.h"
 
 namespace ns3 {
 
-class AnimationInterfaceTestCase : public TestCase
+class AbstractAnimationInterfaceTestCase : public TestCase
 {
 public:
   /**
    * \brief Constructor.
    */
-  AnimationInterfaceTestCase ();
+  AbstractAnimationInterfaceTestCase (std::string name);
   /**
    * \brief Destructor.
    */
   virtual
-  ~AnimationInterfaceTestCase ();
+  ~AbstractAnimationInterfaceTestCase ();
   /**
    * \brief Run unit tests for this class.
    * \return false if all tests have passed, false otherwise
@@ -48,33 +51,96 @@
   virtual void
   DoRun (void);
 
+protected:
+
+  NodeContainer m_nodes;
+  AnimationInterface* m_anim;
+
+private:
+
+  virtual void
+  PrepareNetwork () = 0;
+
+  virtual void
+  CheckLogic () = 0;
+
+  virtual void
+  CheckFileExistence ();
+
+  const char* m_traceFileName;
 };
 
-AnimationInterfaceTestCase::AnimationInterfaceTestCase () :
-  TestCase ("Verify AnimationInterface")
+AbstractAnimationInterfaceTestCase::AbstractAnimationInterfaceTestCase (std::string name) :
+  TestCase (name), m_anim (NULL), m_traceFileName ("netanim-test.xml")
 {
 }
 
-AnimationInterfaceTestCase::~AnimationInterfaceTestCase ()
+AbstractAnimationInterfaceTestCase::~AbstractAnimationInterfaceTestCase ()
+{
+  delete m_anim;
+}
+
+void
+AbstractAnimationInterfaceTestCase::DoRun (void)
+{
+  PrepareNetwork ();
+
+  m_anim = new AnimationInterface (m_traceFileName);
+
+  Simulator::Run ();
+  CheckLogic ();
+  CheckFileExistence ();
+  Simulator::Destroy ();
+}
+
+void
+AbstractAnimationInterfaceTestCase::CheckFileExistence ()
+{
+  FILE * fp = fopen (m_traceFileName, "r");
+  NS_TEST_ASSERT_MSG_NE (fp, 0, "Trace file was not created");
+  fclose (fp);
+  unlink (m_traceFileName);
+}
+
+class AnimationInterfaceTestCase : public AbstractAnimationInterfaceTestCase
+{
+public:
+  /**
+   * \brief Constructor.
+   */
+  AnimationInterfaceTestCase ();
+
+private:
+
+  virtual void
+  PrepareNetwork ();
+
+  virtual void
+  CheckLogic ();
+
+};
+
+AnimationInterfaceTestCase::AnimationInterfaceTestCase () :
+  AbstractAnimationInterfaceTestCase ("Verify AnimationInterface")
 {
 }
+
 void
-AnimationInterfaceTestCase::DoRun (void)
+AnimationInterfaceTestCase::PrepareNetwork (void)
 {
-  NodeContainer nodes;
-  nodes.Create (2);
-  AnimationInterface::SetConstantPosition (nodes.Get (0), 0 , 10);
-  AnimationInterface::SetConstantPosition (nodes.Get (1), 1 , 10);
+  m_nodes.Create (2);
+  AnimationInterface::SetConstantPosition (m_nodes.Get (0), 0 , 10);
+  AnimationInterface::SetConstantPosition (m_nodes.Get (1), 1 , 10);
 
   PointToPointHelper pointToPoint;
   pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
   pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
 
   NetDeviceContainer devices;
-  devices = pointToPoint.Install (nodes);
+  devices = pointToPoint.Install (m_nodes);
 
   InternetStackHelper stack;
-  stack.Install (nodes);
+  stack.Install (m_nodes);
 
   Ipv4AddressHelper address;
   address.SetBase ("10.1.1.0", "255.255.255.0");
@@ -83,7 +149,7 @@
 
   UdpEchoServerHelper echoServer (9);
 
-  ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
+  ApplicationContainer serverApps = echoServer.Install (m_nodes.Get (1));
   serverApps.Start (Seconds (1.0));
   serverApps.Stop (Seconds (10.0));
 
@@ -92,18 +158,74 @@
   echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
   echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
 
-  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
+  ApplicationContainer clientApps = echoClient.Install (m_nodes.Get (0));
   clientApps.Start (Seconds (2.0));
   clientApps.Stop (Seconds (10.0));
-  std::string traceFileName = "netanim-test.xml";
-  AnimationInterface anim(traceFileName.c_str ());
-  Simulator::Run ();
-  NS_TEST_ASSERT_MSG_EQ (anim.GetTracePktCount (), 32, "Expected 32 packets traced");
-  FILE * fp = fopen (traceFileName.c_str (), "r");
-  NS_TEST_ASSERT_MSG_NE (fp, 0, "Trace file was not created");
-  fclose (fp);
-  unlink (traceFileName.c_str ());
-  Simulator::Destroy ();
+}
+
+void
+AnimationInterfaceTestCase::CheckLogic (void)
+{
+  NS_TEST_ASSERT_MSG_EQ (m_anim->GetTracePktCount (), 32, "Expected 32 packets traced");
+}
+
+class AnimationRemainingEnergyTestCase : public AbstractAnimationInterfaceTestCase
+{
+public:
+  /**
+   * \brief Constructor.
+   */
+  AnimationRemainingEnergyTestCase ();
+
+private:
+
+  virtual void
+  PrepareNetwork ();
+
+  virtual void
+  CheckLogic ();
+
+  Ptr<BasicEnergySource> m_energySource;
+  Ptr<SimpleDeviceEnergyModel> m_energyModel;
+  const double m_initialEnergy;
+};
+
+AnimationRemainingEnergyTestCase::AnimationRemainingEnergyTestCase () :
+  AbstractAnimationInterfaceTestCase ("Verify Remaining energy tracing"),
+  m_initialEnergy (100)
+{
+}
+
+void
+AnimationRemainingEnergyTestCase::PrepareNetwork (void)
+{
+  m_energySource = CreateObject<BasicEnergySource>();
+  m_energyModel = CreateObject<SimpleDeviceEnergyModel>();
+
+  m_energySource->SetInitialEnergy (m_initialEnergy);
+  m_energyModel->SetEnergySource (m_energySource);
+  m_energySource->AppendDeviceEnergyModel (m_energyModel);
+  m_energyModel->SetCurrentA (20);
+
+  m_nodes.Create (1);
+  AnimationInterface::SetConstantPosition (m_nodes.Get (0), 0 , 10);
+
+  // aggregate energy source to node
+  m_nodes.Get (0)->AggregateObject (m_energySource);
+  // once node's energy will be depleted according to the model
+  Simulator::Stop (Seconds (2));
+}
+
+void
+AnimationRemainingEnergyTestCase::CheckLogic (void)
+{
+  const double remainingEnergy = m_energySource->GetRemainingEnergy ();
+
+  NS_TEST_ASSERT_MSG_EQ ((remainingEnergy < m_initialEnergy), true, "Energy hasn't depleted!");
+  NS_TEST_ASSERT_MSG_EQ_TOL (m_anim->GetNodeEnergyFraction (m_nodes.Get (0)),
+                            remainingEnergy / m_initialEnergy,
+                            1.0e-13,
+                            "Wrong remaining energy value was traced");
 }
 
 static class AnimationInterfaceTestSuite : public TestSuite
@@ -113,6 +235,7 @@
     TestSuite ("animation-interface", UNIT)
   {
     AddTestCase (new AnimationInterfaceTestCase (), TestCase::QUICK);
+    AddTestCase (new AnimationRemainingEnergyTestCase (), TestCase::QUICK);
   }
 } g_animationInterfaceTestSuite;
 
diff -Naur ns-3.18.1/src/netanim/wscript ns-3.19/src/netanim/wscript
--- ns-3.18.1/src/netanim/wscript	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/netanim/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -3,11 +3,11 @@
 import wutils
 
 # Required NetAnim version
-NETANIM_RELEASE_NAME = "netanim-3.103"
+NETANIM_RELEASE_NAME = "netanim-3.104"
 
 
 def build (bld) :
-	module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan'])
+	module = bld.create_ns3_module ('netanim', ['internet', 'mobility', 'wimax', 'wifi', 'csma', 'lte', 'uan', 'energy'])
 	module.includes = '.'
 	module.source = [
 			  'model/animation-interface.cc',
diff -Naur ns-3.18.1/src/network/bindings/modulegen__gcc_ILP32.py ns-3.19/src/network/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/network/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -267,7 +267,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1985,10 +1985,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -5402,6 +5403,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5412,6 +5418,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5427,6 +5438,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5452,6 +5468,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -9074,7 +9095,8 @@
     ## simple-channel.h (module 'network'): void ns3::SimpleChannel::Add(ns3::Ptr<ns3::SimpleNetDevice> device) [member function]
     cls.add_method('Add', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')])
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')], 
+                   is_virtual=True)
     ## simple-channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::SimpleChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -9093,7 +9115,8 @@
     ## simple-channel.h (module 'network'): void ns3::SimpleChannel::Send(ns3::Ptr<ns3::Packet> p, uint16_t protocol, ns3::Mac48Address to, ns3::Mac48Address from, ns3::Ptr<ns3::SimpleNetDevice> sender) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')])
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')], 
+                   is_virtual=True)
     return
 
 def register_Ns3SimpleNetDevice_methods(root_module, cls):
@@ -9414,14 +9437,14 @@
     cls.add_method('SetBurstRate', 
                    'void', 
                    [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
     cls.add_method('SetRandomBurstSize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
     cls.add_method('SetRandomVariable', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
     ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoCorrupt', 
                    'bool', 
@@ -9666,6 +9689,10 @@
 
 def register_functions(root_module):
     module = root_module
+    ## crc32.h (module 'network'): extern uint32_t ns3::CRC32Calculate(uint8_t const * data, int length) [free function]
+    module.add_function('CRC32Calculate', 
+                        'uint32_t', 
+                        [param('uint8_t const *', 'data'), param('int', 'length')])
     ## address.h (module 'network'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::MakeAddressChecker() [free function]
     module.add_function('MakeAddressChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
diff -Naur ns-3.18.1/src/network/bindings/modulegen__gcc_LP64.py ns-3.19/src/network/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/network/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -267,7 +267,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1985,10 +1985,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -5402,6 +5403,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5412,6 +5418,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5427,6 +5438,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5452,6 +5468,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -9074,7 +9095,8 @@
     ## simple-channel.h (module 'network'): void ns3::SimpleChannel::Add(ns3::Ptr<ns3::SimpleNetDevice> device) [member function]
     cls.add_method('Add', 
                    'void', 
-                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')])
+                   [param('ns3::Ptr< ns3::SimpleNetDevice >', 'device')], 
+                   is_virtual=True)
     ## simple-channel.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::SimpleChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
@@ -9093,7 +9115,8 @@
     ## simple-channel.h (module 'network'): void ns3::SimpleChannel::Send(ns3::Ptr<ns3::Packet> p, uint16_t protocol, ns3::Mac48Address to, ns3::Mac48Address from, ns3::Ptr<ns3::SimpleNetDevice> sender) [member function]
     cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')])
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('uint16_t', 'protocol'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from'), param('ns3::Ptr< ns3::SimpleNetDevice >', 'sender')], 
+                   is_virtual=True)
     return
 
 def register_Ns3SimpleNetDevice_methods(root_module, cls):
@@ -9414,14 +9437,14 @@
     cls.add_method('SetBurstRate', 
                    'void', 
                    [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
     cls.add_method('SetRandomBurstSize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
     cls.add_method('SetRandomVariable', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
     ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoCorrupt', 
                    'bool', 
@@ -9666,6 +9689,10 @@
 
 def register_functions(root_module):
     module = root_module
+    ## crc32.h (module 'network'): extern uint32_t ns3::CRC32Calculate(uint8_t const * data, int length) [free function]
+    module.add_function('CRC32Calculate', 
+                        'uint32_t', 
+                        [param('uint8_t const *', 'data'), param('int', 'length')])
     ## address.h (module 'network'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::MakeAddressChecker() [free function]
     module.add_function('MakeAddressChecker', 
                         'ns3::Ptr< ns3::AttributeChecker const >', 
diff -Naur ns-3.18.1/src/network/doc/packets.rst ns-3.19/src/network/doc/packets.rst
--- ns-3.18.1/src/network/doc/packets.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/doc/packets.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 Packets
 -------
@@ -161,7 +162,7 @@
   Ptr<Packet> pkt = Create<Packet> ();
 
 What is the Uid (unique Id)?  It is an internal id that the system uses to
-identify packets.  It can be fetched via the following method:::
+identify packets.  It can be fetched via the following method::
 
   uint32_t uid = pkt->GetUid ();
 
@@ -179,14 +180,14 @@
 behave, when delays such as serialization or transmission delays are computed,
 to have a certain number of payload bytes, but the bytes will only be allocated
 on-demand when needed).  The command to do this is, when the packet is
-created:::
+created::
 
   Ptr<Packet> pkt = Create<Packet> (N);
 
 where N is a positive integer.  
 
 The packet now has a size of N bytes, which can be verified by the GetSize()
-method:::
+method::
 
   /**
    * \returns the size in bytes of the packet (including the zero-filled
@@ -196,11 +197,11 @@
 
 You can also initialize a packet with a character buffer. The input
 data is copied and the input buffer is untouched. The constructor
-applied is:::
+applied is::
 
   Packet (uint8_t const *buffer, uint32_t size);
 
-Here is an example:::
+Here is an example::
 
   Ptr<Packet> pkt1 = Create<Packet> (reinterpret_cast<const uint8_t*> ("hello"), 5);
 
@@ -421,14 +422,14 @@
   PacketTagIterator GetPacketTagIterator (void) const;
 
 Here is a simple example illustrating the use of tags from the
-code in ``src/internet/model/udp-socket-impl.cc``:::
+code in ``src/internet/model/udp-socket-impl.cc``::
 
   Ptr<Packet> p;  // pointer to a pre-existing packet
   SocketIpTtlTag tag
   tag.SetTtl (m_ipMulticastTtl); // Convey the TTL from UDP layer to IP layer
   p->AddPacketTag (tag);
 
-This tag is read at the IP layer, then stripped (``src/internet/model/ipv4-l3-protocol.cc``):::
+This tag is read at the IP layer, then stripped (``src/internet/model/ipv4-l3-protocol.cc``)::
 
   uint8_t ttl = m_defaultTtl;
   SocketIpTtlTag tag;
@@ -443,7 +444,7 @@
 
 Packets may be fragmented or merged together.  For example, to fragment a packet
 ``p`` of 90 bytes into two packets, one containing the first 10 bytes and the
-other containing the remaining 80, one may call the following code:::
+other containing the remaining 80, one may call the following code::
 
   Ptr<Packet> frag0 = p->CreateFragment (0, 10);
   Ptr<Packet> frag1 = p->CreateFragment (10, 90);
@@ -451,7 +452,7 @@
 As discussed above, the packet tags from ``p`` will follow to both packet
 fragments, and the byte tags will follow the byte ranges as needed.
 
-Now, to put them back together:::
+Now, to put them back together::
 
   frag0->AddAtEnd (frag1);
 
@@ -480,7 +481,7 @@
 the program.
 
 To enable this operation, users will typically insert one or both of these
-statements at the beginning of their programs:::
+statements at the beginning of their programs::
 
   Packet::EnablePrinting ();
   Packet::EnableChecking ();
@@ -496,7 +497,7 @@
 Private member variables
 ++++++++++++++++++++++++
 
-A Packet object's interface provides access to some private data:::
+A Packet object's interface provides access to some private data::
 
   Buffer m_buffer;
   ByteTagList m_byteTagList;
@@ -601,7 +602,7 @@
 Tags are found by the unique mapping between the Tag type and
 its underlying id. This is why at most one instance of any Tag
 can be stored in a packet. The mapping between Tag type and 
-underlying id is performed by a registration as follows:::
+underlying id is performed by a registration as follows::
 
     /* A sample Tag implementation
      */
diff -Naur ns-3.18.1/src/network/doc/queue.rst ns-3.19/src/network/doc/queue.rst
--- ns-3.18.1/src/network/doc/queue.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/doc/queue.rst	2013-12-20 09:44:50.000000000 -0800
@@ -85,7 +85,7 @@
 the queue type and attributes from the helper, such as this example
 from ``src/network/examples/red-tests.cc``:
 
-:: 
+.. sourcecode:: cpp
 
   PointToPointHelper p2p;
 
@@ -134,7 +134,7 @@
 the Enqueue, Dequeue, and Drop traces of these queues and print out 
 trace statements, such as the following from ``examples/udp/udp-echo.cc``:
 
-::
+.. sourcecode:: text
 
   + 2 /NodeList/0/DeviceList/1/$ns3::CsmaNetDevice/TxQueue/Enqueue ns3::EthernetHeader 
   ( length/type=0x806, source=00:00:00:00:00:01, destination=ff:ff:ff:ff:ff:ff) 
diff -Naur ns-3.18.1/src/network/doc/sockets-api.rst ns-3.19/src/network/doc/sockets-api.rst
--- ns-3.18.1/src/network/doc/sockets-api.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/doc/sockets-api.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 .. _Sockets-APIs:
 
@@ -104,14 +105,14 @@
 =============
 
 Below is a typical sequence of socket calls for a TCP client in a
-real implementation:
+real implementation::
 
-* ``sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);``
-* ``bind(sock, ...);``
-* ``connect(sock, ...);``
-* ``send(sock, ...);``
-* ``recv(sock, ...);``
-* ``close(sock);``
+    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+    bind(sock, ...);
+    connect(sock, ...);
+    send(sock, ...);
+    recv(sock, ...);
+    close(sock);
 
 There are analogs to all of these calls in ns-3, but we will focus on  
 two aspects here.  First, most usage of sockets in real systems 
@@ -127,16 +128,16 @@
 :cpp:func:`ns3::Socket::SetSendCallback` callback is invoked.  
 An application can also ask the socket how much space is available 
 by calling :cpp:func:`ns3::Socket::GetTxAvailable`.  A typical sequence 
-of events for sending data (ignoring connection setup) might be:::
+of events for sending data (ignoring connection setup) might be::
 
-    * ``SetSendCallback (MakeCallback(&HandleSendCallback));``
-    * ``Send ();``
-    * ``Send ();``
-    * ...
-    * Send fails because buffer is full
-    * wait until :cpp:func:`HandleSendCallback` is called
-    * :cpp:func:`HandleSendCallback` is called by socket, since space now available
-    * ``Send (); // Start sending again``
+    SetSendCallback (MakeCallback(&HandleSendCallback));
+    Send ();
+    Send ();
+    ...
+    // Send fails because buffer is full
+    // Wait until HandleSendCallback is called
+    // HandleSendCallback is called by socket, since space now available
+    Send (); // Start sending again
 
 Similarly, on the receive side, the socket user does not block on
 a call to ``recv()``.  Instead, the application sets a callback
diff -Naur ns-3.18.1/src/network/helper/trace-helper.h ns-3.19/src/network/helper/trace-helper.h
--- ns-3.18.1/src/network/helper/trace-helper.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/helper/trace-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -67,23 +67,42 @@
   /**
    * @brief Let the pcap helper figure out a reasonable filename to use for a
    * pcap file associated with a device.
+   * 
+   * @param prefix prefix string
+   * @param device NetDevice
+   * @param useObjectNames use node and device names instead of indexes
    */
   std::string GetFilenameFromDevice (std::string prefix, Ptr<NetDevice> device, bool useObjectNames = true);
 
   /**
    * @brief Let the pcap helper figure out a reasonable filename to use for the
    * pcap file associated with a node.
+   * 
+   * @param prefix prefix string
+   * @param object interface (such as Ipv4Interface or Ipv6Interface)
+   * @param interface interface id
+   * @param useObjectNames use node and device names instead of indexes
    */
   std::string GetFilenameFromInterfacePair (std::string prefix, Ptr<Object> object, 
                                             uint32_t interface, bool useObjectNames = true);
 
   /**
    * @brief Create and initialize a pcap file.
+   * 
+   * @param filename file name
+   * @param filemode file mode
+   * @param dataLinkType data link type of packet data
+   * @param snapLen maximum length of packet data stored in records
+   * @param tzCorrection time zone correction to be applied to timestamps of packets
    */
   Ptr<PcapFileWrapper> CreateFile (std::string filename, std::ios::openmode filemode,
                                    uint32_t dataLinkType,  uint32_t snapLen = 65535, int32_t tzCorrection = 0);
   /**
    * @brief Hook a trace source to the default trace sink
+   * 
+   * @param object object
+   * @param traceName trace source name
+   * @param file file wrapper
    */
   template <typename T> void HookDefaultSink (Ptr<T> object, std::string traceName, Ptr<PcapFileWrapper> file);
 
@@ -122,12 +141,21 @@
   /**
    * @brief Let the ascii trace helper figure out a reasonable filename to use
    * for an ascii trace file associated with a device.
+   * 
+   * @param prefix prefix string
+   * @param device NetDevice
+   * @param useObjectNames use node and device names instead of indexes
    */
   std::string GetFilenameFromDevice (std::string prefix, Ptr<NetDevice> device, bool useObjectNames = true);
 
   /**
    * @brief Let the ascii trace helper figure out a reasonable filename to use
    * for an ascii trace file associated with a node.
+   * 
+   * @param prefix prefix string
+   * @param object interface (such as Ipv4Interface or Ipv6Interface)
+   * @param interface interface id
+   * @param useObjectNames use node and device names instead of indexes
    */
   std::string GetFilenameFromInterfacePair (std::string prefix, Ptr<Object> object, 
                                             uint32_t interface, bool useObjectNames = true);
@@ -151,6 +179,9 @@
    * run into object lifetime issues.  Ns-3 has a nice reference counted object
    * that can solve the problem so we use one of those to carry the stream
    * around and deal with the lifetime issues.
+   * 
+   * @param filename file name
+   * @param filemode file mode
    */
   Ptr<OutputStreamWrapper> CreateFileStream (std::string filename, 
                                              std::ios::openmode filemode = std::ios::out);
@@ -158,6 +189,10 @@
   /**
    * @brief Hook a trace source to the default enqueue operation trace sink that
    * does not accept nor log a trace context.
+   * 
+   * @param object object
+   * @param traceName trace source name
+   * @param stream output stream wrapper
    */
   template <typename T> 
   void HookDefaultEnqueueSinkWithoutContext (Ptr<T> object, std::string traceName, Ptr<OutputStreamWrapper> stream);
@@ -165,6 +200,11 @@
   /**
    * @brief Hook a trace source to the default enqueue operation trace sink that
    * does accept and log a trace context.
+   * 
+   * @param object object
+   * @param context context string
+   * @param traceName trace source name
+   * @param stream output stream wrapper
    */
   template <typename T> 
   void HookDefaultEnqueueSinkWithContext (Ptr<T> object, 
@@ -173,6 +213,10 @@
   /**
    * @brief Hook a trace source to the default drop operation trace sink that 
    * does not accept nor log a trace context.
+   * 
+   * @param object object
+   * @param traceName trace source name
+   * @param stream output stream wrapper
    */
   template <typename T> 
   void HookDefaultDropSinkWithoutContext (Ptr<T> object, std::string traceName, Ptr<OutputStreamWrapper> stream);
@@ -180,6 +224,11 @@
   /**
    * @brief Hook a trace source to the default drop operation trace sink that 
    * does accept and log a trace context.
+   * 
+   * @param object object
+   * @param context context string
+   * @param traceName trace source name
+   * @param stream output stream wrapper
    */
   template <typename T> 
   void HookDefaultDropSinkWithContext (Ptr<T> object, 
@@ -188,6 +237,10 @@
   /**
    * @brief Hook a trace source to the default dequeue operation trace sink
    * that does not accept nor log a trace context.
+   * 
+   * @param object object
+   * @param traceName trace source name
+   * @param stream output stream wrapper
    */
   template <typename T> 
   void HookDefaultDequeueSinkWithoutContext (Ptr<T> object, std::string traceName, Ptr<OutputStreamWrapper> stream);
@@ -195,6 +248,11 @@
   /**
    * @brief Hook a trace source to the default dequeue operation trace sink
    * that does accept and log a trace context.
+   * 
+   * @param object object
+   * @param context context string
+   * @param traceName trace source name
+   * @param stream output stream wrapper
    */
   template <typename T> 
   void HookDefaultDequeueSinkWithContext (Ptr<T> object, 
@@ -203,6 +261,10 @@
   /**
    * @brief Hook a trace source to the default receive operation trace sink
    * that does not accept nor log a trace context.
+   * 
+   * @param object object
+   * @param traceName trace source name
+   * @param stream output stream wrapper
    */
   template <typename T> 
   void HookDefaultReceiveSinkWithoutContext (Ptr<T> object, std::string traceName, Ptr<OutputStreamWrapper> stream);
@@ -210,6 +272,11 @@
   /**
    * @brief Hook a trace source to the default receive operation trace sink
    * that does accept and log a trace context.
+   * 
+   * @param object object
+   * @param context context string
+   * @param traceName trace source name
+   * @param stream output stream wrapper
    */
   template <typename T> 
   void HookDefaultReceiveSinkWithContext (Ptr<T> object, 
diff -Naur ns-3.18.1/src/network/model/address.cc ns-3.19/src/network/model/address.cc
--- ns-3.18.1/src/network/model/address.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/address.cc	2013-12-20 09:44:50.000000000 -0800
@@ -169,7 +169,7 @@
   buffer.Read (m_data, m_len);
 }
 
-ATTRIBUTE_HELPER_CPP (Address);
+ATTRIBUTE_HELPER_CPP (Address);   /// Macro to make help make class an ns-3 attribute
 
 
 bool operator == (const Address &a, const Address &b)
diff -Naur ns-3.18.1/src/network/model/address.h ns-3.19/src/network/model/address.h
--- ns-3.18.1/src/network/model/address.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/address.h	2013-12-20 09:44:50.000000000 -0800
@@ -224,7 +224,7 @@
  * \brief hold objects of type ns3::Address
  */
 
-ATTRIBUTE_HELPER_HEADER (Address);
+ATTRIBUTE_HELPER_HEADER (Address);  /// Macro to make help make class an ns-3 attribute
 
 bool operator == (const Address &a, const Address &b);
 bool operator != (const Address &a, const Address &b);
diff -Naur ns-3.18.1/src/network/model/application.cc ns-3.19/src/network/model/application.cc
--- ns-3.18.1/src/network/model/application.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/application.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Application);
+NS_OBJECT_ENSURE_REGISTERED (Application)
+  ;
 
 // Application Methods
 
diff -Naur ns-3.18.1/src/network/model/application.h ns-3.19/src/network/model/application.h
--- ns-3.18.1/src/network/model/application.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/application.h	2013-12-20 09:44:50.000000000 -0800
@@ -123,11 +123,11 @@
   virtual void DoDispose (void);
   virtual void DoInitialize (void);
 
-  Ptr<Node>       m_node;
-  Time m_startTime;
-  Time m_stopTime;
-  EventId m_startEvent;
-  EventId m_stopEvent;
+  Ptr<Node>       m_node;   /// The node that this application is installed on
+  Time m_startTime;         /// The simulation time that the appliacation will start
+  Time m_stopTime;          /// The simulation time that the appliacation will end
+  EventId m_startEvent;     /// The event that will fire at m_startTime to start the application
+  EventId m_stopEvent;      /// The event that will fire at m_stopTime to end the application
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/network/model/byte-tag-list.h ns-3.19/src/network/model/byte-tag-list.h
--- ns-3.18.1/src/network/model/byte-tag-list.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/byte-tag-list.h	2013-12-20 09:44:50.000000000 -0800
@@ -68,24 +68,53 @@
 class ByteTagList
 {
 public:
-
+  /*
+   * \brief An iterator for iterating through a byte tag list
+   *
+   * An iterator for iterating through a byte tag list
+   *
+   */
   class Iterator
   {
 public:
+    /*
+     * \brief An item specifies an individual tag within a byte buffer
+     *
+     * An item specifies an individual tag within a byte buffer
+     *
+     */
     struct Item 
     {
-      TypeId tid;
-      uint32_t size;
-      int32_t start;
-      int32_t end;
-      TagBuffer buf;
-      Item (TagBuffer buf);
+      TypeId tid;             /// type of the tag
+      uint32_t size;          /// size of tag data
+      int32_t start;          /// offset to the start of the tag from the virtual byte buffer 
+      int32_t end;            /// offset to the end of the tag from the virtual byte buffer
+      TagBuffer buf;          /// the data for the tag as generated by Tag::Serialize
+      Item (TagBuffer buf);   /// constructs an item with the given TagBuffer
 private:
       friend class ByteTagList;
       friend class ByteTagList::Iterator;
     };
+    
+    /*
+     * \brief Used to determine if the iterator is at the end of the byteTagList
+     *
+     * \returns true if there are more Items in the list
+     */
     bool HasNext (void) const;
+
+    /*
+     * \brief Returns the next Item from the ByteTagList
+     *
+     * \returns the next Item in the ByteTagList
+     */        
     struct ByteTagList::Iterator::Item Next (void);
+    
+    /*
+     * \brief Returns the offset from the start of the virtual byte buffer to the ByteTagList
+     *
+     * \returns offset to the start of this ByteTagList
+     */     
     uint32_t GetOffsetStart (void) const;
 private:
     friend class ByteTagList;
@@ -102,7 +131,26 @@
   };
 
   ByteTagList ();
+  
+  /**
+   * 
+   * Copy constructor, copies the data and increases reference count
+   *
+   * \param o The ByteTagList to copy
+   * \returns The newly created ByteTagList
+   *
+   */
   ByteTagList (const ByteTagList &o);
+  
+  /**
+   *
+   * Assignment operator, deallocates current data and assigns
+   * value of passed in ByteTagList.  Also increases reference count
+   *
+   * \param o reference to the ByteTagList to copy
+   * \returns reference to the assignee
+   *
+   */
   ByteTagList &operator = (const ByteTagList &o);
   ~ByteTagList ();
 
@@ -125,6 +173,10 @@
    */
   void Add (const ByteTagList &o);
 
+  /**
+   * 
+   * Removes all of the tags from the ByteTagList
+   */ 
   void RemoveAll (void);
 
   /**
@@ -144,12 +196,20 @@
    * Adjust the offsets stored internally by the adjustment delta and
    * make sure that all offsets are smaller than appendOffset which represents
    * the location where new bytes have been added to the byte buffer.
+   * 
+   * \param adjustment value to change stored offsets by
+   * \param appendOffset maximum offset value
+   *
    */
   void AddAtEnd (int32_t adjustment, int32_t appendOffset);
   /**
    * Adjust the offsets stored internally by the adjustment delta and
    * make sure that all offsets are bigger than prependOffset which represents
    * the location where new bytes have been added to the byte buffer.
+   *
+   * \param adjustment value to change stored offsets byte
+   * \param prependOffset minimum offset value
+   *
    */
   void AddAtStart (int32_t adjustment, int32_t prependOffset);
 
diff -Naur ns-3.18.1/src/network/model/channel.cc ns-3.19/src/network/model/channel.cc
--- ns-3.18.1/src/network/model/channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Channel);
+NS_OBJECT_ENSURE_REGISTERED (Channel)
+  ;
 
 TypeId 
 Channel::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/model/channel-list.cc ns-3.19/src/network/model/channel-list.cc
--- ns-3.18.1/src/network/model/channel-list.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/channel-list.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("ChannelList");
+NS_LOG_COMPONENT_DEFINE ("ChannelList")
+  ;
 
 /**
  * \brief private implementation detail of the ChannelList API.
@@ -55,7 +56,8 @@
   std::vector<Ptr<Channel> > m_channels;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (ChannelListPriv);
+NS_OBJECT_ENSURE_REGISTERED (ChannelListPriv)
+  ;
 
 TypeId 
 ChannelListPriv::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/model/chunk.cc ns-3.19/src/network/model/chunk.cc
--- ns-3.18.1/src/network/model/chunk.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/chunk.cc	2013-12-20 09:44:50.000000000 -0800
@@ -2,7 +2,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Chunk);
+NS_OBJECT_ENSURE_REGISTERED (Chunk)
+  ;
 
 TypeId 
 Chunk::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/model/header.cc ns-3.19/src/network/model/header.cc
--- ns-3.18.1/src/network/model/header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -5,7 +5,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Header);
+NS_OBJECT_ENSURE_REGISTERED (Header)
+  ;
 
 Header::~Header ()
 {
diff -Naur ns-3.18.1/src/network/model/net-device.cc ns-3.19/src/network/model/net-device.cc
--- ns-3.18.1/src/network/model/net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (NetDevice);
+NS_OBJECT_ENSURE_REGISTERED (NetDevice)
+  ;
 
 TypeId NetDevice::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/network/model/net-device.h ns-3.19/src/network/model/net-device.h
--- ns-3.18.1/src/network/model/net-device.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,7 @@
 
 /**
  * \ingroup network
- * \defgroup netdevice NetDevice
+ * \defgroup netdevice Network Device
  */
 /**
  * \ingroup netdevice
diff -Naur ns-3.18.1/src/network/model/nix-vector.cc ns-3.19/src/network/model/nix-vector.cc
--- ns-3.18.1/src/network/model/nix-vector.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/nix-vector.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,7 @@
 
 namespace ns3 {
 
-typedef std::vector<uint32_t> NixBits_t;
+typedef std::vector<uint32_t> NixBits_t;  ///typedef for the nixVector
 
 NixVector::NixVector ()
   : m_nixVector (0),
@@ -77,6 +77,7 @@
   return Ptr<NixVector> (new NixVector (*this), false);
 }
 
+/* For printing the nix vector */
 std::ostream & operator << (std::ostream &os, const NixVector &nix)
 {
   nix.DumpNixVector (os); 
diff -Naur ns-3.18.1/src/network/model/nix-vector.h ns-3.19/src/network/model/nix-vector.h
--- ns-3.18.1/src/network/model/nix-vector.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/nix-vector.h	2013-12-20 09:44:50.000000000 -0800
@@ -75,6 +75,8 @@
    */
   NixVector (const NixVector &o);
   /**
+   * \return a reference to the assignee
+   *
    * \param o the NixVector to copy to a new NixVector using the
    *          equals operator
    */
diff -Naur ns-3.18.1/src/network/model/node.cc ns-3.19/src/network/model/node.cc
--- ns-3.18.1/src/network/model/node.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/node.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Node);
+NS_OBJECT_ENSURE_REGISTERED (Node)
+  ;
 
 GlobalValue g_checksumEnabled  = GlobalValue ("ChecksumEnabled",
                                               "A global switch to enable all checksums for all protocols",
diff -Naur ns-3.18.1/src/network/model/node-list.cc ns-3.19/src/network/model/node-list.cc
--- ns-3.18.1/src/network/model/node-list.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/node-list.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("NodeList");
+NS_LOG_COMPONENT_DEFINE ("NodeList")
+  ;
 
 /**
  * \brief private implementation detail of the NodeList API.
@@ -56,7 +57,8 @@
   std::vector<Ptr<Node> > m_nodes;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (NodeListPriv);
+NS_OBJECT_ENSURE_REGISTERED (NodeListPriv)
+  ;
 
 TypeId 
 NodeListPriv::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/model/packet-tag-list.cc ns-3.19/src/network/model/packet-tag-list.cc
--- ns-3.18.1/src/network/model/packet-tag-list.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/packet-tag-list.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 #include "ns3/log.h"
 #include <cstring>
 
-NS_LOG_COMPONENT_DEFINE ("PacketTagList");
+NS_LOG_COMPONENT_DEFINE ("PacketTagList")
+  ;
 
 namespace ns3 {
 
diff -Naur ns-3.18.1/src/network/model/packet-tag-list.h ns-3.19/src/network/model/packet-tag-list.h
--- ns-3.18.1/src/network/model/packet-tag-list.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/packet-tag-list.h	2013-12-20 09:44:50.000000000 -0800
@@ -177,7 +177,7 @@
    * \param [in] o The PacketTagList to copy.
    *
    * This makes a light-weight copy by #RemoveAll, then
-   * pointing to the same #struct TagData as \pname{o}.
+   * pointing to the same \ref TagData as \pname{o}.
    */
   inline PacketTagList (PacketTagList const &o);
   /**
@@ -186,7 +186,7 @@
    * \param [in] o The PacketTagList to copy.
    *
    * This makes a light-weight copy by #RemoveAll, then
-   * pointing to the same #struct TagData as \pname{o}.
+   * pointing to the same \ref TagData as \pname{o}.
    */
   inline PacketTagList &operator = (PacketTagList const &o);
   /**
@@ -287,7 +287,7 @@
   bool ReplaceWriter (Tag & tag, bool preMerge, struct TagData * cur, struct TagData ** prevNext);
 
   /**
-   * Pointer to first #struct TagData on the list
+   * Pointer to first \ref TagData on the list
    */
   struct TagData *m_next;
 };
diff -Naur ns-3.18.1/src/network/model/socket.cc ns-3.19/src/network/model/socket.cc
--- ns-3.18.1/src/network/model/socket.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/socket.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Socket);
+NS_OBJECT_ENSURE_REGISTERED (Socket)
+  ;
 
 TypeId
 Socket::GetTypeId (void)
@@ -532,7 +533,8 @@
   return m_address;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (SocketAddressTag);
+NS_OBJECT_ENSURE_REGISTERED (SocketAddressTag)
+  ;
 
 TypeId
 SocketAddressTag::GetTypeId (void)
@@ -592,7 +594,8 @@
   return m_ttl;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (SocketIpTtlTag);
+NS_OBJECT_ENSURE_REGISTERED (SocketIpTtlTag)
+  ;
 
 TypeId
 SocketIpTtlTag::GetTypeId (void)
@@ -650,7 +653,8 @@
   return m_hopLimit;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (SocketIpv6HopLimitTag);
+NS_OBJECT_ENSURE_REGISTERED (SocketIpv6HopLimitTag)
+  ;
 
 TypeId
 SocketIpv6HopLimitTag::GetTypeId (void)
@@ -711,7 +715,8 @@
   return m_dontFragment;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (SocketSetDontFragmentTag);
+NS_OBJECT_ENSURE_REGISTERED (SocketSetDontFragmentTag)
+  ;
 
 TypeId 
 SocketSetDontFragmentTag::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/model/socket-factory.cc ns-3.19/src/network/model/socket-factory.cc
--- ns-3.18.1/src/network/model/socket-factory.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/socket-factory.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SocketFactory);
+NS_OBJECT_ENSURE_REGISTERED (SocketFactory)
+  ;
 
 TypeId SocketFactory::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/network/model/socket.h ns-3.19/src/network/model/socket.h
--- ns-3.18.1/src/network/model/socket.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/socket.h	2013-12-20 09:44:50.000000000 -0800
@@ -66,11 +66,19 @@
 class Socket : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   Socket (void);
   virtual ~Socket (void);
 
+  /**
+   * \enum SocketErrno
+   * \brief Enumeration of the possible errors returned by a socket.
+   */
   enum SocketErrno {
     ERROR_NOTERROR,
     ERROR_ISCONN,
@@ -89,6 +97,10 @@
     SOCKET_ERRNO_LAST
   };
 
+  /**
+   * \enum SocketType
+   * \brief Enumeration of the possible socket types.
+   */
   enum SocketType {
     NS3_SOCK_STREAM,
     NS3_SOCK_SEQPACKET,
@@ -107,6 +119,8 @@
    */
   static Ptr<Socket> CreateSocket (Ptr<Node> node, TypeId tid);
   /**
+   * \brief Get last error number.
+   *
    * \return the errno associated to the last call which failed in this
    *         socket. Each socket's errno is initialized to zero
    *         when the socket is created.
@@ -117,7 +131,8 @@
     */
   virtual enum Socket::SocketType GetSocketType (void) const = 0;
   /**
-   * \returns the node this socket is associated with.
+   * \brief Return the node this socket is associated with.
+   * \returns the node
    */
   virtual Ptr<Node> GetNode (void) const = 0;
   /**
@@ -253,6 +268,7 @@
   /**
    * \brief Initiate a connection to a remote host
    * \param address Address of remote.
+   * \returns 0 on success, -1 on error (in which case errno is set).
    */
   virtual int Connect (const Address &address) = 0;
 
@@ -271,6 +287,8 @@
    *
    * For stream sockets, this returns the available space in bytes
    * left in the transmit buffer.
+   *
+   * \returns The number of bytes which can be sent in a single Send call.
    */
   virtual uint32_t GetTxAvailable (void) const = 0;
  
@@ -341,6 +359,9 @@
    * Return number of bytes which can be returned from one or 
    * multiple calls to Recv.
    * Must be possible to call this method from the Recv callback.
+   *
+   * \returns the number of bytes which can be returned from one or
+   *          multiple Recv calls.
    */
   virtual uint32_t GetRxAvailable (void) const = 0;
 
@@ -446,6 +467,8 @@
    * second parameter
    * \param size the number of bytes to copy from the buffer
    * \param flags Socket control flags
+   * \returns the number of bytes accepted for transmission if no error
+   *          occurs, and -1 otherwise.
    */
   int Send (const uint8_t* buf, uint32_t size, uint32_t flags);
 
@@ -531,6 +554,7 @@
   int RecvFrom (uint8_t* buf, uint32_t size, uint32_t flags,
                 Address &fromAddress);
   /**
+   * \brief Get socket address.
    * \param address the address name this socket is associated with.
    * \returns 0 if success, -1 otherwise
    */
@@ -613,7 +637,7 @@
    */
   bool IsRecvPktInfo () const;
 
-  /*
+  /**
    * \brief Manually set IP Type of Service field
    * 
    * This method corresponds to using setsockopt () IP_TOS of
@@ -626,7 +650,7 @@
    */
   void SetIpTos (uint8_t ipTos);
 
-  /*
+  /**
    * \brief Query the value of IP Type of Service of this socket
    *
    * This method corresponds to using getsockopt () IP_TOS of real network
@@ -655,11 +679,11 @@
    * This method corresponds to using getsockopt () IP_RECVTOS of real
    * network or BSD sockets.
    *
-   * \return Wheter the IP_RECVTOS is set
+   * \return Whether the IP_RECVTOS is set
    */
   bool IsIpRecvTos (void) const;
 
-  /*
+  /**
    * \brief Manually set IPv6 Traffic Class field
    * 
    * This method corresponds to using setsockopt () IPV6_TCLASS of
@@ -671,7 +695,7 @@
    */
   void SetIpv6Tclass (int ipTclass);
 
-  /*
+  /**
    * \brief Query the value of IPv6 Traffic Class field of this socket
    *
    * This method corresponds to using getsockopt () IPV6_TCLASS of real network
@@ -700,11 +724,11 @@
    * This method corresponds to using getsockopt () IPV6_RECVTCLASS of real
    * network or BSD sockets.
    *
-   * \return Wheter the IPV6_RECVTCLASS is set
+   * \return Whether the IPV6_RECVTCLASS is set
    */
   bool IsIpv6RecvTclass (void) const;
 
-  /*
+  /**
    * \brief Manually set IP Time to Live field
    * 
    * This method corresponds to using setsockopt () IP_TTL of
@@ -714,7 +738,7 @@
    */
   virtual void SetIpTtl (uint8_t ipTtl);
 
-  /*
+  /**
    * \brief Query the value of IP Time to Live field of this socket
    *
    * This method corresponds to using getsockopt () IP_TTL of real network
@@ -743,11 +767,11 @@
    * This method corresponds to using getsockopt () IP_RECVTTL of real
    * network or BSD sockets.
    *
-   * \return Wheter the IP_RECVTTL is set
+   * \return Whether the IP_RECVTTL is set
    */
   bool IsIpRecvTtl (void) const;
 
-  /*
+  /**
    * \brief Manually set IPv6 Hop Limit
    * 
    * This method corresponds to using setsockopt () IPV6_HOPLIMIT of
@@ -757,7 +781,7 @@
    */
   virtual void SetIpv6HopLimit (uint8_t ipHopLimit);
 
-  /*
+  /**
    * \brief Query the value of IP Hop Limit field of this socket
    *
    * This method corresponds to using getsockopt () IPV6_HOPLIMIT of real network
@@ -786,58 +810,135 @@
    * This method corresponds to using getsockopt () IPV6_RECVHOPLIMIT of real
    * network or BSD sockets.
    *
-   * \return Wheter the IPV6_RECVHOPLIMIT is set
+   * \return Whether the IPV6_RECVHOPLIMIT is set
    */
   bool IsIpv6RecvHopLimit (void) const;
  
 protected:
+  /**
+   * \brief Notify through the callback (if set) that the connection has been
+   *        established.
+   */
   void NotifyConnectionSucceeded (void);
+
+  /**
+   * \brief Notify through the callback (if set) that the connection has not been
+   *        established due to an error.
+   */
   void NotifyConnectionFailed (void);
+
+  /**
+   * \brief Notify through the callback (if set) that the connection has been
+   *        closed.
+   */
   void NotifyNormalClose (void);
+
+  /**
+   * \brief Notify through the callback (if set) that the connection has been
+   *        closed due to an error.
+   */
   void NotifyErrorClose (void);
+
+  /**
+   * \brief Notify through the callback (if set) that an incoming connection
+   *        is being requested by a remote host.
+   *
+   * This function returns true by default (i.e., accept all the incoming connections).
+   * The callback (if set) might restrict this behaviour by returning zero for a
+   * connection that should be refused.
+   *
+   * \param from the address the connection is incoming from
+   * \returns true if the connection must be accepted, false otherwise.
+   */
   bool NotifyConnectionRequest (const Address &from);
+
+  /**
+   * \brief Notify through the callback (if set) that a new connection has been
+   *        created.
+   */
   void NotifyNewConnectionCreated (Ptr<Socket> socket, const Address &from);
+
+  /**
+   * \brief Notify through the callback (if set) that some data have been sent.
+   *
+   * \param size number of sent bytes.
+   */
   void NotifyDataSent (uint32_t size);
+
+  /**
+   * \brief Notify through the callback (if set) that some data have been sent.
+   *
+   * \param spaceAvailable the number of bytes available in the transmission buffer.
+   */
   void NotifySend (uint32_t spaceAvailable);
+
+  /**
+   * \brief Notify through the callback (if set) that some data have been received.
+   */
   void NotifyDataRecv (void);
+
+  // inherited function, no doc necessary
   virtual void DoDispose (void);
 
+  /**
+   * \brief Checks if the socket has a specific IPv4 ToS set
+   *
+   * \returns true if the socket has a IPv4 ToS set, false otherwise.
+   */
   bool IsManualIpTos (void) const;
+
+  /**
+   * \brief Checks if the socket has a specific IPv6 Tclass set
+   *
+   * \returns true if the socket has a IPv6 Tclass set, false otherwise.
+   */
   bool IsManualIpv6Tclass (void) const;
+
+  /**
+   * \brief Checks if the socket has a specific IPv4 TTL set
+   *
+   * \returns true if the socket has a IPv4 TTL set, false otherwise.
+   */
   bool IsManualIpTtl (void) const;
+
+  /**
+   * \brief Checks if the socket has a specific IPv6 Hop Limit set
+   *
+   * \returns true if the socket has a IPv6 Hop Limit set, false otherwise.
+   */
   bool IsManualIpv6HopLimit (void) const;
 
-  Ptr<NetDevice> m_boundnetdevice;
-  bool m_recvPktInfo;
+  Ptr<NetDevice> m_boundnetdevice; //!< the device this socket is bound to (might be null).
+  bool m_recvPktInfo; //!< if the socket should add packet info tags to the packet forwarded to L4.
 
 private:
-  Callback<void, Ptr<Socket> >                   m_connectionSucceeded;
-  Callback<void, Ptr<Socket> >                   m_connectionFailed;
-  Callback<void, Ptr<Socket> >                   m_normalClose;
-  Callback<void, Ptr<Socket> >                   m_errorClose;
-  Callback<bool, Ptr<Socket>, const Address &>   m_connectionRequest;
-  Callback<void, Ptr<Socket>, const Address&>    m_newConnectionCreated;
-  Callback<void, Ptr<Socket>, uint32_t>          m_dataSent;
-  Callback<void, Ptr<Socket>, uint32_t >         m_sendCb;
-  Callback<void, Ptr<Socket> >                   m_receivedData;
+  Callback<void, Ptr<Socket> >                   m_connectionSucceeded;  //!< connection succeeded callback
+  Callback<void, Ptr<Socket> >                   m_connectionFailed;     //!< connection failed callback
+  Callback<void, Ptr<Socket> >                   m_normalClose;          //!< connection closed callback
+  Callback<void, Ptr<Socket> >                   m_errorClose;           //!< connection closed due to errors callback
+  Callback<bool, Ptr<Socket>, const Address &>   m_connectionRequest;    //!< connection request callback
+  Callback<void, Ptr<Socket>, const Address&>    m_newConnectionCreated; //!< connection created callback
+  Callback<void, Ptr<Socket>, uint32_t>          m_dataSent;             //!< data sent callback
+  Callback<void, Ptr<Socket>, uint32_t >         m_sendCb;               //!< packet sent callback
+  Callback<void, Ptr<Socket> >                   m_receivedData;         //!< data received callback
 
   //IPv4 options
-  bool m_manualIpTos;
-  bool m_manualIpTtl;
-  bool m_ipRecvTos;
-  bool m_ipRecvTtl;
+  bool m_manualIpTos; //!< socket has IPv4 TOS set
+  bool m_manualIpTtl; //!< socket has IPv4 TTL set
+  bool m_ipRecvTos;   //!< socket forwards IPv4 TOS tag to L4
+  bool m_ipRecvTtl;   //!< socket forwards IPv4 TTL tag to L4
 
-  uint8_t m_ipTos;
-  uint8_t m_ipTtl;
+  uint8_t m_ipTos; //!< the socket IPv4 TOS
+  uint8_t m_ipTtl; //!< the socket IPv4 TTL
 
   //IPv6 options
-  bool m_manualIpv6Tclass;
-  bool m_manualIpv6HopLimit;
-  bool m_ipv6RecvTclass;
-  bool m_ipv6RecvHopLimit;
+  bool m_manualIpv6Tclass;    //!< socket has IPv6 Tclass set
+  bool m_manualIpv6HopLimit;  //!< socket has IPv6 Hop Limit set
+  bool m_ipv6RecvTclass;      //!< socket forwards IPv6 Tclass tag to L4
+  bool m_ipv6RecvHopLimit;    //!< socket forwards IPv6 Hop Limit tag to L4
 
-  uint8_t m_ipv6Tclass;
-  uint8_t m_ipv6HopLimit;
+  uint8_t m_ipv6Tclass;     //!< the socket IPv6 Tclass
+  uint8_t m_ipv6HopLimit;   //!< the socket IPv6 Hop Limit
 };
 
 /**
@@ -848,18 +949,44 @@
 {
 public:
   SocketAddressTag ();
+
+  /**
+   * \brief Set the tag's address
+   *
+   * \param addr the address
+   */
   void SetAddress (Address addr);
+
+  /**
+   * \brief Get the tag's address
+   *
+   * \returns the address
+   */
   Address GetAddress (void) const;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
+
+  // inherited function, no need to doc.
   virtual TypeId GetInstanceTypeId (void) const;
+
+  // inherited function, no need to doc.
   virtual uint32_t GetSerializedSize (void) const;
+
+  // inherited function, no need to doc.
   virtual void Serialize (TagBuffer i) const;
+
+  // inherited function, no need to doc.
   virtual void Deserialize (TagBuffer i);
+
+  // inherited function, no need to doc.
   virtual void Print (std::ostream &os) const;
 
 private:
-  Address m_address;
+  Address m_address; //!< the address carried by the tag
 };
 
 /**
@@ -870,18 +997,44 @@
 {
 public:
   SocketIpTtlTag ();
+
+  /**
+   * \brief Set the tag's TTL
+   *
+   * \param ttl the TTL
+   */
   void SetTtl (uint8_t ttl);
+
+  /**
+   * \brief Get the tag's TTL
+   *
+   * \returns the TTL
+   */
   uint8_t GetTtl (void) const;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
+
+  // inherited function, no need to doc.
   virtual TypeId GetInstanceTypeId (void) const;
+
+  // inherited function, no need to doc.
   virtual uint32_t GetSerializedSize (void) const;
+
+  // inherited function, no need to doc.
   virtual void Serialize (TagBuffer i) const;
+
+  // inherited function, no need to doc.
   virtual void Deserialize (TagBuffer i);
+
+  // inherited function, no need to doc.
   virtual void Print (std::ostream &os) const;
 
 private:
-  uint8_t m_ttl;
+  uint8_t m_ttl; //!< the ttl carried by the tag
 };
 
 /**
@@ -892,82 +1045,188 @@
 {
 public:
   SocketIpv6HopLimitTag ();
+
+  /**
+   * \brief Set the tag's Hop Limit
+   *
+   * \param hopLimit the Hop Limit
+   */
   void SetHopLimit (uint8_t hopLimit);
+
+  /**
+   * \brief Get the tag's Hop Limit
+   *
+   * \returns the Hop Limit
+   */
   uint8_t GetHopLimit (void) const;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
+
+  // inherited function, no need to doc.
   virtual TypeId GetInstanceTypeId (void) const;
+
+  // inherited function, no need to doc.
   virtual uint32_t GetSerializedSize (void) const;
+
+  // inherited function, no need to doc.
   virtual void Serialize (TagBuffer i) const;
+
+  // inherited function, no need to doc.
   virtual void Deserialize (TagBuffer i);
+
+  // inherited function, no need to doc.
   virtual void Print (std::ostream &os) const;
 
 private:
-  uint8_t m_hopLimit;
+  uint8_t m_hopLimit; //!< the Hop Limit carried by the tag
 };
 
 /**
- * \brief indicated whether packets should be sent out with
- * the DF flag set.
+ * \brief indicates whether packets should be sent out with
+ * the DF (Don't Fragment) flag set.
  */
 class SocketSetDontFragmentTag : public Tag
 {
 public:
   SocketSetDontFragmentTag ();
+
+  /**
+   * \brief Enables the DF (Don't Fragment) flag
+   */
   void Enable (void);
+
+  /**
+   * \brief Disables the DF (Don't Fragment) flag
+   */
   void Disable (void);
+
+  /**
+   * \brief Checks if the DF (Don't Fragment) flag is set
+   *
+   * \returns true if DF is set.
+   */
   bool IsEnabled (void) const;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
+
+  // inherited function, no need to doc.
   virtual TypeId GetInstanceTypeId (void) const;
+
+  // inherited function, no need to doc.
   virtual uint32_t GetSerializedSize (void) const;
+
+  // inherited function, no need to doc.
   virtual void Serialize (TagBuffer i) const;
+
+  // inherited function, no need to doc.
   virtual void Deserialize (TagBuffer i);
+
+  // inherited function, no need to doc.
   virtual void Print (std::ostream &os) const;
 private:
-  bool m_dontFragment;
+  bool m_dontFragment; //!< DF bit value for outgoing packets.
 };
 
-/*
- * \brief indicated whether the socket has IP_TOS set.
+/**
+ * \brief indicates whether the socket has IP_TOS set.
  * This tag is for IPv4 socket.
  */
 class SocketIpTosTag : public Tag
 {
 public:
   SocketIpTosTag ();
+
+  /**
+   * \brief Set the tag's TOS
+   *
+   * \param tos the TOS
+   */
   void SetTos (uint8_t tos);
+
+  /**
+   * \brief Get the tag's TOS
+   *
+   * \returns the TOS
+   */
   uint8_t GetTos (void) const;
   
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
+
+  // inherited function, no need to doc.
   virtual TypeId GetInstanceTypeId (void) const;
+
+  // inherited function, no need to doc.
   virtual uint32_t GetSerializedSize (void) const;
+
+  // inherited function, no need to doc.
   virtual void Serialize (TagBuffer i) const;
+
+  // inherited function, no need to doc.
   virtual void Deserialize (TagBuffer i);
+
+  // inherited function, no need to doc.
   virtual void Print (std::ostream &os) const;
 private:
-  uint8_t m_ipTos;
+  uint8_t m_ipTos;  //!< the TOS carried by the tag
 };
 
-/*
- * \brief indicated whether the socket has IPV6_TCLASS set.
+/**
+ * \brief indicates whether the socket has IPV6_TCLASS set.
  * This tag is for IPv6 socket.
  */
 class SocketIpv6TclassTag : public Tag
 {
 public:
   SocketIpv6TclassTag ();
+
+  /**
+   * \brief Set the tag's Tclass
+   *
+   * \param tclass the Tclass
+   */
   void SetTclass (uint8_t tclass);
+
+  /**
+   * \brief Get the tag's Tclass
+   *
+   * \returns the Tclass
+   */
   uint8_t GetTclass (void) const;
   
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
+
+  // inherited function, no need to doc.
   virtual TypeId GetInstanceTypeId (void) const;
+
+  // inherited function, no need to doc.
   virtual uint32_t GetSerializedSize (void) const;
+
+  // inherited function, no need to doc.
   virtual void Serialize (TagBuffer i) const;
+
+  // inherited function, no need to doc.
   virtual void Deserialize (TagBuffer i);
+
+  // inherited function, no need to doc.
   virtual void Print (std::ostream &os) const;
 private:
-  uint8_t m_ipv6Tclass;
+  uint8_t m_ipv6Tclass; //!< the Tclass carried by the tag
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/network/model/tag.cc ns-3.19/src/network/model/tag.cc
--- ns-3.18.1/src/network/model/tag.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -21,7 +21,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Tag);
+NS_OBJECT_ENSURE_REGISTERED (Tag)
+  ;
 
 TypeId 
 Tag::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/model/trailer.cc ns-3.19/src/network/model/trailer.cc
--- ns-3.18.1/src/network/model/trailer.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/model/trailer.cc	2013-12-20 09:44:50.000000000 -0800
@@ -5,7 +5,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Trailer);
+NS_OBJECT_ENSURE_REGISTERED (Trailer)
+  ;
 
 Trailer::~Trailer ()
 {
diff -Naur ns-3.18.1/src/network/utils/address-utils.h ns-3.19/src/network/utils/address-utils.h
--- ns-3.18.1/src/network/utils/address-utils.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/address-utils.h	2013-12-20 09:44:50.000000000 -0800
@@ -30,18 +30,90 @@
 
 namespace ns3 {
 
+/**
+ * \brief Write an Ipv4Address to a Buffer
+ * \param i a reference to the buffer to write to
+ * \param ad the Ipv4Address
+ */
 void WriteTo (Buffer::Iterator &i, Ipv4Address ad);
+
+/**
+ * \brief Write an Ipv4Address to a Buffer
+ * \param i a reference to the buffer to write to
+ * \param ad the Ipv6Address
+ */
 void WriteTo (Buffer::Iterator &i, Ipv6Address ad);
+
+/**
+ * \brief Write an Address to a Buffer
+ * \param i a reference to the buffer to write to
+ * \param ad the Address
+ */
 void WriteTo (Buffer::Iterator &i, const Address &ad);
+
+/**
+ * \brief Write an Mac64Address to a Buffer
+ * \param i a reference to the buffer to write to
+ * \param ad the Mac64Address
+ */
 void WriteTo (Buffer::Iterator &i, Mac64Address ad);
+
+/**
+ * \brief Write an Mac48Address to a Buffer
+ * \param i a reference to the buffer to write to
+ * \param ad the Mac48Address
+ */
 void WriteTo (Buffer::Iterator &i, Mac48Address ad);
+
+/**
+ * \brief Write an Mac16Address to a Buffer
+ * \param i a reference to the buffer to write to
+ * \param ad the Mac16Address
+ */
 void WriteTo (Buffer::Iterator &i, Mac16Address ad);
 
+
+/**
+ * \brief Read an Ipv4Address from a Buffer
+ * \param i a reference to the buffer to read from
+ * \param ad a reference to the Ipv4Address to be read
+ */
 void ReadFrom (Buffer::Iterator &i, Ipv4Address &ad);
+
+/**
+ * \brief Read an Ipv6Address from a Buffer
+ * \param i a reference to the buffer to read from
+ * \param ad a reference to the Ipv6Address to be read
+ */
 void ReadFrom (Buffer::Iterator &i, Ipv6Address &ad);
+
+/**
+ * \brief Read an Address from a Buffer
+ * \param i a reference to the buffer to read from
+ * \param ad a reference to the Address to be read
+ * \param len the length of the Address
+ */
 void ReadFrom (Buffer::Iterator &i, Address &ad, uint32_t len);
+
+/**
+ * \brief Read a Mac64Address from a Buffer
+ * \param i a reference to the buffer to read from
+ * \param ad a reference to the Mac64Address to be read
+ */
 void ReadFrom (Buffer::Iterator &i, Mac64Address &ad);
+
+/**
+ * \brief Read a Mac48Address from a Buffer
+ * \param i a reference to the buffer to read from
+ * \param ad a reference to the Mac48Address to be read
+ */
 void ReadFrom (Buffer::Iterator &i, Mac48Address &ad);
+
+/**
+ * \brief Read a Mac16Address from a Buffer
+ * \param i a reference to the buffer to read from
+ * \param ad a reference to the Mac16Address to be read
+ */
 void ReadFrom (Buffer::Iterator &i, Mac16Address &ad);
 
 namespace addressUtils {
diff -Naur ns-3.18.1/src/network/utils/ascii-file.h ns-3.19/src/network/utils/ascii-file.h
--- ns-3.18.1/src/network/utils/ascii-file.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/ascii-file.h	2013-12-20 09:44:50.000000000 -0800
@@ -30,10 +30,11 @@
 namespace ns3 {
 
 
-/*
- * A class representing an ascii file.
+/**
+ * \brief A class representing an ascii file.
+ *
+ * This class represents an ascii file
  */
-
 class AsciiFile
 {
 public:
@@ -77,7 +78,7 @@
    * 
    * \param  f1         First ASCII file name
    * \param  f2         Second ASCII file name
-   * \param  lineNumbe   [out] Line number of first different line.
+   * \param  lineNumber   [out] Line number of first different line.
    */
   static bool Diff (std::string const & f1,
 		    std::string const & f2, 
diff -Naur ns-3.18.1/src/network/utils/crc32.cc ns-3.19/src/network/utils/crc32.cc
--- ns-3.18.1/src/network/utils/crc32.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/network/utils/crc32.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,80 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 PIOTR JURKIEWICZ
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Piotr Jurkiewicz <piotr.jerzy.jurkiewicz@gmail.com>
+ */
+/*
+ * Note:  CRC tables such as below are found in many projects;
+ * below is the oldest reference (and copyright) to original work 
+ * of this nature that we could find.
+ *
+ * COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
+ * code or tables extracted from it, as desired without restriction.
+ */
+#include <stdint.h>
+
+namespace ns3 {
+
+static uint32_t crc32table[256] = {
+0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,
+0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,
+0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,
+0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,
+0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,
+0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
+0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,
+0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,
+0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,
+0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01,
+0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,
+0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,
+0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,
+0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
+0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,
+0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD,
+0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,
+0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,
+0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,
+0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,
+0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,
+0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79,
+0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,
+0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,
+0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,
+0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,
+0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,
+0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
+0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,
+0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
+0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,
+0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D 
+};
+
+uint32_t
+CRC32Calculate (const uint8_t *data, int length)
+{
+  uint32_t crc = 0xffffffff;
+
+  while (length--)
+    {
+      crc = (crc >> 8) ^ crc32table[(crc & 0xFF) ^ *data++];
+    }
+  return ~crc;
+}
+
+} // namespace ns3
+
diff -Naur ns-3.18.1/src/network/utils/crc32.h ns-3.19/src/network/utils/crc32.h
--- ns-3.18.1/src/network/utils/crc32.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/network/utils/crc32.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,36 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 PIOTR JURKIEWICZ
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Piotr Jurkiewicz <piotr.jerzy.jurkiewicz@gmail.com>
+ */
+#ifndef CRC32_H
+#define CRC32_H
+#include <stdint.h>
+
+namespace ns3 {
+
+/**
+ * \param data buffer to calculate the checksum for
+ * \param length the length of the buffer (bytes)
+ * \returns the computed crc.
+ *
+ */
+uint32_t CRC32Calculate (const uint8_t *data, int length);
+
+} // namespace ns3
+
+#endif
diff -Naur ns-3.18.1/src/network/utils/data-rate.cc ns-3.19/src/network/utils/data-rate.cc
--- ns-3.18.1/src/network/utils/data-rate.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/data-rate.cc	2013-12-20 09:44:50.000000000 -0800
@@ -182,7 +182,7 @@
 
 namespace ns3 {
 
-ATTRIBUTE_HELPER_CPP (DataRate);
+ATTRIBUTE_HELPER_CPP (DataRate);  /// Macro to make help make data-rate an ns-3 attribute
 
 DataRate::DataRate ()
   : m_bps (0)
@@ -248,11 +248,13 @@
     }
 }
 
+/* For printing of data rate */
 std::ostream &operator << (std::ostream &os, const DataRate &rate)
 {
   os << rate.GetBitRate () << "bps";
   return os;
 }
+/* Initialize a data rate from an input stream */
 std::istream &operator >> (std::istream &is, DataRate &rate)
 {
   std::string value;
@@ -267,13 +269,26 @@
   return is;
 }
 
-
-
+/**
+  * \brief Multiply datarate by a time value
+  *
+  * Calculates the number of bits that have been transmitted over a period of time
+  * \param lhs rate
+  * \param rhs time
+  * \return the number of bits over the period of time
+  */
 double operator* (const DataRate& lhs, const Time& rhs)
 {
   return rhs.GetSeconds ()*lhs.GetBitRate ();
 }
-
+/**
+  * \brief Multiply time value by a data rate
+  *
+  * Calculates the number of bits that have been transmitted over a period of time
+  * \param lhs time
+  * \param rhs rate
+  * \return the number of bits over the period of time
+  */
 double operator* (const Time& lhs, const DataRate& rhs)
 {
   return lhs.GetSeconds ()*rhs.GetBitRate ();
diff -Naur ns-3.18.1/src/network/utils/data-rate.h ns-3.19/src/network/utils/data-rate.h
--- ns-3.18.1/src/network/utils/data-rate.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/data-rate.h	2013-12-20 09:44:50.000000000 -0800
@@ -81,13 +81,66 @@
    * \param bps bit/s value
    */
   DataRate (uint64_t bps);
+  /**
+   * \brief String constructor
+   *
+   * Construct a data rate from a string.  Many different unit strings are supported
+   * Supported unit strings:
+   * bps, b/s, Bps, B/s \n
+   * kbps, kb/s, Kbps, Kb/s, kBps, kB/s, KBps, KB/s, Kib/s, KiB/s \n
+   * Mbps, Mb/s, MBps, MB/s, Mib/s, MiB/s \n
+   * Gbps, Gb/s, GBps, GB/s, Gib/s, GiB/s \n
+   * 
+   * Examples:
+   * "56kbps" = 56,000 bits/s \n
+   * "128 kb/s" = 128,000 bits/s \n
+   * "8Kib/s" = 1 KiB/s = 8192 bits/s \n
+   * "1kB/s" = 8000 bits/s 
+   *
+   * \param rate string representing the desired rate
+   */
   DataRate (std::string rate);
 
+  /**
+   * \return true if this rate is less than rhs
+   *
+   * \param rhs the datarate to compare to this datarate
+   */  
   bool operator <  (const DataRate& rhs) const;
+
+  /**
+   * \return true if this rate is less than or equal to rhs
+   *
+   * \param rhs the datarate to compare to this datarate
+   */ 
   bool operator <= (const DataRate& rhs) const;
+  
+  /**
+   * \return true if this rate is greater than rhs
+   *
+   * \param rhs the datarate to compare to this datarate
+   */   
   bool operator >  (const DataRate& rhs) const;
+  
+  /**
+   * \return true if this rate is greather than or equal to rhs
+   *
+   * \param rhs the datarate to compare to this datarate
+   */   
   bool operator >= (const DataRate& rhs) const;
+  
+  /**
+   * \return true if this rate is equal to rhs
+   *
+   * \param rhs the datarate to compare to this datarate
+   */   
   bool operator == (const DataRate& rhs) const;
+  
+  /**
+   * \return true if this rate is not equal to rhs
+   *
+   * \param rhs the datarate to compare to this datarate
+   */   
   bool operator != (const DataRate& rhs) const;
 
   /**
@@ -118,7 +171,8 @@
  * \brief hold objects of type ns3::DataRate
  */
 
-ATTRIBUTE_HELPER_HEADER (DataRate);
+
+ATTRIBUTE_HELPER_HEADER (DataRate);   /// Macro to make help make data-rate an ns-3 attribute
 
 /**
  * \param lhs
diff -Naur ns-3.18.1/src/network/utils/drop-tail-queue.cc ns-3.19/src/network/utils/drop-tail-queue.cc
--- ns-3.18.1/src/network/utils/drop-tail-queue.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/drop-tail-queue.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (DropTailQueue);
+NS_OBJECT_ENSURE_REGISTERED (DropTailQueue)
+  ;
 
 TypeId DropTailQueue::GetTypeId (void) 
 {
diff -Naur ns-3.18.1/src/network/utils/error-model.cc ns-3.19/src/network/utils/error-model.cc
--- ns-3.18.1/src/network/utils/error-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/error-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -77,7 +77,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ErrorModel);
+NS_OBJECT_ENSURE_REGISTERED (ErrorModel)
+  ;
 
 TypeId ErrorModel::GetTypeId (void)
 { 
@@ -145,7 +146,8 @@
 // RateErrorModel
 //
 
-NS_OBJECT_ENSURE_REGISTERED (RateErrorModel);
+NS_OBJECT_ENSURE_REGISTERED (RateErrorModel)
+  ;
 
 TypeId RateErrorModel::GetTypeId (void)
 { 
@@ -284,7 +286,8 @@
 // BurstErrorModel
 //
 
-NS_OBJECT_ENSURE_REGISTERED (BurstErrorModel);
+NS_OBJECT_ENSURE_REGISTERED (BurstErrorModel)
+  ;
 
 TypeId BurstErrorModel::GetTypeId (void)
 {
@@ -412,7 +415,8 @@
 // ListErrorModel
 //
 
-NS_OBJECT_ENSURE_REGISTERED (ListErrorModel);
+NS_OBJECT_ENSURE_REGISTERED (ListErrorModel)
+  ;
 
 TypeId ListErrorModel::GetTypeId (void)
 { 
@@ -481,7 +485,8 @@
 // ReceiveListErrorModel
 //
 
-NS_OBJECT_ENSURE_REGISTERED (ReceiveListErrorModel);
+NS_OBJECT_ENSURE_REGISTERED (ReceiveListErrorModel)
+  ;
 
 TypeId ReceiveListErrorModel::GetTypeId (void)
 { 
diff -Naur ns-3.18.1/src/network/utils/error-model.h ns-3.19/src/network/utils/error-model.h
--- ns-3.18.1/src/network/utils/error-model.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/error-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -277,19 +277,19 @@
    */
   double GetBurstRate (void) const;
   /**
-   * \param burstRate the error rate to be used by the model
+   * \param rate the error rate to be used by the model
    */
   void SetBurstRate (double rate);
 
   /**
-   * \param ranVariable A random variable distribution to generate random variates
+   * \param ranVar A random variable distribution to generate random variates
    */
-  void SetRandomVariable (Ptr<RandomVariableStream>);
+  void SetRandomVariable (Ptr<RandomVariableStream> ranVar);
 
   /**
-   * \param burstSize A random variable distribution to generate random burst size
+   * \param burstSz A random variable distribution to generate random burst size
    */
-  void SetRandomBurstSize (Ptr<RandomVariableStream>);
+  void SetRandomBurstSize (Ptr<RandomVariableStream> burstSz);
 
   /**
     * Assign a fixed random variable stream number to the random variables
diff -Naur ns-3.18.1/src/network/utils/ethernet-header.cc ns-3.19/src/network/utils/ethernet-header.cc
--- ns-3.18.1/src/network/utils/ethernet-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/ethernet-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (EthernetHeader);
+NS_OBJECT_ENSURE_REGISTERED (EthernetHeader)
+  ;
 
 EthernetHeader::EthernetHeader (bool hasPreamble)
   : m_enPreambleSfd (hasPreamble),
diff -Naur ns-3.18.1/src/network/utils/ethernet-trailer.cc ns-3.19/src/network/utils/ethernet-trailer.cc
--- ns-3.18.1/src/network/utils/ethernet-trailer.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/ethernet-trailer.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,12 +22,14 @@
 #include "ns3/log.h"
 #include "ns3/trailer.h"
 #include "ethernet-trailer.h"
+#include "crc32.h"
 
 NS_LOG_COMPONENT_DEFINE ("EthernetTrailer");
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (EthernetTrailer);
+NS_OBJECT_ENSURE_REGISTERED (EthernetTrailer)
+  ;
 
 EthernetTrailer::EthernetTrailer ()
   : m_calcFcs (false),
@@ -58,7 +60,7 @@
 
   buffer = new uint8_t[len];
   p->CopyData (buffer, len);
-  crc = DoCalcFcs (buffer, len);
+  crc = CRC32Calculate (buffer, len);
   delete[] buffer;
   return (m_fcs == crc);
 }
@@ -77,7 +79,7 @@
 
   buffer = new uint8_t[len];
   p->CopyData (buffer, len);
-  m_fcs = DoCalcFcs (buffer, len);
+  m_fcs = CRC32Calculate (buffer, len);
   delete[] buffer;
 }
 
@@ -151,24 +153,4 @@
   return size;
 }
 
-// This code is copied from /lib/crc32.c in the linux kernel.
-// It assumes little endian ordering.
-uint32_t
-EthernetTrailer::DoCalcFcs (uint8_t const *buffer, size_t len) const
-{
-  NS_LOG_FUNCTION (this << &buffer << len);
-  uint32_t crc = 0xffffffff;
-  int i;
-
-  while (len--)
-    {
-      crc ^= *buffer++;
-      for (i = 0; i < 8; i++)
-        {
-          crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
-        }
-    }
-  return ~crc;
-}
-
 } // namespace ns3
diff -Naur ns-3.18.1/src/network/utils/ethernet-trailer.h ns-3.19/src/network/utils/ethernet-trailer.h
--- ns-3.18.1/src/network/utils/ethernet-trailer.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/ethernet-trailer.h	2013-12-20 09:44:50.000000000 -0800
@@ -104,8 +104,6 @@
   bool m_calcFcs;
   uint32_t m_fcs; /// Value of the fcs contained in the trailer
 
-  uint32_t DoCalcFcs (uint8_t const *buffer, size_t len) const;
-
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/network/utils/flow-id-tag.cc ns-3.19/src/network/utils/flow-id-tag.cc
--- ns-3.18.1/src/network/utils/flow-id-tag.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/flow-id-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (FlowIdTag);
+NS_OBJECT_ENSURE_REGISTERED (FlowIdTag)
+  ;
 
 TypeId 
 FlowIdTag::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/utils/flow-id-tag.h ns-3.19/src/network/utils/flow-id-tag.h
--- ns-3.18.1/src/network/utils/flow-id-tag.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/flow-id-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,9 +34,27 @@
   virtual void Deserialize (TagBuffer buf);
   virtual void Print (std::ostream &os) const;
   FlowIdTag ();
+  
+  /**
+   *  Constructs a FlowIdTag with the given flow id
+   *
+   *  \param flowId Id to use for the tag
+   */
   FlowIdTag (uint32_t flowId);
+  /**
+   *  Sets the flow id for the tag
+   *  \param flowId Id to assign to the tag
+   */
   void SetFlowId (uint32_t flowId);
+  /**
+   *  Gets the flow id for the tag
+   *  \returns current flow id for this tag
+   */
   uint32_t GetFlowId (void) const;
+  /**
+   *  Uses a static variable to generate sequential flow id
+   *  \returns flow id allocated
+   */
   static uint32_t AllocateFlowId (void);
 private:
   uint32_t m_flowId;
diff -Naur ns-3.18.1/src/network/utils/ipv4-address.cc ns-3.19/src/network/utils/ipv4-address.cc
--- ns-3.18.1/src/network/utils/ipv4-address.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/ipv4-address.cc	2013-12-20 09:44:50.000000000 -0800
@@ -417,7 +417,7 @@
   return !a.IsEqual (b);
 }
 
-ATTRIBUTE_HELPER_CPP (Ipv4Address);
-ATTRIBUTE_HELPER_CPP (Ipv4Mask);
+ATTRIBUTE_HELPER_CPP (Ipv4Address); /// Macro to make help make class an ns-3 attribute
+ATTRIBUTE_HELPER_CPP (Ipv4Mask);    /// Macro to make help make class an ns-3 attribute
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/network/utils/ipv4-address.h ns-3.19/src/network/utils/ipv4-address.h
--- ns-3.18.1/src/network/utils/ipv4-address.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/ipv4-address.h	2013-12-20 09:44:50.000000000 -0800
@@ -286,8 +286,8 @@
  * \brief hold objects of type ns3::Ipv4Mask
  */
 
-ATTRIBUTE_HELPER_HEADER (Ipv4Address);
-ATTRIBUTE_HELPER_HEADER (Ipv4Mask);
+ATTRIBUTE_HELPER_HEADER (Ipv4Address);  /// Macro to make help make class an ns-3 attribute
+ATTRIBUTE_HELPER_HEADER (Ipv4Mask);     /// Macro to make help make class an ns-3 attribute
 
 std::ostream& operator<< (std::ostream& os, Ipv4Address const& address);
 std::ostream& operator<< (std::ostream& os, Ipv4Mask const& mask);
diff -Naur ns-3.18.1/src/network/utils/ipv6-address.cc ns-3.19/src/network/utils/ipv6-address.cc
--- ns-3.18.1/src/network/utils/ipv6-address.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/ipv6-address.cc	2013-12-20 09:44:50.000000000 -0800
@@ -18,6 +18,29 @@
  * Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
  */
 
+// Part of the Ipv6Address::Print function has been adapted from inet_ntop6 Linux function.
+// See http://www.net-snmp.org/dev/agent/inet__ntop_8c_source.html
+// Author: Paul Vixie, 1996.
+// The inet_ntop6 function was under the copyright below, which is
+// compatible with GPLv2, see http://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses.
+
+/* Copyright (c) 1996 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+
 #include <iomanip>
 #include <memory.h>
 
@@ -115,7 +138,12 @@
 
 /**
  * \brief Convert an IPv6 C-string into a 128-bit representation.
+ *
+ * \param address pointer to the char buffer with the address ascii representation
+ * \param addr the buffer to store the IPv6 address
+ *
  * \return true if success, false otherwise (bad format, ...)
+ *
  * \note This function is strongly inspired by inet_pton6() from Paul Vixie.
  * \todo Handle IPv6 address with decimal value for last four bytes.
  */
@@ -473,23 +501,96 @@
 void Ipv6Address::Print (std::ostream& os) const
 {
   NS_LOG_FUNCTION (this << &os);
-  os << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[0]
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[1] << ":"
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[2]
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[3] << ":"
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[4]
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[5] << ":"
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[6]
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[7] << ":"
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[8]
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[9] << ":"
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[10]
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[11] << ":"
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[12]
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[13] << ":"
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[14]
-     << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_address[15]
-     << std::dec << std::setfill (' ');
+
+  // note: part of this function has been adapted from inet_ntop6 Linux function.
+  // See http://www.net-snmp.org/dev/agent/inet__ntop_8c_source.html
+  // Author: Paul Vixie, 1996.
+
+  if (IsIpv4MappedAddress ())
+    {
+      os << "::ffff:"
+         << (unsigned int) m_address[12] << "."
+         << (unsigned int) m_address[13] << "."
+         << (unsigned int) m_address[14] << "."
+         << (unsigned int) m_address[15];
+      return;
+    }
+
+  uint16_t address[8];
+  uint8_t i;
+
+  for (i=0; i<8; i++)
+    {
+      address[i] = (uint16_t(m_address[2*i]) << 8) | uint16_t(m_address[2*i+1]);
+    }
+
+  int8_t bestBase = -1;
+  int8_t bestLen = 0;
+  int8_t curBase = -1;
+  int8_t curLen = 0;
+
+  for (i=0; i<8; i++)
+    {
+      if (address[i] == 0)
+        {
+          if (curBase == -1)
+            {
+              curBase = i;
+              curLen = 1;
+            }
+          else
+            {
+              curLen++;
+            }
+        }
+      else
+        {
+          if (curBase != -1)
+            {
+              if (bestBase == -1 || curLen > bestLen)
+                {
+                  bestBase = curBase;
+                  bestLen = curLen;
+                }
+              curBase = -1;
+            }
+        }
+    }
+  if (curBase != -1)
+    {
+      if (bestBase == -1 || curLen > bestLen)
+        {
+          bestBase = curBase;
+          bestLen = curLen;
+        }
+    }
+  if (bestBase != -1 && bestLen < 2)
+    {
+      bestBase = -1;
+    }
+
+  for (i = 0; i < 8;) {
+      // Are we inside the best run of 0x00's?
+      if (i == bestBase)
+        {
+          os << ':';
+          i += bestLen;
+          continue;
+        }
+      // Are we following an initial run of 0x00s or any real hex?
+      if (i != 0)
+        {
+          os << ':';
+        }
+      os << std::hex << (unsigned int) address[i];
+      i++;
+  }
+  // Was it a trailing run of 0x00's?
+  if (bestBase != -1 && (bestBase + bestLen) == 8)
+    {
+      os << ':';
+    }
+  os << std::dec;
 }
 
 bool Ipv6Address::IsLocalhost () const
@@ -519,7 +620,7 @@
   return false;
 }
 
-bool Ipv6Address::IsIpv4MappedAddress ()
+bool Ipv6Address::IsIpv4MappedAddress () const
 {
   NS_LOG_FUNCTION (this);
   uint8_t v4MappedPrefix[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -827,22 +928,8 @@
 void Ipv6Prefix::Print (std::ostream &os) const
 {
   NS_LOG_FUNCTION (this << &os);
-  os << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[0]
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[1] << ":"
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[2]
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[3] << ":"
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[4]
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[5] << ":"
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[6]
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[7] << ":"
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[8]
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[9] << ":"
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[10]
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[11] << ":"
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[12]
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[13] << ":"
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[14]
-  << std::hex << std::setw (2) << std::setfill ('0') << (unsigned int) m_prefix[15];
+
+  os << "/" << (unsigned int) GetPrefixLength();
 }
 
 Ipv6Prefix Ipv6Prefix::GetLoopback ()
@@ -915,16 +1002,6 @@
   return is;
 }
 
-bool operator == (Ipv6Prefix const &a, Ipv6Prefix const &b)
-{
-  return a.IsEqual (b);
-}
-
-bool operator != (Ipv6Prefix const &a, Ipv6Prefix const &b)
-{
-  return !a.IsEqual (b);
-}
-
 size_t Ipv6AddressHash::operator () (Ipv6Address const &x) const
 {
   uint8_t buf[16];
@@ -934,8 +1011,8 @@
   return lookuphash (buf, sizeof (buf), 0);
 }
 
-ATTRIBUTE_HELPER_CPP (Ipv6Address);
-ATTRIBUTE_HELPER_CPP (Ipv6Prefix);
+ATTRIBUTE_HELPER_CPP (Ipv6Address); /// Macro to make help make class an ns-3 attribute
+ATTRIBUTE_HELPER_CPP (Ipv6Prefix);  /// Macro to make help make class an ns-3 attribute
 
 } /* namespace ns3 */
 
diff -Naur ns-3.18.1/src/network/utils/ipv6-address.h ns-3.19/src/network/utils/ipv6-address.h
--- ns-3.18.1/src/network/utils/ipv6-address.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/ipv6-address.h	2013-12-20 09:44:50.000000000 -0800
@@ -269,7 +269,7 @@
    * \brief If the address is an IPv4-mapped address
    * \return true if address is an IPv4-mapped address, otherwise false.
    */
-  bool IsIpv4MappedAddress();
+  bool IsIpv4MappedAddress() const;
 
   /**
    * \brief Convert to Address object
@@ -350,8 +350,31 @@
    */
   uint8_t m_address[16];
 
+  /**
+   * \brief Equal to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the operands are equal
+   */
   friend bool operator == (Ipv6Address const &a, Ipv6Address const &b);
+
+  /**
+   * \brief Not equal to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the operands are not equal
+   */
   friend bool operator != (Ipv6Address const &a, Ipv6Address const &b);
+
+  /**
+   * \brief Less than to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the first operand is less than the second
+   */
   friend bool operator < (Ipv6Address const &a, Ipv6Address const &b);
 };
 
@@ -463,23 +486,72 @@
    * \brief The prefix representation.
    */
   uint8_t m_prefix[16];
+
+  /**
+   * \brief Equal to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the operands are equal
+   */
+  friend bool operator == (Ipv6Prefix const &a, Ipv6Prefix const &b);
+
+  /**
+   * \brief Not equal to operator.
+   *
+   * \param a the first operand
+   * \param b the first operand
+   * \returns true if the operands are not equal
+   */
+  friend bool operator != (Ipv6Prefix const &a, Ipv6Prefix const &b);
 };
 
 /**
  * \class ns3::Ipv6AddressValue
  * \brief Hold objects of type ns3::Ipv6Address
  */
-ATTRIBUTE_HELPER_HEADER (Ipv6Address);
+ATTRIBUTE_HELPER_HEADER (Ipv6Address);  /// Macro to make help make class an ns-3 attribute
 
 /**
  * \class ns3::Ipv6PrefixValue
  * \brief Hold objects of type ns3::Ipv6Prefix
  */
-ATTRIBUTE_HELPER_HEADER (Ipv6Prefix);
+ATTRIBUTE_HELPER_HEADER (Ipv6Prefix);   /// Macro to make help make class an ns-3 attribute
 
-std::ostream& operator << (std::ostream& os, Ipv6Address const& address);
-std::ostream& operator<< (std::ostream& os, Ipv6Prefix const& prefix);
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param address the Ipv6Address
+ * \returns the reference to the output stream
+ */
+std::ostream & operator << (std::ostream& os, Ipv6Address const& address);
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param prefix the Ipv6Prefix
+ * \returns the reference to the output stream
+ */
+std::ostream & operator << (std::ostream& os, Ipv6Prefix const& prefix);
+
+/**
+ * \brief Stream extraction operator.
+ *
+ * \param is the reference to the input stream
+ * \param address the Ipv6Address
+ * \returns the reference to the input stream
+ */
 std::istream & operator >> (std::istream &is, Ipv6Address &address);
+
+/**
+ * \brief Stream extraction operator.
+ *
+ * \param is the reference to the input stream
+ * \param prefix the Ipv6Preofix
+ * \returns the reference to the input stream
+ */
 std::istream & operator >> (std::istream &is, Ipv6Prefix &prefix);
 
 inline bool operator == (const Ipv6Address& a, const Ipv6Address& b)
@@ -497,6 +569,16 @@
   return (std::memcmp (a.m_address, b.m_address, 16) < 0);
 }
 
+inline bool operator == (const Ipv6Prefix& a, const Ipv6Prefix& b)
+{
+  return (!std::memcmp (a.m_prefix, b.m_prefix, 16));
+}
+
+inline bool operator != (const Ipv6Prefix& a, const Ipv6Prefix& b)
+{
+  return std::memcmp (a.m_prefix, b.m_prefix, 16);
+}
+
 /**
  * \class Ipv6AddressHash
  * \brief Hash function class for IPv6 addresses.
@@ -507,13 +589,11 @@
   /**
    * \brief Unary operator to hash IPv6 address.
    * \param x IPv6 address to hash
+   * \returns the hash of the address
    */
   size_t operator () (Ipv6Address const &x) const;
 };
 
-bool operator == (Ipv6Prefix const &a, Ipv6Prefix const &b);
-bool operator != (Ipv6Prefix const &a, Ipv6Prefix const &b);
-
 } /* namespace ns3 */
 
 #endif /* IPV6_ADDRESS_H */
diff -Naur ns-3.18.1/src/network/utils/llc-snap-header.cc ns-3.19/src/network/utils/llc-snap-header.cc
--- ns-3.18.1/src/network/utils/llc-snap-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/llc-snap-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (LlcSnapHeader);
+NS_OBJECT_ENSURE_REGISTERED (LlcSnapHeader)
+  ;
 
 LlcSnapHeader::LlcSnapHeader ()
 {
diff -Naur ns-3.18.1/src/network/utils/mac16-address.cc ns-3.19/src/network/utils/mac16-address.cc
--- ns-3.18.1/src/network/utils/mac16-address.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/mac16-address.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,7 @@
 
 namespace ns3 {
 
-ATTRIBUTE_HELPER_CPP (Mac16Address);
+ATTRIBUTE_HELPER_CPP (Mac16Address);  /// Macro to make help make class an ns-3 attribute
 
 #define ASCII_a (0x41)
 #define ASCII_z (0x5a)
diff -Naur ns-3.18.1/src/network/utils/mac16-address.h ns-3.19/src/network/utils/mac16-address.h
--- ns-3.18.1/src/network/utils/mac16-address.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/mac16-address.h	2013-12-20 09:44:50.000000000 -0800
@@ -80,6 +80,7 @@
   static bool IsMatchingType (const Address &address);
   /**
    * Allocate a new Mac16Address.
+   * \returns newly allocated mac16Address
    */
   static Mac16Address Allocate (void);
 
@@ -104,7 +105,7 @@
  * \brief hold objects of type ns3::Mac16Address
  */
 
-ATTRIBUTE_HELPER_HEADER (Mac16Address);
+ATTRIBUTE_HELPER_HEADER (Mac16Address); /// Macro to make help make class an ns-3 attribute
 
 inline bool operator == (const Mac16Address &a, const Mac16Address &b)
 {
diff -Naur ns-3.18.1/src/network/utils/mac48-address.cc ns-3.19/src/network/utils/mac48-address.cc
--- ns-3.18.1/src/network/utils/mac48-address.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/mac48-address.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,7 @@
 
 namespace ns3 {
 
-ATTRIBUTE_HELPER_CPP (Mac48Address);
+ATTRIBUTE_HELPER_CPP (Mac48Address);  /// Macro to make help make class an ns-3 attribute
 
 #define ASCII_a (0x41)
 #define ASCII_z (0x5a)
diff -Naur ns-3.18.1/src/network/utils/mac48-address.h ns-3.19/src/network/utils/mac48-address.h
--- ns-3.18.1/src/network/utils/mac48-address.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/mac48-address.h	2013-12-20 09:44:50.000000000 -0800
@@ -84,6 +84,7 @@
   static bool IsMatchingType (const Address &address);
   /**
    * Allocate a new Mac48Address.
+   * \returns newly allocated mac48Address
    */
   static Mac48Address Allocate (void);
 
@@ -146,7 +147,7 @@
  * \brief hold objects of type ns3::Mac48Address
  */
 
-ATTRIBUTE_HELPER_HEADER (Mac48Address);
+ATTRIBUTE_HELPER_HEADER (Mac48Address); /// Macro to make help make class an ns-3 attribute
 
 inline bool operator == (const Mac48Address &a, const Mac48Address &b)
 {
diff -Naur ns-3.18.1/src/network/utils/mac64-address.cc ns-3.19/src/network/utils/mac64-address.cc
--- ns-3.18.1/src/network/utils/mac64-address.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/mac64-address.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,7 @@
 
 namespace ns3 {
 
-ATTRIBUTE_HELPER_CPP (Mac64Address);
+ATTRIBUTE_HELPER_CPP (Mac64Address);  /// Macro to make help make class an ns-3 attribute
 
 #define ASCII_a (0x41)
 #define ASCII_z (0x5a)
diff -Naur ns-3.18.1/src/network/utils/mac64-address.h ns-3.19/src/network/utils/mac64-address.h
--- ns-3.18.1/src/network/utils/mac64-address.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/mac64-address.h	2013-12-20 09:44:50.000000000 -0800
@@ -83,6 +83,7 @@
   static bool IsMatchingType (const Address &address);
   /**
    * Allocate a new Mac64Address.
+   * \returns newly allocated mac64Address   
    */
   static Mac64Address Allocate (void);
 private:
@@ -106,7 +107,7 @@
  * \brief hold objects of type ns3::Mac64Address
  */
 
-ATTRIBUTE_HELPER_HEADER (Mac64Address);
+ATTRIBUTE_HELPER_HEADER (Mac64Address); /// Macro to make help make class an ns-3 attribute
 
 inline bool operator == (const Mac64Address &a, const Mac64Address &b)
 {
diff -Naur ns-3.18.1/src/network/utils/packetbb.cc ns-3.19/src/network/utils/packetbb.cc
--- ns-3.18.1/src/network/utils/packetbb.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/packetbb.cc	2013-12-20 09:44:50.000000000 -0800
@@ -58,7 +58,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PbbPacket);
+NS_OBJECT_ENSURE_REGISTERED (PbbPacket)
+  ;
 
 PbbTlvBlock::PbbTlvBlock (void)
 {
diff -Naur ns-3.18.1/src/network/utils/packetbb.h ns-3.19/src/network/utils/packetbb.h
--- ns-3.18.1/src/network/utils/packetbb.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/packetbb.h	2013-12-20 09:44:50.000000000 -0800
@@ -55,8 +55,8 @@
 class PbbTlvBlock
 {
 public:
-  typedef std::list< Ptr<PbbTlv> >::iterator Iterator;
-  typedef std::list< Ptr<PbbTlv> >::const_iterator ConstIterator;
+  typedef std::list< Ptr<PbbTlv> >::iterator Iterator;              /// this is an iterator
+  typedef std::list< Ptr<PbbTlv> >::const_iterator ConstIterator;   /// this is a const iterator
 
   PbbTlvBlock (void);
   ~PbbTlvBlock (void);
@@ -192,7 +192,17 @@
    */
   void Print (std::ostream &os, int level) const;
 
+  /**
+   * \brief Equality operator for PbbTlvBlock
+   * \param other PbbTlvBlock to compare this one to
+   * \returns true if the blocks are equal
+   */
   bool operator== (const PbbTlvBlock &other) const;
+  /**
+   * \brief Inequality operator for PbbTlvBlock
+   * \param other PbbTlvBlock to compare this one to
+   * \returns true if the blocks are not equal
+   */  
   bool operator!= (const PbbTlvBlock &other) const;
 
 private:
@@ -207,8 +217,8 @@
 class PbbAddressTlvBlock
 {
 public:
-  typedef std::list< Ptr<PbbAddressTlv> >::iterator Iterator;
-  typedef std::list< Ptr<PbbAddressTlv> >::const_iterator ConstIterator;
+  typedef std::list< Ptr<PbbAddressTlv> >::iterator Iterator;               /// This is a PbbAddressTlv iterator for PbbAddressTlvBlock
+  typedef std::list< Ptr<PbbAddressTlv> >::const_iterator ConstIterator;    /// This is a const PbbAddressTlv iterator for PbbAddressTlvBlock
 
   PbbAddressTlvBlock (void);
   ~PbbAddressTlvBlock (void);
@@ -346,7 +356,18 @@
    */
   void Print (std::ostream &os, int level) const;
 
+  /**
+   * \brief Equality operator for PbbAddressTlvBlock
+   * \param other PbbAddressTlvBlock to compare to this one
+   * \returns true if PbbAddressTlvBlock are equal
+   */
   bool operator== (const PbbAddressTlvBlock &other) const;
+
+  /**
+   * \brief Inequality operator for PbbAddressTlvBlock
+   * \param other PbbAddressTlvBlock to compare to this one
+   * \returns true if PbbAddressTlvBlock are not equal
+   */  
   bool operator!= (const PbbAddressTlvBlock &other) const;
 
 private:
@@ -364,10 +385,10 @@
 class PbbPacket : public SimpleRefCount<PbbPacket,Header>
 {
 public:
-  typedef std::list< Ptr<PbbTlv> >::iterator TlvIterator;
-  typedef std::list< Ptr<PbbTlv> >::const_iterator ConstTlvIterator;
-  typedef std::list< Ptr<PbbMessage> >::iterator MessageIterator;
-  typedef std::list< Ptr<PbbMessage> >::const_iterator ConstMessageIterator;
+  typedef std::list< Ptr<PbbTlv> >::iterator TlvIterator;                       /// This is a PbbTlv iterator for PbbPacket
+  typedef std::list< Ptr<PbbTlv> >::const_iterator ConstTlvIterator;            /// This is a const PbbTlv iterator for PbbPacket
+  typedef std::list< Ptr<PbbMessage> >::iterator MessageIterator;               /// This is a PbbMessageIterator for PbbPacket
+  typedef std::list< Ptr<PbbMessage> >::const_iterator ConstMessageIterator;    /// This is a const PbbMessageIterator for PbbPacket
 
   PbbPacket (void);
   ~PbbPacket (void);
@@ -627,7 +648,18 @@
    */
   virtual void Print (std::ostream &os) const;
 
+  /**
+   * \brief Equality operator for PbbPacket
+   * \param other PbbPacket to compare to this one
+   * \returns true if PbbPacket are equal
+   */
   bool operator== (const PbbPacket &other) const;
+  
+  /**
+   * \brief Inequality operator for PbbPacket
+   * \param other PbbPacket to compare to this one
+   * \returns true if PbbPacket are not equal
+   */
   bool operator!= (const PbbPacket &other) const;
 
 protected:
@@ -652,10 +684,10 @@
 class PbbMessage : public SimpleRefCount<PbbMessage>
 {
 public:
-  typedef std::list< Ptr<PbbTlv> >::iterator TlvIterator;
-  typedef std::list< Ptr<PbbTlv> >::const_iterator ConstTlvIterator;
-  typedef std::list< Ptr<PbbAddressBlock> >::iterator AddressBlockIterator;
-  typedef std::list< Ptr<PbbAddressBlock> >::const_iterator ConstAddressBlockIterator;
+  typedef std::list< Ptr<PbbTlv> >::iterator TlvIterator;                                 /// This is a PbbTlv iterator for PbbMessage
+  typedef std::list< Ptr<PbbTlv> >::const_iterator ConstTlvIterator;                      /// This is a const PbbTlv iterator for PbbMessage
+  typedef std::list< Ptr<PbbAddressBlock> >::iterator AddressBlockIterator;               /// This is a PbbAddressBlock iterator for PbbMessage
+  typedef std::list< Ptr<PbbAddressBlock> >::const_iterator ConstAddressBlockIterator;    /// This is a const PbbAddressBlock iterator for PbbMessage
 
   PbbMessage ();
   virtual ~PbbMessage ();
@@ -1004,13 +1036,27 @@
    */
   void Print (std::ostream &os, int level) const;
 
+  /**
+   * \brief Equality operator for PbbMessage
+   * \param other PbbMessage to compare to this one
+   * \returns true if PbbMessages are equal
+   */
   bool operator== (const PbbMessage &other) const;
+  /**
+   * \brief Inequality operator for PbbMessage
+   * \param other PbbMessage to compare to this one
+   * \returns true if PbbMessages are not equal
+   */
   bool operator!= (const PbbMessage &other) const;
 
-protected:
-  /* PbbMessage size in bytes - 1.
+protected:  
+  /**
+   * \brief Returns address length (IPV4 3 or IPV6 15)
    *
-   * IPv4 = 4 - 1 = 3, IPv6 = 16 - 1 = 15
+   *  Returns message size in bytes - 1
+   *  IPv4 = 4 - 1 = 3, IPv6 = 16 - 1 = 15
+   *
+   * \returns Address length (IPV4 3 or IPV6 15)
    */
   virtual PbbAddressLength GetAddressLength (void) const = 0;
 
@@ -1051,6 +1097,14 @@
   virtual ~PbbMessageIpv4 ();
 
 protected:
+  /**
+   * \brief Returns address length (IPV4 3 or IPV6 15)
+   *
+   *  Returns message size in bytes - 1
+   *  IPv4 = 4 - 1 = 3, IPv6 = 16 - 1 = 15
+   *
+   * \returns Address length (IPV4 3 or IPV6 15)
+   */
   virtual PbbAddressLength GetAddressLength (void) const;
 
   virtual void SerializeOriginatorAddress (Buffer::Iterator &start) const;
@@ -1071,6 +1125,14 @@
   virtual ~PbbMessageIpv6 ();
 
 protected:
+  /**
+   * \brief Returns address length (IPV4 3 or IPV6 15)
+   *
+   *  Returns message size in bytes - 1
+   *  IPv4 = 4 - 1 = 3, IPv6 = 16 - 1 = 15
+   *
+   * \returns Address length (IPV4 3 or IPV6 15)
+   */
   virtual PbbAddressLength GetAddressLength (void) const;
 
   virtual void SerializeOriginatorAddress (Buffer::Iterator &start) const;
@@ -1089,14 +1151,14 @@
 class PbbAddressBlock : public SimpleRefCount<PbbAddressBlock>
 {
 public:
-  typedef std::list< Address >::iterator AddressIterator;
-  typedef std::list< Address >::const_iterator ConstAddressIterator;
+  typedef std::list< Address >::iterator AddressIterator;             /// this is an address iterator for PbbAddressBlock
+  typedef std::list< Address >::const_iterator ConstAddressIterator;  /// this is an const address iterator for PbbAddressBlock
 
-  typedef std::list<uint8_t>::iterator PrefixIterator;
-  typedef std::list<uint8_t>::const_iterator ConstPrefixIterator;
+  typedef std::list<uint8_t>::iterator PrefixIterator;                /// this is a prefix iterator for PbbAddressBlock
+  typedef std::list<uint8_t>::const_iterator ConstPrefixIterator;     /// this is a const prefix iterator for PbbAddressBlock
 
-  typedef PbbAddressTlvBlock::Iterator TlvIterator;
-  typedef PbbAddressTlvBlock::ConstIterator ConstTlvIterator;
+  typedef PbbAddressTlvBlock::Iterator TlvIterator;                   /// this is a tlvblock iterator for PbbAddressBlock
+  typedef PbbAddressTlvBlock::ConstIterator ConstTlvIterator;         /// this is a const tlvblock iterator for PbbAddressBlock
 
   PbbAddressBlock ();
   virtual ~PbbAddressBlock ();
@@ -1440,12 +1502,26 @@
    */
   void Print (std::ostream &os, int level) const;
 
+  /**
+   * \brief Equality operator for PbbAddressBlock
+   * \param other PbbAddressBlock to compare to this one
+   * \returns true if PbbMessages are equal
+   */
   bool operator== (const PbbAddressBlock &other) const;
+  
+  /**
+   * \brief Inequality operator for PbbAddressBlock
+   * \param other PbbAddressBlock to compare to this one
+   * \returns true if PbbAddressBlock are not equal
+   */  
   bool operator!= (const PbbAddressBlock &other) const;
 
 protected:
+  /**
+   * \brief Returns address length
+   * \returns Address length
+   */
   virtual uint8_t GetAddressLength (void) const = 0;
-
   virtual void SerializeAddress (uint8_t *buffer, ConstAddressIterator iter) const = 0;
   virtual Address DeserializeAddress (uint8_t *buffer) const = 0;
   virtual void PrintAddress (std::ostream &os, ConstAddressIterator iter) const = 0;
@@ -1473,8 +1549,11 @@
   virtual ~PbbAddressBlockIpv4 ();
 
 protected:
+  /**
+   * \brief Returns address length
+   * \returns Address length
+   */
   virtual uint8_t GetAddressLength (void) const;
-
   virtual void SerializeAddress (uint8_t *buffer, ConstAddressIterator iter) const;
   virtual Address DeserializeAddress (uint8_t *buffer) const;
   virtual void PrintAddress (std::ostream &os, ConstAddressIterator iter) const;
@@ -1492,8 +1571,11 @@
   virtual ~PbbAddressBlockIpv6 ();
 
 protected:
+  /**
+   * \brief Returns address length
+   * \returns Address length
+   */
   virtual uint8_t GetAddressLength (void) const;
-
   virtual void SerializeAddress (uint8_t *buffer, ConstAddressIterator iter) const;
   virtual Address DeserializeAddress (uint8_t *buffer) const;
   virtual void PrintAddress (std::ostream &os, ConstAddressIterator iter) const;
@@ -1620,7 +1702,18 @@
    */
   void Print (std::ostream &os, int level) const;
 
+  /**
+   * \brief Equality operator for PbbTlv
+   * \param other PbbTlv to compare to this one
+   * \returns true if PbbTlv are equal
+   */
   bool operator== (const PbbTlv &other) const;
+
+  /**
+   * \brief Inequality operator for PbbTlv
+   * \param other PbbTlv to compare to this one
+   * \returns true if PbbTlv are not equal
+   */
   bool operator!= (const PbbTlv &other) const;
 
 protected:
diff -Naur ns-3.18.1/src/network/utils/packet-burst.cc ns-3.19/src/network/utils/packet-burst.cc
--- ns-3.18.1/src/network/utils/packet-burst.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/packet-burst.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PacketBurst);
+NS_OBJECT_ENSURE_REGISTERED (PacketBurst)
+  ;
 
 TypeId
 PacketBurst::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/utils/packet-data-calculators.h ns-3.19/src/network/utils/packet-data-calculators.h
--- ns-3.18.1/src/network/utils/packet-data-calculators.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/packet-data-calculators.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,13 +31,30 @@
 /**
  * \ingroup stats
  *
+ *  A stat for counting packets
+ *
  */
 class PacketCounterCalculator : public CounterCalculator<uint32_t> {
 public:
   PacketCounterCalculator();
   virtual ~PacketCounterCalculator();
 
+  /**
+   * Increments the packet counter by one
+   *
+   * \param path not used in this method
+   * \param packet not used in this method
+   */
   void PacketUpdate (std::string path, Ptr<const Packet> packet);
+
+  /**
+   * Increments the packet counter by one
+   *
+   * \param path not used in this method
+   * \param packet not used in this method
+   * \param realto not used in this method
+   */
+
   void FrameUpdate (std::string path, Ptr<const Packet> packet,
                     Mac48Address realto);
 
@@ -51,14 +68,30 @@
 /**
  * \ingroup stats
  *
+ * A stat for collecting packet size statistics: min, max and average
+ *
  */
 class PacketSizeMinMaxAvgTotalCalculator :
   public MinMaxAvgTotalCalculator<uint32_t> {
 public:
   PacketSizeMinMaxAvgTotalCalculator();
   virtual ~PacketSizeMinMaxAvgTotalCalculator();
-
+  
+  /**
+   * Increments the packet stats by the size of the packet
+   *
+   * \param path not used in this method
+   * \param packet packet size used to update stats
+   */
   void PacketUpdate (std::string path, Ptr<const Packet> packet);
+  
+  /**
+   * Increments the packet stats by the size of the packet
+   *
+   * \param path not used in this method
+   * \param packet packet size used to update stats
+   * \param realto not used in this method
+   */  
   void FrameUpdate (std::string path, Ptr<const Packet> packet,
                     Mac48Address realto);
 
diff -Naur ns-3.18.1/src/network/utils/packet-probe.cc ns-3.19/src/network/utils/packet-probe.cc
--- ns-3.18.1/src/network/utils/packet-probe.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/packet-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PacketProbe);
+NS_OBJECT_ENSURE_REGISTERED (PacketProbe)
+  ;
 
 TypeId
 PacketProbe::GetTypeId ()
diff -Naur ns-3.18.1/src/network/utils/packet-socket.cc ns-3.19/src/network/utils/packet-socket.cc
--- ns-3.18.1/src/network/utils/packet-socket.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/packet-socket.cc	2013-12-20 09:44:50.000000000 -0800
@@ -33,7 +33,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PacketSocket);
+NS_OBJECT_ENSURE_REGISTERED (PacketSocket)
+  ;
 
 TypeId
 PacketSocket::GetTypeId (void)
@@ -536,7 +537,8 @@
   return m_destAddr;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (PacketSocketTag);
+NS_OBJECT_ENSURE_REGISTERED (PacketSocketTag)
+  ;
 
 TypeId
 PacketSocketTag::GetTypeId (void)
@@ -599,7 +601,8 @@
   return m_deviceName;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (DeviceNameTag);
+NS_OBJECT_ENSURE_REGISTERED (DeviceNameTag)
+  ;
 
 TypeId
 DeviceNameTag::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/utils/packet-socket-factory.cc ns-3.19/src/network/utils/packet-socket-factory.cc
--- ns-3.18.1/src/network/utils/packet-socket-factory.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/packet-socket-factory.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PacketSocketFactory);
+NS_OBJECT_ENSURE_REGISTERED (PacketSocketFactory)
+  ;
 
 TypeId 
 PacketSocketFactory::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/utils/pcap-file.cc ns-3.19/src/network/utils/pcap-file.cc
--- ns-3.18.1/src/network/utils/pcap-file.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/pcap-file.cc	2013-12-20 09:44:50.000000000 -0800
@@ -45,7 +45,6 @@
 
 const uint16_t VERSION_MAJOR = 2;             /**< Major version of supported pcap file format */
 const uint16_t VERSION_MINOR = 4;             /**< Minor version of supported pcap file format */
-const int32_t  SIGFIGS_DEFAULT = 0;           /**< Significant figures for timestamps (libpcap doesn't even bother) */
 
 PcapFile::PcapFile ()
   : m_file (),
diff -Naur ns-3.18.1/src/network/utils/pcap-file.h ns-3.19/src/network/utils/pcap-file.h
--- ns-3.18.1/src/network/utils/pcap-file.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/pcap-file.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,12 +31,14 @@
 class Packet;
 class Header;
 
-/*
+
+/**
+ * \brief A class representing a pcap file
+ * 
  * A class representing a pcap file.  This allows easy creation, writing and 
  * reading of files composed of stored packets; which may be viewed using
  * standard tools.
  */
-
 class PcapFile
 {
 public:
diff -Naur ns-3.18.1/src/network/utils/pcap-file-wrapper.cc ns-3.19/src/network/utils/pcap-file-wrapper.cc
--- ns-3.18.1/src/network/utils/pcap-file-wrapper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/pcap-file-wrapper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PcapFileWrapper);
+NS_OBJECT_ENSURE_REGISTERED (PcapFileWrapper)
+  ;
 
 TypeId 
 PcapFileWrapper::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/utils/queue.cc ns-3.19/src/network/utils/queue.cc
--- ns-3.18.1/src/network/utils/queue.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/queue.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Queue);
+NS_OBJECT_ENSURE_REGISTERED (Queue)
+  ;
 
 TypeId 
 Queue::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/utils/queue.h ns-3.19/src/network/utils/queue.h
--- ns-3.18.1/src/network/utils/queue.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/queue.h	2013-12-20 09:44:50.000000000 -0800
@@ -156,7 +156,11 @@
   virtual Ptr<const Packet> DoPeek (void) const = 0;
 
 protected:
-  // called by subclasses to notify parent of packet drops.
+  /**
+   *  \brief Drop a packet 
+   *  \param packet packet that was dropped
+   *  This method is called by subclasses to notify parent (this class) of packet drops.
+   */
   void Drop (Ptr<Packet> packet);
 
 private:
diff -Naur ns-3.18.1/src/network/utils/radiotap-header.cc ns-3.19/src/network/utils/radiotap-header.cc
--- ns-3.18.1/src/network/utils/radiotap-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/radiotap-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RadiotapHeader);
+NS_OBJECT_ENSURE_REGISTERED (RadiotapHeader)
+  ;
  
 RadiotapHeader::RadiotapHeader()
   : m_length (8),
diff -Naur ns-3.18.1/src/network/utils/red-queue.cc ns-3.19/src/network/utils/red-queue.cc
--- ns-3.18.1/src/network/utils/red-queue.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/red-queue.cc	2013-12-20 09:44:50.000000000 -0800
@@ -69,7 +69,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RedQueue);
+NS_OBJECT_ENSURE_REGISTERED (RedQueue)
+  ;
 
 TypeId RedQueue::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/network/utils/red-queue.h ns-3.19/src/network/utils/red-queue.h
--- ns-3.18.1/src/network/utils/red-queue.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/red-queue.h	2013-12-20 09:44:50.000000000 -0800
@@ -83,46 +83,43 @@
 {
 public:
   static TypeId GetTypeId (void);
-  /*
+  /**
    * \brief RedQueue Constructor
    *
    * Create a RED queue
    */
   RedQueue ();
 
-  /*
+  /**
    * \brief Destructor
    *
    * Destructor
    */ 
   virtual ~RedQueue ();
 
-  /*
+  /**
    * \brief Stats
    *
    */
   typedef struct
-  {
-    // Early probability drops
-    uint32_t unforcedDrop;
-    // Forced drops, qavg > max threshold
-    uint32_t forcedDrop;
-    // Drops due to queue limits
-    uint32_t qLimDrop;
+  {   
+    uint32_t unforcedDrop;  /// Early probability drops 
+    uint32_t forcedDrop;    /// Forced drops, qavg > max threshold
+    uint32_t qLimDrop;      /// Drops due to queue limits
   } Stats;
 
-  /* 
+  /** 
    * \brief Drop types
    *
    */
   enum
   {
-    DTYPE_NONE,        // Ok, no drop
-    DTYPE_FORCED,      // A "forced" drop
-    DTYPE_UNFORCED,    // An "unforced" (random) drop
+    DTYPE_NONE,        /// Ok, no drop
+    DTYPE_FORCED,      /// A "forced" drop
+    DTYPE_UNFORCED,    /// An "unforced" (random) drop
   };
 
-  /*
+  /**
    * \brief Set the operating mode of this queue.
    *  Set operating mode
    *
@@ -130,7 +127,7 @@
    */
   void SetMode (RedQueue::QueueMode mode);
 
-  /*
+  /**
    * \brief Get the encapsulation mode of this queue.
    * Get the encapsulation mode of this queue
    *
@@ -138,29 +135,29 @@
    */
   RedQueue::QueueMode GetMode (void);
 
-  /*
+  /**
    * \brief Get the current value of the queue in bytes or packets.
    *
    * \returns The queue size in bytes or packets.
    */
   uint32_t GetQueueSize (void);
 
-  /*
+  /**
    * \brief Set the limit of the queue.
    *
    * \param lim The limit in bytes or packets.
    */
   void SetQueueLimit (uint32_t lim);
 
-  /*
+  /**
    * \brief Set the thresh limits of RED.
    *
-   * \param min Minimum thresh in bytes or packets.
-   * \param max Maximum thresh in bytes or packets.
+   * \param minTh Minimum thresh in bytes or packets.
+   * \param maxTh Maximum thresh in bytes or packets.
    */
   void SetTh (double minTh, double maxTh);
 
-  /*
+  /**
    * \brief Get the RED statistics after running.
    *
    * \returns The drop statistics.
diff -Naur ns-3.18.1/src/network/utils/sequence-number.h ns-3.19/src/network/utils/sequence-number.h
--- ns-3.18.1/src/network/utils/sequence-number.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/sequence-number.h	2013-12-20 09:44:50.000000000 -0800
@@ -64,19 +64,30 @@
     : m_value (value)
   {}
 
-  // copy contructor
+  /**
+   * \brief Constructs a SequenceNumber from a copy
+   * \param value sequence number to copy
+   */
   SequenceNumber (SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> const &value)
     : m_value (value.m_value)
   {}
 
-  // assignment from a plain number
+  /**
+   * \brief Constructs a SequenceNumber from an assignment of given value
+   * \param value sequence number to copy
+   * \returns reference to the assignee
+   */
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& operator= (NUMERIC_TYPE value)
   {
     m_value = value;
     return *this;
   }
 
-  // assignment from a sequence number
+  /**
+   * \brief Constructs a SequenceNumber from an assignment of another sequence number
+   * \param value sequence number to copy
+   * \returns reference to the assignee
+   */
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& operator= (SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> const &value)
   {
     m_value = value.m_value;
@@ -100,14 +111,20 @@
     return m_value;
   }
 
-  // prefix ++
+  /**
+   * \brief Prefix increment operator
+   * \returns incremented sequence number
+   */ 
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator++ ()
   {
     m_value++;
     return *this;
   }
 
-  // postfix ++
+  /**
+   * \brief Postfix increment operator
+   * \returns incremented sequence number
+   */ 
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator++ (int)
   {
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> retval (m_value);
@@ -115,14 +132,20 @@
     return retval;
   }
 
-  // prefix --
+  /**
+   * \brief Prefix decrement operator
+   * \returns decremented sequence number
+   */ 
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator-- ()
   {
     m_value--;
     return *this;
   }
 
-  // postfix --
+   /**
+   * \brief Postfix decrement operator
+   * \returns incremented sequence number
+   */ 
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator-- (int)
   {
     SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> retval (m_value);
@@ -130,33 +153,63 @@
     return retval;
   }
 
+  /**
+   * \brief Plus equals operator
+   * \param value value to add to sequence number
+   * \returns incremented sequence number
+   */ 
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& operator+= (SIGNED_TYPE value)
   {
     m_value += value;
     return *this;
   }
-
+  
+  /**
+   * \brief Minus equals operator
+   * \param value value to subtract from sequence number
+   * \returns decremented sequence number
+   */ 
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE>& operator-= (SIGNED_TYPE value)
   {
     m_value -= value;
     return *this;
   }
 
+  /**
+   * \brief Operator defining addition of two sequence numbers
+   * \param other sequence number added to this
+   * \returns sequence number representing sum
+   */
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator + (const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &other) const
   {
     return SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> (m_value + other.m_value);
   }
 
+  /**
+   * \brief Addition operator for adding numeric value to sequence number
+   * \param delta value to add to sequence number
+   * \returns sequence number representing sum
+   */
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator + (SIGNED_TYPE delta) const
   {
     return SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> (m_value + delta);
   }
 
+  /**
+   * \brief Subtraction operator for subtracting numeric value from sequence number
+   * \param delta value to subtract from sequence number
+   * \returns sequence number representing difference
+   */
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator - (SIGNED_TYPE delta) const
   {
     return SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> (m_value - delta);
   }
 
+  /**
+   * \brief Subtraction operator for subtracting sequence number from sequence number
+   * \param other sequence number to subtract from this sequence number
+   * \returns numeric value representing the difference
+   */
   SIGNED_TYPE operator - (const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &other) const
   {
     static const NUMERIC_TYPE maxValue = std::numeric_limits<NUMERIC_TYPE>::max ();
@@ -199,16 +252,18 @@
       }
   }
 
-
-  // Here is the critical part, how the comparison is made taking into
-  // account wrap-around.  From RFC 3626:
-  //
-  //   The sequence number S1 is said to be "greater than" the sequence
-  //    number S2 if:
-  //
-  //           S1 > S2 AND S1 - S2 <= MAXVALUE/2 OR
-  //
-  //           S2 > S1 AND S2 - S1 > MAXVALUE/2
+  /**
+   * Here is the critical part, how the comparison is made taking into
+   * account wrap-around.  From RFC 3626:
+   *
+   * The sequence number S1 is said to be "greater than" the sequence
+   * number S2 if:
+   *      S1 > S2 AND S1 - S2 <= MAXVALUE/2 OR
+   *      S2 > S1 AND S2 - S1 > MAXVALUE/2
+   *
+   * \param other sequence number to compare to this one
+   * \returns true if this sequence number is greater than other
+   */
   bool operator > (const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &other) const
   {
     static const NUMERIC_TYPE halfMaxValue = std::numeric_limits<NUMERIC_TYPE>::max () / 2;
@@ -217,35 +272,71 @@
             || ((other.m_value > m_value) && (other.m_value - m_value) > halfMaxValue));
   }
 
+  /**
+   * \brief Equality operator for comparing sequence number
+   * \param other sequence number to compare to this sequence number
+   * \returns true if the sequence numbers are equal
+   */
   bool operator == (const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &other) const
   {
     return (m_value == other.m_value);
   }
 
+  /**
+   * \brief Inequality operator for comparing sequence numbers
+   * \param other sequence number to compare to this sequence number
+   * \returns true if the sequence numbers are not equal
+   */
   bool operator != (const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &other) const
   {
     return (m_value != other.m_value);
   }
 
+  /**
+   * \brief Less than or equal operator for comparing sequence numbers
+   * \param other sequence number to compare to this sequence number
+   * \returns true if this sequence number is less than or equal to other
+   */
   bool operator <= (const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &other) const
   {
     return (!this->operator> (other));
   }
 
+  /**
+   * \brief Greater than or equal operator for comparing sequence numbers
+   * \param other sequence number to compare to this sequence number
+   * \returns true if this sequence number is greater than or equal to other
+   */
   bool operator >= (const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &other) const
   {
     return (this->operator> (other) || this->operator== (other));
   }
 
+  /**
+   * \brief Less than operator for comparing sequence numbers
+   * \param other sequence number to compare to this sequence number
+   * \returns true if this sequence number is less than other
+   */
   bool operator < (const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &other) const
   {
     return !this->operator> (other) && m_value != other.m_value;
   }
 
-
+  /**
+   * \brief For printing sequence number
+   * \param os output stream
+   * \param val sequence number to display
+   * \returns output stream os
+   */
   template<typename NUMERIC_TYPE2, typename SIGNED_TYPE2>
   friend std::ostream & operator<< (std::ostream& os, const SequenceNumber<NUMERIC_TYPE2, SIGNED_TYPE2> &val);
 
+  /**
+   * \brief For loading sequence number from input streams
+   * \param is input stream
+   * \param val sequence number to load
+   * \returns input stream is
+   */
   template<typename NUMERIC_TYPE2, typename SIGNED_TYPE2>
   friend std::istream & operator >> (std::istream &is, const SequenceNumber<NUMERIC_TYPE2, SIGNED_TYPE2> &val);
 
@@ -271,7 +362,6 @@
   NUMERIC_TYPE m_value;
 };
 
-
 template<typename NUMERIC_TYPE, typename SIGNED_TYPE>
 std::ostream &
 operator<< (std::ostream& os, const SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> &val)
diff -Naur ns-3.18.1/src/network/utils/simple-channel.cc ns-3.19/src/network/utils/simple-channel.cc
--- ns-3.18.1/src/network/utils/simple-channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/simple-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SimpleChannel);
+NS_OBJECT_ENSURE_REGISTERED (SimpleChannel)
+  ;
 
 TypeId 
 SimpleChannel::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/utils/simple-channel.h ns-3.19/src/network/utils/simple-channel.h
--- ns-3.18.1/src/network/utils/simple-channel.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/simple-channel.h	2013-12-20 09:44:50.000000000 -0800
@@ -39,10 +39,27 @@
   static TypeId GetTypeId (void);
   SimpleChannel ();
 
-  void Send (Ptr<Packet> p, uint16_t protocol, Mac48Address to, Mac48Address from,
-             Ptr<SimpleNetDevice> sender);
+  /**
+   * A packet is sent by a net device.  A receive event will be 
+   * scheduled for all net device connected to the channel other 
+   * than the net device who sent the packet
+   *
+   * \param p packet to be sent
+   * \param protocol protocol number
+   * \param to address to send packet to
+   * \param from address the packet is coming from
+   * \param sender netdevice who sent the packet
+   *
+   */
+  virtual void Send (Ptr<Packet> p, uint16_t protocol, Mac48Address to, Mac48Address from,
+                     Ptr<SimpleNetDevice> sender);
 
-  void Add (Ptr<SimpleNetDevice> device);
+  /**
+   * Attached a net device to the channel.
+   *
+   * \param device the device to attach to the channel
+   */ 
+  virtual void Add (Ptr<SimpleNetDevice> device);
 
   // inherited from ns3::Channel
   virtual uint32_t GetNDevices (void) const;
diff -Naur ns-3.18.1/src/network/utils/simple-net-device.cc ns-3.19/src/network/utils/simple-net-device.cc
--- ns-3.18.1/src/network/utils/simple-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/simple-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SimpleNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (SimpleNetDevice)
+  ;
 
 TypeId 
 SimpleNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/network/utils/simple-net-device.h ns-3.19/src/network/utils/simple-net-device.h
--- ns-3.18.1/src/network/utils/simple-net-device.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/utils/simple-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -48,7 +48,26 @@
   static TypeId GetTypeId (void);
   SimpleNetDevice ();
 
+  /**
+   * Receive a packet from a connected SimpleChannel.  The 
+   * SimpleNetDevice receives packets from its connected channel
+   * and then forwards them by calling its rx callback method
+   *
+   * \param packet Packet received on the channel
+   * \param protocol protocol number
+   * \param to address packet should be sent to
+   * \param from address packet was sent from
+   */
   void Receive (Ptr<Packet> packet, uint16_t protocol, Mac48Address to, Mac48Address from);
+  
+  /**
+   *
+   * Attach a channel to this net device.  This will be the 
+   * channel the net device sends on
+   * 
+   * \param channel channel to assign to this net device
+   *
+   */
   void SetChannel (Ptr<SimpleChannel> channel);
 
   /**
diff -Naur ns-3.18.1/src/network/wscript ns-3.19/src/network/wscript
--- ns-3.18.1/src/network/wscript	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/network/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -25,6 +25,7 @@
         'model/trailer.cc',
         'utils/address-utils.cc',
         'utils/ascii-file.cc',
+        'utils/crc32.cc',
         'utils/data-rate.cc',
         'utils/drop-tail-queue.cc',
         'utils/error-model.cc',
@@ -102,6 +103,7 @@
         'utils/address-utils.h',
         'utils/ascii-file.h',
         'utils/ascii-test.h',
+        'utils/crc32.h',
         'utils/data-rate.h',
         'utils/drop-tail-queue.h',
         'utils/error-model.h',
diff -Naur ns-3.18.1/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py ns-3.19/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -235,7 +235,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1574,10 +1574,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4092,6 +4093,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4102,6 +4108,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4117,6 +4128,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4142,6 +4158,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py ns-3.19/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -235,7 +235,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1574,10 +1574,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4092,6 +4093,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4102,6 +4108,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4117,6 +4128,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4142,6 +4158,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/nix-vector-routing/doc/nix-vector-routing.h ns-3.19/src/nix-vector-routing/doc/nix-vector-routing.h
--- ns-3.18.1/src/nix-vector-routing/doc/nix-vector-routing.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/nix-vector-routing/doc/nix-vector-routing.h	2013-12-20 09:44:50.000000000 -0800
@@ -19,7 +19,7 @@
  */
 
 /**
- * \defgroup nixvectorrouting Nix-Vector Routing
+ * \defgroup nix-vector-routing Nix-Vector Routing
  *
  * \section model Model
  *
diff -Naur ns-3.18.1/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc ns-3.19/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc
--- ns-3.18.1/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ipv4NixVectorRouting);
+NS_OBJECT_ENSURE_REGISTERED (Ipv4NixVectorRouting)
+  ;
 
 TypeId 
 Ipv4NixVectorRouting::GetTypeId (void)
diff -Naur ns-3.18.1/src/nix-vector-routing/model/ipv4-nix-vector-routing.h ns-3.19/src/nix-vector-routing/model/ipv4-nix-vector-routing.h
--- ns-3.18.1/src/nix-vector-routing/model/ipv4-nix-vector-routing.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/nix-vector-routing/model/ipv4-nix-vector-routing.h	2013-12-20 09:44:50.000000000 -0800
@@ -35,15 +35,18 @@
 namespace ns3 {
 
 /**
+ * \ingroup nix-vector-routing
  * Map of Ipv4Address to NixVector
  */
 typedef std::map<Ipv4Address, Ptr<NixVector> > NixMap_t;
 /**
+ * \ingroup nix-vector-routing
  * Map of Ipv4Address to Ipv4Route
  */
 typedef std::map<Ipv4Address, Ptr<Ipv4Route> > Ipv4RouteMap_t;
 
 /**
+ * \ingroup nix-vector-routing
  * Nix-vector routing protocol
  */
 class Ipv4NixVectorRouting : public Ipv4RoutingProtocol
diff -Naur ns-3.18.1/src/olsr/bindings/modulegen__gcc_ILP32.py ns-3.19/src/olsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/olsr/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/olsr/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -237,7 +237,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1729,10 +1729,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4451,6 +4452,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4461,6 +4467,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4476,6 +4487,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4501,6 +4517,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/olsr/bindings/modulegen__gcc_LP64.py ns-3.19/src/olsr/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/olsr/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/olsr/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -237,7 +237,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1729,10 +1729,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4451,6 +4452,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -4461,6 +4467,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -4476,6 +4487,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -4501,6 +4517,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/olsr/doc/olsr.rst ns-3.19/src/olsr/doc/olsr.rst
--- ns-3.18.1/src/olsr/doc/olsr.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/olsr/doc/olsr.rst	2013-12-20 09:44:50.000000000 -0800
@@ -22,10 +22,10 @@
 
 The model is for IPv4 only.  
 
-* Mostly compliant with OLSR as documented in [rfc3626]_, 
+* Mostly compliant with OLSR as documented in :rfc:`3626`, 
 * The use of multiple interfaces was not supported by the NS-2 version, but is supported in NS-3;
 * OLSR does not respond to the routing event notifications corresponding to dynamic interface up and down (``ns3::RoutingProtocol::NotifyInterfaceUp`` and ``ns3::RoutingProtocol::NotifyInterfaceDown``) or address insertion/removal ``ns3::RoutingProtocol::NotifyAddAddress`` and ``ns3::RoutingProtocol::NotifyRemoveAddress``).
-* Unlike the NS-2 version, does not yet support MAC layer feedback as described in RFC 3626;
+* Unlike the NS-2 version, does not yet support MAC layer feedback as described in :rfc:`3626`;
 
 Host Network Association (HNA) is supported in this implementation
 of OLSR. Refer to ``examples/olsr-hna.cc`` to see how the API
@@ -34,7 +34,7 @@
 References
 ++++++++++
 
-.. [rfc3626] RFC 3626 *Optimized Link State Routing*
+.. [rfc3626] :rfc:`3626` *Optimized Link State Routing*
 
 Usage
 *****
diff -Naur ns-3.18.1/src/olsr/model/olsr-header.cc ns-3.19/src/olsr/model/olsr-header.cc
--- ns-3.18.1/src/olsr/model/olsr-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/olsr/model/olsr-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -96,7 +96,8 @@
 
 // ---------------- OLSR Packet -------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (PacketHeader);
+NS_OBJECT_ENSURE_REGISTERED (PacketHeader)
+  ;
 
 PacketHeader::PacketHeader ()
 {
@@ -153,7 +154,8 @@
 
 // ---------------- OLSR Message -------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (MessageHeader);
+NS_OBJECT_ENSURE_REGISTERED (MessageHeader)
+  ;
 
 MessageHeader::MessageHeader ()
   : m_messageType (MessageHeader::MessageType (0))
diff -Naur ns-3.18.1/src/olsr/model/olsr-routing-protocol.cc ns-3.19/src/olsr/model/olsr-routing-protocol.cc
--- ns-3.18.1/src/olsr/model/olsr-routing-protocol.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/olsr/model/olsr-routing-protocol.cc	2013-12-20 09:44:50.000000000 -0800
@@ -146,7 +146,8 @@
 
 /********** OLSR class **********/
 
-NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol);
+NS_OBJECT_ENSURE_REGISTERED (RoutingProtocol)
+  ;
 
 TypeId 
 RoutingProtocol::GetTypeId (void)
diff -Naur ns-3.18.1/src/openflow/doc/openflow-switch.rst ns-3.19/src/openflow/doc/openflow-switch.rst
--- ns-3.18.1/src/openflow/doc/openflow-switch.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/openflow/doc/openflow-switch.rst	2013-12-20 09:44:51.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: bash
 
 OpenFlow switch support
 -----------------------
@@ -62,14 +63,18 @@
 The OpenFlow switch device behaves somewhat according to the diagram setup as a classical OFSID
 switch, with a few modifications made for a proper simulation environment.
 
-Normal OF-enabled Switch:::
+Normal OF-enabled Switch:
+
+.. sourcecode:: text
   
   | Secure Channel                  | <--OF Protocol--> | Controller is external |
   | Hardware or Software Flow Table |
  
 
-ns-3 OF-enabled Switch (module):::
+ns-3 OF-enabled Switch (module):
 
+.. sourcecode:: text
+  
   | m_controller->ReceiveFromSwitch() | <--OF Protocol--> | Controller is internal |
   | Software Flow Table, virtual TCAM |
 
@@ -132,42 +137,45 @@
 OFSID (OpenFlow Software Implementation Distribution) to ns-3.
 To do this:
 
-#1 Obtain the OFSID code. An ns-3 specific OFSID branch is provided to ensure
-operation with ns-3. Use mercurial to download this branch and waf to build 
-the library::: 
+1. Obtain the OFSID code.
+   An ns-3 specific OFSID branch is provided to ensure
+   operation with ns-3. Use mercurial to download this branch and waf to build 
+   the library::
 
-  $ hg clone http://code.nsnam.org/openflow
-  $ cd openflow
+     $ hg clone http://code.nsnam.org/openflow
+     $ cd openflow
 
-From the "openflow" directory, run:::
+   From the "openflow" directory, run::
      
-  $ ./waf configure
-  $ ./waf build
+     $ ./waf configure
+     $ ./waf build
 
-#2 Your OFSID is now built into a libopenflow.a library!   To
-link to an ns-3 build with this OpenFlow switch module, run from the ns-3-dev
-(or whatever you have named your distribution):::
+2. Your OFSID is now built into a libopenflow.a library!
+   To link to an ns-3 build with this OpenFlow switch module, run from the ns-3-dev
+   (or whatever you have named your distribution)::
 
-  $ ./waf configure --enable-examples --enable-tests --with-openflow=path/to/openflow
+     $ ./waf configure --enable-examples --enable-tests --with-openflow=path/to/openflow
 
-#3 Under ``---- Summary of optional NS-3 features:`` you should see:::
+3. Under ``---- Summary of optional NS-3 features:`` you should see:
 
-   "NS-3 OpenFlow Integration     : enabled"
+   .. sourcecode:: text
+  
+     "NS-3 OpenFlow Integration     : enabled"
 
-indicating the library has been linked to ns-3. Run:::
+   indicating the library has been linked to ns-3. Run::
 
-   $ ./waf build
+     $ ./waf build
 
 to build ns-3 and activate the OpenFlowSwitch module in ns-3.
 
 Examples
 ========
 For an example demonstrating its use in a simple learning controller/switch, 
-run:::
+run::
 
   $ ./waf --run openflow-switch
 
-To see it in detailed logging, run:::
+To see it in detailed logging, run::
 
   $ ./waf --run "openflow-switch -v"
 
@@ -219,7 +227,7 @@
 Validation
 **********
 
-This model has one test suite which can be run as follows:::
+This model has one test suite which can be run as follows::
 
   $ ./test.py --suite=openflow
 
diff -Naur ns-3.18.1/src/openflow/model/openflow-switch-net-device.cc ns-3.19/src/openflow/model/openflow-switch-net-device.cc
--- ns-3.18.1/src/openflow/model/openflow-switch-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/openflow/model/openflow-switch-net-device.cc	2013-12-20 09:44:51.000000000 -0800
@@ -23,7 +23,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (OpenFlowSwitchNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (OpenFlowSwitchNetDevice)
+  ;
 
 const char *
 OpenFlowSwitchNetDevice::GetManufacturerDescription ()
diff -Naur ns-3.18.1/src/point-to-point/bindings/modulegen__gcc_ILP32.py ns-3.19/src/point-to-point/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:51.000000000 -0800
@@ -171,7 +171,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1445,10 +1445,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3352,6 +3353,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3362,6 +3368,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3377,6 +3388,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3402,6 +3418,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5544,14 +5565,14 @@
     cls.add_method('SetBurstRate', 
                    'void', 
                    [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
     cls.add_method('SetRandomBurstSize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
     cls.add_method('SetRandomVariable', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
     ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoCorrupt', 
                    'bool', 
diff -Naur ns-3.18.1/src/point-to-point/bindings/modulegen__gcc_LP64.py ns-3.19/src/point-to-point/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/point-to-point/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:51.000000000 -0800
@@ -171,7 +171,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1445,10 +1445,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3352,6 +3353,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3362,6 +3368,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3377,6 +3388,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3402,6 +3418,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -5544,14 +5565,14 @@
     cls.add_method('SetBurstRate', 
                    'void', 
                    [param('double', 'rate')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomBurstSize(ns3::Ptr<ns3::RandomVariableStream> burstSz) [member function]
     cls.add_method('SetRandomBurstSize', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
-    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> arg0) [member function]
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'burstSz')])
+    ## error-model.h (module 'network'): void ns3::BurstErrorModel::SetRandomVariable(ns3::Ptr<ns3::RandomVariableStream> ranVar) [member function]
     cls.add_method('SetRandomVariable', 
                    'void', 
-                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'arg0')])
+                   [param('ns3::Ptr< ns3::RandomVariableStream >', 'ranVar')])
     ## error-model.h (module 'network'): bool ns3::BurstErrorModel::DoCorrupt(ns3::Ptr<ns3::Packet> p) [member function]
     cls.add_method('DoCorrupt', 
                    'bool', 
diff -Naur ns-3.18.1/src/point-to-point/doc/point-to-point.rst ns-3.19/src/point-to-point/doc/point-to-point.rst
--- ns-3.18.1/src/point-to-point/doc/point-to-point.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/doc/point-to-point.rst	2013-12-20 09:44:51.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 PointToPoint NetDevice
 ----------------------
@@ -76,7 +77,7 @@
 The conceptual model of interest is that of a bare computer "husk" into which
 you plug net devices. The bare computers are created using a ``NodeContainer``
 helper. You just ask this helper to create as many computers (we call them
-``Nodes``) as you need on your network:::
+``Nodes``) as you need on your network::
 
   NodeContainer nodes;
   nodes.Create (2);
@@ -119,7 +120,7 @@
 When a packet is sent to the Point-to-Point net device for transmission it
 always passes through the transmit queue. The transmit queue in the
 PointToPointNetDevice inherits from Queue, and therefore inherits three trace
-sources:::
+sources:
 
 * An Enqueue operation source (see ns3::Queue::m_traceEnqueue);
 * A Dequeue operation source (see ns3::Queue::m_traceDequeue);
diff -Naur ns-3.18.1/src/point-to-point/helper/point-to-point-helper.cc ns-3.19/src/point-to-point/helper/point-to-point-helper.cc
--- ns-3.18.1/src/point-to-point/helper/point-to-point-helper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/helper/point-to-point-helper.cc	2013-12-20 09:44:51.000000000 -0800
@@ -241,6 +241,7 @@
   //use a normal p2p channel, otherwise use a remote channel
   bool useNormalChannel = true;
   Ptr<PointToPointChannel> channel = 0;
+
   if (MpiInterface::IsEnabled ())
     {
       uint32_t n1SystemId = a->GetSystemId ();
diff -Naur ns-3.18.1/src/point-to-point/model/point-to-point-channel.cc ns-3.19/src/point-to-point/model/point-to-point-channel.cc
--- ns-3.18.1/src/point-to-point/model/point-to-point-channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/model/point-to-point-channel.cc	2013-12-20 09:44:51.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PointToPointChannel);
+NS_OBJECT_ENSURE_REGISTERED (PointToPointChannel)
+  ;
 
 TypeId 
 PointToPointChannel::GetTypeId (void)
diff -Naur ns-3.18.1/src/point-to-point/model/point-to-point-net-device.cc ns-3.19/src/point-to-point/model/point-to-point-net-device.cc
--- ns-3.18.1/src/point-to-point/model/point-to-point-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/model/point-to-point-net-device.cc	2013-12-20 09:44:51.000000000 -0800
@@ -25,7 +25,6 @@
 #include "ns3/trace-source-accessor.h"
 #include "ns3/uinteger.h"
 #include "ns3/pointer.h"
-#include "ns3/mpi-interface.h"
 #include "point-to-point-net-device.h"
 #include "point-to-point-channel.h"
 #include "ppp-header.h"
@@ -34,7 +33,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PointToPointNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (PointToPointNetDevice)
+  ;
 
 TypeId 
 PointToPointNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/point-to-point/model/point-to-point-net-device.h ns-3.19/src/point-to-point/model/point-to-point-net-device.h
--- ns-3.18.1/src/point-to-point/model/point-to-point-net-device.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/model/point-to-point-net-device.h	2013-12-20 09:44:51.000000000 -0800
@@ -38,7 +38,7 @@
 class ErrorModel;
 
 /**
- * \defgroup point-to-point PointToPointNetDevice
+ * \defgroup point-to-point Point-To-Point Network Device
  * This section documents the API of the ns-3 point-to-point module. For a generic functional description, please refer to the ns-3 manual.
  */
 
diff -Naur ns-3.18.1/src/point-to-point/model/point-to-point-remote-channel.cc ns-3.19/src/point-to-point/model/point-to-point-remote-channel.cc
--- ns-3.18.1/src/point-to-point/model/point-to-point-remote-channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/model/point-to-point-remote-channel.cc	2013-12-20 09:44:51.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PointToPointRemoteChannel);
+NS_OBJECT_ENSURE_REGISTERED (PointToPointRemoteChannel)
+  ;
 
 TypeId
 PointToPointRemoteChannel::GetTypeId (void)
diff -Naur ns-3.18.1/src/point-to-point/model/ppp-header.cc ns-3.19/src/point-to-point/model/ppp-header.cc
--- ns-3.18.1/src/point-to-point/model/ppp-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point/model/ppp-header.cc	2013-12-20 09:44:51.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PppHeader);
+NS_OBJECT_ENSURE_REGISTERED (PppHeader)
+  ;
 
 PppHeader::PppHeader ()
 {
diff -Naur ns-3.18.1/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py ns-3.19/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:51.000000000 -0800
@@ -265,7 +265,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1888,10 +1888,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4997,6 +4998,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5007,6 +5013,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5022,6 +5033,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5047,6 +5063,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -6475,10 +6496,10 @@
                    'bool', 
                    [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
                    is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interface, ns3::Ipv6Address address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, ns3::Ipv6Address address) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'address')], 
+                   [param('uint32_t', 'interfaceIndex'), param('ns3::Ipv6Address', 'address')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMetric(uint32_t i, uint16_t metric) [member function]
     cls.add_method('SetMetric', 
diff -Naur ns-3.18.1/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py ns-3.19/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:51.000000000 -0800
@@ -265,7 +265,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1888,10 +1888,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -4997,6 +4998,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5007,6 +5013,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5022,6 +5033,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5047,6 +5063,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -6475,10 +6496,10 @@
                    'bool', 
                    [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
                    is_virtual=True)
-    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interface, ns3::Ipv6Address address) [member function]
+    ## ipv6-l3-protocol.h (module 'internet'): bool ns3::Ipv6L3Protocol::RemoveAddress(uint32_t interfaceIndex, ns3::Ipv6Address address) [member function]
     cls.add_method('RemoveAddress', 
                    'bool', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'address')], 
+                   [param('uint32_t', 'interfaceIndex'), param('ns3::Ipv6Address', 'address')], 
                    is_virtual=True)
     ## ipv6-l3-protocol.h (module 'internet'): void ns3::Ipv6L3Protocol::SetMetric(uint32_t i, uint16_t metric) [member function]
     cls.add_method('SetMetric', 
diff -Naur ns-3.18.1/src/point-to-point-layout/model/point-to-point-dumbbell.h ns-3.19/src/point-to-point-layout/model/point-to-point-dumbbell.h
--- ns-3.18.1/src/point-to-point-layout/model/point-to-point-dumbbell.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point-layout/model/point-to-point-dumbbell.h	2013-12-20 09:44:51.000000000 -0800
@@ -33,7 +33,7 @@
 namespace ns3 {
 
 /**
- * \ingroup pointtopointlayout
+ * \ingroup point-to-point-layout
  *
  * \brief A helper to make it easier to create a dumbbell topology
  * with p2p links
diff -Naur ns-3.18.1/src/point-to-point-layout/model/point-to-point-grid.h ns-3.19/src/point-to-point-layout/model/point-to-point-grid.h
--- ns-3.18.1/src/point-to-point-layout/model/point-to-point-grid.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point-layout/model/point-to-point-grid.h	2013-12-20 09:44:51.000000000 -0800
@@ -32,7 +32,7 @@
 namespace ns3 {
 
 /**
- * \ingroup pointtopointlayout
+ * \ingroup point-to-point-layout
  *
  * \brief A helper to make it easier to create a grid topology
  * with p2p links
diff -Naur ns-3.18.1/src/point-to-point-layout/model/point-to-point-star.h ns-3.19/src/point-to-point-layout/model/point-to-point-star.h
--- ns-3.18.1/src/point-to-point-layout/model/point-to-point-star.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/point-to-point-layout/model/point-to-point-star.h	2013-12-20 09:44:51.000000000 -0800
@@ -31,12 +31,12 @@
 namespace ns3 {
 
 /**
- * \defgroup pointtopointlayout Point-to-Point Layout Helpers
+ * \defgroup point-to-point-layout Point-to-Point Layout Helpers
  *
  */
 
 /**
- * \ingroup pointtopointlayout
+ * \ingroup point-to-point-layout
  *
  * \brief A helper to make it easier to create a star topology
  * with PointToPoint links
diff -Naur ns-3.18.1/src/propagation/bindings/modulegen__gcc_ILP32.py ns-3.19/src/propagation/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/propagation/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/propagation/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:51.000000000 -0800
@@ -91,7 +91,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1273,6 +1273,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -1283,6 +1288,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -1298,6 +1308,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -1323,6 +1338,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/propagation/bindings/modulegen__gcc_LP64.py ns-3.19/src/propagation/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/propagation/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:51.000000000 -0800
@@ -91,7 +91,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1273,6 +1273,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -1283,6 +1288,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -1298,6 +1308,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -1323,6 +1338,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/propagation/doc/propagation.rst ns-3.19/src/propagation/doc/propagation.rst
--- ns-3.18.1/src/propagation/doc/propagation.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/doc/propagation.rst	2013-12-20 09:44:51.000000000 -0800
@@ -111,6 +111,7 @@
 and for large cities
 
 .. math::
+
   C_\mathrm{H} = \left\{\begin{array}{ll} 8.29 (\log{(1.54h_M)})^2 -1.1 & \mbox{if } 150\leq f\leq 200 \\ 3.2(\log{(11.75h_M)})^2 -4.97 & \mbox{if } 200<f\leq 1500\end{array} \right.
 
 There extension for the standard OH in suburban is
diff -Naur ns-3.18.1/src/propagation/model/cost231-propagation-loss-model.cc ns-3.19/src/propagation/model/cost231-propagation-loss-model.cc
--- ns-3.18.1/src/propagation/model/cost231-propagation-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/cost231-propagation-loss-model.cc	2013-12-20 09:44:51.000000000 -0800
@@ -29,8 +29,10 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Cost231PropagationLossModel");
-NS_OBJECT_ENSURE_REGISTERED (Cost231PropagationLossModel);
+NS_LOG_COMPONENT_DEFINE ("Cost231PropagationLossModel")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (Cost231PropagationLossModel)
+  ;
 
 TypeId
 Cost231PropagationLossModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/propagation/model/itu-r-1411-los-propagation-loss-model.cc ns-3.19/src/propagation/model/itu-r-1411-los-propagation-loss-model.cc
--- ns-3.18.1/src/propagation/model/itu-r-1411-los-propagation-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/itu-r-1411-los-propagation-loss-model.cc	2013-12-20 09:44:51.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ItuR1411LosPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (ItuR1411LosPropagationLossModel)
+  ;
 
 TypeId
 ItuR1411LosPropagationLossModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc ns-3.19/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc
--- ns-3.18.1/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/itu-r-1411-nlos-over-rooftop-propagation-loss-model.cc	2013-12-20 09:44:51.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ItuR1411NlosOverRooftopPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (ItuR1411NlosOverRooftopPropagationLossModel)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/propagation/model/jakes-process.cc ns-3.19/src/propagation/model/jakes-process.cc
--- ns-3.18.1/src/propagation/model/jakes-process.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/jakes-process.cc	2013-12-20 09:44:51.000000000 -0800
@@ -43,7 +43,8 @@
   return (m_amplitude * std::cos (at.GetSeconds () * m_omega + m_phase));
 }
 
-NS_OBJECT_ENSURE_REGISTERED (JakesProcess);
+NS_OBJECT_ENSURE_REGISTERED (JakesProcess)
+  ;
 
 TypeId
 JakesProcess::GetTypeId ()
diff -Naur ns-3.18.1/src/propagation/model/jakes-propagation-loss-model.cc ns-3.19/src/propagation/model/jakes-propagation-loss-model.cc
--- ns-3.18.1/src/propagation/model/jakes-propagation-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/jakes-propagation-loss-model.cc	2013-12-20 09:44:51.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3
 {
-NS_OBJECT_ENSURE_REGISTERED (JakesPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (JakesPropagationLossModel)
+  ;
 
 
 const double JakesPropagationLossModel::PI = 3.14159265358979323846;
diff -Naur ns-3.18.1/src/propagation/model/kun-2600-mhz-propagation-loss-model.cc ns-3.19/src/propagation/model/kun-2600-mhz-propagation-loss-model.cc
--- ns-3.18.1/src/propagation/model/kun-2600-mhz-propagation-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/kun-2600-mhz-propagation-loss-model.cc	2013-12-20 09:44:51.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Kun2600MhzPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (Kun2600MhzPropagationLossModel)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/propagation/model/okumura-hata-propagation-loss-model.cc ns-3.19/src/propagation/model/okumura-hata-propagation-loss-model.cc
--- ns-3.18.1/src/propagation/model/okumura-hata-propagation-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/okumura-hata-propagation-loss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (OkumuraHataPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (OkumuraHataPropagationLossModel)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/propagation/model/propagation-delay-model.cc ns-3.19/src/propagation/model/propagation-delay-model.cc
--- ns-3.18.1/src/propagation/model/propagation-delay-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/propagation-delay-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (PropagationDelayModel);
+NS_OBJECT_ENSURE_REGISTERED (PropagationDelayModel)
+  ;
 
 TypeId 
 PropagationDelayModel::GetTypeId (void)
@@ -48,7 +49,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (RandomPropagationDelayModel);
+NS_OBJECT_ENSURE_REGISTERED (RandomPropagationDelayModel)
+  ;
 
 TypeId
 RandomPropagationDelayModel::GetTypeId (void)
@@ -84,7 +86,8 @@
   return 1;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (ConstantSpeedPropagationDelayModel);
+NS_OBJECT_ENSURE_REGISTERED (ConstantSpeedPropagationDelayModel)
+  ;
 
 TypeId
 ConstantSpeedPropagationDelayModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/propagation/model/propagation-loss-model.cc ns-3.19/src/propagation/model/propagation-loss-model.cc
--- ns-3.18.1/src/propagation/model/propagation-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/model/propagation-loss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (PropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (PropagationLossModel)
+  ;
 
 TypeId 
 PropagationLossModel::GetTypeId (void)
@@ -95,7 +96,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (RandomPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (RandomPropagationLossModel)
+  ;
 
 TypeId 
 RandomPropagationLossModel::GetTypeId (void)
@@ -138,7 +140,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (FriisPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (FriisPropagationLossModel)
+  ;
 
 const double FriisPropagationLossModel::PI = 3.14159265358979323846;
 
@@ -275,7 +278,8 @@
 // ------------------------------------------------------------------------- //
 // -- Two-Ray Ground Model ported from NS-2 -- tomhewer@mac.com -- Nov09 //
 
-NS_OBJECT_ENSURE_REGISTERED (TwoRayGroundPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (TwoRayGroundPropagationLossModel)
+  ;
 
 const double TwoRayGroundPropagationLossModel::PI = 3.14159265358979323846;
 
@@ -449,7 +453,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (LogDistancePropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (LogDistancePropagationLossModel)
+  ;
 
 TypeId
 LogDistancePropagationLossModel::GetTypeId (void)
@@ -537,7 +542,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (ThreeLogDistancePropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (ThreeLogDistancePropagationLossModel)
+  ;
 
 TypeId
 ThreeLogDistancePropagationLossModel::GetTypeId (void)
@@ -638,7 +644,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (NakagamiPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (NakagamiPropagationLossModel)
+  ;
 
 TypeId
 NakagamiPropagationLossModel::GetTypeId (void)
@@ -752,7 +759,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (FixedRssLossModel);
+NS_OBJECT_ENSURE_REGISTERED (FixedRssLossModel)
+  ;
 
 TypeId 
 FixedRssLossModel::GetTypeId (void)
@@ -798,7 +806,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (MatrixPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (MatrixPropagationLossModel)
+  ;
 
 TypeId 
 MatrixPropagationLossModel::GetTypeId (void)
@@ -877,7 +886,8 @@
 
 // ------------------------------------------------------------------------- //
 
-NS_OBJECT_ENSURE_REGISTERED (RangePropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (RangePropagationLossModel)
+  ;
 
 TypeId
 RangePropagationLossModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/propagation/test/itu-r-1411-los-test-suite.cc ns-3.19/src/propagation/test/itu-r-1411-los-test-suite.cc
--- ns-3.18.1/src/propagation/test/itu-r-1411-los-test-suite.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/test/itu-r-1411-los-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("ItuR1411LosPropagationLossModelTest");
+NS_LOG_COMPONENT_DEFINE ("ItuR1411LosPropagationLossModelTest")
+  ;
 
 
 class ItuR1411LosPropagationLossModelTestCase : public TestCase
diff -Naur ns-3.18.1/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc ns-3.19/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc
--- ns-3.18.1/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/test/itu-r-1411-nlos-over-rooftop-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("ItuR1411NlosOverRooftopPropagationLossModelTest");
+NS_LOG_COMPONENT_DEFINE ("ItuR1411NlosOverRooftopPropagationLossModelTest")
+  ;
 
 
 class ItuR1411NlosOverRooftopPropagationLossModelTestCase : public TestCase
diff -Naur ns-3.18.1/src/propagation/test/kun-2600-mhz-test-suite.cc ns-3.19/src/propagation/test/kun-2600-mhz-test-suite.cc
--- ns-3.18.1/src/propagation/test/kun-2600-mhz-test-suite.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/test/kun-2600-mhz-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("Kun2600MhzPropagationLossModelTest");
+NS_LOG_COMPONENT_DEFINE ("Kun2600MhzPropagationLossModelTest")
+  ;
 
 
 class Kun2600MhzPropagationLossModelTestCase : public TestCase
diff -Naur ns-3.18.1/src/propagation/test/okumura-hata-test-suite.cc ns-3.19/src/propagation/test/okumura-hata-test-suite.cc
--- ns-3.18.1/src/propagation/test/okumura-hata-test-suite.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/propagation/test/okumura-hata-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("OkumuraHataPropagationLossModelTest");
+NS_LOG_COMPONENT_DEFINE ("OkumuraHataPropagationLossModelTest")
+  ;
 
 
 class OkumuraHataPropagationLossModelTestCase : public TestCase
diff -Naur ns-3.18.1/src/sixlowpan/bindings/callbacks_list.py ns-3.19/src/sixlowpan/bindings/callbacks_list.py
--- ns-3.18.1/src/sixlowpan/bindings/callbacks_list.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/bindings/callbacks_list.py	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,4 @@
+callback_classes = [
+    ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::Packet const>', 'unsigned short', 'ns3::Address const&', 'ns3::Address const&', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::Packet const>', 'unsigned short', 'ns3::Address const&', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+]
diff -Naur ns-3.18.1/src/sixlowpan/bindings/modulegen__gcc_ILP32.py ns-3.19/src/sixlowpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,5163 @@
+from pybindgen import Module, FileCodeSink, param, retval, cppclass, typehandlers
+
+
+import pybindgen.settings
+import warnings
+
+class ErrorHandler(pybindgen.settings.ErrorHandler):
+    def handle_error(self, wrapper, exception, traceback_):
+        warnings.warn("exception %r in wrapper %s" % (exception, wrapper))
+        return True
+pybindgen.settings.error_handler = ErrorHandler()
+
+
+import sys
+
+def module_init():
+    root_module = Module('ns.sixlowpan', cpp_namespace='::ns3')
+    return root_module
+
+def register_types(module):
+    root_module = module.get_root()
+    
+    ## address.h (module 'network'): ns3::Address [class]
+    module.add_class('Address', import_from_module='ns.network')
+    ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
+    module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
+    module.add_class('AttributeConstructionList', import_from_module='ns.core')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
+    module.add_class('Item', import_from_module='ns.core', outer_class=root_module['ns3::AttributeConstructionList'])
+    ## buffer.h (module 'network'): ns3::Buffer [class]
+    module.add_class('Buffer', import_from_module='ns.network')
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::Buffer'])
+    ## packet.h (module 'network'): ns3::ByteTagIterator [class]
+    module.add_class('ByteTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagIterator'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList [class]
+    module.add_class('ByteTagList', import_from_module='ns.network')
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
+    ## callback.h (module 'core'): ns3::CallbackBase [class]
+    module.add_class('CallbackBase', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId [class]
+    module.add_class('EventId', import_from_module='ns.core')
+    ## hash.h (module 'core'): ns3::Hasher [class]
+    module.add_class('Hasher', import_from_module='ns.core')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    module.add_class('Ipv4Address', import_from_module='ns.network')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
+    module.add_class('Ipv4Mask', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    module.add_class('Ipv6Address', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
+    module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
+    module.add_class('NetDeviceContainer', import_from_module='ns.network')
+    ## object-base.h (module 'core'): ns3::ObjectBase [class]
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
+    ## object.h (module 'core'): ns3::ObjectDeleter [struct]
+    module.add_class('ObjectDeleter', import_from_module='ns.core')
+    ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
+    module.add_class('ObjectFactory', import_from_module='ns.core')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
+    module.add_class('PacketMetadata', import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [enumeration]
+    module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item'], import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator [class]
+    module.add_class('ItemIterator', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet.h (module 'network'): ns3::PacketTagIterator [class]
+    module.add_class('PacketTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagIterator'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList [class]
+    module.add_class('PacketTagList', import_from_module='ns.network')
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
+    module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
+    module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch [class]
+    module.add_class('SixLowPanDispatch')
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::Dispatch_e [enumeration]
+    module.add_enum('Dispatch_e', ['LOWPAN_NALP', 'LOWPAN_NALP_N', 'LOWPAN_NOTCOMPRESSED', 'LOWPAN_HC1', 'LOWPAN_BC0', 'LOWPAN_IPHC', 'LOWPAN_IPHC_N', 'LOWPAN_MESH', 'LOWPAN_MESH_N', 'LOWPAN_FRAG1', 'LOWPAN_FRAG1_N', 'LOWPAN_FRAGN', 'LOWPAN_FRAGN_N', 'LOWPAN_UNSUPPORTED'], outer_class=root_module['ns3::SixLowPanDispatch'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::NhcDispatch_e [enumeration]
+    module.add_enum('NhcDispatch_e', ['LOWPAN_NHC', 'LOWPAN_NHC_N', 'LOWPAN_UDPNHC', 'LOWPAN_UDPNHC_N', 'LOWPAN_NHCUNSUPPORTED'], outer_class=root_module['ns3::SixLowPanDispatch'])
+    ## sixlowpan-helper.h (module 'sixlowpan'): ns3::SixLowPanHelper [class]
+    module.add_class('SixLowPanHelper')
+    ## tag.h (module 'network'): ns3::Tag [class]
+    module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
+    module.add_class('TagBuffer', import_from_module='ns.network')
+    ## type-id.h (module 'core'): ns3::TypeId [class]
+    module.add_class('TypeId', import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
+    module.add_enum('AttributeFlag', ['ATTR_GET', 'ATTR_SET', 'ATTR_CONSTRUCT', 'ATTR_SGC'], outer_class=root_module['ns3::TypeId'], import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation [struct]
+    module.add_class('AttributeInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
+    module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## empty.h (module 'core'): ns3::empty [class]
+    module.add_class('empty', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
+    module.add_class('int64x64_t', import_from_module='ns.core')
+    ## chunk.h (module 'network'): ns3::Chunk [class]
+    module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## header.h (module 'network'): ns3::Header [class]
+    module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header [class]
+    module.add_class('Ipv6Header', import_from_module='ns.internet', parent=root_module['ns3::Header'])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::NextHeader_e [enumeration]
+    module.add_enum('NextHeader_e', ['IPV6_EXT_HOP_BY_HOP', 'IPV6_IPV4', 'IPV6_TCP', 'IPV6_UDP', 'IPV6_IPV6', 'IPV6_EXT_ROUTING', 'IPV6_EXT_FRAGMENTATION', 'IPV6_EXT_CONFIDENTIALITY', 'IPV6_EXT_AUTHENTIFICATION', 'IPV6_ICMPV6', 'IPV6_EXT_END', 'IPV6_EXT_DESTINATION', 'IPV6_SCTP', 'IPV6_EXT_MOBILITY', 'IPV6_UDP_LITE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
+    ## object.h (module 'core'): ns3::Object [class]
+    module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
+    module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream [class]
+    module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
+    ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
+    module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFrag1 [class]
+    module.add_class('SixLowPanFrag1', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFragN [class]
+    module.add_class('SixLowPanFragN', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1 [class]
+    module.add_class('SixLowPanHc1', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::LowPanHc1Addr_e [enumeration]
+    module.add_enum('LowPanHc1Addr_e', ['HC1_PIII', 'HC1_PIIC', 'HC1_PCII', 'HC1_PCIC'], outer_class=root_module['ns3::SixLowPanHc1'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::LowPanHc1NextHeader_e [enumeration]
+    module.add_enum('LowPanHc1NextHeader_e', ['HC1_NC', 'HC1_UDP', 'HC1_ICMP', 'HC1_TCP'], outer_class=root_module['ns3::SixLowPanHc1'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc [class]
+    module.add_class('SixLowPanIphc', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::TrafficClassFlowLabel_e [enumeration]
+    module.add_enum('TrafficClassFlowLabel_e', ['TF_FULL', 'TF_DSCP_ELIDED', 'TF_FL_ELIDED', 'TF_ELIDED'], outer_class=root_module['ns3::SixLowPanIphc'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::Hlim_e [enumeration]
+    module.add_enum('Hlim_e', ['HLIM_INLINE', 'HLIM_COMPR_1', 'HLIM_COMPR_64', 'HLIM_COMPR_255'], outer_class=root_module['ns3::SixLowPanIphc'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::HeaderCompression_e [enumeration]
+    module.add_enum('HeaderCompression_e', ['HC_INLINE', 'HC_COMPR_64', 'HC_COMPR_16', 'HC_COMPR_0'], outer_class=root_module['ns3::SixLowPanIphc'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension [class]
+    module.add_class('SixLowPanNhcExtension', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension::Eid_e [enumeration]
+    module.add_enum('Eid_e', ['EID_HOPBYHOP_OPTIONS_H', 'EID_ROUTING_H', 'EID_FRAGMENTATION_H', 'EID_DESTINATION_OPTIONS_H', 'EID_MOBILITY_H', 'EID_IPv6_H'], outer_class=root_module['ns3::SixLowPanNhcExtension'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension [class]
+    module.add_class('SixLowPanUdpNhcExtension', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension::Ports_e [enumeration]
+    module.add_enum('Ports_e', ['PORTS_INLINE', 'PORTS_ALL_SRC_LAST_DST', 'PORTS_LAST_SRC_ALL_DST', 'PORTS_LAST_SRC_LAST_DST'], outer_class=root_module['ns3::SixLowPanUdpNhcExtension'])
+    ## nstime.h (module 'core'): ns3::Time [class]
+    module.add_class('Time', import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time [class]
+    root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
+    module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    ## trailer.h (module 'network'): ns3::Trailer [class]
+    module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## random-variable-stream.h (module 'core'): ns3::TriangularRandomVariable [class]
+    module.add_class('TriangularRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
+    module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable [class]
+    module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable [class]
+    module.add_class('ZetaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable [class]
+    module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
+    module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    ## attribute.h (module 'core'): ns3::AttributeChecker [class]
+    module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    ## attribute.h (module 'core'): ns3::AttributeValue [class]
+    module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    ## callback.h (module 'core'): ns3::CallbackChecker [class]
+    module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## callback.h (module 'core'): ns3::CallbackImplBase [class]
+    module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    ## callback.h (module 'core'): ns3::CallbackValue [class]
+    module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable [class]
+    module.add_class('ConstantRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable [class]
+    module.add_class('DeterministicRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
+    module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
+    module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable [class]
+    module.add_class('ErlangRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## event-impl.h (module 'core'): ns3::EventImpl [class]
+    module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable [class]
+    module.add_class('ExponentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
+    module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
+    module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
+    module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
+    module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
+    module.add_class('Ipv4MaskValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
+    module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
+    module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
+    module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
+    module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable [class]
+    module.add_class('LogNormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## net-device.h (module 'network'): ns3::NetDevice [class]
+    module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
+    module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
+    ## nix-vector.h (module 'network'): ns3::NixVector [class]
+    module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable [class]
+    module.add_class('NormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
+    module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
+    module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## packet.h (module 'network'): ns3::Packet [class]
+    module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
+    module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice [class]
+    module.add_class('SixLowPanNetDevice', parent=root_module['ns3::NetDevice'])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice::DropReason [enumeration]
+    module.add_enum('DropReason', ['DROP_FRAGMENT_TIMEOUT', 'DROP_FRAGMENT_BUFFER_FULL', 'DROP_UNKNOWN_EXTENSION'], outer_class=root_module['ns3::SixLowPanNetDevice'])
+    ## nstime.h (module 'core'): ns3::TimeValue [class]
+    module.add_class('TimeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
+    module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## type-id.h (module 'core'): ns3::TypeIdValue [class]
+    module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## address.h (module 'network'): ns3::AddressChecker [class]
+    module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## address.h (module 'network'): ns3::AddressValue [class]
+    module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    
+    ## Register a nested module for the namespace FatalImpl
+    
+    nested_module = module.add_cpp_namespace('FatalImpl')
+    register_types_ns3_FatalImpl(nested_module)
+    
+    
+    ## Register a nested module for the namespace Hash
+    
+    nested_module = module.add_cpp_namespace('Hash')
+    register_types_ns3_Hash(nested_module)
+    
+
+def register_types_ns3_FatalImpl(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_Hash(module):
+    root_module = module.get_root()
+    
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation [class]
+    module.add_class('Implementation', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash32Function_ptr')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash32Function_ptr*')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash32Function_ptr&')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash64Function_ptr')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash64Function_ptr*')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash64Function_ptr&')
+    
+    ## Register a nested module for the namespace Function
+    
+    nested_module = module.add_cpp_namespace('Function')
+    register_types_ns3_Hash_Function(nested_module)
+    
+
+def register_types_ns3_Hash_Function(module):
+    root_module = module.get_root()
+    
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a [class]
+    module.add_class('Fnv1a', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32 [class]
+    module.add_class('Hash32', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64 [class]
+    module.add_class('Hash64', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
+    module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+
+def register_methods(root_module):
+    register_Ns3Address_methods(root_module, root_module['ns3::Address'])
+    register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
+    register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
+    register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
+    register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
+    register_Ns3ByteTagIteratorItem_methods(root_module, root_module['ns3::ByteTagIterator::Item'])
+    register_Ns3ByteTagList_methods(root_module, root_module['ns3::ByteTagList'])
+    register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
+    register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
+    register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
+    register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
+    register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
+    register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
+    register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
+    register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
+    register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
+    register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
+    register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
+    register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
+    register_Ns3PacketTagIterator_methods(root_module, root_module['ns3::PacketTagIterator'])
+    register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
+    register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
+    register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    register_Ns3SixLowPanDispatch_methods(root_module, root_module['ns3::SixLowPanDispatch'])
+    register_Ns3SixLowPanHelper_methods(root_module, root_module['ns3::SixLowPanHelper'])
+    register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
+    register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
+    register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
+    register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
+    register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
+    register_Ns3Header_methods(root_module, root_module['ns3::Header'])
+    register_Ns3Ipv6Header_methods(root_module, root_module['ns3::Ipv6Header'])
+    register_Ns3Object_methods(root_module, root_module['ns3::Object'])
+    register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3RandomVariableStream_methods(root_module, root_module['ns3::RandomVariableStream'])
+    register_Ns3SequentialRandomVariable_methods(root_module, root_module['ns3::SequentialRandomVariable'])
+    register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    register_Ns3SixLowPanFrag1_methods(root_module, root_module['ns3::SixLowPanFrag1'])
+    register_Ns3SixLowPanFragN_methods(root_module, root_module['ns3::SixLowPanFragN'])
+    register_Ns3SixLowPanHc1_methods(root_module, root_module['ns3::SixLowPanHc1'])
+    register_Ns3SixLowPanIphc_methods(root_module, root_module['ns3::SixLowPanIphc'])
+    register_Ns3SixLowPanNhcExtension_methods(root_module, root_module['ns3::SixLowPanNhcExtension'])
+    register_Ns3SixLowPanUdpNhcExtension_methods(root_module, root_module['ns3::SixLowPanUdpNhcExtension'])
+    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
+    register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
+    register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
+    register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
+    register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
+    register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
+    register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
+    register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
+    register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
+    register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
+    register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
+    register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
+    register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
+    register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
+    register_Ns3ConstantRandomVariable_methods(root_module, root_module['ns3::ConstantRandomVariable'])
+    register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
+    register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
+    register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3ErlangRandomVariable_methods(root_module, root_module['ns3::ErlangRandomVariable'])
+    register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3ExponentialRandomVariable_methods(root_module, root_module['ns3::ExponentialRandomVariable'])
+    register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
+    register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
+    register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
+    register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
+    register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
+    register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
+    register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
+    register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
+    register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
+    register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
+    register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
+    register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
+    register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
+    register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
+    register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
+    register_Ns3SixLowPanNetDevice_methods(root_module, root_module['ns3::SixLowPanNetDevice'])
+    register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
+    register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
+    register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
+    register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
+    register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
+    register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
+    register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
+    register_Ns3HashFunctionHash64_methods(root_module, root_module['ns3::Hash::Function::Hash64'])
+    register_Ns3HashFunctionMurmur3_methods(root_module, root_module['ns3::Hash::Function::Murmur3'])
+    return
+
+def register_Ns3Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## address.h (module 'network'): ns3::Address::Address() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::Address::Address(uint8_t type, uint8_t const * buffer, uint8_t len) [constructor]
+    cls.add_constructor([param('uint8_t', 'type'), param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): ns3::Address::Address(ns3::Address const & address) [copy constructor]
+    cls.add_constructor([param('ns3::Address const &', 'address')])
+    ## address.h (module 'network'): bool ns3::Address::CheckCompatible(uint8_t type, uint8_t len) const [member function]
+    cls.add_method('CheckCompatible', 
+                   'bool', 
+                   [param('uint8_t', 'type'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyAllFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllTo(uint8_t * buffer, uint8_t len) const [member function]
+    cls.add_method('CopyAllTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## address.h (module 'network'): void ns3::Address::Deserialize(ns3::TagBuffer buffer) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')])
+    ## address.h (module 'network'): uint8_t ns3::Address::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsInvalid() const [member function]
+    cls.add_method('IsInvalid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsMatchingType(uint8_t type) const [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('uint8_t', 'type')], 
+                   is_const=True)
+    ## address.h (module 'network'): static uint8_t ns3::Address::Register() [member function]
+    cls.add_method('Register', 
+                   'uint8_t', 
+                   [], 
+                   is_static=True)
+    ## address.h (module 'network'): void ns3::Address::Serialize(ns3::TagBuffer buffer) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')], 
+                   is_const=True)
+    return
+
+def register_Ns3AttributeConstructionList_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList(ns3::AttributeConstructionList const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): void ns3::AttributeConstructionList::Add(std::string name, ns3::Ptr<ns3::AttributeChecker const> checker, ns3::Ptr<ns3::AttributeValue> value) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker'), param('ns3::Ptr< ns3::AttributeValue >', 'value')])
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::End() const [member function]
+    cls.add_method('End', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeConstructionList::Find(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True)
+    return
+
+def register_Ns3AttributeConstructionListItem_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item(ns3::AttributeConstructionList::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList::Item const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::value [variable]
+    cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
+    return
+
+def register_Ns3Buffer_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize, bool initialize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    cls.add_method('AddAtEnd', 
+                   'bool', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    cls.add_method('AddAtStart', 
+                   'bool', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Buffer', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
+    cls.add_method('CreateFullCopy', 
+                   'ns3::Buffer', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
+    cls.add_method('GetCurrentEndOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
+    cls.add_method('GetCurrentStartOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint8_t const * ns3::Buffer::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3BufferIterator_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator(ns3::Buffer::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer::Iterator const &', 'arg0')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size, uint32_t initialChecksum) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size'), param('uint32_t', 'initialChecksum')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetDistanceFrom(ns3::Buffer::Iterator const & o) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator const &', 'o')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsEnd() const [member function]
+    cls.add_method('IsEnd', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsStart() const [member function]
+    cls.add_method('IsStart', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next(uint32_t delta) [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev(uint32_t delta) [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
+    cls.add_method('ReadLsbtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadLsbtohU32() [member function]
+    cls.add_method('ReadLsbtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadLsbtohU64() [member function]
+    cls.add_method('ReadLsbtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadNtohU16() [member function]
+    cls.add_method('ReadNtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadNtohU32() [member function]
+    cls.add_method('ReadNtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadNtohU64() [member function]
+    cls.add_method('ReadNtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('ns3::Buffer::Iterator', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU16(uint16_t data) [member function]
+    cls.add_method('WriteHtolsbU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU32(uint32_t data) [member function]
+    cls.add_method('WriteHtolsbU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU64(uint64_t data) [member function]
+    cls.add_method('WriteHtolsbU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU16(uint16_t data) [member function]
+    cls.add_method('WriteHtonU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU32(uint32_t data) [member function]
+    cls.add_method('WriteHtonU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU64(uint64_t data) [member function]
+    cls.add_method('WriteHtonU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU64(uint64_t data) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data, uint32_t len) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data'), param('uint32_t', 'len')])
+    return
+
+def register_Ns3ByteTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::ByteTagIterator(ns3::ByteTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::ByteTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item ns3::ByteTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item::Item(ns3::ByteTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetEnd() const [member function]
+    cls.add_method('GetEnd', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetStart() const [member function]
+    cls.add_method('GetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::ByteTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::ByteTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ByteTagList_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList() [constructor]
+    cls.add_constructor([])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList(ns3::ByteTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): ns3::TagBuffer ns3::ByteTagList::Add(ns3::TypeId tid, uint32_t bufferSize, int32_t start, int32_t end) [member function]
+    cls.add_method('Add', 
+                   'ns3::TagBuffer', 
+                   [param('ns3::TypeId', 'tid'), param('uint32_t', 'bufferSize'), param('int32_t', 'start'), param('int32_t', 'end')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Add(ns3::ByteTagList const & o) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+    cls.add_method('AddAtStart', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
+    cls.add_method('Begin', 
+                   'ns3::ByteTagList::Iterator', 
+                   [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIterator_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Iterator(ns3::ByteTagList::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Iterator::GetOffsetStart() const [member function]
+    cls.add_method('GetOffsetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): bool ns3::ByteTagList::Iterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item ns3::ByteTagList::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagList::Iterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIteratorItem_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::ByteTagList::Iterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator::Item const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::TagBuffer buf) [constructor]
+    cls.add_constructor([param('ns3::TagBuffer', 'buf')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::buf [variable]
+    cls.add_instance_attribute('buf', 'ns3::TagBuffer', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::end [variable]
+    cls.add_instance_attribute('end', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::size [variable]
+    cls.add_instance_attribute('size', 'uint32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::start [variable]
+    cls.add_instance_attribute('start', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3CallbackBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::CallbackBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::CallbackImplBase> ns3::CallbackBase::GetImpl() const [member function]
+    cls.add_method('GetImpl', 
+                   'ns3::Ptr< ns3::CallbackImplBase >', 
+                   [], 
+                   is_const=True)
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
+                        visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3EventId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::EventId const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventId const &', 'arg0')])
+    ## event-id.h (module 'core'): ns3::EventId::EventId() [constructor]
+    cls.add_constructor([])
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::Ptr<ns3::EventImpl> const & impl, uint64_t ts, uint32_t context, uint32_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EventImpl > const &', 'impl'), param('uint64_t', 'ts'), param('uint32_t', 'context'), param('uint32_t', 'uid')])
+    ## event-id.h (module 'core'): void ns3::EventId::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetContext() const [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint64_t ns3::EventId::GetTs() const [member function]
+    cls.add_method('GetTs', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsExpired() const [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): ns3::EventImpl * ns3::EventId::PeekEventImpl() const [member function]
+    cls.add_method('PeekEventImpl', 
+                   'ns3::EventImpl *', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3Hasher_methods(root_module, cls):
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher() [constructor]
+    cls.add_constructor([])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Ptr<ns3::Hash::Implementation> hp) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Hash::Implementation >', 'hp')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(std::string const s) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(std::string const s) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): ns3::Hasher & ns3::Hasher::clear() [member function]
+    cls.add_method('clear', 
+                   'ns3::Hasher &', 
+                   [])
+    return
+
+def register_Ns3Ipv4Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(uint32_t address) [constructor]
+    cls.add_constructor([param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::CombineMask(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('CombineMask', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv4Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Address::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::GetSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('GetSubnetDirectedBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const &', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
+    cls.add_method('IsLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static bool ns3::Ipv4Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('IsSubnetDirectedBroadcast', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(uint32_t address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    return
+
+def register_Ns3Ipv4Mask_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(ns3::Ipv4Mask const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(uint32_t mask) [constructor]
+    cls.add_constructor([param('uint32_t', 'mask')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(char const * mask) [constructor]
+    cls.add_constructor([param('char const *', 'mask')])
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::GetInverse() const [member function]
+    cls.add_method('GetInverse', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint16_t ns3::Ipv4Mask::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'a'), param('ns3::Ipv4Address', 'b')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Set(uint32_t mask) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'mask')])
+    return
+
+def register_Ns3Ipv6Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(uint8_t * address) [constructor]
+    cls.add_constructor([param('uint8_t *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const & addr) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const * addr) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const *', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Address::CombinePrefix(ns3::Ipv6Prefix const & prefix) [member function]
+    cls.add_method('CombinePrefix', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv6Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllHostsMulticast() [member function]
+    cls.add_method('GetAllHostsMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllNodesMulticast() [member function]
+    cls.add_method('GetAllNodesMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllRoutersMulticast() [member function]
+    cls.add_method('GetAllRoutersMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv6Address::GetIpv4MappedAddress() const [member function]
+    cls.add_method('GetIpv4MappedAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllHostsMulticast() const [member function]
+    cls.add_method('IsAllHostsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllNodesMulticast() const [member function]
+    cls.add_method('IsAllNodesMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllRoutersMulticast() const [member function]
+    cls.add_method('IsAllRoutersMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAny() const [member function]
+    cls.add_method('IsAny', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsDocumentation() const [member function]
+    cls.add_method('IsDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Address const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
+    cls.add_method('IsIpv4MappedAddress', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
+    cls.add_method('IsLinkLocal', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocalMulticast() const [member function]
+    cls.add_method('IsLinkLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLocalhost() const [member function]
+    cls.add_method('IsLocalhost', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static bool ns3::Ipv6Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsSolicitedMulticast() const [member function]
+    cls.add_method('IsSolicitedMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac48Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac64Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac16Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac48Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac64Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeIpv4MappedAddress(ns3::Ipv4Address addr) [member function]
+    cls.add_method('MakeIpv4MappedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeSolicitedAddress(ns3::Ipv6Address addr) [member function]
+    cls.add_method('MakeSolicitedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(uint8_t * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t *', 'address')])
+    return
+
+def register_Ns3Ipv6Prefix_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t * prefix) [constructor]
+    cls.add_constructor([param('uint8_t *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(char const * prefix) [constructor]
+    cls.add_constructor([param('char const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t prefix) [constructor]
+    cls.add_constructor([param('uint8_t', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const & prefix) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): uint8_t ns3::Ipv6Prefix::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Prefix const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'a'), param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3NetDeviceContainer_methods(root_module, cls):
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer() [constructor]
+    cls.add_constructor([])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::Ptr<ns3::NetDevice> dev) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::NetDevice >', 'dev')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(std::string devName) [constructor]
+    cls.add_constructor([param('std::string', 'devName')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & a, ns3::NetDeviceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'a'), param('ns3::NetDeviceContainer const &', 'b')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::NetDeviceContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'other')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(std::string deviceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'deviceName')])
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::NetDeviceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): uint32_t ns3::NetDeviceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ObjectBase_methods(root_module, cls):
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
+    cls.add_constructor([])
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase(ns3::ObjectBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectBase const &', 'arg0')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::GetAttribute(std::string name, ns3::AttributeValue & value) const [member function]
+    cls.add_method('GetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('GetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): ns3::TypeId ns3::ObjectBase::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## object-base.h (module 'core'): static ns3::TypeId ns3::ObjectBase::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object-base.h (module 'core'): void ns3::ObjectBase::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::SetAttributeFailSafe(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::ConstructSelf(ns3::AttributeConstructionList const & attributes) [member function]
+    cls.add_method('ConstructSelf', 
+                   'void', 
+                   [param('ns3::AttributeConstructionList const &', 'attributes')], 
+                   visibility='protected')
+    ## object-base.h (module 'core'): void ns3::ObjectBase::NotifyConstructionCompleted() [member function]
+    cls.add_method('NotifyConstructionCompleted', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectDeleter_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter(ns3::ObjectDeleter const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectDeleter const &', 'arg0')])
+    ## object.h (module 'core'): static void ns3::ObjectDeleter::Delete(ns3::Object * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::Object *', 'object')], 
+                   is_static=True)
+    return
+
+def register_Ns3ObjectFactory_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(ns3::ObjectFactory const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
+    cls.add_constructor([param('std::string', 'typeId')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): ns3::TypeId ns3::ObjectFactory::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('ns3::TypeId', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(char const * tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('char const *', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(std::string tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('std::string', 'tid')])
+    return
+
+def register_Ns3PacketMetadata_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
+    cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [param('ns3::Buffer', 'buffer')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::PacketMetadata', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'end')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint64_t ns3::PacketMetadata::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('RemoveHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketMetadataItem_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::current [variable]
+    cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentSize [variable]
+    cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromEnd [variable]
+    cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromStart [variable]
+    cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::isFragment [variable]
+    cls.add_instance_attribute('isFragment', 'bool', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3PacketMetadataItemIterator_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')])
+    ## packet-metadata.h (module 'network'): bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketMetadata::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::PacketTagIterator(ns3::PacketTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::PacketTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item ns3::PacketTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item::Item(ns3::PacketTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): void ns3::PacketTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::PacketTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketTagList_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList(ns3::PacketTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList const &', 'o')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::Add(ns3::Tag const & tag) const [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
+    cls.add_method('Head', 
+                   'ns3::PacketTagList::TagData const *', 
+                   [], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Peek(ns3::Tag & tag) const [member function]
+    cls.add_method('Peek', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Remove(ns3::Tag & tag) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Replace(ns3::Tag & tag) [member function]
+    cls.add_method('Replace', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    return
+
+def register_Ns3PacketTagListTagData_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData(ns3::PacketTagList::TagData const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList::TagData const &', 'arg0')])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
+    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
+    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
+    cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount(ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SixLowPanDispatch_methods(root_module, cls):
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::SixLowPanDispatch(ns3::SixLowPanDispatch const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanDispatch const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::SixLowPanDispatch() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::SixLowPanDispatch::Dispatch_e ns3::SixLowPanDispatch::GetDispatchType(uint8_t dispatch) [member function]
+    cls.add_method('GetDispatchType', 
+                   'ns3::SixLowPanDispatch::Dispatch_e', 
+                   [param('uint8_t', 'dispatch')], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::SixLowPanDispatch::NhcDispatch_e ns3::SixLowPanDispatch::GetNhcDispatchType(uint8_t dispatch) [member function]
+    cls.add_method('GetNhcDispatchType', 
+                   'ns3::SixLowPanDispatch::NhcDispatch_e', 
+                   [param('uint8_t', 'dispatch')], 
+                   is_static=True)
+    return
+
+def register_Ns3SixLowPanHelper_methods(root_module, cls):
+    ## sixlowpan-helper.h (module 'sixlowpan'): ns3::SixLowPanHelper::SixLowPanHelper(ns3::SixLowPanHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanHelper const &', 'arg0')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): ns3::SixLowPanHelper::SixLowPanHelper() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-helper.h (module 'sixlowpan'): int64_t ns3::SixLowPanHelper::AssignStreams(ns3::NetDeviceContainer c, int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): ns3::NetDeviceContainer ns3::SixLowPanHelper::Install(ns3::NetDeviceContainer c) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NetDeviceContainer', 'c')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::SetDeviceAttribute(std::string n1, ns3::AttributeValue const & v1) [member function]
+    cls.add_method('SetDeviceAttribute', 
+                   'void', 
+                   [param('std::string', 'n1'), param('ns3::AttributeValue const &', 'v1')])
+    return
+
+def register_Ns3Tag_methods(root_module, cls):
+    ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
+    cls.add_constructor([])
+    ## tag.h (module 'network'): ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Tag const &', 'arg0')])
+    ## tag.h (module 'network'): void ns3::Tag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tag.h (module 'network'): void ns3::Tag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3TagBuffer_methods(root_module, cls):
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
+    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'o')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): double ns3::TagBuffer::ReadDouble() [member function]
+    cls.add_method('ReadDouble', 
+                   'double', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint16_t ns3::TagBuffer::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint32_t ns3::TagBuffer::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint64_t ns3::TagBuffer::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint8_t ns3::TagBuffer::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::TrimAtEnd(uint32_t trim) [member function]
+    cls.add_method('TrimAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'trim')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteDouble(double v) [member function]
+    cls.add_method('WriteDouble', 
+                   'void', 
+                   [param('double', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU64(uint64_t v) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU8(uint8_t v) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'v')])
+    return
+
+def register_Ns3TypeId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
+    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'o')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, uint32_t flags, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('uint32_t', 'flags'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor) [member function]
+    cls.add_method('AddTraceSource', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation ns3::TypeId::GetAttribute(uint32_t i) const [member function]
+    cls.add_method('GetAttribute', 
+                   'ns3::TypeId::AttributeInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetAttributeFullName(uint32_t i) const [member function]
+    cls.add_method('GetAttributeFullName', 
+                   'std::string', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetAttributeN() const [member function]
+    cls.add_method('GetAttributeN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::Callback<ns3::ObjectBase*,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> ns3::TypeId::GetConstructor() const [member function]
+    cls.add_method('GetConstructor', 
+                   'ns3::Callback< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetGroupName() const [member function]
+    cls.add_method('GetGroupName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetHash() const [member function]
+    cls.add_method('GetHash', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::GetParent() const [member function]
+    cls.add_method('GetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::GetRegistered(uint32_t i) [member function]
+    cls.add_method('GetRegistered', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'i')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static uint32_t ns3::TypeId::GetRegisteredN() [member function]
+    cls.add_method('GetRegisteredN', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation ns3::TypeId::GetTraceSource(uint32_t i) const [member function]
+    cls.add_method('GetTraceSource', 
+                   'ns3::TypeId::TraceSourceInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetTraceSourceN() const [member function]
+    cls.add_method('GetTraceSourceN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint16_t ns3::TypeId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasConstructor() const [member function]
+    cls.add_method('HasConstructor', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasParent() const [member function]
+    cls.add_method('HasParent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::HideFromDocumentation() [member function]
+    cls.add_method('HideFromDocumentation', 
+                   'ns3::TypeId', 
+                   [])
+    ## type-id.h (module 'core'): bool ns3::TypeId::IsChildOf(ns3::TypeId other) const [member function]
+    cls.add_method('IsChildOf', 
+                   'bool', 
+                   [param('ns3::TypeId', 'other')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::LookupAttributeByName(std::string name, ns3::TypeId::AttributeInformation * info) const [member function]
+    cls.add_method('LookupAttributeByName', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::TypeId::AttributeInformation *', 'info', transfer_ownership=False)], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByHash(uint32_t hash) [member function]
+    cls.add_method('LookupByHash', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'hash')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static bool ns3::TypeId::LookupByHashFailSafe(uint32_t hash, ns3::TypeId * tid) [member function]
+    cls.add_method('LookupByHashFailSafe', 
+                   'bool', 
+                   [param('uint32_t', 'hash'), param('ns3::TypeId *', 'tid')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByName(std::string name) [member function]
+    cls.add_method('LookupByName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::TraceSourceAccessor const> ns3::TypeId::LookupTraceSourceByName(std::string name) const [member function]
+    cls.add_method('LookupTraceSourceByName', 
+                   'ns3::Ptr< ns3::TraceSourceAccessor const >', 
+                   [param('std::string', 'name')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::MustHideFromDocumentation() const [member function]
+    cls.add_method('MustHideFromDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::SetAttributeInitialValue(uint32_t i, ns3::Ptr<ns3::AttributeValue const> initialValue) [member function]
+    cls.add_method('SetAttributeInitialValue', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ptr< ns3::AttributeValue const >', 'initialValue')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetGroupName(std::string groupName) [member function]
+    cls.add_method('SetGroupName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'groupName')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent(ns3::TypeId tid) [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): void ns3::TypeId::SetUid(uint16_t tid) [member function]
+    cls.add_method('SetUid', 
+                   'void', 
+                   [param('uint16_t', 'tid')])
+    return
+
+def register_Ns3TypeIdAttributeInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation(ns3::TypeId::AttributeInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::AttributeInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::AttributeAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::flags [variable]
+    cls.add_instance_attribute('flags', 'uint32_t', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::initialValue [variable]
+    cls.add_instance_attribute('initialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::originalInitialValue [variable]
+    cls.add_instance_attribute('originalInitialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    return
+
+def register_Ns3TypeIdTraceSourceInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation(ns3::TypeId::TraceSourceInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::TraceSourceInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::TraceSourceAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    return
+
+def register_Ns3Empty_methods(root_module, cls):
+    ## empty.h (module 'core'): ns3::empty::empty() [constructor]
+    cls.add_constructor([])
+    ## empty.h (module 'core'): ns3::empty::empty(ns3::empty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::empty const &', 'arg0')])
+    return
+
+def register_Ns3Int64x64_t_methods(root_module, cls):
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_unary_numeric_operator('-')
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
+    cls.add_constructor([])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t hi, uint64_t lo) [constructor]
+    cls.add_constructor([param('int64_t', 'hi'), param('uint64_t', 'lo')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [copy constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): double ns3::int64x64_t::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): int64_t ns3::int64x64_t::GetHigh() const [member function]
+    cls.add_method('GetHigh', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): uint64_t ns3::int64x64_t::GetLow() const [member function]
+    cls.add_method('GetLow', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): static ns3::int64x64_t ns3::int64x64_t::Invert(uint64_t v) [member function]
+    cls.add_method('Invert', 
+                   'ns3::int64x64_t', 
+                   [param('uint64_t', 'v')], 
+                   is_static=True)
+    ## int64x64-double.h (module 'core'): void ns3::int64x64_t::MulByInvert(ns3::int64x64_t const & o) [member function]
+    cls.add_method('MulByInvert', 
+                   'void', 
+                   [param('ns3::int64x64_t const &', 'o')])
+    return
+
+def register_Ns3Chunk_methods(root_module, cls):
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
+    cls.add_constructor([])
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk(ns3::Chunk const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Chunk const &', 'arg0')])
+    ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## chunk.h (module 'network'): static ns3::TypeId ns3::Chunk::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## chunk.h (module 'network'): void ns3::Chunk::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Header_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## header.h (module 'network'): ns3::Header::Header() [constructor]
+    cls.add_constructor([])
+    ## header.h (module 'network'): ns3::Header::Header(ns3::Header const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Header const &', 'arg0')])
+    ## header.h (module 'network'): uint32_t ns3::Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## header.h (module 'network'): void ns3::Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Ipv6Header_methods(root_module, cls):
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::Ipv6Header(ns3::Ipv6Header const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Header const &', 'arg0')])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::Ipv6Header() [constructor]
+    cls.add_constructor([])
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestinationAddress() const [member function]
+    cls.add_method('GetDestinationAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::GetFlowLabel() const [member function]
+    cls.add_method('GetFlowLabel', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetHopLimit() const [member function]
+    cls.add_method('GetHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::TypeId ns3::Ipv6Header::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint16_t ns3::Ipv6Header::GetPayloadLength() const [member function]
+    cls.add_method('GetPayloadLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
+    cls.add_method('GetSourceAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
+    cls.add_method('GetTrafficClass', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): static ns3::TypeId ns3::Ipv6Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestinationAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetFlowLabel(uint32_t flow) [member function]
+    cls.add_method('SetFlowLabel', 
+                   'void', 
+                   [param('uint32_t', 'flow')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetHopLimit(uint8_t limit) [member function]
+    cls.add_method('SetHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'limit')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetNextHeader(uint8_t next) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'next')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetPayloadLength(uint16_t len) [member function]
+    cls.add_method('SetPayloadLength', 
+                   'void', 
+                   [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSourceAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
+    cls.add_method('SetTrafficClass', 
+                   'void', 
+                   [param('uint8_t', 'traffic')])
+    return
+
+def register_Ns3Object_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::Object() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): void ns3::Object::AggregateObject(ns3::Ptr<ns3::Object> other) [member function]
+    cls.add_method('AggregateObject', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'other')])
+    ## object.h (module 'core'): void ns3::Object::Dispose() [member function]
+    cls.add_method('Dispose', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator ns3::Object::GetAggregateIterator() const [member function]
+    cls.add_method('GetAggregateIterator', 
+                   'ns3::Object::AggregateIterator', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::TypeId ns3::Object::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object.h (module 'core'): static ns3::TypeId ns3::Object::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object.h (module 'core'): void ns3::Object::Initialize() [member function]
+    cls.add_method('Initialize', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::Object(ns3::Object const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Object const &', 'o')], 
+                        visibility='protected')
+    ## object.h (module 'core'): void ns3::Object::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectAggregateIterator_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator(ns3::Object::AggregateIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Object::AggregateIterator const &', 'arg0')])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): bool ns3::Object::AggregateIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::Ptr<ns3::Object const> ns3::Object::AggregateIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::Object const >', 
+                   [])
+    return
+
+def register_Ns3RandomVariableStream_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::RandomVariableStream::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream::RandomVariableStream() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::RandomVariableStream::SetStream(int64_t stream) [member function]
+    cls.add_method('SetStream', 
+                   'void', 
+                   [param('int64_t', 'stream')])
+    ## random-variable-stream.h (module 'core'): int64_t ns3::RandomVariableStream::GetStream() const [member function]
+    cls.add_method('GetStream', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): void ns3::RandomVariableStream::SetAntithetic(bool isAntithetic) [member function]
+    cls.add_method('SetAntithetic', 
+                   'void', 
+                   [param('bool', 'isAntithetic')])
+    ## random-variable-stream.h (module 'core'): bool ns3::RandomVariableStream::IsAntithetic() const [member function]
+    cls.add_method('IsAntithetic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::RandomVariableStream::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::RandomVariableStream::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## random-variable-stream.h (module 'core'): ns3::RngStream * ns3::RandomVariableStream::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::RngStream *', 
+                   [], 
+                   is_const=True, visibility='protected')
+    return
+
+def register_Ns3SequentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::SequentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable::SequentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): ns3::Ptr<ns3::RandomVariableStream> ns3::SequentialRandomVariable::GetIncrement() const [member function]
+    cls.add_method('GetIncrement', 
+                   'ns3::Ptr< ns3::RandomVariableStream >', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::SequentialRandomVariable::GetConsecutive() const [member function]
+    cls.add_method('GetConsecutive', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::SequentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SixLowPanFrag1_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFrag1::SixLowPanFrag1(ns3::SixLowPanFrag1 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanFrag1 const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFrag1::SixLowPanFrag1() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanFrag1::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanFrag1::GetDatagramSize() const [member function]
+    cls.add_method('GetDatagramSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanFrag1::GetDatagramTag() const [member function]
+    cls.add_method('GetDatagramTag', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanFrag1::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanFrag1::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanFrag1::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFrag1::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFrag1::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFrag1::SetDatagramSize(uint16_t datagramSize) [member function]
+    cls.add_method('SetDatagramSize', 
+                   'void', 
+                   [param('uint16_t', 'datagramSize')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFrag1::SetDatagramTag(uint16_t datagramTag) [member function]
+    cls.add_method('SetDatagramTag', 
+                   'void', 
+                   [param('uint16_t', 'datagramTag')])
+    return
+
+def register_Ns3SixLowPanFragN_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFragN::SixLowPanFragN(ns3::SixLowPanFragN const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanFragN const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFragN::SixLowPanFragN() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanFragN::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanFragN::GetDatagramOffset() const [member function]
+    cls.add_method('GetDatagramOffset', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanFragN::GetDatagramSize() const [member function]
+    cls.add_method('GetDatagramSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanFragN::GetDatagramTag() const [member function]
+    cls.add_method('GetDatagramTag', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanFragN::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanFragN::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanFragN::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::SetDatagramOffset(uint8_t datagramOffset) [member function]
+    cls.add_method('SetDatagramOffset', 
+                   'void', 
+                   [param('uint8_t', 'datagramOffset')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::SetDatagramSize(uint16_t datagramSize) [member function]
+    cls.add_method('SetDatagramSize', 
+                   'void', 
+                   [param('uint16_t', 'datagramSize')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::SetDatagramTag(uint16_t datagramTag) [member function]
+    cls.add_method('SetDatagramTag', 
+                   'void', 
+                   [param('uint16_t', 'datagramTag')])
+    return
+
+def register_Ns3SixLowPanHc1_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::SixLowPanHc1(ns3::SixLowPanHc1 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanHc1 const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::SixLowPanHc1() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanHc1::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::LowPanHc1Addr_e ns3::SixLowPanHc1::GetDstCompression() const [member function]
+    cls.add_method('GetDstCompression', 
+                   'ns3::SixLowPanHc1::LowPanHc1Addr_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanHc1::GetDstInterface() const [member function]
+    cls.add_method('GetDstInterface', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanHc1::GetDstPrefix() const [member function]
+    cls.add_method('GetDstPrefix', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanHc1::GetFlowLabel() const [member function]
+    cls.add_method('GetFlowLabel', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanHc1::GetHopLimit() const [member function]
+    cls.add_method('GetHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanHc1::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanHc1::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanHc1::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::LowPanHc1Addr_e ns3::SixLowPanHc1::GetSrcCompression() const [member function]
+    cls.add_method('GetSrcCompression', 
+                   'ns3::SixLowPanHc1::LowPanHc1Addr_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanHc1::GetSrcInterface() const [member function]
+    cls.add_method('GetSrcInterface', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanHc1::GetSrcPrefix() const [member function]
+    cls.add_method('GetSrcPrefix', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanHc1::GetTrafficClass() const [member function]
+    cls.add_method('GetTrafficClass', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanHc1::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanHc1::IsHc2HeaderPresent() const [member function]
+    cls.add_method('IsHc2HeaderPresent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanHc1::IsTcflCompression() const [member function]
+    cls.add_method('IsTcflCompression', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetDstCompression(ns3::SixLowPanHc1::LowPanHc1Addr_e dstCompression) [member function]
+    cls.add_method('SetDstCompression', 
+                   'void', 
+                   [param('ns3::SixLowPanHc1::LowPanHc1Addr_e', 'dstCompression')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetDstInterface(uint8_t const * dstInterface) [member function]
+    cls.add_method('SetDstInterface', 
+                   'void', 
+                   [param('uint8_t const *', 'dstInterface')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetDstPrefix(uint8_t const * dstPrefix) [member function]
+    cls.add_method('SetDstPrefix', 
+                   'void', 
+                   [param('uint8_t const *', 'dstPrefix')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetFlowLabel(uint32_t flowLabel) [member function]
+    cls.add_method('SetFlowLabel', 
+                   'void', 
+                   [param('uint32_t', 'flowLabel')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetHc2HeaderPresent(bool hc2HeaderPresent) [member function]
+    cls.add_method('SetHc2HeaderPresent', 
+                   'void', 
+                   [param('bool', 'hc2HeaderPresent')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetHopLimit(uint8_t limit) [member function]
+    cls.add_method('SetHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'limit')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetNextHeader(uint8_t nextHeader) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'nextHeader')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetSrcCompression(ns3::SixLowPanHc1::LowPanHc1Addr_e srcCompression) [member function]
+    cls.add_method('SetSrcCompression', 
+                   'void', 
+                   [param('ns3::SixLowPanHc1::LowPanHc1Addr_e', 'srcCompression')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetSrcInterface(uint8_t const * srcInterface) [member function]
+    cls.add_method('SetSrcInterface', 
+                   'void', 
+                   [param('uint8_t const *', 'srcInterface')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetSrcPrefix(uint8_t const * srcPrefix) [member function]
+    cls.add_method('SetSrcPrefix', 
+                   'void', 
+                   [param('uint8_t const *', 'srcPrefix')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetTcflCompression(bool tcflCompression) [member function]
+    cls.add_method('SetTcflCompression', 
+                   'void', 
+                   [param('bool', 'tcflCompression')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetTrafficClass(uint8_t trafficClass) [member function]
+    cls.add_method('SetTrafficClass', 
+                   'void', 
+                   [param('uint8_t', 'trafficClass')])
+    return
+
+def register_Ns3SixLowPanIphc_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::SixLowPanIphc(ns3::SixLowPanIphc const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanIphc const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::SixLowPanIphc() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::SixLowPanIphc(uint8_t dispatch) [constructor]
+    cls.add_constructor([param('uint8_t', 'dispatch')])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanIphc::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetCid() const [member function]
+    cls.add_method('GetCid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetDac() const [member function]
+    cls.add_method('GetDac', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::HeaderCompression_e ns3::SixLowPanIphc::GetDam() const [member function]
+    cls.add_method('GetDam', 
+                   'ns3::SixLowPanIphc::HeaderCompression_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetDscp() const [member function]
+    cls.add_method('GetDscp', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::Ipv6Address ns3::SixLowPanIphc::GetDstAddress() const [member function]
+    cls.add_method('GetDstAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetDstContextId() const [member function]
+    cls.add_method('GetDstContextId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetEcn() const [member function]
+    cls.add_method('GetEcn', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanIphc::GetFlowLabel() const [member function]
+    cls.add_method('GetFlowLabel', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::Hlim_e ns3::SixLowPanIphc::GetHlim() const [member function]
+    cls.add_method('GetHlim', 
+                   'ns3::SixLowPanIphc::Hlim_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetHopLimit() const [member function]
+    cls.add_method('GetHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanIphc::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetM() const [member function]
+    cls.add_method('GetM', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetNh() const [member function]
+    cls.add_method('GetNh', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetSac() const [member function]
+    cls.add_method('GetSac', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::HeaderCompression_e ns3::SixLowPanIphc::GetSam() const [member function]
+    cls.add_method('GetSam', 
+                   'ns3::SixLowPanIphc::HeaderCompression_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanIphc::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::Ipv6Address ns3::SixLowPanIphc::GetSrcAddress() const [member function]
+    cls.add_method('GetSrcAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetSrcContextId() const [member function]
+    cls.add_method('GetSrcContextId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::TrafficClassFlowLabel_e ns3::SixLowPanIphc::GetTf() const [member function]
+    cls.add_method('GetTf', 
+                   'ns3::SixLowPanIphc::TrafficClassFlowLabel_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanIphc::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetCid(bool cidField) [member function]
+    cls.add_method('SetCid', 
+                   'void', 
+                   [param('bool', 'cidField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDac(bool dacField) [member function]
+    cls.add_method('SetDac', 
+                   'void', 
+                   [param('bool', 'dacField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDam(ns3::SixLowPanIphc::HeaderCompression_e damField) [member function]
+    cls.add_method('SetDam', 
+                   'void', 
+                   [param('ns3::SixLowPanIphc::HeaderCompression_e', 'damField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDscp(uint8_t dscp) [member function]
+    cls.add_method('SetDscp', 
+                   'void', 
+                   [param('uint8_t', 'dscp')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstAddress(ns3::Ipv6Address dstAddress) [member function]
+    cls.add_method('SetDstAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dstAddress')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstContextId(uint8_t dstContextId) [member function]
+    cls.add_method('SetDstContextId', 
+                   'void', 
+                   [param('uint8_t', 'dstContextId')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetEcn(uint8_t ecn) [member function]
+    cls.add_method('SetEcn', 
+                   'void', 
+                   [param('uint8_t', 'ecn')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetFlowLabel(uint32_t flowLabel) [member function]
+    cls.add_method('SetFlowLabel', 
+                   'void', 
+                   [param('uint32_t', 'flowLabel')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetHlim(ns3::SixLowPanIphc::Hlim_e hlimField) [member function]
+    cls.add_method('SetHlim', 
+                   'void', 
+                   [param('ns3::SixLowPanIphc::Hlim_e', 'hlimField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetHopLimit(uint8_t hopLimit) [member function]
+    cls.add_method('SetHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'hopLimit')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetM(bool mField) [member function]
+    cls.add_method('SetM', 
+                   'void', 
+                   [param('bool', 'mField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetNextHeader(uint8_t nextHeader) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'nextHeader')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetNh(bool nhField) [member function]
+    cls.add_method('SetNh', 
+                   'void', 
+                   [param('bool', 'nhField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSac(bool sacField) [member function]
+    cls.add_method('SetSac', 
+                   'void', 
+                   [param('bool', 'sacField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSam(ns3::SixLowPanIphc::HeaderCompression_e samField) [member function]
+    cls.add_method('SetSam', 
+                   'void', 
+                   [param('ns3::SixLowPanIphc::HeaderCompression_e', 'samField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcAddress(ns3::Ipv6Address srcAddress) [member function]
+    cls.add_method('SetSrcAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'srcAddress')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcContextId(uint8_t srcContextId) [member function]
+    cls.add_method('SetSrcContextId', 
+                   'void', 
+                   [param('uint8_t', 'srcContextId')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetTf(ns3::SixLowPanIphc::TrafficClassFlowLabel_e tfField) [member function]
+    cls.add_method('SetTf', 
+                   'void', 
+                   [param('ns3::SixLowPanIphc::TrafficClassFlowLabel_e', 'tfField')])
+    return
+
+def register_Ns3SixLowPanNhcExtension_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension::SixLowPanNhcExtension(ns3::SixLowPanNhcExtension const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanNhcExtension const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension::SixLowPanNhcExtension() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNhcExtension::CopyBlob(uint8_t * blob, uint32_t size) const [member function]
+    cls.add_method('CopyBlob', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'blob'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNhcExtension::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension::Eid_e ns3::SixLowPanNhcExtension::GetEid() const [member function]
+    cls.add_method('GetEid', 
+                   'ns3::SixLowPanNhcExtension::Eid_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanNhcExtension::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanNhcExtension::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanNhcExtension::GetNh() const [member function]
+    cls.add_method('GetNh', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::NhcDispatch_e ns3::SixLowPanNhcExtension::GetNhcDispatchType() const [member function]
+    cls.add_method('GetNhcDispatchType', 
+                   'ns3::SixLowPanDispatch::NhcDispatch_e', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNhcExtension::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanNhcExtension::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::SetBlob(uint8_t const * blob, uint32_t size) [member function]
+    cls.add_method('SetBlob', 
+                   'void', 
+                   [param('uint8_t const *', 'blob'), param('uint32_t', 'size')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::SetEid(ns3::SixLowPanNhcExtension::Eid_e extensionHeaderType) [member function]
+    cls.add_method('SetEid', 
+                   'void', 
+                   [param('ns3::SixLowPanNhcExtension::Eid_e', 'extensionHeaderType')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::SetNextHeader(uint8_t nextHeader) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'nextHeader')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::SetNh(bool nhField) [member function]
+    cls.add_method('SetNh', 
+                   'void', 
+                   [param('bool', 'nhField')])
+    return
+
+def register_Ns3SixLowPanUdpNhcExtension_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension::SixLowPanUdpNhcExtension(ns3::SixLowPanUdpNhcExtension const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanUdpNhcExtension const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension::SixLowPanUdpNhcExtension() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanUdpNhcExtension::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanUdpNhcExtension::GetC() const [member function]
+    cls.add_method('GetC', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanUdpNhcExtension::GetChecksum() const [member function]
+    cls.add_method('GetChecksum', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanUdpNhcExtension::GetDstPort() const [member function]
+    cls.add_method('GetDstPort', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanUdpNhcExtension::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::NhcDispatch_e ns3::SixLowPanUdpNhcExtension::GetNhcDispatchType() const [member function]
+    cls.add_method('GetNhcDispatchType', 
+                   'ns3::SixLowPanDispatch::NhcDispatch_e', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension::Ports_e ns3::SixLowPanUdpNhcExtension::GetPorts() const [member function]
+    cls.add_method('GetPorts', 
+                   'ns3::SixLowPanUdpNhcExtension::Ports_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanUdpNhcExtension::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanUdpNhcExtension::GetSrcPort() const [member function]
+    cls.add_method('GetSrcPort', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanUdpNhcExtension::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetC(bool cField) [member function]
+    cls.add_method('SetC', 
+                   'void', 
+                   [param('bool', 'cField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetChecksum(uint16_t checksum) [member function]
+    cls.add_method('SetChecksum', 
+                   'void', 
+                   [param('uint16_t', 'checksum')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetDstPort(uint16_t port) [member function]
+    cls.add_method('SetDstPort', 
+                   'void', 
+                   [param('uint16_t', 'port')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetPorts(ns3::SixLowPanUdpNhcExtension::Ports_e port) [member function]
+    cls.add_method('SetPorts', 
+                   'void', 
+                   [param('ns3::SixLowPanUdpNhcExtension::Ports_e', 'port')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetSrcPort(uint16_t port) [member function]
+    cls.add_method('SetSrcPort', 
+                   'void', 
+                   [param('uint16_t', 'port')])
+    return
+
+def register_Ns3Time_methods(root_module, cls):
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Time const &', 'o')])
+    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
+    cls.add_constructor([param('std::string const &', 's')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & value) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'value')])
+    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
+    cls.add_method('Compare', 
+                   'int', 
+                   [param('ns3::Time const &', 'o')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & from, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'from'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromDouble', 
+                   'ns3::Time', 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromInteger', 
+                   'ns3::Time', 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
+    cls.add_method('GetFemtoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
+    cls.add_method('GetMicroSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
+    cls.add_method('GetMilliSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
+    cls.add_method('GetNanoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
+    cls.add_method('GetPicoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
+    cls.add_method('GetResolution', 
+                   'ns3::Time::Unit', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
+    cls.add_method('GetSeconds', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
+    cls.add_method('GetTimeStep', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
+    cls.add_method('IsNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
+    cls.add_method('IsPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
+    cls.add_method('IsStrictlyNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
+    cls.add_method('IsStrictlyPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
+    cls.add_method('IsZero', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
+    cls.add_method('Max', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
+    cls.add_method('Min', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
+    cls.add_method('SetResolution', 
+                   'void', 
+                   [param('ns3::Time::Unit', 'resolution')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
+    cls.add_method('StaticInit', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('To', 
+                   'ns3::int64x64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToDouble', 
+                   'double', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToInteger', 
+                   'int64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    return
+
+def register_Ns3TraceSourceAccessor_methods(root_module, cls):
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor() [constructor]
+    cls.add_constructor([])
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Connect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Connect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('ConnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Disconnect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Disconnect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::DisconnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Trailer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer() [constructor]
+    cls.add_constructor([])
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer(ns3::Trailer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Trailer const &', 'arg0')])
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'end')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3TriangularRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::TriangularRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::TriangularRandomVariable::TriangularRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetValue(double mean, double min, double max) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'min'), param('double', 'max')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::TriangularRandomVariable::GetInteger(uint32_t mean, uint32_t min, uint32_t max) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'min'), param('uint32_t', 'max')])
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::TriangularRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3UniformRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::UniformRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable::UniformRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetValue(double min, double max) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'min'), param('double', 'max')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger(uint32_t min, uint32_t max) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'min'), param('uint32_t', 'max')])
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3WeibullRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::WeibullRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable::WeibullRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ZetaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZetaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable::ZetaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue(double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger(uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ZipfRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZipfRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable::ZipfRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue(uint32_t n, double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'n'), param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger(uint32_t n, uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3AttributeAccessor_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('CreateValidValue', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::CallbackBase', 'base')])
+    return
+
+def register_Ns3ConstantRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
+    cls.add_method('GetConstant', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'constant')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'constant')])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3DeterministicRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::DeterministicRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable::DeterministicRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::DeterministicRandomVariable::SetValueArray(double * values, uint64_t length) [member function]
+    cls.add_method('SetValueArray', 
+                   'void', 
+                   [param('double *', 'values'), param('uint64_t', 'length')])
+    ## random-variable-stream.h (module 'core'): double ns3::DeterministicRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::DeterministicRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::CDF(double v, double c) [member function]
+    cls.add_method('CDF', 
+                   'void', 
+                   [param('double', 'v'), param('double', 'c')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::EmpiricalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::EmpiricalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    cls.add_method('Interpolate', 
+                   'double', 
+                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   visibility='private', is_virtual=True)
+    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
+    cls.add_method('Validate', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EmptyAttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3ErlangRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ErlangRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable::ErlangRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetK() const [member function]
+    cls.add_method('GetK', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetLambda() const [member function]
+    cls.add_method('GetLambda', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue(uint32_t k, double lambda) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'k'), param('double', 'lambda')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger(uint32_t k, uint32_t lambda) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'k'), param('uint32_t', 'lambda')])
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3EventImpl_methods(root_module, cls):
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
+    cls.add_constructor([])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3GammaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable::GammaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetBeta() const [member function]
+    cls.add_method('GetBeta', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
+    return
+
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3LogNormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::LogNormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable::LogNormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetMu() const [member function]
+    cls.add_method('GetMu', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetSigma() const [member function]
+    cls.add_method('GetSigma', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue(double mu, double sigma) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mu'), param('double', 'sigma')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger(uint32_t mu, uint32_t sigma) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mu'), param('uint32_t', 'sigma')])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3NetDevice_methods(root_module, cls):
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
+    cls.add_constructor([])
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NixVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+    cls.add_constructor([])
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [copy constructor]
+    cls.add_constructor([param('ns3::NixVector const &', 'o')])
+    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
+    cls.add_method('AddNeighborIndex', 
+                   'void', 
+                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
+    cls.add_method('BitCount', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfNeighbors')], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
+    cls.add_method('ExtractNeighborIndex', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    cls.add_method('GetRemainingBits', 
+                   'uint32_t', 
+                   [])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3NormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::INFINITE_VALUE [variable]
+    cls.add_static_attribute('INFINITE_VALUE', 'double const', is_const=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::NormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::NormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetVariance() const [member function]
+    cls.add_method('GetVariance', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue(double mean, double variance, double bound=ns3::NormalRandomVariable::INFINITE_VALUE) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'variance'), param('double', 'bound', default_value='ns3::NormalRandomVariable::INFINITE_VALUE')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger(uint32_t mean, uint32_t variance, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'variance'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    return
+
+def register_Ns3ObjectFactoryValue_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ObjectFactory', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ObjectFactory const &', 'value')])
+    return
+
+def register_Ns3Packet_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    cls.add_constructor([])
+    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Packet const &', 'o')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
+    cls.add_constructor([param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header')])
+    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddPacketTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer')])
+    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
+    cls.add_method('EnablePrinting', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
+    cls.add_method('FindFirstMatchingByteTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
+    cls.add_method('GetByteTagIterator', 
+                   'ns3::ByteTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
+    cls.add_method('GetNixVector', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
+    cls.add_method('GetPacketTagIterator', 
+                   'ns3::PacketTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint8_t const * ns3::Packet::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   deprecated=True, is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')], 
+                   is_const=True)
+    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
+    cls.add_method('PeekPacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('PeekTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
+    cls.add_method('PrintByteTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
+    cls.add_method('PrintPacketTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
+    cls.add_method('RemoveAllByteTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
+    cls.add_method('RemoveAllPacketTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')])
+    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('RemovePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> arg0) [member function]
+    cls.add_method('SetNixVector', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NixVector >', 'arg0')])
+    return
+
+def register_Ns3ParetoRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double mean, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t mean, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3SixLowPanNetDevice_methods(root_module, cls):
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice::SixLowPanNetDevice() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::AddLinkChangeCallback(ns3::Callback<void,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): int64_t ns3::SixLowPanNetDevice::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Address ns3::SixLowPanNetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Address ns3::SixLowPanNetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Ptr<ns3::Channel> ns3::SixLowPanNetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): uint16_t ns3::SixLowPanNetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Address ns3::SixLowPanNetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Address ns3::SixLowPanNetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Ptr<ns3::NetDevice> ns3::SixLowPanNetDevice::GetNetDevice() const [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Ptr<ns3::Node> ns3::SixLowPanNetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanNetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Address', 'address')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetNetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('SetNetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetPromiscReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3TimeValue_methods(root_module, cls):
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'value')])
+    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Time const &', 'value')])
+    return
+
+def register_Ns3TypeIdChecker_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    return
+
+def register_Ns3TypeIdValue_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'value')])
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::TypeId const &', 'value')])
+    return
+
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
+def register_Ns3HashImplementation_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation() [constructor]
+    cls.add_constructor([])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Implementation::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Implementation::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Implementation::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3HashFunctionFnv1a_methods(root_module, cls):
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a(ns3::Hash::Function::Fnv1a const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Fnv1a const &', 'arg0')])
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a() [constructor]
+    cls.add_constructor([])
+    ## hash-fnv.h (module 'core'): uint32_t ns3::Hash::Function::Fnv1a::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): uint64_t ns3::Hash::Function::Fnv1a::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): void ns3::Hash::Function::Fnv1a::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash32_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Function::Hash32 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash32 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Hash32Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash32Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash32::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash32::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash64_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Function::Hash64 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash64 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Hash64Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash64Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash64::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Function::Hash64::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash64::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionMurmur3_methods(root_module, cls):
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3(ns3::Hash::Function::Murmur3 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Murmur3 const &', 'arg0')])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3() [constructor]
+    cls.add_constructor([])
+    ## hash-murmur3.h (module 'core'): uint32_t ns3::Hash::Function::Murmur3::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): uint64_t ns3::Hash::Function::Murmur3::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): void ns3::Hash::Function::Murmur3::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_functions(root_module):
+    module = root_module
+    register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
+    register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    return
+
+def register_functions_ns3_FatalImpl(module, root_module):
+    return
+
+def register_functions_ns3_Hash(module, root_module):
+    register_functions_ns3_Hash_Function(module.get_submodule('Function'), root_module)
+    return
+
+def register_functions_ns3_Hash_Function(module, root_module):
+    return
+
+def main():
+    out = FileCodeSink(sys.stdout)
+    root_module = module_init()
+    register_types(root_module)
+    register_methods(root_module)
+    register_functions(root_module)
+    root_module.generate(out)
+
+if __name__ == '__main__':
+    main()
+
diff -Naur ns-3.18.1/src/sixlowpan/bindings/modulegen__gcc_LP64.py ns-3.19/src/sixlowpan/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/sixlowpan/bindings/modulegen__gcc_LP64.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,5163 @@
+from pybindgen import Module, FileCodeSink, param, retval, cppclass, typehandlers
+
+
+import pybindgen.settings
+import warnings
+
+class ErrorHandler(pybindgen.settings.ErrorHandler):
+    def handle_error(self, wrapper, exception, traceback_):
+        warnings.warn("exception %r in wrapper %s" % (exception, wrapper))
+        return True
+pybindgen.settings.error_handler = ErrorHandler()
+
+
+import sys
+
+def module_init():
+    root_module = Module('ns.sixlowpan', cpp_namespace='::ns3')
+    return root_module
+
+def register_types(module):
+    root_module = module.get_root()
+    
+    ## address.h (module 'network'): ns3::Address [class]
+    module.add_class('Address', import_from_module='ns.network')
+    ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
+    module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
+    module.add_class('AttributeConstructionList', import_from_module='ns.core')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
+    module.add_class('Item', import_from_module='ns.core', outer_class=root_module['ns3::AttributeConstructionList'])
+    ## buffer.h (module 'network'): ns3::Buffer [class]
+    module.add_class('Buffer', import_from_module='ns.network')
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::Buffer'])
+    ## packet.h (module 'network'): ns3::ByteTagIterator [class]
+    module.add_class('ByteTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagIterator'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList [class]
+    module.add_class('ByteTagList', import_from_module='ns.network')
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
+    ## callback.h (module 'core'): ns3::CallbackBase [class]
+    module.add_class('CallbackBase', import_from_module='ns.core')
+    ## event-id.h (module 'core'): ns3::EventId [class]
+    module.add_class('EventId', import_from_module='ns.core')
+    ## hash.h (module 'core'): ns3::Hasher [class]
+    module.add_class('Hasher', import_from_module='ns.core')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    module.add_class('Ipv4Address', import_from_module='ns.network')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
+    module.add_class('Ipv4Mask', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    module.add_class('Ipv6Address', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
+    module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
+    module.add_class('NetDeviceContainer', import_from_module='ns.network')
+    ## object-base.h (module 'core'): ns3::ObjectBase [class]
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
+    ## object.h (module 'core'): ns3::ObjectDeleter [struct]
+    module.add_class('ObjectDeleter', import_from_module='ns.core')
+    ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
+    module.add_class('ObjectFactory', import_from_module='ns.core')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
+    module.add_class('PacketMetadata', import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [enumeration]
+    module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item'], import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator [class]
+    module.add_class('ItemIterator', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet.h (module 'network'): ns3::PacketTagIterator [class]
+    module.add_class('PacketTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagIterator'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList [class]
+    module.add_class('PacketTagList', import_from_module='ns.network')
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
+    module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
+    module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch [class]
+    module.add_class('SixLowPanDispatch')
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::Dispatch_e [enumeration]
+    module.add_enum('Dispatch_e', ['LOWPAN_NALP', 'LOWPAN_NALP_N', 'LOWPAN_NOTCOMPRESSED', 'LOWPAN_HC1', 'LOWPAN_BC0', 'LOWPAN_IPHC', 'LOWPAN_IPHC_N', 'LOWPAN_MESH', 'LOWPAN_MESH_N', 'LOWPAN_FRAG1', 'LOWPAN_FRAG1_N', 'LOWPAN_FRAGN', 'LOWPAN_FRAGN_N', 'LOWPAN_UNSUPPORTED'], outer_class=root_module['ns3::SixLowPanDispatch'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::NhcDispatch_e [enumeration]
+    module.add_enum('NhcDispatch_e', ['LOWPAN_NHC', 'LOWPAN_NHC_N', 'LOWPAN_UDPNHC', 'LOWPAN_UDPNHC_N', 'LOWPAN_NHCUNSUPPORTED'], outer_class=root_module['ns3::SixLowPanDispatch'])
+    ## sixlowpan-helper.h (module 'sixlowpan'): ns3::SixLowPanHelper [class]
+    module.add_class('SixLowPanHelper')
+    ## tag.h (module 'network'): ns3::Tag [class]
+    module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
+    module.add_class('TagBuffer', import_from_module='ns.network')
+    ## type-id.h (module 'core'): ns3::TypeId [class]
+    module.add_class('TypeId', import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
+    module.add_enum('AttributeFlag', ['ATTR_GET', 'ATTR_SET', 'ATTR_CONSTRUCT', 'ATTR_SGC'], outer_class=root_module['ns3::TypeId'], import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation [struct]
+    module.add_class('AttributeInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
+    module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## empty.h (module 'core'): ns3::empty [class]
+    module.add_class('empty', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
+    module.add_class('int64x64_t', import_from_module='ns.core')
+    ## chunk.h (module 'network'): ns3::Chunk [class]
+    module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## header.h (module 'network'): ns3::Header [class]
+    module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header [class]
+    module.add_class('Ipv6Header', import_from_module='ns.internet', parent=root_module['ns3::Header'])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::NextHeader_e [enumeration]
+    module.add_enum('NextHeader_e', ['IPV6_EXT_HOP_BY_HOP', 'IPV6_IPV4', 'IPV6_TCP', 'IPV6_UDP', 'IPV6_IPV6', 'IPV6_EXT_ROUTING', 'IPV6_EXT_FRAGMENTATION', 'IPV6_EXT_CONFIDENTIALITY', 'IPV6_EXT_AUTHENTIFICATION', 'IPV6_ICMPV6', 'IPV6_EXT_END', 'IPV6_EXT_DESTINATION', 'IPV6_SCTP', 'IPV6_EXT_MOBILITY', 'IPV6_UDP_LITE'], outer_class=root_module['ns3::Ipv6Header'], import_from_module='ns.internet')
+    ## object.h (module 'core'): ns3::Object [class]
+    module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
+    module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream [class]
+    module.add_class('RandomVariableStream', import_from_module='ns.core', parent=root_module['ns3::Object'])
+    ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable [class]
+    module.add_class('SequentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFrag1 [class]
+    module.add_class('SixLowPanFrag1', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFragN [class]
+    module.add_class('SixLowPanFragN', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1 [class]
+    module.add_class('SixLowPanHc1', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::LowPanHc1Addr_e [enumeration]
+    module.add_enum('LowPanHc1Addr_e', ['HC1_PIII', 'HC1_PIIC', 'HC1_PCII', 'HC1_PCIC'], outer_class=root_module['ns3::SixLowPanHc1'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::LowPanHc1NextHeader_e [enumeration]
+    module.add_enum('LowPanHc1NextHeader_e', ['HC1_NC', 'HC1_UDP', 'HC1_ICMP', 'HC1_TCP'], outer_class=root_module['ns3::SixLowPanHc1'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc [class]
+    module.add_class('SixLowPanIphc', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::TrafficClassFlowLabel_e [enumeration]
+    module.add_enum('TrafficClassFlowLabel_e', ['TF_FULL', 'TF_DSCP_ELIDED', 'TF_FL_ELIDED', 'TF_ELIDED'], outer_class=root_module['ns3::SixLowPanIphc'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::Hlim_e [enumeration]
+    module.add_enum('Hlim_e', ['HLIM_INLINE', 'HLIM_COMPR_1', 'HLIM_COMPR_64', 'HLIM_COMPR_255'], outer_class=root_module['ns3::SixLowPanIphc'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::HeaderCompression_e [enumeration]
+    module.add_enum('HeaderCompression_e', ['HC_INLINE', 'HC_COMPR_64', 'HC_COMPR_16', 'HC_COMPR_0'], outer_class=root_module['ns3::SixLowPanIphc'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension [class]
+    module.add_class('SixLowPanNhcExtension', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension::Eid_e [enumeration]
+    module.add_enum('Eid_e', ['EID_HOPBYHOP_OPTIONS_H', 'EID_ROUTING_H', 'EID_FRAGMENTATION_H', 'EID_DESTINATION_OPTIONS_H', 'EID_MOBILITY_H', 'EID_IPv6_H'], outer_class=root_module['ns3::SixLowPanNhcExtension'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension [class]
+    module.add_class('SixLowPanUdpNhcExtension', parent=root_module['ns3::Header'])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension::Ports_e [enumeration]
+    module.add_enum('Ports_e', ['PORTS_INLINE', 'PORTS_ALL_SRC_LAST_DST', 'PORTS_LAST_SRC_ALL_DST', 'PORTS_LAST_SRC_LAST_DST'], outer_class=root_module['ns3::SixLowPanUdpNhcExtension'])
+    ## nstime.h (module 'core'): ns3::Time [class]
+    module.add_class('Time', import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time [class]
+    root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
+    module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    ## trailer.h (module 'network'): ns3::Trailer [class]
+    module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## random-variable-stream.h (module 'core'): ns3::TriangularRandomVariable [class]
+    module.add_class('TriangularRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable [class]
+    module.add_class('UniformRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable [class]
+    module.add_class('WeibullRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable [class]
+    module.add_class('ZetaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable [class]
+    module.add_class('ZipfRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
+    module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    ## attribute.h (module 'core'): ns3::AttributeChecker [class]
+    module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    ## attribute.h (module 'core'): ns3::AttributeValue [class]
+    module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    ## callback.h (module 'core'): ns3::CallbackChecker [class]
+    module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## callback.h (module 'core'): ns3::CallbackImplBase [class]
+    module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    ## callback.h (module 'core'): ns3::CallbackValue [class]
+    module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable [class]
+    module.add_class('ConstantRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable [class]
+    module.add_class('DeterministicRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable [class]
+    module.add_class('EmpiricalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
+    module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable [class]
+    module.add_class('ErlangRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## event-impl.h (module 'core'): ns3::EventImpl [class]
+    module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable [class]
+    module.add_class('ExponentialRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable [class]
+    module.add_class('GammaRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
+    module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
+    module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
+    module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
+    module.add_class('Ipv4MaskValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
+    module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
+    module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
+    module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
+    module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable [class]
+    module.add_class('LogNormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## net-device.h (module 'network'): ns3::NetDevice [class]
+    module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
+    module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
+    ## nix-vector.h (module 'network'): ns3::NixVector [class]
+    module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable [class]
+    module.add_class('NormalRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
+    module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
+    module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## packet.h (module 'network'): ns3::Packet [class]
+    module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable [class]
+    module.add_class('ParetoRandomVariable', import_from_module='ns.core', parent=root_module['ns3::RandomVariableStream'])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice [class]
+    module.add_class('SixLowPanNetDevice', parent=root_module['ns3::NetDevice'])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice::DropReason [enumeration]
+    module.add_enum('DropReason', ['DROP_FRAGMENT_TIMEOUT', 'DROP_FRAGMENT_BUFFER_FULL', 'DROP_UNKNOWN_EXTENSION'], outer_class=root_module['ns3::SixLowPanNetDevice'])
+    ## nstime.h (module 'core'): ns3::TimeValue [class]
+    module.add_class('TimeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
+    module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## type-id.h (module 'core'): ns3::TypeIdValue [class]
+    module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## address.h (module 'network'): ns3::AddressChecker [class]
+    module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## address.h (module 'network'): ns3::AddressValue [class]
+    module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    
+    ## Register a nested module for the namespace FatalImpl
+    
+    nested_module = module.add_cpp_namespace('FatalImpl')
+    register_types_ns3_FatalImpl(nested_module)
+    
+    
+    ## Register a nested module for the namespace Hash
+    
+    nested_module = module.add_cpp_namespace('Hash')
+    register_types_ns3_Hash(nested_module)
+    
+
+def register_types_ns3_FatalImpl(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_Hash(module):
+    root_module = module.get_root()
+    
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation [class]
+    module.add_class('Implementation', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash32Function_ptr')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash32Function_ptr*')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash32Function_ptr&')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash64Function_ptr')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash64Function_ptr*')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash64Function_ptr&')
+    
+    ## Register a nested module for the namespace Function
+    
+    nested_module = module.add_cpp_namespace('Function')
+    register_types_ns3_Hash_Function(nested_module)
+    
+
+def register_types_ns3_Hash_Function(module):
+    root_module = module.get_root()
+    
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a [class]
+    module.add_class('Fnv1a', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32 [class]
+    module.add_class('Hash32', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64 [class]
+    module.add_class('Hash64', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
+    module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+
+def register_methods(root_module):
+    register_Ns3Address_methods(root_module, root_module['ns3::Address'])
+    register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
+    register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
+    register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
+    register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
+    register_Ns3ByteTagIteratorItem_methods(root_module, root_module['ns3::ByteTagIterator::Item'])
+    register_Ns3ByteTagList_methods(root_module, root_module['ns3::ByteTagList'])
+    register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
+    register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
+    register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
+    register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
+    register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
+    register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
+    register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
+    register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
+    register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
+    register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
+    register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
+    register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
+    register_Ns3PacketTagIterator_methods(root_module, root_module['ns3::PacketTagIterator'])
+    register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
+    register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
+    register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    register_Ns3SixLowPanDispatch_methods(root_module, root_module['ns3::SixLowPanDispatch'])
+    register_Ns3SixLowPanHelper_methods(root_module, root_module['ns3::SixLowPanHelper'])
+    register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
+    register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
+    register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
+    register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
+    register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
+    register_Ns3Header_methods(root_module, root_module['ns3::Header'])
+    register_Ns3Ipv6Header_methods(root_module, root_module['ns3::Ipv6Header'])
+    register_Ns3Object_methods(root_module, root_module['ns3::Object'])
+    register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3RandomVariableStream_methods(root_module, root_module['ns3::RandomVariableStream'])
+    register_Ns3SequentialRandomVariable_methods(root_module, root_module['ns3::SequentialRandomVariable'])
+    register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    register_Ns3SixLowPanFrag1_methods(root_module, root_module['ns3::SixLowPanFrag1'])
+    register_Ns3SixLowPanFragN_methods(root_module, root_module['ns3::SixLowPanFragN'])
+    register_Ns3SixLowPanHc1_methods(root_module, root_module['ns3::SixLowPanHc1'])
+    register_Ns3SixLowPanIphc_methods(root_module, root_module['ns3::SixLowPanIphc'])
+    register_Ns3SixLowPanNhcExtension_methods(root_module, root_module['ns3::SixLowPanNhcExtension'])
+    register_Ns3SixLowPanUdpNhcExtension_methods(root_module, root_module['ns3::SixLowPanUdpNhcExtension'])
+    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
+    register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
+    register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
+    register_Ns3TriangularRandomVariable_methods(root_module, root_module['ns3::TriangularRandomVariable'])
+    register_Ns3UniformRandomVariable_methods(root_module, root_module['ns3::UniformRandomVariable'])
+    register_Ns3WeibullRandomVariable_methods(root_module, root_module['ns3::WeibullRandomVariable'])
+    register_Ns3ZetaRandomVariable_methods(root_module, root_module['ns3::ZetaRandomVariable'])
+    register_Ns3ZipfRandomVariable_methods(root_module, root_module['ns3::ZipfRandomVariable'])
+    register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
+    register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
+    register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
+    register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
+    register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
+    register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
+    register_Ns3ConstantRandomVariable_methods(root_module, root_module['ns3::ConstantRandomVariable'])
+    register_Ns3DeterministicRandomVariable_methods(root_module, root_module['ns3::DeterministicRandomVariable'])
+    register_Ns3EmpiricalRandomVariable_methods(root_module, root_module['ns3::EmpiricalRandomVariable'])
+    register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3ErlangRandomVariable_methods(root_module, root_module['ns3::ErlangRandomVariable'])
+    register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3ExponentialRandomVariable_methods(root_module, root_module['ns3::ExponentialRandomVariable'])
+    register_Ns3GammaRandomVariable_methods(root_module, root_module['ns3::GammaRandomVariable'])
+    register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
+    register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
+    register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
+    register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
+    register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
+    register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
+    register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
+    register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3LogNormalRandomVariable_methods(root_module, root_module['ns3::LogNormalRandomVariable'])
+    register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
+    register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
+    register_Ns3NormalRandomVariable_methods(root_module, root_module['ns3::NormalRandomVariable'])
+    register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
+    register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
+    register_Ns3ParetoRandomVariable_methods(root_module, root_module['ns3::ParetoRandomVariable'])
+    register_Ns3SixLowPanNetDevice_methods(root_module, root_module['ns3::SixLowPanNetDevice'])
+    register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
+    register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
+    register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
+    register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
+    register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
+    register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
+    register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
+    register_Ns3HashFunctionHash64_methods(root_module, root_module['ns3::Hash::Function::Hash64'])
+    register_Ns3HashFunctionMurmur3_methods(root_module, root_module['ns3::Hash::Function::Murmur3'])
+    return
+
+def register_Ns3Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## address.h (module 'network'): ns3::Address::Address() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::Address::Address(uint8_t type, uint8_t const * buffer, uint8_t len) [constructor]
+    cls.add_constructor([param('uint8_t', 'type'), param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): ns3::Address::Address(ns3::Address const & address) [copy constructor]
+    cls.add_constructor([param('ns3::Address const &', 'address')])
+    ## address.h (module 'network'): bool ns3::Address::CheckCompatible(uint8_t type, uint8_t len) const [member function]
+    cls.add_method('CheckCompatible', 
+                   'bool', 
+                   [param('uint8_t', 'type'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyAllFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllTo(uint8_t * buffer, uint8_t len) const [member function]
+    cls.add_method('CopyAllTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## address.h (module 'network'): void ns3::Address::Deserialize(ns3::TagBuffer buffer) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')])
+    ## address.h (module 'network'): uint8_t ns3::Address::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsInvalid() const [member function]
+    cls.add_method('IsInvalid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsMatchingType(uint8_t type) const [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('uint8_t', 'type')], 
+                   is_const=True)
+    ## address.h (module 'network'): static uint8_t ns3::Address::Register() [member function]
+    cls.add_method('Register', 
+                   'uint8_t', 
+                   [], 
+                   is_static=True)
+    ## address.h (module 'network'): void ns3::Address::Serialize(ns3::TagBuffer buffer) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')], 
+                   is_const=True)
+    return
+
+def register_Ns3AttributeConstructionList_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList(ns3::AttributeConstructionList const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): void ns3::AttributeConstructionList::Add(std::string name, ns3::Ptr<ns3::AttributeChecker const> checker, ns3::Ptr<ns3::AttributeValue> value) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker'), param('ns3::Ptr< ns3::AttributeValue >', 'value')])
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::End() const [member function]
+    cls.add_method('End', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeConstructionList::Find(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True)
+    return
+
+def register_Ns3AttributeConstructionListItem_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item(ns3::AttributeConstructionList::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList::Item const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::value [variable]
+    cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
+    return
+
+def register_Ns3Buffer_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize, bool initialize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    cls.add_method('AddAtEnd', 
+                   'bool', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    cls.add_method('AddAtStart', 
+                   'bool', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Buffer', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
+    cls.add_method('CreateFullCopy', 
+                   'ns3::Buffer', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
+    cls.add_method('GetCurrentEndOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
+    cls.add_method('GetCurrentStartOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint8_t const * ns3::Buffer::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3BufferIterator_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator(ns3::Buffer::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer::Iterator const &', 'arg0')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size, uint32_t initialChecksum) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size'), param('uint32_t', 'initialChecksum')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetDistanceFrom(ns3::Buffer::Iterator const & o) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator const &', 'o')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsEnd() const [member function]
+    cls.add_method('IsEnd', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsStart() const [member function]
+    cls.add_method('IsStart', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next(uint32_t delta) [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev(uint32_t delta) [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
+    cls.add_method('ReadLsbtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadLsbtohU32() [member function]
+    cls.add_method('ReadLsbtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadLsbtohU64() [member function]
+    cls.add_method('ReadLsbtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadNtohU16() [member function]
+    cls.add_method('ReadNtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadNtohU32() [member function]
+    cls.add_method('ReadNtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadNtohU64() [member function]
+    cls.add_method('ReadNtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('ns3::Buffer::Iterator', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU16(uint16_t data) [member function]
+    cls.add_method('WriteHtolsbU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU32(uint32_t data) [member function]
+    cls.add_method('WriteHtolsbU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU64(uint64_t data) [member function]
+    cls.add_method('WriteHtolsbU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU16(uint16_t data) [member function]
+    cls.add_method('WriteHtonU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU32(uint32_t data) [member function]
+    cls.add_method('WriteHtonU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU64(uint64_t data) [member function]
+    cls.add_method('WriteHtonU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU64(uint64_t data) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data, uint32_t len) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data'), param('uint32_t', 'len')])
+    return
+
+def register_Ns3ByteTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::ByteTagIterator(ns3::ByteTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::ByteTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item ns3::ByteTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item::Item(ns3::ByteTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetEnd() const [member function]
+    cls.add_method('GetEnd', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetStart() const [member function]
+    cls.add_method('GetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::ByteTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::ByteTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ByteTagList_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList() [constructor]
+    cls.add_constructor([])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList(ns3::ByteTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): ns3::TagBuffer ns3::ByteTagList::Add(ns3::TypeId tid, uint32_t bufferSize, int32_t start, int32_t end) [member function]
+    cls.add_method('Add', 
+                   'ns3::TagBuffer', 
+                   [param('ns3::TypeId', 'tid'), param('uint32_t', 'bufferSize'), param('int32_t', 'start'), param('int32_t', 'end')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Add(ns3::ByteTagList const & o) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+    cls.add_method('AddAtStart', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
+    cls.add_method('Begin', 
+                   'ns3::ByteTagList::Iterator', 
+                   [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIterator_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Iterator(ns3::ByteTagList::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Iterator::GetOffsetStart() const [member function]
+    cls.add_method('GetOffsetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): bool ns3::ByteTagList::Iterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item ns3::ByteTagList::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagList::Iterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIteratorItem_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::ByteTagList::Iterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator::Item const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::TagBuffer buf) [constructor]
+    cls.add_constructor([param('ns3::TagBuffer', 'buf')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::buf [variable]
+    cls.add_instance_attribute('buf', 'ns3::TagBuffer', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::end [variable]
+    cls.add_instance_attribute('end', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::size [variable]
+    cls.add_instance_attribute('size', 'uint32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::start [variable]
+    cls.add_instance_attribute('start', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3CallbackBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::CallbackBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::CallbackImplBase> ns3::CallbackBase::GetImpl() const [member function]
+    cls.add_method('GetImpl', 
+                   'ns3::Ptr< ns3::CallbackImplBase >', 
+                   [], 
+                   is_const=True)
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
+                        visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3EventId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::EventId const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventId const &', 'arg0')])
+    ## event-id.h (module 'core'): ns3::EventId::EventId() [constructor]
+    cls.add_constructor([])
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::Ptr<ns3::EventImpl> const & impl, uint64_t ts, uint32_t context, uint32_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EventImpl > const &', 'impl'), param('uint64_t', 'ts'), param('uint32_t', 'context'), param('uint32_t', 'uid')])
+    ## event-id.h (module 'core'): void ns3::EventId::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetContext() const [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint64_t ns3::EventId::GetTs() const [member function]
+    cls.add_method('GetTs', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsExpired() const [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): ns3::EventImpl * ns3::EventId::PeekEventImpl() const [member function]
+    cls.add_method('PeekEventImpl', 
+                   'ns3::EventImpl *', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3Hasher_methods(root_module, cls):
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher() [constructor]
+    cls.add_constructor([])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Ptr<ns3::Hash::Implementation> hp) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Hash::Implementation >', 'hp')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(std::string const s) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(std::string const s) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): ns3::Hasher & ns3::Hasher::clear() [member function]
+    cls.add_method('clear', 
+                   'ns3::Hasher &', 
+                   [])
+    return
+
+def register_Ns3Ipv4Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(uint32_t address) [constructor]
+    cls.add_constructor([param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::CombineMask(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('CombineMask', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv4Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Address::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::GetSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('GetSubnetDirectedBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const &', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
+    cls.add_method('IsLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static bool ns3::Ipv4Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('IsSubnetDirectedBroadcast', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(uint32_t address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    return
+
+def register_Ns3Ipv4Mask_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(ns3::Ipv4Mask const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(uint32_t mask) [constructor]
+    cls.add_constructor([param('uint32_t', 'mask')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(char const * mask) [constructor]
+    cls.add_constructor([param('char const *', 'mask')])
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::GetInverse() const [member function]
+    cls.add_method('GetInverse', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint16_t ns3::Ipv4Mask::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'a'), param('ns3::Ipv4Address', 'b')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Set(uint32_t mask) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'mask')])
+    return
+
+def register_Ns3Ipv6Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(uint8_t * address) [constructor]
+    cls.add_constructor([param('uint8_t *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const & addr) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const * addr) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const *', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Address::CombinePrefix(ns3::Ipv6Prefix const & prefix) [member function]
+    cls.add_method('CombinePrefix', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv6Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllHostsMulticast() [member function]
+    cls.add_method('GetAllHostsMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllNodesMulticast() [member function]
+    cls.add_method('GetAllNodesMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllRoutersMulticast() [member function]
+    cls.add_method('GetAllRoutersMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv6Address::GetIpv4MappedAddress() const [member function]
+    cls.add_method('GetIpv4MappedAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllHostsMulticast() const [member function]
+    cls.add_method('IsAllHostsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllNodesMulticast() const [member function]
+    cls.add_method('IsAllNodesMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllRoutersMulticast() const [member function]
+    cls.add_method('IsAllRoutersMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAny() const [member function]
+    cls.add_method('IsAny', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsDocumentation() const [member function]
+    cls.add_method('IsDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Address const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
+    cls.add_method('IsIpv4MappedAddress', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
+    cls.add_method('IsLinkLocal', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocalMulticast() const [member function]
+    cls.add_method('IsLinkLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLocalhost() const [member function]
+    cls.add_method('IsLocalhost', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static bool ns3::Ipv6Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsSolicitedMulticast() const [member function]
+    cls.add_method('IsSolicitedMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac48Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac64Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac16Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac48Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac64Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeIpv4MappedAddress(ns3::Ipv4Address addr) [member function]
+    cls.add_method('MakeIpv4MappedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeSolicitedAddress(ns3::Ipv6Address addr) [member function]
+    cls.add_method('MakeSolicitedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(uint8_t * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t *', 'address')])
+    return
+
+def register_Ns3Ipv6Prefix_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t * prefix) [constructor]
+    cls.add_constructor([param('uint8_t *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(char const * prefix) [constructor]
+    cls.add_constructor([param('char const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t prefix) [constructor]
+    cls.add_constructor([param('uint8_t', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const & prefix) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): uint8_t ns3::Ipv6Prefix::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Prefix const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'a'), param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3NetDeviceContainer_methods(root_module, cls):
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer() [constructor]
+    cls.add_constructor([])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::Ptr<ns3::NetDevice> dev) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::NetDevice >', 'dev')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(std::string devName) [constructor]
+    cls.add_constructor([param('std::string', 'devName')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & a, ns3::NetDeviceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'a'), param('ns3::NetDeviceContainer const &', 'b')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::NetDeviceContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'other')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(std::string deviceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'deviceName')])
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::NetDeviceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): uint32_t ns3::NetDeviceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ObjectBase_methods(root_module, cls):
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
+    cls.add_constructor([])
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase(ns3::ObjectBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectBase const &', 'arg0')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::GetAttribute(std::string name, ns3::AttributeValue & value) const [member function]
+    cls.add_method('GetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('GetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): ns3::TypeId ns3::ObjectBase::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## object-base.h (module 'core'): static ns3::TypeId ns3::ObjectBase::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object-base.h (module 'core'): void ns3::ObjectBase::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::SetAttributeFailSafe(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::ConstructSelf(ns3::AttributeConstructionList const & attributes) [member function]
+    cls.add_method('ConstructSelf', 
+                   'void', 
+                   [param('ns3::AttributeConstructionList const &', 'attributes')], 
+                   visibility='protected')
+    ## object-base.h (module 'core'): void ns3::ObjectBase::NotifyConstructionCompleted() [member function]
+    cls.add_method('NotifyConstructionCompleted', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectDeleter_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter(ns3::ObjectDeleter const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectDeleter const &', 'arg0')])
+    ## object.h (module 'core'): static void ns3::ObjectDeleter::Delete(ns3::Object * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::Object *', 'object')], 
+                   is_static=True)
+    return
+
+def register_Ns3ObjectFactory_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(ns3::ObjectFactory const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
+    cls.add_constructor([param('std::string', 'typeId')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): ns3::TypeId ns3::ObjectFactory::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('ns3::TypeId', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(char const * tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('char const *', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(std::string tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('std::string', 'tid')])
+    return
+
+def register_Ns3PacketMetadata_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
+    cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [param('ns3::Buffer', 'buffer')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::PacketMetadata', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'end')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint64_t ns3::PacketMetadata::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('RemoveHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketMetadataItem_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::current [variable]
+    cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentSize [variable]
+    cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromEnd [variable]
+    cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromStart [variable]
+    cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::isFragment [variable]
+    cls.add_instance_attribute('isFragment', 'bool', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3PacketMetadataItemIterator_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')])
+    ## packet-metadata.h (module 'network'): bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketMetadata::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::PacketTagIterator(ns3::PacketTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::PacketTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item ns3::PacketTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item::Item(ns3::PacketTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): void ns3::PacketTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::PacketTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketTagList_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList(ns3::PacketTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList const &', 'o')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::Add(ns3::Tag const & tag) const [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
+    cls.add_method('Head', 
+                   'ns3::PacketTagList::TagData const *', 
+                   [], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Peek(ns3::Tag & tag) const [member function]
+    cls.add_method('Peek', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Remove(ns3::Tag & tag) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Replace(ns3::Tag & tag) [member function]
+    cls.add_method('Replace', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    return
+
+def register_Ns3PacketTagListTagData_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData(ns3::PacketTagList::TagData const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList::TagData const &', 'arg0')])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
+    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
+    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
+    cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount(ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SixLowPanDispatch_methods(root_module, cls):
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::SixLowPanDispatch(ns3::SixLowPanDispatch const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanDispatch const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::SixLowPanDispatch() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::SixLowPanDispatch::Dispatch_e ns3::SixLowPanDispatch::GetDispatchType(uint8_t dispatch) [member function]
+    cls.add_method('GetDispatchType', 
+                   'ns3::SixLowPanDispatch::Dispatch_e', 
+                   [param('uint8_t', 'dispatch')], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::SixLowPanDispatch::NhcDispatch_e ns3::SixLowPanDispatch::GetNhcDispatchType(uint8_t dispatch) [member function]
+    cls.add_method('GetNhcDispatchType', 
+                   'ns3::SixLowPanDispatch::NhcDispatch_e', 
+                   [param('uint8_t', 'dispatch')], 
+                   is_static=True)
+    return
+
+def register_Ns3SixLowPanHelper_methods(root_module, cls):
+    ## sixlowpan-helper.h (module 'sixlowpan'): ns3::SixLowPanHelper::SixLowPanHelper(ns3::SixLowPanHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanHelper const &', 'arg0')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): ns3::SixLowPanHelper::SixLowPanHelper() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-helper.h (module 'sixlowpan'): int64_t ns3::SixLowPanHelper::AssignStreams(ns3::NetDeviceContainer c, int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): ns3::NetDeviceContainer ns3::SixLowPanHelper::Install(ns3::NetDeviceContainer c) [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::NetDeviceContainer', 'c')])
+    ## sixlowpan-helper.h (module 'sixlowpan'): void ns3::SixLowPanHelper::SetDeviceAttribute(std::string n1, ns3::AttributeValue const & v1) [member function]
+    cls.add_method('SetDeviceAttribute', 
+                   'void', 
+                   [param('std::string', 'n1'), param('ns3::AttributeValue const &', 'v1')])
+    return
+
+def register_Ns3Tag_methods(root_module, cls):
+    ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
+    cls.add_constructor([])
+    ## tag.h (module 'network'): ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Tag const &', 'arg0')])
+    ## tag.h (module 'network'): void ns3::Tag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tag.h (module 'network'): void ns3::Tag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3TagBuffer_methods(root_module, cls):
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
+    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'o')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): double ns3::TagBuffer::ReadDouble() [member function]
+    cls.add_method('ReadDouble', 
+                   'double', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint16_t ns3::TagBuffer::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint32_t ns3::TagBuffer::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint64_t ns3::TagBuffer::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint8_t ns3::TagBuffer::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::TrimAtEnd(uint32_t trim) [member function]
+    cls.add_method('TrimAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'trim')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteDouble(double v) [member function]
+    cls.add_method('WriteDouble', 
+                   'void', 
+                   [param('double', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU64(uint64_t v) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU8(uint8_t v) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'v')])
+    return
+
+def register_Ns3TypeId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
+    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'o')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, uint32_t flags, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('uint32_t', 'flags'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor) [member function]
+    cls.add_method('AddTraceSource', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation ns3::TypeId::GetAttribute(uint32_t i) const [member function]
+    cls.add_method('GetAttribute', 
+                   'ns3::TypeId::AttributeInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetAttributeFullName(uint32_t i) const [member function]
+    cls.add_method('GetAttributeFullName', 
+                   'std::string', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetAttributeN() const [member function]
+    cls.add_method('GetAttributeN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::Callback<ns3::ObjectBase*,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> ns3::TypeId::GetConstructor() const [member function]
+    cls.add_method('GetConstructor', 
+                   'ns3::Callback< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetGroupName() const [member function]
+    cls.add_method('GetGroupName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetHash() const [member function]
+    cls.add_method('GetHash', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::GetParent() const [member function]
+    cls.add_method('GetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::GetRegistered(uint32_t i) [member function]
+    cls.add_method('GetRegistered', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'i')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static uint32_t ns3::TypeId::GetRegisteredN() [member function]
+    cls.add_method('GetRegisteredN', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation ns3::TypeId::GetTraceSource(uint32_t i) const [member function]
+    cls.add_method('GetTraceSource', 
+                   'ns3::TypeId::TraceSourceInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetTraceSourceN() const [member function]
+    cls.add_method('GetTraceSourceN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint16_t ns3::TypeId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasConstructor() const [member function]
+    cls.add_method('HasConstructor', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasParent() const [member function]
+    cls.add_method('HasParent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::HideFromDocumentation() [member function]
+    cls.add_method('HideFromDocumentation', 
+                   'ns3::TypeId', 
+                   [])
+    ## type-id.h (module 'core'): bool ns3::TypeId::IsChildOf(ns3::TypeId other) const [member function]
+    cls.add_method('IsChildOf', 
+                   'bool', 
+                   [param('ns3::TypeId', 'other')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::LookupAttributeByName(std::string name, ns3::TypeId::AttributeInformation * info) const [member function]
+    cls.add_method('LookupAttributeByName', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::TypeId::AttributeInformation *', 'info', transfer_ownership=False)], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByHash(uint32_t hash) [member function]
+    cls.add_method('LookupByHash', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'hash')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static bool ns3::TypeId::LookupByHashFailSafe(uint32_t hash, ns3::TypeId * tid) [member function]
+    cls.add_method('LookupByHashFailSafe', 
+                   'bool', 
+                   [param('uint32_t', 'hash'), param('ns3::TypeId *', 'tid')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByName(std::string name) [member function]
+    cls.add_method('LookupByName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::TraceSourceAccessor const> ns3::TypeId::LookupTraceSourceByName(std::string name) const [member function]
+    cls.add_method('LookupTraceSourceByName', 
+                   'ns3::Ptr< ns3::TraceSourceAccessor const >', 
+                   [param('std::string', 'name')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::MustHideFromDocumentation() const [member function]
+    cls.add_method('MustHideFromDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::SetAttributeInitialValue(uint32_t i, ns3::Ptr<ns3::AttributeValue const> initialValue) [member function]
+    cls.add_method('SetAttributeInitialValue', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ptr< ns3::AttributeValue const >', 'initialValue')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetGroupName(std::string groupName) [member function]
+    cls.add_method('SetGroupName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'groupName')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent(ns3::TypeId tid) [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): void ns3::TypeId::SetUid(uint16_t tid) [member function]
+    cls.add_method('SetUid', 
+                   'void', 
+                   [param('uint16_t', 'tid')])
+    return
+
+def register_Ns3TypeIdAttributeInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation(ns3::TypeId::AttributeInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::AttributeInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::AttributeAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::flags [variable]
+    cls.add_instance_attribute('flags', 'uint32_t', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::initialValue [variable]
+    cls.add_instance_attribute('initialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::originalInitialValue [variable]
+    cls.add_instance_attribute('originalInitialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    return
+
+def register_Ns3TypeIdTraceSourceInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation(ns3::TypeId::TraceSourceInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::TraceSourceInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::TraceSourceAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    return
+
+def register_Ns3Empty_methods(root_module, cls):
+    ## empty.h (module 'core'): ns3::empty::empty() [constructor]
+    cls.add_constructor([])
+    ## empty.h (module 'core'): ns3::empty::empty(ns3::empty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::empty const &', 'arg0')])
+    return
+
+def register_Ns3Int64x64_t_methods(root_module, cls):
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_unary_numeric_operator('-')
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
+    cls.add_constructor([])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t hi, uint64_t lo) [constructor]
+    cls.add_constructor([param('int64_t', 'hi'), param('uint64_t', 'lo')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [copy constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): double ns3::int64x64_t::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): int64_t ns3::int64x64_t::GetHigh() const [member function]
+    cls.add_method('GetHigh', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): uint64_t ns3::int64x64_t::GetLow() const [member function]
+    cls.add_method('GetLow', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): static ns3::int64x64_t ns3::int64x64_t::Invert(uint64_t v) [member function]
+    cls.add_method('Invert', 
+                   'ns3::int64x64_t', 
+                   [param('uint64_t', 'v')], 
+                   is_static=True)
+    ## int64x64-double.h (module 'core'): void ns3::int64x64_t::MulByInvert(ns3::int64x64_t const & o) [member function]
+    cls.add_method('MulByInvert', 
+                   'void', 
+                   [param('ns3::int64x64_t const &', 'o')])
+    return
+
+def register_Ns3Chunk_methods(root_module, cls):
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
+    cls.add_constructor([])
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk(ns3::Chunk const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Chunk const &', 'arg0')])
+    ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## chunk.h (module 'network'): static ns3::TypeId ns3::Chunk::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## chunk.h (module 'network'): void ns3::Chunk::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Header_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## header.h (module 'network'): ns3::Header::Header() [constructor]
+    cls.add_constructor([])
+    ## header.h (module 'network'): ns3::Header::Header(ns3::Header const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Header const &', 'arg0')])
+    ## header.h (module 'network'): uint32_t ns3::Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## header.h (module 'network'): void ns3::Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Ipv6Header_methods(root_module, cls):
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::Ipv6Header(ns3::Ipv6Header const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Header const &', 'arg0')])
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::Ipv6Header() [constructor]
+    cls.add_constructor([])
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestinationAddress() const [member function]
+    cls.add_method('GetDestinationAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::GetFlowLabel() const [member function]
+    cls.add_method('GetFlowLabel', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetHopLimit() const [member function]
+    cls.add_method('GetHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::TypeId ns3::Ipv6Header::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint16_t ns3::Ipv6Header::GetPayloadLength() const [member function]
+    cls.add_method('GetPayloadLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint32_t ns3::Ipv6Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
+    cls.add_method('GetSourceAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
+    cls.add_method('GetTrafficClass', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): static ns3::TypeId ns3::Ipv6Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestinationAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetFlowLabel(uint32_t flow) [member function]
+    cls.add_method('SetFlowLabel', 
+                   'void', 
+                   [param('uint32_t', 'flow')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetHopLimit(uint8_t limit) [member function]
+    cls.add_method('SetHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'limit')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetNextHeader(uint8_t next) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'next')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetPayloadLength(uint16_t len) [member function]
+    cls.add_method('SetPayloadLength', 
+                   'void', 
+                   [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSourceAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
+    cls.add_method('SetTrafficClass', 
+                   'void', 
+                   [param('uint8_t', 'traffic')])
+    return
+
+def register_Ns3Object_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::Object() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): void ns3::Object::AggregateObject(ns3::Ptr<ns3::Object> other) [member function]
+    cls.add_method('AggregateObject', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'other')])
+    ## object.h (module 'core'): void ns3::Object::Dispose() [member function]
+    cls.add_method('Dispose', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator ns3::Object::GetAggregateIterator() const [member function]
+    cls.add_method('GetAggregateIterator', 
+                   'ns3::Object::AggregateIterator', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::TypeId ns3::Object::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object.h (module 'core'): static ns3::TypeId ns3::Object::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object.h (module 'core'): void ns3::Object::Initialize() [member function]
+    cls.add_method('Initialize', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::Object(ns3::Object const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Object const &', 'o')], 
+                        visibility='protected')
+    ## object.h (module 'core'): void ns3::Object::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectAggregateIterator_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator(ns3::Object::AggregateIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Object::AggregateIterator const &', 'arg0')])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): bool ns3::Object::AggregateIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::Ptr<ns3::Object const> ns3::Object::AggregateIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::Object const >', 
+                   [])
+    return
+
+def register_Ns3RandomVariableStream_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::RandomVariableStream::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::RandomVariableStream::RandomVariableStream() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::RandomVariableStream::SetStream(int64_t stream) [member function]
+    cls.add_method('SetStream', 
+                   'void', 
+                   [param('int64_t', 'stream')])
+    ## random-variable-stream.h (module 'core'): int64_t ns3::RandomVariableStream::GetStream() const [member function]
+    cls.add_method('GetStream', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): void ns3::RandomVariableStream::SetAntithetic(bool isAntithetic) [member function]
+    cls.add_method('SetAntithetic', 
+                   'void', 
+                   [param('bool', 'isAntithetic')])
+    ## random-variable-stream.h (module 'core'): bool ns3::RandomVariableStream::IsAntithetic() const [member function]
+    cls.add_method('IsAntithetic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::RandomVariableStream::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::RandomVariableStream::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## random-variable-stream.h (module 'core'): ns3::RngStream * ns3::RandomVariableStream::Peek() const [member function]
+    cls.add_method('Peek', 
+                   'ns3::RngStream *', 
+                   [], 
+                   is_const=True, visibility='protected')
+    return
+
+def register_Ns3SequentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::SequentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::SequentialRandomVariable::SequentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): ns3::Ptr<ns3::RandomVariableStream> ns3::SequentialRandomVariable::GetIncrement() const [member function]
+    cls.add_method('GetIncrement', 
+                   'ns3::Ptr< ns3::RandomVariableStream >', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::SequentialRandomVariable::GetConsecutive() const [member function]
+    cls.add_method('GetConsecutive', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::SequentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::SequentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SixLowPanFrag1_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFrag1::SixLowPanFrag1(ns3::SixLowPanFrag1 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanFrag1 const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFrag1::SixLowPanFrag1() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanFrag1::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanFrag1::GetDatagramSize() const [member function]
+    cls.add_method('GetDatagramSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanFrag1::GetDatagramTag() const [member function]
+    cls.add_method('GetDatagramTag', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanFrag1::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanFrag1::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanFrag1::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFrag1::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFrag1::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFrag1::SetDatagramSize(uint16_t datagramSize) [member function]
+    cls.add_method('SetDatagramSize', 
+                   'void', 
+                   [param('uint16_t', 'datagramSize')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFrag1::SetDatagramTag(uint16_t datagramTag) [member function]
+    cls.add_method('SetDatagramTag', 
+                   'void', 
+                   [param('uint16_t', 'datagramTag')])
+    return
+
+def register_Ns3SixLowPanFragN_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFragN::SixLowPanFragN(ns3::SixLowPanFragN const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanFragN const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanFragN::SixLowPanFragN() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanFragN::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanFragN::GetDatagramOffset() const [member function]
+    cls.add_method('GetDatagramOffset', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanFragN::GetDatagramSize() const [member function]
+    cls.add_method('GetDatagramSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanFragN::GetDatagramTag() const [member function]
+    cls.add_method('GetDatagramTag', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanFragN::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanFragN::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanFragN::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::SetDatagramOffset(uint8_t datagramOffset) [member function]
+    cls.add_method('SetDatagramOffset', 
+                   'void', 
+                   [param('uint8_t', 'datagramOffset')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::SetDatagramSize(uint16_t datagramSize) [member function]
+    cls.add_method('SetDatagramSize', 
+                   'void', 
+                   [param('uint16_t', 'datagramSize')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanFragN::SetDatagramTag(uint16_t datagramTag) [member function]
+    cls.add_method('SetDatagramTag', 
+                   'void', 
+                   [param('uint16_t', 'datagramTag')])
+    return
+
+def register_Ns3SixLowPanHc1_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::SixLowPanHc1(ns3::SixLowPanHc1 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanHc1 const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::SixLowPanHc1() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanHc1::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::LowPanHc1Addr_e ns3::SixLowPanHc1::GetDstCompression() const [member function]
+    cls.add_method('GetDstCompression', 
+                   'ns3::SixLowPanHc1::LowPanHc1Addr_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanHc1::GetDstInterface() const [member function]
+    cls.add_method('GetDstInterface', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanHc1::GetDstPrefix() const [member function]
+    cls.add_method('GetDstPrefix', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanHc1::GetFlowLabel() const [member function]
+    cls.add_method('GetFlowLabel', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanHc1::GetHopLimit() const [member function]
+    cls.add_method('GetHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanHc1::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanHc1::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanHc1::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanHc1::LowPanHc1Addr_e ns3::SixLowPanHc1::GetSrcCompression() const [member function]
+    cls.add_method('GetSrcCompression', 
+                   'ns3::SixLowPanHc1::LowPanHc1Addr_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanHc1::GetSrcInterface() const [member function]
+    cls.add_method('GetSrcInterface', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t const * ns3::SixLowPanHc1::GetSrcPrefix() const [member function]
+    cls.add_method('GetSrcPrefix', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanHc1::GetTrafficClass() const [member function]
+    cls.add_method('GetTrafficClass', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanHc1::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanHc1::IsHc2HeaderPresent() const [member function]
+    cls.add_method('IsHc2HeaderPresent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanHc1::IsTcflCompression() const [member function]
+    cls.add_method('IsTcflCompression', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetDstCompression(ns3::SixLowPanHc1::LowPanHc1Addr_e dstCompression) [member function]
+    cls.add_method('SetDstCompression', 
+                   'void', 
+                   [param('ns3::SixLowPanHc1::LowPanHc1Addr_e', 'dstCompression')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetDstInterface(uint8_t const * dstInterface) [member function]
+    cls.add_method('SetDstInterface', 
+                   'void', 
+                   [param('uint8_t const *', 'dstInterface')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetDstPrefix(uint8_t const * dstPrefix) [member function]
+    cls.add_method('SetDstPrefix', 
+                   'void', 
+                   [param('uint8_t const *', 'dstPrefix')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetFlowLabel(uint32_t flowLabel) [member function]
+    cls.add_method('SetFlowLabel', 
+                   'void', 
+                   [param('uint32_t', 'flowLabel')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetHc2HeaderPresent(bool hc2HeaderPresent) [member function]
+    cls.add_method('SetHc2HeaderPresent', 
+                   'void', 
+                   [param('bool', 'hc2HeaderPresent')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetHopLimit(uint8_t limit) [member function]
+    cls.add_method('SetHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'limit')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetNextHeader(uint8_t nextHeader) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'nextHeader')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetSrcCompression(ns3::SixLowPanHc1::LowPanHc1Addr_e srcCompression) [member function]
+    cls.add_method('SetSrcCompression', 
+                   'void', 
+                   [param('ns3::SixLowPanHc1::LowPanHc1Addr_e', 'srcCompression')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetSrcInterface(uint8_t const * srcInterface) [member function]
+    cls.add_method('SetSrcInterface', 
+                   'void', 
+                   [param('uint8_t const *', 'srcInterface')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetSrcPrefix(uint8_t const * srcPrefix) [member function]
+    cls.add_method('SetSrcPrefix', 
+                   'void', 
+                   [param('uint8_t const *', 'srcPrefix')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetTcflCompression(bool tcflCompression) [member function]
+    cls.add_method('SetTcflCompression', 
+                   'void', 
+                   [param('bool', 'tcflCompression')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanHc1::SetTrafficClass(uint8_t trafficClass) [member function]
+    cls.add_method('SetTrafficClass', 
+                   'void', 
+                   [param('uint8_t', 'trafficClass')])
+    return
+
+def register_Ns3SixLowPanIphc_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::SixLowPanIphc(ns3::SixLowPanIphc const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanIphc const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::SixLowPanIphc() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::SixLowPanIphc(uint8_t dispatch) [constructor]
+    cls.add_constructor([param('uint8_t', 'dispatch')])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanIphc::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetCid() const [member function]
+    cls.add_method('GetCid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetDac() const [member function]
+    cls.add_method('GetDac', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::HeaderCompression_e ns3::SixLowPanIphc::GetDam() const [member function]
+    cls.add_method('GetDam', 
+                   'ns3::SixLowPanIphc::HeaderCompression_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetDscp() const [member function]
+    cls.add_method('GetDscp', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::Ipv6Address ns3::SixLowPanIphc::GetDstAddress() const [member function]
+    cls.add_method('GetDstAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetDstContextId() const [member function]
+    cls.add_method('GetDstContextId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetEcn() const [member function]
+    cls.add_method('GetEcn', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanIphc::GetFlowLabel() const [member function]
+    cls.add_method('GetFlowLabel', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::Hlim_e ns3::SixLowPanIphc::GetHlim() const [member function]
+    cls.add_method('GetHlim', 
+                   'ns3::SixLowPanIphc::Hlim_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetHopLimit() const [member function]
+    cls.add_method('GetHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanIphc::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetM() const [member function]
+    cls.add_method('GetM', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetNh() const [member function]
+    cls.add_method('GetNh', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanIphc::GetSac() const [member function]
+    cls.add_method('GetSac', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::HeaderCompression_e ns3::SixLowPanIphc::GetSam() const [member function]
+    cls.add_method('GetSam', 
+                   'ns3::SixLowPanIphc::HeaderCompression_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanIphc::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::Ipv6Address ns3::SixLowPanIphc::GetSrcAddress() const [member function]
+    cls.add_method('GetSrcAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanIphc::GetSrcContextId() const [member function]
+    cls.add_method('GetSrcContextId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanIphc::TrafficClassFlowLabel_e ns3::SixLowPanIphc::GetTf() const [member function]
+    cls.add_method('GetTf', 
+                   'ns3::SixLowPanIphc::TrafficClassFlowLabel_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanIphc::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetCid(bool cidField) [member function]
+    cls.add_method('SetCid', 
+                   'void', 
+                   [param('bool', 'cidField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDac(bool dacField) [member function]
+    cls.add_method('SetDac', 
+                   'void', 
+                   [param('bool', 'dacField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDam(ns3::SixLowPanIphc::HeaderCompression_e damField) [member function]
+    cls.add_method('SetDam', 
+                   'void', 
+                   [param('ns3::SixLowPanIphc::HeaderCompression_e', 'damField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDscp(uint8_t dscp) [member function]
+    cls.add_method('SetDscp', 
+                   'void', 
+                   [param('uint8_t', 'dscp')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstAddress(ns3::Ipv6Address dstAddress) [member function]
+    cls.add_method('SetDstAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dstAddress')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetDstContextId(uint8_t dstContextId) [member function]
+    cls.add_method('SetDstContextId', 
+                   'void', 
+                   [param('uint8_t', 'dstContextId')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetEcn(uint8_t ecn) [member function]
+    cls.add_method('SetEcn', 
+                   'void', 
+                   [param('uint8_t', 'ecn')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetFlowLabel(uint32_t flowLabel) [member function]
+    cls.add_method('SetFlowLabel', 
+                   'void', 
+                   [param('uint32_t', 'flowLabel')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetHlim(ns3::SixLowPanIphc::Hlim_e hlimField) [member function]
+    cls.add_method('SetHlim', 
+                   'void', 
+                   [param('ns3::SixLowPanIphc::Hlim_e', 'hlimField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetHopLimit(uint8_t hopLimit) [member function]
+    cls.add_method('SetHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'hopLimit')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetM(bool mField) [member function]
+    cls.add_method('SetM', 
+                   'void', 
+                   [param('bool', 'mField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetNextHeader(uint8_t nextHeader) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'nextHeader')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetNh(bool nhField) [member function]
+    cls.add_method('SetNh', 
+                   'void', 
+                   [param('bool', 'nhField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSac(bool sacField) [member function]
+    cls.add_method('SetSac', 
+                   'void', 
+                   [param('bool', 'sacField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSam(ns3::SixLowPanIphc::HeaderCompression_e samField) [member function]
+    cls.add_method('SetSam', 
+                   'void', 
+                   [param('ns3::SixLowPanIphc::HeaderCompression_e', 'samField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcAddress(ns3::Ipv6Address srcAddress) [member function]
+    cls.add_method('SetSrcAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'srcAddress')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetSrcContextId(uint8_t srcContextId) [member function]
+    cls.add_method('SetSrcContextId', 
+                   'void', 
+                   [param('uint8_t', 'srcContextId')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanIphc::SetTf(ns3::SixLowPanIphc::TrafficClassFlowLabel_e tfField) [member function]
+    cls.add_method('SetTf', 
+                   'void', 
+                   [param('ns3::SixLowPanIphc::TrafficClassFlowLabel_e', 'tfField')])
+    return
+
+def register_Ns3SixLowPanNhcExtension_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension::SixLowPanNhcExtension(ns3::SixLowPanNhcExtension const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanNhcExtension const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension::SixLowPanNhcExtension() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNhcExtension::CopyBlob(uint8_t * blob, uint32_t size) const [member function]
+    cls.add_method('CopyBlob', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'blob'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNhcExtension::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanNhcExtension::Eid_e ns3::SixLowPanNhcExtension::GetEid() const [member function]
+    cls.add_method('GetEid', 
+                   'ns3::SixLowPanNhcExtension::Eid_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanNhcExtension::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint8_t ns3::SixLowPanNhcExtension::GetNextHeader() const [member function]
+    cls.add_method('GetNextHeader', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanNhcExtension::GetNh() const [member function]
+    cls.add_method('GetNh', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::NhcDispatch_e ns3::SixLowPanNhcExtension::GetNhcDispatchType() const [member function]
+    cls.add_method('GetNhcDispatchType', 
+                   'ns3::SixLowPanDispatch::NhcDispatch_e', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNhcExtension::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanNhcExtension::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::SetBlob(uint8_t const * blob, uint32_t size) [member function]
+    cls.add_method('SetBlob', 
+                   'void', 
+                   [param('uint8_t const *', 'blob'), param('uint32_t', 'size')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::SetEid(ns3::SixLowPanNhcExtension::Eid_e extensionHeaderType) [member function]
+    cls.add_method('SetEid', 
+                   'void', 
+                   [param('ns3::SixLowPanNhcExtension::Eid_e', 'extensionHeaderType')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::SetNextHeader(uint8_t nextHeader) [member function]
+    cls.add_method('SetNextHeader', 
+                   'void', 
+                   [param('uint8_t', 'nextHeader')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanNhcExtension::SetNh(bool nhField) [member function]
+    cls.add_method('SetNh', 
+                   'void', 
+                   [param('bool', 'nhField')])
+    return
+
+def register_Ns3SixLowPanUdpNhcExtension_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension::SixLowPanUdpNhcExtension(ns3::SixLowPanUdpNhcExtension const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SixLowPanUdpNhcExtension const &', 'arg0')])
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension::SixLowPanUdpNhcExtension() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanUdpNhcExtension::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): bool ns3::SixLowPanUdpNhcExtension::GetC() const [member function]
+    cls.add_method('GetC', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanUdpNhcExtension::GetChecksum() const [member function]
+    cls.add_method('GetChecksum', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanUdpNhcExtension::GetDstPort() const [member function]
+    cls.add_method('GetDstPort', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::TypeId ns3::SixLowPanUdpNhcExtension::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanDispatch::NhcDispatch_e ns3::SixLowPanUdpNhcExtension::GetNhcDispatchType() const [member function]
+    cls.add_method('GetNhcDispatchType', 
+                   'ns3::SixLowPanDispatch::NhcDispatch_e', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): ns3::SixLowPanUdpNhcExtension::Ports_e ns3::SixLowPanUdpNhcExtension::GetPorts() const [member function]
+    cls.add_method('GetPorts', 
+                   'ns3::SixLowPanUdpNhcExtension::Ports_e', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint32_t ns3::SixLowPanUdpNhcExtension::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): uint16_t ns3::SixLowPanUdpNhcExtension::GetSrcPort() const [member function]
+    cls.add_method('GetSrcPort', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanUdpNhcExtension::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetC(bool cField) [member function]
+    cls.add_method('SetC', 
+                   'void', 
+                   [param('bool', 'cField')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetChecksum(uint16_t checksum) [member function]
+    cls.add_method('SetChecksum', 
+                   'void', 
+                   [param('uint16_t', 'checksum')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetDstPort(uint16_t port) [member function]
+    cls.add_method('SetDstPort', 
+                   'void', 
+                   [param('uint16_t', 'port')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetPorts(ns3::SixLowPanUdpNhcExtension::Ports_e port) [member function]
+    cls.add_method('SetPorts', 
+                   'void', 
+                   [param('ns3::SixLowPanUdpNhcExtension::Ports_e', 'port')])
+    ## sixlowpan-header.h (module 'sixlowpan'): void ns3::SixLowPanUdpNhcExtension::SetSrcPort(uint16_t port) [member function]
+    cls.add_method('SetSrcPort', 
+                   'void', 
+                   [param('uint16_t', 'port')])
+    return
+
+def register_Ns3Time_methods(root_module, cls):
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Time const &', 'o')])
+    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
+    cls.add_constructor([param('std::string const &', 's')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & value) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'value')])
+    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
+    cls.add_method('Compare', 
+                   'int', 
+                   [param('ns3::Time const &', 'o')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & from, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'from'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromDouble', 
+                   'ns3::Time', 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromInteger', 
+                   'ns3::Time', 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
+    cls.add_method('GetFemtoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
+    cls.add_method('GetMicroSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
+    cls.add_method('GetMilliSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
+    cls.add_method('GetNanoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
+    cls.add_method('GetPicoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
+    cls.add_method('GetResolution', 
+                   'ns3::Time::Unit', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
+    cls.add_method('GetSeconds', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
+    cls.add_method('GetTimeStep', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
+    cls.add_method('IsNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
+    cls.add_method('IsPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
+    cls.add_method('IsStrictlyNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
+    cls.add_method('IsStrictlyPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
+    cls.add_method('IsZero', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
+    cls.add_method('Max', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
+    cls.add_method('Min', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
+    cls.add_method('SetResolution', 
+                   'void', 
+                   [param('ns3::Time::Unit', 'resolution')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
+    cls.add_method('StaticInit', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('To', 
+                   'ns3::int64x64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToDouble', 
+                   'double', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToInteger', 
+                   'int64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    return
+
+def register_Ns3TraceSourceAccessor_methods(root_module, cls):
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor() [constructor]
+    cls.add_constructor([])
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Connect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Connect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('ConnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Disconnect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Disconnect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::DisconnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Trailer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer() [constructor]
+    cls.add_constructor([])
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer(ns3::Trailer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Trailer const &', 'arg0')])
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'end')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3TriangularRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::TriangularRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::TriangularRandomVariable::TriangularRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetValue(double mean, double min, double max) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'min'), param('double', 'max')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::TriangularRandomVariable::GetInteger(uint32_t mean, uint32_t min, uint32_t max) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'min'), param('uint32_t', 'max')])
+    ## random-variable-stream.h (module 'core'): double ns3::TriangularRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::TriangularRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3UniformRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::UniformRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::UniformRandomVariable::UniformRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetMin() const [member function]
+    cls.add_method('GetMin', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetMax() const [member function]
+    cls.add_method('GetMax', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetValue(double min, double max) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'min'), param('double', 'max')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger(uint32_t min, uint32_t max) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'min'), param('uint32_t', 'max')])
+    ## random-variable-stream.h (module 'core'): double ns3::UniformRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::UniformRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3WeibullRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::WeibullRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::WeibullRandomVariable::WeibullRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetScale() const [member function]
+    cls.add_method('GetScale', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetValue(double scale, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'scale'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger(uint32_t scale, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'scale'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::WeibullRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::WeibullRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ZetaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZetaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZetaRandomVariable::ZetaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue(double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger(uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZetaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZetaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ZipfRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ZipfRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ZipfRandomVariable::ZipfRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue(uint32_t n, double alpha) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'n'), param('double', 'alpha')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger(uint32_t n, uint32_t alpha) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'alpha')])
+    ## random-variable-stream.h (module 'core'): double ns3::ZipfRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ZipfRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3AttributeAccessor_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('CreateValidValue', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::CallbackBase', 'base')])
+    return
+
+def register_Ns3ConstantRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ConstantRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ConstantRandomVariable::ConstantRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetConstant() const [member function]
+    cls.add_method('GetConstant', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue(double constant) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'constant')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger(uint32_t constant) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'constant')])
+    ## random-variable-stream.h (module 'core'): double ns3::ConstantRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ConstantRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3DeterministicRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::DeterministicRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::DeterministicRandomVariable::DeterministicRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::DeterministicRandomVariable::SetValueArray(double * values, uint64_t length) [member function]
+    cls.add_method('SetValueArray', 
+                   'void', 
+                   [param('double *', 'values'), param('uint64_t', 'length')])
+    ## random-variable-stream.h (module 'core'): double ns3::DeterministicRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::DeterministicRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3EmpiricalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::EmpiricalRandomVariable::EmpiricalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::CDF(double v, double c) [member function]
+    cls.add_method('CDF', 
+                   'void', 
+                   [param('double', 'v'), param('double', 'c')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::EmpiricalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::EmpiricalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): double ns3::EmpiricalRandomVariable::Interpolate(double arg0, double arg1, double arg2, double arg3, double arg4) [member function]
+    cls.add_method('Interpolate', 
+                   'double', 
+                   [param('double', 'arg0'), param('double', 'arg1'), param('double', 'arg2'), param('double', 'arg3'), param('double', 'arg4')], 
+                   visibility='private', is_virtual=True)
+    ## random-variable-stream.h (module 'core'): void ns3::EmpiricalRandomVariable::Validate() [member function]
+    cls.add_method('Validate', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EmptyAttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3ErlangRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ErlangRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ErlangRandomVariable::ErlangRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetK() const [member function]
+    cls.add_method('GetK', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetLambda() const [member function]
+    cls.add_method('GetLambda', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue(uint32_t k, double lambda) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('uint32_t', 'k'), param('double', 'lambda')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger(uint32_t k, uint32_t lambda) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'k'), param('uint32_t', 'lambda')])
+    ## random-variable-stream.h (module 'core'): double ns3::ErlangRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ErlangRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3EventImpl_methods(root_module, cls):
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
+    cls.add_constructor([])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ExponentialRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ExponentialRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ExponentialRandomVariable::ExponentialRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue(double mean, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger(uint32_t mean, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ExponentialRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ExponentialRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3GammaRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::GammaRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::GammaRandomVariable::GammaRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetAlpha() const [member function]
+    cls.add_method('GetAlpha', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetBeta() const [member function]
+    cls.add_method('GetBeta', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue(double alpha, double beta) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'alpha'), param('double', 'beta')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger(uint32_t alpha, uint32_t beta) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'alpha'), param('uint32_t', 'beta')])
+    ## random-variable-stream.h (module 'core'): double ns3::GammaRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::GammaRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
+    return
+
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3LogNormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::LogNormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::LogNormalRandomVariable::LogNormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetMu() const [member function]
+    cls.add_method('GetMu', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetSigma() const [member function]
+    cls.add_method('GetSigma', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue(double mu, double sigma) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mu'), param('double', 'sigma')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger(uint32_t mu, uint32_t sigma) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mu'), param('uint32_t', 'sigma')])
+    ## random-variable-stream.h (module 'core'): double ns3::LogNormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::LogNormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3NetDevice_methods(root_module, cls):
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
+    cls.add_constructor([])
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NixVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+    cls.add_constructor([])
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [copy constructor]
+    cls.add_constructor([param('ns3::NixVector const &', 'o')])
+    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
+    cls.add_method('AddNeighborIndex', 
+                   'void', 
+                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
+    cls.add_method('BitCount', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfNeighbors')], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
+    cls.add_method('ExtractNeighborIndex', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    cls.add_method('GetRemainingBits', 
+                   'uint32_t', 
+                   [])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3NormalRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::INFINITE_VALUE [variable]
+    cls.add_static_attribute('INFINITE_VALUE', 'double const', is_const=True)
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::NormalRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::NormalRandomVariable::NormalRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetVariance() const [member function]
+    cls.add_method('GetVariance', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue(double mean, double variance, double bound=ns3::NormalRandomVariable::INFINITE_VALUE) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'variance'), param('double', 'bound', default_value='ns3::NormalRandomVariable::INFINITE_VALUE')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger(uint32_t mean, uint32_t variance, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'variance'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::NormalRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::NormalRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    return
+
+def register_Ns3ObjectFactoryValue_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ObjectFactory', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ObjectFactory const &', 'value')])
+    return
+
+def register_Ns3Packet_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    cls.add_constructor([])
+    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Packet const &', 'o')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
+    cls.add_constructor([param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<const ns3::Packet> packet) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header')])
+    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddPacketTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer')])
+    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
+    cls.add_method('EnablePrinting', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
+    cls.add_method('FindFirstMatchingByteTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
+    cls.add_method('GetByteTagIterator', 
+                   'ns3::ByteTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
+    cls.add_method('GetNixVector', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
+    cls.add_method('GetPacketTagIterator', 
+                   'ns3::PacketTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint8_t const * ns3::Packet::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   deprecated=True, is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')], 
+                   is_const=True)
+    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
+    cls.add_method('PeekPacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('PeekTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
+    cls.add_method('PrintByteTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
+    cls.add_method('PrintPacketTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
+    cls.add_method('RemoveAllByteTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
+    cls.add_method('RemoveAllPacketTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')])
+    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('RemovePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> arg0) [member function]
+    cls.add_method('SetNixVector', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NixVector >', 'arg0')])
+    return
+
+def register_Ns3ParetoRandomVariable_methods(root_module, cls):
+    ## random-variable-stream.h (module 'core'): static ns3::TypeId ns3::ParetoRandomVariable::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## random-variable-stream.h (module 'core'): ns3::ParetoRandomVariable::ParetoRandomVariable() [constructor]
+    cls.add_constructor([])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetMean() const [member function]
+    cls.add_method('GetMean', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetShape() const [member function]
+    cls.add_method('GetShape', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetBound() const [member function]
+    cls.add_method('GetBound', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue(double mean, double shape, double bound) [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [param('double', 'mean'), param('double', 'shape'), param('double', 'bound')])
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger(uint32_t mean, uint32_t shape, uint32_t bound) [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [param('uint32_t', 'mean'), param('uint32_t', 'shape'), param('uint32_t', 'bound')])
+    ## random-variable-stream.h (module 'core'): double ns3::ParetoRandomVariable::GetValue() [member function]
+    cls.add_method('GetValue', 
+                   'double', 
+                   [], 
+                   is_virtual=True)
+    ## random-variable-stream.h (module 'core'): uint32_t ns3::ParetoRandomVariable::GetInteger() [member function]
+    cls.add_method('GetInteger', 
+                   'uint32_t', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3SixLowPanNetDevice_methods(root_module, cls):
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::SixLowPanNetDevice::SixLowPanNetDevice() [constructor]
+    cls.add_constructor([])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::AddLinkChangeCallback(ns3::Callback<void,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): int64_t ns3::SixLowPanNetDevice::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Address ns3::SixLowPanNetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Address ns3::SixLowPanNetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Ptr<ns3::Channel> ns3::SixLowPanNetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): uint32_t ns3::SixLowPanNetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): uint16_t ns3::SixLowPanNetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Address ns3::SixLowPanNetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Address ns3::SixLowPanNetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Ptr<ns3::NetDevice> ns3::SixLowPanNetDevice::GetNetDevice() const [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): ns3::Ptr<ns3::Node> ns3::SixLowPanNetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): static ns3::TypeId ns3::SixLowPanNetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Address', 'address')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetNetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('SetNetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetPromiscReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::SetReceiveCallback(ns3::Callback<bool, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): bool ns3::SixLowPanNetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## sixlowpan-net-device.h (module 'sixlowpan'): void ns3::SixLowPanNetDevice::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3TimeValue_methods(root_module, cls):
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'value')])
+    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Time const &', 'value')])
+    return
+
+def register_Ns3TypeIdChecker_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    return
+
+def register_Ns3TypeIdValue_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'value')])
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::TypeId const &', 'value')])
+    return
+
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
+def register_Ns3HashImplementation_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation() [constructor]
+    cls.add_constructor([])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Implementation::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Implementation::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Implementation::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3HashFunctionFnv1a_methods(root_module, cls):
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a(ns3::Hash::Function::Fnv1a const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Fnv1a const &', 'arg0')])
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a() [constructor]
+    cls.add_constructor([])
+    ## hash-fnv.h (module 'core'): uint32_t ns3::Hash::Function::Fnv1a::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): uint64_t ns3::Hash::Function::Fnv1a::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): void ns3::Hash::Function::Fnv1a::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash32_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Function::Hash32 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash32 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Hash32Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash32Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash32::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash32::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash64_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Function::Hash64 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash64 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Hash64Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash64Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash64::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Function::Hash64::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash64::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionMurmur3_methods(root_module, cls):
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3(ns3::Hash::Function::Murmur3 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Murmur3 const &', 'arg0')])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3() [constructor]
+    cls.add_constructor([])
+    ## hash-murmur3.h (module 'core'): uint32_t ns3::Hash::Function::Murmur3::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): uint64_t ns3::Hash::Function::Murmur3::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): void ns3::Hash::Function::Murmur3::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_functions(root_module):
+    module = root_module
+    register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
+    register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    return
+
+def register_functions_ns3_FatalImpl(module, root_module):
+    return
+
+def register_functions_ns3_Hash(module, root_module):
+    register_functions_ns3_Hash_Function(module.get_submodule('Function'), root_module)
+    return
+
+def register_functions_ns3_Hash_Function(module, root_module):
+    return
+
+def main():
+    out = FileCodeSink(sys.stdout)
+    root_module = module_init()
+    register_types(root_module)
+    register_methods(root_module)
+    register_functions(root_module)
+    root_module.generate(out)
+
+if __name__ == '__main__':
+    main()
+
diff -Naur ns-3.18.1/src/sixlowpan/doc/sixlowpan.rst ns-3.19/src/sixlowpan/doc/sixlowpan.rst
--- ns-3.18.1/src/sixlowpan/doc/sixlowpan.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/doc/sixlowpan.rst	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,153 @@
+.. include:: replace.txt
+.. highlight:: cpp
+
+
+6LoWPAN: Transmission of IPv6 Packets over IEEE 802.15.4 Networks
+-----------------------------------------------------------------
+
+This chapter describes the implementation of |ns3| model for the
+compression of IPv6 packets over IEEE 802.15.4-Based Networks 
+as specified by :rfc:`4944` and :rfc:`6282`.
+
+Model Description
+*****************
+
+The source code for the sixlowpan module lives in the directory ``src/sixlowpan``.
+
+Design
+======
+
+The model design does not follow strictly the standard from an architectural 
+standpoint, as it does extend it beyond the original scope by supporting also
+other kinds of networks.
+
+Other than that, the module strictly follows :rfc:`4944` and :rfc:`6282`, with the 
+following exceptions:
+
+* MESH and LOWPAN_BC0 dispatch types are not supported
+* HC2 encoding is not supported
+* IPHC's SAC and DAC are not supported
+
+The MESH and LOWPAN_BC0 are not supported as they do apply only to mesh-under
+architecture, which is not one of the goals of the module development.
+
+The HC2 encoding is not supported, as it has been superseded by IPHC and NHC
+compression type (\ :rfc:`6282`).
+
+IPHC SAC and DAC are not yet supported, as they do require :rfc:`6775` for full 
+compliance. It is planned to support them in the future. 
+
+NetDevice
+#########
+
+The whole module is developed as a transparent NetDevice, which can act as a
+proxy between IPv6 and any NetDevice (the module has been successfully tested 
+with PointToPointNedevice, CsmaNetDevice and LrWpanNetDevice).
+
+For this reason, the module implements a virtual NetDevice, and all the calls are passed
+without modifications to the underlying NetDevice. The only important difference is in
+GetMtu behaviour. It will always return *at least* 1280 bytes, as is the minumum IPv6 MTU.
+
+The module does provide some attributes and some tracesources.
+The attributes are:
+
+* Rfc6282 (boolean, default true), used to activate HC1 (:rfc:`4944`) or IPHC (:rfc:`6282`) compression.
+* OmitUdpChecksum (boolean, default true), used to activate UDP checksum compression in IPHC.
+* FragmentReassemblyListSize (integer, default 0), indicating the number of packets that can be reassembled at the same time. If the limit is reached, the oldest packet is discarded. Zero means infinite.
+* FragmentExpirationTimeout (Time, default 60 seconds), being the timeout to wait for further fragments before discarding a partial packet.
+* ForceEtherType (boolean, default false), and
+* EtherType (unsigned 16 bits integer, default 0xFFFF), to force a particular L2 EtherType.
+
+The last two attributes are needed to use the module with a NetDevice other than 802.15.4, as
+neither IANA or IEEE did reserve an EtherType for 6LoWPAN. As a consequence there might be a
+conflict with the L2 multiplexer/demultiplexer which is based on EtherType. The default 
+value is 0xFFFF, which is reserved by IEEE (see [IANA802]_ and [Ethertype]_).
+The default module behaviour is to not change the EtherType, however this would not work with
+any NetDevice actually understanding and using the EtherType.
+
+Note that the `ForceEtherType` parameter have also a direct effect on the MAC address kind the
+module is expecting to handle:
+* ForceEtherType true: Mac48Address (Ethernet, WiFi, etc.).
+* ForceEtherType false: Mac16Address or Mac64Address (IEEE 802.15.4).
+
+Note that using 6LoWPAN over any NetDevice other than 802.15.4 will produce valid .pcap files,
+but they will not be correctly dissected by Wireshark.
+The reason lies on the fact that 6LoWPAN was really meant to be used only over 802.15.4, so
+Wireshark dissectors will not even try to decode 6LoWPAN headers on top of protocols other than
+802.15.4.
+
+The Trace sources are:
+
+* Tx - exposing packet (including 6LoWPAN header), SixLoWPanNetDevice Ptr, interface index.
+* Rx - exposing packet (including 6LoWPAN header), SixLoWPanNetDevice Ptr, interface index.
+* Drop - exposing DropReason, packet (including 6LoWPAN header), SixLoWPanNetDevice Ptr, interface index.
+
+The Tx and Rx traces are called as soon as a packet is received or sent. The Drop trace is
+invoked when a packet (or a fragment) is discarded.
+
+
+Scope and Limitations
+=====================
+
+Future versions of this module will support :rfc:`6775`, however no timeframe is guaranteed.
+
+Using 6LoWPAN with IPv4 (or other L3 protocols)
+###############################################
+
+As the name implies, 6LoWPAN can handle only IPv6 packets. Any other protocol will be discarded.
+Moreover, 6LoWPAN assumes that the network is uniform, as is all the devices connected by the
+same same channel are using 6LoWPAN. Mixed environments are not supported by the standard.
+The reason is simple: 802.15.4 frame doesn't have a "protocol" field. As a consequence,
+there is no demultiplexing at MAC layer and the protocol carried by L2 frames must be known
+in advance.
+
+In the |ns3| implementation it is possible, but not advisable, to violate this requirement
+if the underlying NetDevice is capable of discriminating different protocols. As an example,
+CsmaNetDevice can carry IPv4 and 6LoWPAN at the same time. However, this configuration has 
+not been tested.
+
+References
+==========
+
+.. [RFC4944] :rfc:`4944`, "Transmission of IPv6 Packets over IEEE 802.15.4 Networks"
+.. [RFC6282] :rfc:`6282`, "Compression Format for IPv6 Datagrams over IEEE 802.15.4-Based Networks"
+.. [RFC6775] :rfc:`6775`, "Neighbor Discovery Optimization for IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs)"
+.. [IANA802] IANA, assigned IEEE 802 numbers: http://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xml
+.. [Ethertype] IEEE Ethertype numbers: http://standards.ieee.org/develop/regauth/ethertype/eth.txt
+
+Usage
+*****
+
+Enabling sixlowpan
+==================
+
+Add ``sixlowpan`` to the list of modules built with |ns3|.
+
+Helper
+======
+
+The helper is patterned after other device helpers. 
+
+Examples
+========
+
+The following example can be found in ``src/sixlowpan/examples/``:
+
+* ``example-sixlowpan.cc``:  A simple example showing end-to-end data transfer.
+
+In particular, the example enables a very simplified end-to-end data
+transfer scenario, with a CSMA network forced to carry 6LoWPAN compressed packets.
+
+
+Tests
+=====
+
+The test provided checks the connection between two UDP clients and the correctness of the received packets.
+
+Validation
+**********
+
+The model has been validated against WireShark, checking whatever the packets are correctly
+interpreted and validated.
+
+
diff -Naur ns-3.18.1/src/sixlowpan/examples/example-sixlowpan.cc ns-3.19/src/sixlowpan/examples/example-sixlowpan.cc
--- ns-3.18.1/src/sixlowpan/examples/example-sixlowpan.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/examples/example-sixlowpan.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,139 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+
+// Network topology
+//
+//      n0                                      n1
+//  +---------+                             +--------+
+//  | UDP     |             r               | UDP    |
+//  +---------+    +---------+--------+     +--------+
+//  | IPv6    |    | IPv6    | IPv6   |     | IPv6   |
+//  +---------+    +---------+        |     |        |
+//  | 6LoWPAN |    | 6LoWPAN |        |     |        |
+//  +---------+    +---------+--------+     +--------+
+//  | CSMA    |    | CSMA    | CSMA   |     | CSMA   |
+//  +---------+    +---------+--------+     +--------+
+//       |              |        |               |
+//       ================        =================
+//
+// - Tracing of queues and packet receptions to file "example-sixlowpan.tr"
+// Note that the Pcap packet dissection will not be very meaningful.
+// See the module's documentation for a discussion about this.
+
+#include <fstream>
+#include "ns3/core-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/csma-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/ipv6-static-routing-helper.h"
+
+#include "ns3/ipv6-routing-table-entry.h"
+#include "ns3/sixlowpan-module.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("ExampleSixlowpan")
+  ;
+
+int main (int argc, char** argv)
+{
+  bool verbose = false;
+
+  CommandLine cmd;
+  cmd.AddValue ("verbose", "turn on some relevant log components", verbose);
+  cmd.Parse (argc, argv);
+
+  if (verbose)
+    {
+      LogComponentEnable ("SixLowPanNetDevice", LOG_LEVEL_ALL);
+      LogComponentEnable ("Ping6Application", LOG_LEVEL_ALL);
+    }
+
+  Packet::EnablePrinting ();
+  Packet::EnableChecking ();
+
+  NS_LOG_INFO ("Create nodes.");
+  Ptr<Node> n0 = CreateObject<Node> ();
+  Ptr<Node> r = CreateObject<Node> ();
+  Ptr<Node> n1 = CreateObject<Node> ();
+
+
+  NodeContainer net1 (n0, r);
+  NodeContainer net2 (r, n1);
+  NodeContainer all (n0, r, n1);
+
+  NS_LOG_INFO ("Create IPv6 Internet Stack");
+  InternetStackHelper internetv6;
+  internetv6.Install (all);
+
+  NS_LOG_INFO ("Create channels.");
+  CsmaHelper csma;
+  csma.SetChannelAttribute ("DataRate", DataRateValue (5000000));
+  csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
+  NetDeviceContainer d2 = csma.Install (net2);
+  csma.SetDeviceAttribute ("Mtu", UintegerValue (150));
+  NetDeviceContainer d1 = csma.Install (net1);
+
+  SixLowPanHelper sixlowpan;
+  sixlowpan.SetDeviceAttribute ("ForceEtherType", BooleanValue (true) );
+  NetDeviceContainer six1 = sixlowpan.Install (d1);
+
+  NS_LOG_INFO ("Create networks and assign IPv6 Addresses.");
+  Ipv6AddressHelper ipv6;
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
+  Ipv6InterfaceContainer i1 = ipv6.Assign (six1);
+  i1.SetForwarding (1, true);
+  i1.SetDefaultRouteInAllNodes (1);
+
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
+  Ipv6InterfaceContainer i2 = ipv6.Assign (d2);
+  i2.SetForwarding (0, true);
+  i2.SetDefaultRouteInAllNodes (0);
+
+  /* Create a Ping6 application to send ICMPv6 echo request from n0 to n1 via r */
+  uint32_t packetSize = 200;
+  uint32_t maxPacketCount = 50;
+  Time interPacketInterval = Seconds (1.);
+  Ping6Helper ping6;
+
+  ping6.SetLocal (i1.GetAddress (0, 1));
+  ping6.SetRemote (i2.GetAddress (1, 1));
+
+  ping6.SetAttribute ("MaxPackets", UintegerValue (maxPacketCount));
+  ping6.SetAttribute ("Interval", TimeValue (interPacketInterval));
+  ping6.SetAttribute ("PacketSize", UintegerValue (packetSize));
+  ApplicationContainer apps = ping6.Install (net1.Get (0));
+
+  apps.Start (Seconds (5.0));
+  apps.Stop (Seconds (15.0));
+
+
+  AsciiTraceHelper ascii;
+  csma.EnableAsciiAll (ascii.CreateFileStream ("example-sixlowpan.tr"));
+  csma.EnablePcapAll (std::string ("example-sixlowpan"), true);
+
+  Simulator::Stop (Seconds (100));
+  NS_LOG_INFO ("Run Simulation.");
+  Simulator::Run ();
+  Simulator::Destroy ();
+  NS_LOG_INFO ("Done.");
+}
+
diff -Naur ns-3.18.1/src/sixlowpan/examples/wscript ns-3.19/src/sixlowpan/examples/wscript
--- ns-3.18.1/src/sixlowpan/examples/wscript	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/examples/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,9 @@
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+def build(bld):
+    if not bld.env['ENABLE_EXAMPLES']:
+        return;
+
+    obj = bld.create_ns3_program('example-sixlowpan',
+                                 ['network', 'sixlowpan', 'internet', 'csma'])
+    obj.source = 'example-sixlowpan.cc'
diff -Naur ns-3.18.1/src/sixlowpan/helper/sixlowpan-helper.cc ns-3.19/src/sixlowpan/helper/sixlowpan-helper.cc
--- ns-3.18.1/src/sixlowpan/helper/sixlowpan-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/helper/sixlowpan-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,83 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include "sixlowpan-helper.h"
+#include "ns3/log.h"
+#include "ns3/sixlowpan-net-device.h"
+#include "ns3/node.h"
+#include "ns3/names.h"
+
+NS_LOG_COMPONENT_DEFINE ("SixLowPanHelper")
+  ;
+
+namespace ns3 {
+
+SixLowPanHelper::SixLowPanHelper ()
+{
+  NS_LOG_FUNCTION (this);
+  m_deviceFactory.SetTypeId ("ns3::SixLowPanNetDevice");
+}
+
+void SixLowPanHelper::SetDeviceAttribute (std::string n1,
+                                          const AttributeValue &v1)
+{
+  NS_LOG_FUNCTION (this);
+  m_deviceFactory.Set (n1, v1);
+}
+
+NetDeviceContainer SixLowPanHelper::Install (const NetDeviceContainer c)
+{
+  NS_LOG_FUNCTION (this);
+
+  NetDeviceContainer devs;
+
+  for (uint32_t i = 0; i < c.GetN (); ++i)
+    {
+      Ptr<NetDevice> device = c.Get (i);
+      NS_ASSERT_MSG (device != 0, "No NetDevice found in the node " << int(i) );
+
+      Ptr<Node> node = device->GetNode ();
+      NS_LOG_LOGIC ("**** Install 6LoWPAN on node " << node->GetId ());
+
+      Ptr<SixLowPanNetDevice> dev = m_deviceFactory.Create<SixLowPanNetDevice> ();
+      devs.Add (dev);
+      node->AddDevice (dev);
+      dev->SetNetDevice (device);
+    }
+  return devs;
+}
+
+int64_t SixLowPanHelper::AssignStreams (NetDeviceContainer c, int64_t stream)
+{
+  int64_t currentStream = stream;
+  Ptr<NetDevice> netDevice;
+  for (NetDeviceContainer::Iterator i = c.Begin (); i != c.End (); ++i)
+    {
+      netDevice = (*i);
+      Ptr<SixLowPanNetDevice> dev = DynamicCast<SixLowPanNetDevice> (netDevice);
+      if (dev)
+        {
+          currentStream += dev->AssignStreams (currentStream);
+        }
+    }
+  return (currentStream - stream);
+}
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/sixlowpan/helper/sixlowpan-helper.h ns-3.19/src/sixlowpan/helper/sixlowpan-helper.h
--- ns-3.18.1/src/sixlowpan/helper/sixlowpan-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/helper/sixlowpan-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,102 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#ifndef SIXLOWPAN_HELPER_H
+#define SIXLOWPAN_HELPER_H
+
+#include "ns3/net-device-container.h"
+#include "ns3/object-factory.h"
+#include <string>
+
+namespace ns3 {
+
+class Node;
+class AttributeValue;
+
+/**
+ * \ingroup sixlowpan
+ *
+ * \brief Setup a sixlowpan stack to be used as a shim between IPv6 and a generic NetDevice.
+ */
+class SixLowPanHelper
+{
+public:
+  /*
+   * Construct a SixlowpanHelper
+   */
+  SixLowPanHelper ();
+  /**
+   * Set an attribute on each ns3::SixlowpanNetDevice created by
+   * SixlowpanHelper::Install.
+   *
+   * \param n1 the name of the attribute to set
+   * \param v1 the value of the attribute to set
+   */
+  void SetDeviceAttribute (std::string n1,
+                           const AttributeValue &v1);
+
+  /**
+   * \brief Install the SixLoWPAN stack on top of an existing NetDevice.
+   *
+   * This function requires a set of properly configured NetDevices
+   * passed in as the parameter "c". The new NetDevices will have to
+   * be used instead of the original ones. In this way these
+   * SixLoWPAN devices will behave as shims between the NetDevices
+   * passed in and IPv6.
+   *
+   * Note that only IPv6 (and related protocols, such as ICMPv6) can
+   * be transmitted over a 6LoWPAN interface.
+   * Any other protocol (e.g., IPv4) will be discarded by 6LoWPAN.
+   *
+   * Other protocols (e.g., IPv4) could be used on the original NetDevices
+   * with some limitations.
+   * See the manual for a complete discussion.
+   *
+   * \note IPv6 stack must be installed \a after SixLoWPAN,
+   * using the SixLoWPAN NetDevices. See the example in the
+   * examples directory.
+   *
+   *
+   * \param c the NetDevice container
+   * \return a container with the newly created SixLowPanNetDevices
+   */
+  NetDeviceContainer Install (NetDeviceContainer c);
+
+  /**
+  * Assign a fixed random variable stream number to the random variables
+  * used by this model. Return the number of streams (possibly zero) that
+  * have been assigned. The Install() method should have previously been
+  * called by the user.
+  *
+  * \param c NetDeviceContainer of the set of net devices for which the
+  *          SixLowPanNetDevice should be modified to use a fixed stream
+  * \param stream first stream index to use
+  * \return the number of stream indices assigned by this helper
+  */
+  int64_t AssignStreams (NetDeviceContainer c, int64_t stream);
+
+private:
+  ObjectFactory m_deviceFactory; //!< Object factory
+};
+
+} // namespace ns3
+
+
+#endif /* SIXLOWPAN_HELPER_H */
diff -Naur ns-3.18.1/src/sixlowpan/model/sixlowpan-header.cc ns-3.19/src/sixlowpan/model/sixlowpan-header.cc
--- ns-3.18.1/src/sixlowpan/model/sixlowpan-header.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/model/sixlowpan-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,1747 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ *         Michele Muccio <michelemuccio@virgilio.it>
+ */
+
+#include "ns3/assert.h"
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "ns3/address-utils.h"
+#include "sixlowpan-header.h"
+
+
+namespace ns3 {
+
+/*
+ * SixLowPanDispatch
+ */
+
+
+SixLowPanDispatch::SixLowPanDispatch ()
+{
+}
+
+
+SixLowPanDispatch::Dispatch_e
+SixLowPanDispatch::GetDispatchType (uint8_t dispatch)
+{
+  if (dispatch <= LOWPAN_NALP_N)
+    {
+      return LOWPAN_NALP;
+    }
+  else if (dispatch == LOWPAN_NOTCOMPRESSED)
+    {
+      return LOWPAN_NOTCOMPRESSED;
+    }
+  else if (dispatch == LOWPAN_HC1)
+    {
+      return LOWPAN_HC1;
+    }
+  else if (dispatch == LOWPAN_BC0)
+    {
+      return LOWPAN_BC0;
+    }
+  else if ((dispatch >= LOWPAN_IPHC) && (dispatch <= LOWPAN_IPHC_N))
+    {
+      return LOWPAN_IPHC;
+    }
+  else if ((dispatch >= LOWPAN_MESH) && (dispatch <= LOWPAN_MESH_N))
+    {
+      return LOWPAN_MESH;
+    }
+  else if ((dispatch >= LOWPAN_FRAG1) && (dispatch <= LOWPAN_FRAG1_N))
+    {
+      return LOWPAN_FRAG1;
+    }
+  else if ((dispatch >= LOWPAN_FRAGN) && (dispatch <= LOWPAN_FRAGN_N))
+    {
+      return LOWPAN_FRAGN;
+    }
+  return LOWPAN_UNSUPPORTED;
+}
+
+SixLowPanDispatch::NhcDispatch_e
+SixLowPanDispatch::GetNhcDispatchType (uint8_t dispatch)
+{
+  if ((dispatch >= LOWPAN_NHC) && (dispatch <= LOWPAN_NHC_N))
+    {
+      return LOWPAN_NHC;
+    }
+  else if ((dispatch >= LOWPAN_UDPNHC) && (dispatch <= LOWPAN_UDPNHC_N))
+    {
+      return LOWPAN_UDPNHC;
+    }
+  return LOWPAN_NHCUNSUPPORTED;
+}
+
+
+/*
+ * SixLowPanHc1
+ */
+NS_OBJECT_ENSURE_REGISTERED (SixLowPanHc1)
+  ;
+
+SixLowPanHc1::SixLowPanHc1 ()
+  : m_hopLimit (0)
+{
+}
+
+TypeId SixLowPanHc1::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SixLowPanHc1").SetParent<Header> ().AddConstructor<SixLowPanHc1> ();
+  return tid;
+}
+
+TypeId SixLowPanHc1::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void SixLowPanHc1::Print (std::ostream & os) const
+{
+  uint8_t encoding;
+  encoding = m_srcCompression;
+  encoding <<= 2;
+  encoding |= m_dstCompression;
+  encoding <<= 1;
+  encoding |= m_tcflCompression;
+  encoding <<= 2;
+  encoding |= m_nextHeaderCompression;
+  encoding <<= 1;
+  encoding |= m_hc2HeaderPresent;
+
+  os << "encoding " << int(encoding) << ", hopLimit " << int(m_hopLimit);
+}
+
+uint32_t SixLowPanHc1::GetSerializedSize () const
+{
+  uint32_t serializedSize = 3;
+
+  switch (m_srcCompression)
+    {
+    case HC1_PIII:
+      serializedSize += 16;
+      break;
+    case HC1_PIIC:
+      serializedSize += 8;
+      break;
+    case HC1_PCII:
+      serializedSize += 8;
+      break;
+    case HC1_PCIC:
+      break;
+    }
+  switch (m_dstCompression)
+    {
+    case HC1_PIII:
+      serializedSize += 16;
+      break;
+    case HC1_PIIC:
+      serializedSize += 8;
+      break;
+    case HC1_PCII:
+      serializedSize += 8;
+      break;
+    case HC1_PCIC:
+      break;
+    }
+
+  if (m_tcflCompression == false )
+    {
+      serializedSize += 4;
+    }
+
+  if (m_nextHeaderCompression == HC1_NC )
+    {
+      serializedSize++;
+    }
+
+  return serializedSize;
+}
+
+void SixLowPanHc1::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
+  uint8_t encoding;
+  encoding = m_srcCompression;
+  encoding <<= 2;
+  encoding |= m_dstCompression;
+  encoding <<= 1;
+  encoding |= m_tcflCompression;
+  encoding <<= 2;
+  encoding |= m_nextHeaderCompression;
+  encoding <<= 1;
+  encoding |= m_hc2HeaderPresent;
+
+  i.WriteU8 (SixLowPanDispatch::LOWPAN_HC1);
+  i.WriteU8 (encoding);
+  i.WriteU8 (m_hopLimit);
+  switch (m_srcCompression)
+    {
+    case HC1_PIII:
+      for ( int j = 0; j < 8; j++ )
+        {
+          i.WriteU8 (m_srcPrefix[j]);
+        }
+      for ( int j = 0; j < 8; j++ )
+        {
+          i.WriteU8 (m_srcInterface[j]);
+        }
+      break;
+    case HC1_PIIC:
+      for ( int j = 0; j < 8; j++ )
+        {
+          i.WriteU8 (m_srcPrefix[j]);
+        }
+      break;
+    case HC1_PCII:
+      for ( int j = 0; j < 8; j++ )
+        {
+          i.WriteU8 (m_srcInterface[j]);
+        }
+      break;
+    case HC1_PCIC:
+      break;
+    }
+  switch (m_dstCompression)
+    {
+    case HC1_PIII:
+      for ( int j = 0; j < 8; j++ )
+        {
+          i.WriteU8 (m_dstPrefix[j]);
+        }
+      for ( int j = 0; j < 8; j++ )
+        {
+          i.WriteU8 (m_dstInterface[j]);
+        }
+      break;
+    case HC1_PIIC:
+      for ( int j = 0; j < 8; j++ )
+        {
+          i.WriteU8 (m_dstPrefix[j]);
+        }
+      break;
+    case HC1_PCII:
+      for ( int j = 0; j < 8; j++ )
+        {
+          i.WriteU8 (m_dstInterface[j]);
+        }
+      break;
+    case HC1_PCIC:
+      break;
+    }
+
+  if ( m_tcflCompression == false )
+    {
+      i.WriteU8 (m_trafficClass);
+      uint8_t temp[3];
+      temp[0] = uint8_t (m_flowLabel & 0xff);
+      temp[1] = uint8_t ((m_flowLabel >> 8) & 0xff);
+      temp[2] = uint8_t ((m_flowLabel >> 16) & 0xff);
+      i.Write (temp, 3);
+    }
+
+  if (m_nextHeaderCompression == HC1_NC )
+    {
+      i.WriteU8 (m_nextHeader);
+    }
+
+  // TODO: HC2 is not yet supported. Should be.
+  NS_ASSERT_MSG ( m_hc2HeaderPresent != true, "Can not compress HC2, exiting. Very sorry." );
+}
+
+uint32_t SixLowPanHc1::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+  uint32_t serializedSize = 3;
+
+  uint8_t dispatch = i.ReadU8 ();
+  if (dispatch != SixLowPanDispatch::LOWPAN_HC1)
+    {
+      return 0;
+    }
+
+  uint8_t encoding = i.ReadU8 ();
+  m_hopLimit = i.ReadU8 ();
+
+  m_srcCompression = LowPanHc1Addr_e (encoding >> 6);
+  m_dstCompression = LowPanHc1Addr_e ( (encoding >> 4) & 0x3);
+  m_tcflCompression = (encoding >> 3) & 0x1;
+  m_nextHeaderCompression = LowPanHc1NextHeader_e ( (encoding >> 1) & 0x3);
+  m_hc2HeaderPresent = encoding & 0x1;
+
+  switch (m_srcCompression)
+    {
+    case HC1_PIII:
+      for ( int j = 0; j < 8; j++)
+        {
+          m_srcPrefix[j] = i.ReadU8 ();
+        }
+      for ( int j = 0; j < 8; j++)
+        {
+          m_srcInterface[j] = i.ReadU8 ();
+        }
+      serializedSize += 16;
+      break;
+    case HC1_PIIC:
+      for ( int j = 0; j < 8; j++)
+        {
+          m_srcPrefix[j] = i.ReadU8 ();
+        }
+      serializedSize += 8;
+      break;
+    case HC1_PCII:
+      for ( int j = 0; j < 8; j++)
+        {
+          m_srcInterface[j] = i.ReadU8 ();
+        }
+      serializedSize += 8;
+      break;
+    case HC1_PCIC:
+      break;
+    }
+  switch (m_dstCompression)
+    {
+    case HC1_PIII:
+      for ( int j = 0; j < 8; j++)
+        {
+          m_dstPrefix[j] = i.ReadU8 ();
+        }
+      for ( int j = 0; j < 8; j++)
+        {
+          m_dstInterface[j] = i.ReadU8 ();
+        }
+      serializedSize += 16;
+      break;
+    case HC1_PIIC:
+      for ( int j = 0; j < 8; j++)
+        {
+          m_dstPrefix[j] = i.ReadU8 ();
+        }
+      serializedSize += 8;
+      break;
+    case HC1_PCII:
+      for ( int j = 0; j < 8; j++)
+        {
+          m_dstInterface[j] = i.ReadU8 ();
+        }
+      serializedSize += 8;
+      break;
+    case HC1_PCIC:
+      break;
+    }
+
+  if ( m_tcflCompression == false )
+    {
+      m_trafficClass = i.ReadU8 ();
+      uint8_t temp[3];
+      i.Read (temp, 3);
+      m_flowLabel = temp[2];
+      m_flowLabel = (m_flowLabel << 8) | temp[1];
+      m_flowLabel = (m_flowLabel << 8) | temp[0];
+      serializedSize += 4;
+    }
+
+  switch ( m_nextHeaderCompression )
+    {
+    case HC1_NC:
+      m_nextHeader = i.ReadU8 ();
+      serializedSize++;
+      break;
+    case HC1_TCP:
+      m_nextHeader = Ipv6Header::IPV6_TCP;
+      break;
+    case HC1_UDP:
+      m_nextHeader = Ipv6Header::IPV6_UDP;
+      break;
+    case HC1_ICMP:
+      m_nextHeader = Ipv6Header::IPV6_ICMPV6;
+      break;
+    }
+
+  NS_ASSERT_MSG ( m_hc2HeaderPresent != true, "Can not compress HC2, exiting. Very sorry." );
+
+  return GetSerializedSize ();
+}
+
+void SixLowPanHc1::SetHopLimit (uint8_t limit)
+{
+  m_hopLimit = limit;
+}
+
+uint8_t SixLowPanHc1::GetHopLimit () const
+{
+  return m_hopLimit;
+}
+
+SixLowPanHc1::LowPanHc1Addr_e SixLowPanHc1::GetDstCompression () const
+{
+  return m_dstCompression;
+}
+
+const uint8_t* SixLowPanHc1::GetDstInterface () const
+{
+  return m_dstInterface;
+}
+
+const uint8_t* SixLowPanHc1::GetDstPrefix () const
+{
+  return m_dstPrefix;
+}
+
+uint32_t SixLowPanHc1::GetFlowLabel () const
+{
+  return m_flowLabel;
+}
+
+uint8_t SixLowPanHc1::GetNextHeader () const
+{
+  return m_nextHeader;
+}
+
+SixLowPanHc1::LowPanHc1Addr_e SixLowPanHc1::GetSrcCompression () const
+{
+  return m_srcCompression;
+}
+
+const uint8_t* SixLowPanHc1::GetSrcInterface () const
+{
+  return m_srcInterface;
+}
+
+const uint8_t* SixLowPanHc1::GetSrcPrefix () const
+{
+  return m_srcPrefix;
+}
+
+uint8_t SixLowPanHc1::GetTrafficClass () const
+{
+  return m_trafficClass;
+}
+
+bool SixLowPanHc1::IsTcflCompression () const
+{
+  return m_tcflCompression;
+}
+
+bool SixLowPanHc1::IsHc2HeaderPresent () const
+{
+  return m_hc2HeaderPresent;
+}
+
+void SixLowPanHc1::SetDstCompression (LowPanHc1Addr_e dstCompression)
+{
+  m_dstCompression = dstCompression;
+}
+
+void SixLowPanHc1::SetDstInterface (const uint8_t* dstInterface)
+{
+  for ( int i = 0; i < 8; i++)
+    {
+      m_dstInterface[i] = dstInterface[i];
+    }
+}
+
+void SixLowPanHc1::SetDstPrefix (const uint8_t* dstPrefix)
+{
+  for ( int i = 0; i < 8; i++)
+    {
+      m_dstPrefix[i] = dstPrefix[i];
+    }
+}
+
+void SixLowPanHc1::SetFlowLabel (uint32_t flowLabel)
+{
+  m_flowLabel = flowLabel;
+}
+
+void SixLowPanHc1::SetNextHeader (uint8_t nextHeader)
+{
+  m_nextHeader = nextHeader;
+
+  switch (m_nextHeader)
+    {
+    case Ipv6Header::IPV6_UDP:
+      m_nextHeaderCompression = HC1_UDP;
+      break;
+    case Ipv6Header::IPV6_TCP:
+      m_nextHeaderCompression = HC1_TCP;
+      break;
+    case Ipv6Header::IPV6_ICMPV6:
+      m_nextHeaderCompression = HC1_ICMP;
+      break;
+    default:
+      m_nextHeaderCompression = HC1_NC;
+      break;
+    }
+}
+
+void SixLowPanHc1::SetSrcCompression (LowPanHc1Addr_e srcCompression)
+{
+  m_srcCompression = srcCompression;
+}
+
+void SixLowPanHc1::SetSrcInterface (const uint8_t* srcInterface)
+{
+  for ( int i = 0; i < 8; i++)
+    {
+      m_srcInterface[i] = srcInterface[i];
+    }
+}
+
+void SixLowPanHc1::SetSrcPrefix (const uint8_t* srcPrefix)
+{
+  for ( int i = 0; i < 8; i++)
+    {
+      m_srcPrefix[i] = srcPrefix[i];
+    }
+}
+
+void SixLowPanHc1::SetTcflCompression (bool tcflCompression)
+{
+  m_tcflCompression = tcflCompression;
+}
+
+void SixLowPanHc1::SetTrafficClass (uint8_t trafficClass)
+{
+  m_trafficClass = trafficClass;
+}
+
+
+void SixLowPanHc1::SetHc2HeaderPresent (bool hc2HeaderPresent)
+{
+  m_hc2HeaderPresent = hc2HeaderPresent;
+}
+
+
+std::ostream & operator << (std::ostream & os, const SixLowPanHc1 & h)
+{
+  h.Print (os);
+  return os;
+}
+
+/*
+ * SixLowPanFrag1
+ */
+NS_OBJECT_ENSURE_REGISTERED (SixLowPanFrag1)
+  ;
+
+SixLowPanFrag1::SixLowPanFrag1 ()
+  : m_datagramSize (0),
+    m_datagramTag (0)
+{
+}
+
+TypeId SixLowPanFrag1::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SixLowPanFrag1").SetParent<Header> ().AddConstructor<SixLowPanFrag1> ();
+  return tid;
+}
+
+TypeId SixLowPanFrag1::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void SixLowPanFrag1::Print (std::ostream & os) const
+{
+  os << "datagram size " << m_datagramSize << " tag " << m_datagramTag;
+}
+
+uint32_t SixLowPanFrag1::GetSerializedSize () const
+{
+  return 4;
+}
+
+void SixLowPanFrag1::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
+
+  uint16_t temp = m_datagramSize | ( uint16_t (SixLowPanDispatch::LOWPAN_FRAG1) << 8 );
+
+  i.WriteU8 (uint8_t (temp >> 8));
+  i.WriteU8 (uint8_t (temp & 0xff));
+
+  i.WriteU16 (m_datagramTag);
+}
+
+uint32_t SixLowPanFrag1::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+
+  uint8_t temp = i.ReadU8 ();
+  m_datagramSize = (uint16_t (temp) << 8) | i.ReadU8 ();
+  m_datagramSize &= 0x7FF;
+
+  m_datagramTag = i.ReadU16 ();
+  return GetSerializedSize ();
+}
+
+void SixLowPanFrag1::SetDatagramSize (uint16_t datagramSize)
+{
+  m_datagramSize = datagramSize & 0x7FF;
+}
+
+uint16_t SixLowPanFrag1::GetDatagramSize () const
+{
+  return m_datagramSize & 0x7FF;
+}
+
+void SixLowPanFrag1::SetDatagramTag (uint16_t datagramTag)
+{
+  m_datagramTag = datagramTag;
+}
+
+uint16_t SixLowPanFrag1::GetDatagramTag () const
+{
+  return m_datagramTag;
+}
+
+std::ostream & operator << (std::ostream & os, const SixLowPanFrag1 & h)
+{
+  h.Print (os);
+  return os;
+}
+
+
+/*
+ * SixLowPanFragN
+ */
+
+NS_OBJECT_ENSURE_REGISTERED (SixLowPanFragN)
+  ;
+
+SixLowPanFragN::SixLowPanFragN ()
+  : m_datagramSize (0),
+    m_datagramTag (0),
+    m_datagramOffset (0)
+{
+}
+/*
+ * SixLowPanFragmentOffset
+ */
+TypeId SixLowPanFragN::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SixLowPanFragN").SetParent<Header> ().AddConstructor<SixLowPanFragN> ();
+  return tid;
+}
+
+TypeId SixLowPanFragN::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void SixLowPanFragN::Print (std::ostream & os) const
+{
+  os << "datagram size " << m_datagramSize << " tag " << m_datagramTag << " offset " << int(m_datagramOffset);
+}
+
+uint32_t SixLowPanFragN::GetSerializedSize () const
+{
+  return 5;
+}
+
+void SixLowPanFragN::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
+
+  uint16_t temp = m_datagramSize | ( uint16_t (SixLowPanDispatch::LOWPAN_FRAGN) << 8 );
+
+  i.WriteU8 (uint8_t (temp >> 8));
+  i.WriteU8 (uint8_t (temp & 0xff));
+
+  i.WriteU16 (m_datagramTag);
+  i.WriteU8 (m_datagramOffset);
+}
+
+uint32_t SixLowPanFragN::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+
+  uint8_t temp = i.ReadU8 ();
+  m_datagramSize = (uint16_t (temp) << 8) | i.ReadU8 ();
+  m_datagramSize &= 0x7FF;
+
+  m_datagramTag = i.ReadU16 ();
+  m_datagramOffset = i.ReadU8 ();
+
+  return GetSerializedSize ();
+}
+
+void SixLowPanFragN::SetDatagramSize (uint16_t datagramSize)
+{
+  m_datagramSize = datagramSize & 0x7FF;
+}
+
+uint16_t SixLowPanFragN::GetDatagramSize () const
+{
+  return m_datagramSize & 0x7FF;
+}
+
+void SixLowPanFragN::SetDatagramTag (uint16_t datagramTag)
+{
+  m_datagramTag = datagramTag;
+}
+
+uint16_t SixLowPanFragN::GetDatagramTag () const
+{
+  return m_datagramTag;
+}
+
+void SixLowPanFragN::SetDatagramOffset (uint8_t datagramOffset)
+{
+  m_datagramOffset = datagramOffset;
+}
+
+uint8_t SixLowPanFragN::GetDatagramOffset () const
+{
+  return m_datagramOffset;
+}
+
+std::ostream & operator << (std::ostream & os, const SixLowPanFragN & h)
+{
+  h.Print (os);
+  return os;
+}
+
+/*
+ * SixLowPanIphcHeader
+ */
+NS_OBJECT_ENSURE_REGISTERED (SixLowPanIphc)
+  ;
+
+SixLowPanIphc::SixLowPanIphc ()
+{
+  // 011x xxxx xxxx xxxx
+  m_baseFormat = 0x6000;
+}
+
+SixLowPanIphc::SixLowPanIphc (uint8_t dispatch)
+{
+  // 011x xxxx xxxx xxxx
+  m_baseFormat = dispatch;
+  m_baseFormat <<= 8;
+}
+
+TypeId SixLowPanIphc::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SixLowPanIphc").SetParent<Header> ().AddConstructor<SixLowPanIphc> ();
+  return tid;
+}
+
+TypeId SixLowPanIphc::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void SixLowPanIphc::Print (std::ostream & os) const
+{
+  os << "Compression kind: " << m_baseFormat;
+}
+
+uint32_t SixLowPanIphc::GetSerializedSize () const
+{
+  uint32_t serializedSize = 2;
+
+  if ( GetCid () )
+    {
+      serializedSize++;
+    }
+  switch ( GetTf () )
+    {
+    case TF_FULL:
+      serializedSize += 4;
+      break;
+    case TF_DSCP_ELIDED:
+      serializedSize += 3;
+      break;
+    case TF_FL_ELIDED:
+      serializedSize++;
+      break;
+    default:
+      break;
+    }
+  if ( GetNh () == false )
+    {
+      serializedSize++;
+    }
+  if ( GetHlim () == HLIM_INLINE)
+    {
+      serializedSize++;
+    }
+  switch (GetSam () )
+    {
+    case HC_INLINE:
+      if ( GetSac () == false )
+        {
+          serializedSize += 16;
+        }
+      break;
+    case HC_COMPR_64:
+      serializedSize += 8;
+      break;
+    case HC_COMPR_16:
+      serializedSize += 2;
+      break;
+    case HC_COMPR_0:
+    default:
+      break;
+    }
+  if ( GetM () == false)
+    {
+      switch (GetDam () )
+        {
+        case HC_INLINE:
+          if ( GetDac () == false )
+            {
+              serializedSize += 16;
+            }
+          break;
+        case HC_COMPR_64:
+          serializedSize += 8;
+          break;
+        case HC_COMPR_16:
+          serializedSize += 2;
+          break;
+        case HC_COMPR_0:
+        default:
+          break;
+        }
+    }
+  else
+    {
+      switch (GetDam () )
+        {
+        case HC_INLINE:
+          if ( GetDac () == false )
+            {
+              serializedSize += 16;
+            }
+          else
+            {
+              serializedSize += 6;
+            }
+          break;
+        case HC_COMPR_64:
+          if ( GetDac () == false )
+            {
+              serializedSize += 6;
+            }
+          break;
+        case HC_COMPR_16:
+          if ( GetDac () == false )
+            {
+              serializedSize += 4;
+            }
+          break;
+        case HC_COMPR_0:
+        default:
+          if ( GetDac () == false )
+            {
+              serializedSize++;
+            }
+          break;
+        }
+    }
+
+
+
+  return serializedSize;
+}
+
+void SixLowPanIphc::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
+
+  i.WriteHtonU16 (m_baseFormat);
+
+  if ( GetCid () )
+    {
+      i.WriteU8 (m_srcdstContextId);
+    }
+  // Traffic Class and Flow Label
+  switch ( GetTf () )
+    {
+      uint8_t temp;
+    case TF_FULL:
+      temp = (m_ecn << 6) | m_dscp;
+      i.WriteU8 (temp);
+      temp = m_flowLabel >> 16;
+      i.WriteU8 (temp);
+      temp = (m_flowLabel >> 8) & 0xff;
+      i.WriteU8 (temp);
+      temp = m_flowLabel & 0xff;
+      i.WriteU8 (temp);
+      break;
+    case TF_DSCP_ELIDED:
+      temp = (m_ecn << 6) | (m_flowLabel >> 16 );
+      i.WriteU8 (temp);
+      temp = (m_flowLabel >> 8) & 0xff;
+      i.WriteU8 (temp);
+      temp = m_flowLabel & 0xff;
+      i.WriteU8 (temp);
+      break;
+    case TF_FL_ELIDED:
+      temp = (m_ecn << 6) | m_dscp;
+      i.WriteU8 (temp);
+      break;
+    default:
+      break;
+    }
+  // Next Header
+  if ( GetNh () == false )
+    {
+      i.WriteU8 (m_nextHeader);
+    }
+  // Hop Limit
+  if ( GetHlim () == HLIM_INLINE )
+    {
+      i.WriteU8 (m_hopLimit);
+    }
+  // Source Address
+  switch (GetSam () )
+    {
+      uint8_t temp[16];
+    case HC_INLINE:
+      if ( GetSac () == false )
+        {
+          uint8_t temp[16];
+          m_srcAddress.Serialize (temp);
+          i.Write (temp, 16);
+        }
+      break;
+    case HC_COMPR_64:
+      m_srcAddress.Serialize (temp);
+      i.Write (temp + 8, 8);
+      break;
+    case HC_COMPR_16:
+      m_srcAddress.Serialize (temp);
+      i.Write (temp + 14, 2);
+      break;
+    case HC_COMPR_0:
+    default:
+      break;
+    }
+  // Destination Address
+  if ( GetM () == false)
+    {
+      uint8_t temp[16];
+      switch (GetDam () )
+        {
+        case HC_INLINE:
+          if ( GetDac () == false )
+            {
+              m_dstAddress.Serialize (temp);
+              i.Write (temp, 16);
+            }
+          break;
+        case HC_COMPR_64:
+          m_dstAddress.Serialize (temp);
+          i.Write (temp + 8, 8);
+          break;
+        case HC_COMPR_16:
+          m_dstAddress.Serialize (temp);
+          i.Write (temp + 14, 2);
+          break;
+        case HC_COMPR_0:
+        default:
+          break;
+        }
+    }
+  else
+    {
+      switch (GetDam () )
+        {
+          uint8_t temp[16];
+        case HC_INLINE:
+          if ( GetDac () == false )
+            {
+              m_dstAddress.Serialize (temp);
+              i.Write (temp, 16);
+            }
+          else
+            {
+              m_dstAddress.Serialize (temp);
+              i.Write (temp + 1, 2);
+              i.Write (temp + 12, 4);
+            }
+          break;
+        case HC_COMPR_64:
+          if ( GetDac () == false )
+            {
+              m_dstAddress.Serialize (temp);
+              i.Write (temp + 1, 1);
+              i.Write (temp + 11, 5);
+            }
+          break;
+        case HC_COMPR_16:
+          if ( GetDac () == false )
+            {
+              m_dstAddress.Serialize (temp);
+              i.Write (temp + 1, 1);
+              i.Write (temp + 13, 3);
+            }
+          break;
+        case HC_COMPR_0:
+        default:
+          if ( GetDac () == false )
+            {
+              m_dstAddress.Serialize (temp);
+              i.WriteU8 (temp[15]);
+            }
+          break;
+        }
+    }
+}
+
+uint32_t SixLowPanIphc::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+
+  m_baseFormat = i.ReadNtohU16 ();
+
+  if ( GetCid () )
+    {
+      m_srcdstContextId = i.ReadU8 ();
+    }
+  // Traffic Class and Flow Label
+  switch ( GetTf () )
+    {
+      uint8_t temp;
+    case TF_FULL:
+      temp = i.ReadU8 ();
+      m_ecn = temp >> 6;
+      m_dscp = temp & 0x3F;
+      temp = i.ReadU8 ();
+      m_flowLabel = temp;
+      temp = i.ReadU8 ();
+      m_flowLabel = (m_flowLabel << 8) | temp;
+      temp = i.ReadU8 ();
+      m_flowLabel = (m_flowLabel << 8) | temp;
+      break;
+    case TF_DSCP_ELIDED:
+      temp = i.ReadU8 ();
+      m_ecn = temp >> 6;
+      m_flowLabel = temp & 0x3F;
+      temp = i.ReadU8 ();
+      m_flowLabel = (m_flowLabel << 8) | temp;
+      temp = i.ReadU8 ();
+      m_flowLabel = (m_flowLabel << 8) | temp;
+      break;
+    case TF_FL_ELIDED:
+      temp = i.ReadU8 ();
+      m_ecn = temp >> 6;
+      m_dscp = temp & 0x3F;
+      break;
+    default:
+      break;
+    }
+  // Next Header
+  if ( GetNh () == false )
+    {
+      m_nextHeader = i.ReadU8 ();
+    }
+  // Hop Limit
+  switch ( GetHlim () )
+    {
+    case HLIM_INLINE:
+      m_hopLimit = i.ReadU8 ();
+      break;
+    case HLIM_COMPR_1:
+      m_hopLimit = 1;
+      break;
+    case HLIM_COMPR_64:
+      m_hopLimit = 64;
+      break;
+    case HLIM_COMPR_255:
+    default:
+      m_hopLimit = 255;
+      break;
+
+    }
+  // Source Address
+  switch (GetSam () )
+    {
+      uint8_t temp[16];
+    case HC_INLINE:
+      if ( GetSac () == false )
+        {
+          i.Read (temp, 16);
+          m_srcAddress = Ipv6Address::Deserialize (temp);
+        }
+      break;
+    case HC_COMPR_64:
+      memset (temp, 0x00, sizeof (temp));
+      i.Read (temp + 8, 8);
+      temp[0] = 0xfe;
+      temp[1] = 0x80;
+      m_srcAddress = Ipv6Address::Deserialize (temp);
+      break;
+    case HC_COMPR_16:
+      memset (temp, 0x00, sizeof (temp));
+      i.Read (temp + 14, 2);
+      temp[0] = 0xfe;
+      temp[1] = 0x80;
+      temp[11] = 0xff;
+      temp[12] = 0xfe;
+      m_srcAddress = Ipv6Address::Deserialize (temp);
+      break;
+    case HC_COMPR_0:
+    default:
+      break;
+    }
+  if ( GetSac () == true )
+    {
+      PostProcessSac ();
+    }
+  // Destination Address
+  if ( GetM () == false)
+    {
+      uint8_t temp[16];
+      switch (GetDam () )
+        {
+        case HC_INLINE:
+          if ( GetDac () == false )
+            {
+              i.Read (temp, 16);
+              m_dstAddress = Ipv6Address::Deserialize (temp);
+            }
+          break;
+        case HC_COMPR_64:
+          memset (temp, 0x00, sizeof (temp));
+          i.Read (temp + 8, 8);
+          temp[0] = 0xfe;
+          temp[1] = 0x80;
+          m_dstAddress = Ipv6Address::Deserialize (temp);
+          break;
+        case HC_COMPR_16:
+          memset (temp, 0x00, sizeof (temp));
+          i.Read (temp + 14, 2);
+          temp[0] = 0xfe;
+          temp[1] = 0x80;
+          temp[11] = 0xff;
+          temp[12] = 0xfe;
+          m_dstAddress = Ipv6Address::Deserialize (temp);
+          break;
+        case HC_COMPR_0:
+        default:
+          break;
+        }
+    }
+  else
+    {
+      switch (GetDam () )
+        {
+          uint8_t temp[16];
+        case HC_INLINE:
+          if ( GetDac () == false )
+            {
+              i.Read (temp, 16);
+              m_dstAddress = Ipv6Address::Deserialize (temp);
+            }
+          else
+            {
+              memset (temp, 0x00, sizeof (temp));
+              i.Read (temp + 1, 2);
+              i.Read (temp + 12, 4);
+              temp[0] = 0xff;
+              m_dstAddress = Ipv6Address::Deserialize (temp);
+            }
+          break;
+        case HC_COMPR_64:
+          if ( GetDac () == false )
+            {
+              memset (temp, 0x00, sizeof (temp));
+              i.Read (temp + 1, 1);
+              i.Read (temp + 11, 5);
+              temp[0] = 0xff;
+              m_dstAddress = Ipv6Address::Deserialize (temp);
+            }
+          break;
+        case HC_COMPR_16:
+          if ( GetDac () == false )
+            {
+              memset (temp, 0x00, sizeof (temp));
+              i.Read (temp + 1, 1);
+              i.Read (temp + 13, 3);
+              temp[0] = 0xff;
+              m_dstAddress = Ipv6Address::Deserialize (temp);
+            }
+          break;
+        case HC_COMPR_0:
+        default:
+          if ( GetDac () == false )
+            {
+              memset (temp, 0x00, sizeof (temp));
+              temp[15] = i.ReadU8 ();
+              temp[0] = 0xff;
+              temp[1] = 0x02;
+              m_dstAddress = Ipv6Address::Deserialize (temp);
+            }
+          break;
+        }
+    }
+  if ( GetDac () == true )
+    {
+      PostProcessDac ();
+    }
+  return GetSerializedSize ();
+}
+
+void SixLowPanIphc::SetTf (TrafficClassFlowLabel_e tfField)
+{
+  uint16_t field = tfField;
+  m_baseFormat |= (field << 11);
+}
+
+SixLowPanIphc::TrafficClassFlowLabel_e SixLowPanIphc::GetTf (void) const
+{
+  return TrafficClassFlowLabel_e ((m_baseFormat >> 11) & 0x3);
+}
+
+void SixLowPanIphc::SetNh (bool nhField)
+{
+  uint16_t field = nhField;
+  m_baseFormat |= (field << 10);
+}
+
+bool SixLowPanIphc::GetNh (void) const
+{
+  return ((m_baseFormat >> 10) & 0x1);
+}
+
+void SixLowPanIphc::SetHlim (Hlim_e hlimField)
+{
+  uint16_t field = hlimField;
+  m_baseFormat |= (field << 8);
+}
+
+SixLowPanIphc::Hlim_e SixLowPanIphc::GetHlim (void) const
+{
+  return Hlim_e ((m_baseFormat >> 8) & 0x3);
+}
+
+void SixLowPanIphc::SetCid (bool cidField)
+{
+  uint16_t field = cidField;
+  m_baseFormat |= (field << 7);
+}
+
+bool SixLowPanIphc::GetCid (void) const
+{
+  return ((m_baseFormat >> 7) & 0x1);
+}
+
+void SixLowPanIphc::SetSac (bool sacField)
+{
+  uint16_t field = sacField;
+  m_baseFormat |= (field << 6);
+}
+
+bool SixLowPanIphc::GetSac (void) const
+{
+  return ((m_baseFormat >> 6) & 0x1);
+}
+
+void SixLowPanIphc::SetSam (HeaderCompression_e samField)
+{
+  uint16_t field = samField;
+  m_baseFormat |= (field << 4);
+}
+
+SixLowPanIphc::HeaderCompression_e SixLowPanIphc::GetSam (void) const
+{
+  return HeaderCompression_e ((m_baseFormat >> 4) & 0x3);
+}
+
+void SixLowPanIphc::SetM (bool mField)
+{
+  uint16_t field = mField;
+  m_baseFormat |= (field << 3);
+}
+
+bool SixLowPanIphc::GetM (void) const
+{
+  return ((m_baseFormat >> 3) & 0x1);
+}
+
+void SixLowPanIphc::SetDac (bool dacField)
+{
+  uint16_t field = dacField;
+  m_baseFormat |= (field << 2);
+}
+
+bool SixLowPanIphc::GetDac (void) const
+{
+  return ((m_baseFormat >> 2) & 0x1);
+}
+
+void SixLowPanIphc::SetDam (HeaderCompression_e damField)
+{
+  uint16_t field = damField;
+  m_baseFormat |= field;
+}
+
+SixLowPanIphc::HeaderCompression_e SixLowPanIphc::GetDam (void) const
+{
+  return HeaderCompression_e (m_baseFormat & 0x3);
+}
+
+void SixLowPanIphc::SetSrcContextId (uint8_t srcContextId)
+{
+  NS_ASSERT_MSG (srcContextId < 16,  "Src Context ID too large");
+  m_srcdstContextId |= srcContextId << 4;
+}
+
+uint8_t SixLowPanIphc::GetSrcContextId (void) const
+{
+  return ( m_srcdstContextId >> 4);
+}
+
+void SixLowPanIphc::SetDstContextId (uint8_t dstContextId)
+{
+  NS_ASSERT_MSG (dstContextId < 16,  "Dst Context ID too large");
+  m_srcdstContextId |= (dstContextId & 0xF);
+}
+
+uint8_t SixLowPanIphc::GetDstContextId (void) const
+{
+  return (m_srcdstContextId & 0xF);
+}
+
+void SixLowPanIphc::SetEcn (uint8_t ecn)
+{
+  NS_ASSERT_MSG (ecn < 4,  "ECN too large");
+  m_ecn = ecn;
+}
+
+uint8_t SixLowPanIphc::GetEcn (void) const
+{
+  return m_ecn;
+}
+
+void SixLowPanIphc::SetDscp (uint8_t dscp)
+{
+  NS_ASSERT_MSG (dscp < 64,  "DSCP too large");
+  m_dscp = dscp;
+}
+
+uint8_t SixLowPanIphc::GetDscp (void) const
+{
+  return m_dscp;
+}
+
+void SixLowPanIphc::SetFlowLabel (uint32_t flowLabel)
+{
+  NS_ASSERT_MSG (flowLabel < 0x100000,  "Flow Label too large");
+  m_flowLabel = flowLabel;
+}
+
+uint32_t SixLowPanIphc::GetFlowLabel (void) const
+{
+  return m_flowLabel;
+}
+
+void SixLowPanIphc::SetNextHeader (uint8_t nextHeader)
+{
+  m_nextHeader = nextHeader;
+}
+
+uint8_t SixLowPanIphc::GetNextHeader (void) const
+{
+  return m_nextHeader;
+}
+
+void SixLowPanIphc::SetHopLimit (uint8_t hopLimit)
+{
+  m_hopLimit = hopLimit;
+}
+
+uint8_t SixLowPanIphc::GetHopLimit (void) const
+{
+  return m_hopLimit;
+}
+
+void SixLowPanIphc::SetSrcAddress (Ipv6Address srcAddress)
+{
+  m_srcAddress = srcAddress;
+}
+
+Ipv6Address SixLowPanIphc::GetSrcAddress () const
+{
+  return m_srcAddress;
+}
+
+void SixLowPanIphc::SetDstAddress (Ipv6Address dstAddress)
+{
+  m_dstAddress = dstAddress;
+}
+
+Ipv6Address SixLowPanIphc::GetDstAddress () const
+{
+  return m_dstAddress;
+}
+
+void SixLowPanIphc::PostProcessSac ()
+{
+  NS_ABORT_MSG ("Unsupported; Context destination is not implemented");
+  return;
+}
+
+void SixLowPanIphc::PostProcessDac ()
+{
+  NS_ABORT_MSG ("Unsupported; Context destination is not implemented");
+  return;
+}
+
+std::ostream & operator << (std::ostream & os, const SixLowPanIphc & h)
+{
+  h.Print (os);
+  return os;
+}
+
+/*
+ * SixLowPanNhcExtensionHeader
+ */
+NS_OBJECT_ENSURE_REGISTERED (SixLowPanNhcExtension)
+  ;
+
+SixLowPanNhcExtension::SixLowPanNhcExtension ()
+{
+  // 1110 xxxx
+  m_nhcExtensionHeader = 0xE0;
+  m_nhcNextHeader = 0;
+  m_nhcBlobLength = 0;
+}
+
+TypeId SixLowPanNhcExtension::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SixLowPanNhcExtension")
+    .SetParent<Header> ()
+    .AddConstructor<SixLowPanNhcExtension> ();
+  return tid;
+}
+
+TypeId SixLowPanNhcExtension::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void SixLowPanNhcExtension::Print (std::ostream & os) const
+{
+  os << "Compression kind: " << int (m_nhcExtensionHeader) << " Size: " << int(GetSerializedSize ());
+}
+
+uint32_t SixLowPanNhcExtension::GetSerializedSize () const
+{
+  uint32_t serializedSize = 2;
+  if ( GetNh () == false )
+    {
+      serializedSize++;
+    }
+  return serializedSize + m_nhcBlobLength;
+}
+
+void SixLowPanNhcExtension::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
+  i.WriteU8 (m_nhcExtensionHeader);
+  if ( GetNh () == false )
+    {
+      i.WriteU8 (m_nhcNextHeader);
+    }
+  i.WriteU8 (m_nhcBlobLength);
+  i.Write (m_nhcBlob, m_nhcBlobLength);
+}
+
+uint32_t SixLowPanNhcExtension::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+  m_nhcExtensionHeader = i.ReadU8 ();
+  if ( GetNh () == false )
+    {
+      m_nhcNextHeader = i.ReadU8 ();
+    }
+  m_nhcBlobLength = i.ReadU8 ();
+  i.Read (m_nhcBlob, m_nhcBlobLength);
+
+  return GetSerializedSize ();
+}
+
+SixLowPanDispatch::NhcDispatch_e
+SixLowPanNhcExtension::GetNhcDispatchType (void) const
+{
+  return SixLowPanDispatch::LOWPAN_NHC;
+}
+
+void SixLowPanNhcExtension::SetEid (Eid_e extensionHeaderType)
+{
+  uint8_t field = extensionHeaderType;
+  m_nhcExtensionHeader |= (field << 1);
+}
+
+SixLowPanNhcExtension::Eid_e SixLowPanNhcExtension::GetEid (void) const
+{
+  return Eid_e ((m_nhcExtensionHeader >> 1) & 0x7);
+}
+
+void SixLowPanNhcExtension::SetNextHeader (uint8_t nextHeader)
+{
+  m_nhcNextHeader = nextHeader;
+}
+
+uint8_t SixLowPanNhcExtension::GetNextHeader (void) const
+{
+  return m_nhcNextHeader;
+}
+
+void SixLowPanNhcExtension::SetNh (bool nhField)
+{
+  uint8_t field = nhField;
+  m_nhcExtensionHeader |= field;
+}
+
+bool SixLowPanNhcExtension::GetNh (void) const
+{
+  return m_nhcExtensionHeader & 0x01;
+}
+
+void SixLowPanNhcExtension::SetBlob (const uint8_t* blob, uint32_t size)
+{
+  NS_ASSERT_MSG ( size < 255, "Buffer too long" );
+
+  m_nhcBlobLength = size;
+  std::memcpy (m_nhcBlob, blob, size);
+}
+
+uint32_t SixLowPanNhcExtension::CopyBlob (uint8_t* blob, uint32_t size) const
+{
+  NS_ASSERT_MSG ( size > m_nhcBlobLength, "Buffer too short" );
+
+  std::memcpy (blob, m_nhcBlob, m_nhcBlobLength);
+  return m_nhcBlobLength;
+}
+
+std::ostream & operator << (std::ostream & os, const SixLowPanNhcExtension & h)
+{
+  h.Print (os);
+  return os;
+}
+
+/*
+ * SixLowPanUdpNhcExtension
+ */
+NS_OBJECT_ENSURE_REGISTERED (SixLowPanUdpNhcExtension)
+  ;
+
+SixLowPanUdpNhcExtension::SixLowPanUdpNhcExtension ()
+{
+  // 1111 0xxx
+  m_baseFormat = 0xF0;
+  m_checksum = 0;
+  m_srcPort = 0;
+  m_dstPort = 0;
+}
+
+TypeId SixLowPanUdpNhcExtension::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SixLowPanUdpNhcExtension")
+    .SetParent<Header> ()
+    .AddConstructor<SixLowPanUdpNhcExtension> ();
+  return tid;
+}
+
+TypeId SixLowPanUdpNhcExtension::GetInstanceTypeId (void) const
+{
+  return GetTypeId ();
+}
+
+void SixLowPanUdpNhcExtension::Print (std::ostream & os) const
+{
+  os << "Compression kind: " << uint8_t (m_baseFormat);
+}
+
+uint32_t SixLowPanUdpNhcExtension::GetSerializedSize () const
+{
+  uint32_t serializedSize = 1;
+  if ( !GetC () )
+    {
+      serializedSize += 2;
+    }
+  switch (GetPorts ())
+    {
+    case PORTS_INLINE:
+      serializedSize += 4;
+      break;
+    case PORTS_ALL_SRC_LAST_DST:
+    case PORTS_LAST_SRC_ALL_DST:
+      serializedSize += 3;
+      break;
+    case PORTS_LAST_SRC_LAST_DST:
+      serializedSize += 1;
+      break;
+    default:
+      break;
+    }
+  return serializedSize;
+}
+
+void SixLowPanUdpNhcExtension::Serialize (Buffer::Iterator start) const
+{
+  Buffer::Iterator i = start;
+  i.WriteU8 (m_baseFormat);
+  uint8_t temp;
+
+  // Ports
+  switch ( GetPorts () )
+    {
+    case PORTS_INLINE:
+      i.WriteHtonU16 (m_srcPort);
+      i.WriteHtonU16 (m_dstPort);
+      break;
+    case PORTS_ALL_SRC_LAST_DST:
+      i.WriteHtonU16 (m_srcPort);
+      i.WriteU8 (m_dstPort & 0xff);
+      break;
+    case PORTS_LAST_SRC_ALL_DST:
+      i.WriteU8 (m_srcPort & 0xff);
+      i.WriteHtonU16 (m_dstPort);
+      break;
+    case PORTS_LAST_SRC_LAST_DST:
+      temp = ((m_srcPort & 0xf) << 4) | (m_dstPort & 0xf);
+      i.WriteU8 (temp);
+      break;
+    default:
+      break;
+    }
+
+  // Checksum
+  if ( !GetC () )
+    {
+      i.WriteU16 (m_checksum);
+    }
+
+}
+
+uint32_t SixLowPanUdpNhcExtension::Deserialize (Buffer::Iterator start)
+{
+  Buffer::Iterator i = start;
+  m_baseFormat = i.ReadU8 ();
+  uint8_t temp;
+
+  // Ports
+  switch ( GetPorts () )
+    {
+    case PORTS_INLINE:
+      m_srcPort = i.ReadNtohU16 ();
+      m_dstPort = i.ReadNtohU16 ();
+      break;
+    case PORTS_ALL_SRC_LAST_DST:
+      m_srcPort = i.ReadNtohU16 ();
+      m_dstPort = i.ReadU8 ();
+      break;
+    case PORTS_LAST_SRC_ALL_DST:
+      m_srcPort = i.ReadU8 ();
+      m_dstPort = i.ReadNtohU16 ();
+      break;
+    case PORTS_LAST_SRC_LAST_DST:
+      temp = i.ReadU8 ();
+      m_srcPort = temp >> 4;
+      m_dstPort = temp & 0xf;
+      break;
+    default:
+      break;
+    }
+
+  // Checksum
+  if ( !GetC () )
+    {
+      m_checksum = i.ReadU16 ();
+    }
+
+  return GetSerializedSize ();
+}
+
+SixLowPanDispatch::NhcDispatch_e
+SixLowPanUdpNhcExtension::GetNhcDispatchType (void) const
+{
+  return SixLowPanDispatch::LOWPAN_UDPNHC;
+}
+
+void SixLowPanUdpNhcExtension::SetPorts (Ports_e ports)
+{
+  uint16_t field = ports;
+  m_baseFormat |= field;
+}
+
+SixLowPanUdpNhcExtension::Ports_e SixLowPanUdpNhcExtension::GetPorts (void) const
+{
+  return Ports_e (m_baseFormat & 0x3);
+}
+
+void SixLowPanUdpNhcExtension::SetSrcPort (uint16_t srcport)
+{
+  m_srcPort = srcport;
+}
+
+uint16_t SixLowPanUdpNhcExtension::GetSrcPort (void) const
+{
+  return m_srcPort;
+}
+
+void SixLowPanUdpNhcExtension::SetDstPort (uint16_t dstport)
+{
+  m_dstPort = dstport;
+}
+
+uint16_t SixLowPanUdpNhcExtension::GetDstPort (void) const
+{
+  return m_dstPort;
+}
+
+void SixLowPanUdpNhcExtension::SetC (bool cField)
+{
+  uint16_t field = cField;
+  m_baseFormat |= (field << 2);
+}
+
+bool SixLowPanUdpNhcExtension::GetC (void) const
+{
+  return ((m_baseFormat >> 2) & 0x1);
+}
+
+void SixLowPanUdpNhcExtension::SetChecksum (uint16_t checksum)
+{
+  m_checksum = checksum;
+}
+
+uint16_t SixLowPanUdpNhcExtension::GetChecksum (void) const
+{
+  return m_checksum;
+}
+
+std::ostream & operator << (std::ostream & os, const SixLowPanUdpNhcExtension & h)
+{
+  h.Print (os);
+  return os;
+}
+
+
+}
+
diff -Naur ns-3.18.1/src/sixlowpan/model/sixlowpan-header.h ns-3.19/src/sixlowpan/model/sixlowpan-header.h
--- ns-3.18.1/src/sixlowpan/model/sixlowpan-header.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/model/sixlowpan-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,1214 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ *         Michele Muccio <michelemuccio@virgilio.it>
+ */
+
+#ifndef SIXLOWPANHEADER_H_
+#define SIXLOWPANHEADER_H_
+
+#include "ns3/header.h"
+#include "ns3/ipv6-address.h"
+#include "ns3/packet.h"
+#include "ns3/ipv6-header.h"
+
+namespace ns3 {
+
+/**
+* \ingroup sixlowpan
+* \brief   Dispatch header helper. This class only purpose is to interpret
+* the Dispatch header into its correct type.
+*
+* The dispatch type is defined by a zero bit as the first bit and a one
+*  bit as the second bit.
+  \verbatim
+                        1                   2                   3
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+   |0 1| Dispatch  |  type-specific header
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  \endverbatim
+*/
+class SixLowPanDispatch
+{
+public:
+  /**
+   *  \brief Dispatch values, as defined in RFC4944 and RFC6282
+  \verbatim
+     Pattern    Header Type
+   +------------+------------------------------------------------+
+   | 00  xxxxxx | NALP        - Not a LoWPAN frame               |
+   | 01  000000 | ESC         - Additional Dispatch byte follows |
+   | 01  000001 | IPv6        - Uncompressed IPv6 Addresses      |
+   | 01  000010 | LOWPAN_HC1  - LOWPAN_HC1 compressed IPv6       |
+   | 01  000011 | reserved    - Reserved for future use          |
+   |   ...      | reserved    - Reserved for future use          |
+   | 01  001111 | reserved    - Reserved for future use          |
+   | 01  010000 | LOWPAN_BC0  - LOWPAN_BC0 broadcast             |
+   | 01  010001 | reserved    - Reserved for future use          |
+   |   ...      | reserved    - Reserved for future use          |
+   | 01  1xxxxx | LOWPAN_IPHC - LOWPAN_IPHC compressed IPv6      |
+   | 10  xxxxxx | MESH        - Mesh Header                      |
+   | 11  000xxx | FRAG1       - Fragmentation Header (first)     |
+   | 11  001000 | reserved    - Reserved for future use          |
+   |   ...      | reserved    - Reserved for future use          |
+   | 11  011111 | reserved    - Reserved for future use          |
+   | 11  100xxx | FRAGN       - Fragmentation Header (subsequent)|
+   | 11  101000 | reserved    - Reserved for future use          |
+   |   ...      | reserved    - Reserved for future use          |
+   | 11  111111 | reserved    - Reserved for future use          |
+   +------------+------------------------------------------------+
+   \endverbatim
+   */
+  enum Dispatch_e
+  {
+    LOWPAN_NALP = 0x0,
+    LOWPAN_NALP_N = 0x3F,
+    LOWPAN_NOTCOMPRESSED = 0x41,
+    LOWPAN_HC1 = 0x42,
+    LOWPAN_BC0 = 0x50,
+    LOWPAN_IPHC = 0x60,
+    LOWPAN_IPHC_N = 0x7F,
+    LOWPAN_MESH = 0x80,
+    LOWPAN_MESH_N = 0xBF,
+    LOWPAN_FRAG1 = 0xC0,
+    LOWPAN_FRAG1_N = 0xC7,
+    LOWPAN_FRAGN = 0xE0,
+    LOWPAN_FRAGN_N = 0xE7,
+    LOWPAN_UNSUPPORTED = 0xFF
+  };
+
+  /**
+   *  \brief Dispatch values for Next Header compression.
+   *
+   *  The dispatch values reflect the dispatch use, since
+   *  some dispatch bits carry actual header compression bits.
+   */
+  enum NhcDispatch_e
+  {
+    LOWPAN_NHC = 0xE0,
+    LOWPAN_NHC_N = 0xEF,
+    LOWPAN_UDPNHC = 0xF0,
+    LOWPAN_UDPNHC_N = 0xF7,
+    LOWPAN_NHCUNSUPPORTED = 0xFF
+  };
+
+  SixLowPanDispatch (void);
+
+  /**
+   * \brief Get the Dispatch type.
+   * \param dispatch the dispatch value
+   * \return the Dispatch type
+   */
+  static Dispatch_e GetDispatchType (uint8_t dispatch);
+
+  /**
+   * \brief Get the NhcDispatch type.
+   * \param dispatch the dispatch value
+   * \return the NhcDispatch type
+   */
+  static NhcDispatch_e GetNhcDispatchType (uint8_t dispatch);
+
+};
+
+/**
+ * \ingroup sixlowpan
+ * \brief 6LoWPAN HC1 header - see RFC 4944
+ */
+class SixLowPanHc1 : public Header
+{
+public:
+  /**
+   * \brief Kind of address compression.
+   *
+   * The address compression is handled in 4 bits and might mean:
+   * PI: Prefix inline, PC: Prefix Compressed,
+   * II: Interface Identifier, Inline, IC: Interface Identifier Compressed
+   */
+  enum LowPanHc1Addr_e
+  {
+    HC1_PIII = 0x00,
+    HC1_PIIC = 0x01,
+    HC1_PCII = 0x02,
+    HC1_PCIC = 0x03
+  };
+
+  /**
+   * \brief Next header information.
+   *
+   * The Next header compression is handled in 4 bits and might mean:
+   * NC: Not Compressed, UDP, ICMP or TCP.
+   */
+  enum LowPanHc1NextHeader_e
+  {
+    HC1_NC = 0x00,
+    HC1_UDP = 0x01,
+    HC1_ICMP = 0x02,
+    HC1_TCP = 0x03
+  };
+
+  SixLowPanHc1 (void);
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \brief Return the instance type identifier.
+   * \return instance type ID
+   */
+
+  virtual TypeId GetInstanceTypeId (void) const;
+
+  virtual void Print (std::ostream& os) const;
+
+  /**
+   * \brief Get the serialized size of the packet.
+   * \return size
+   */
+  virtual uint32_t GetSerializedSize (void) const;
+
+  /**
+   * \brief Serialize the packet.
+   * \param start Buffer iterator
+   */
+  virtual void Serialize (Buffer::Iterator start) const;
+
+  /**
+   * \brief Deserialize the packet.
+   * \param start Buffer iterator
+   * \return size of the packet
+   */
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+  /**
+   * \brief Get the Dispatch type.
+   * \return the Dispatch type
+   */
+  // virtual Dispatch_e GetDispatchType (void) const;
+
+  /**
+   * \brief Set the "Hop limit" field (TTL).
+   * \param limit the hop limit value
+   */
+  void SetHopLimit (uint8_t limit);
+
+  /**
+   * \brief Get the "Hop limit" field (TTL).
+   * \return the hop limit value
+   */
+  uint8_t GetHopLimit (void) const;
+
+  /**
+   * \brief Get Destination Compression type
+   * \returns the kind of address compression
+   */
+  LowPanHc1Addr_e GetDstCompression () const;
+
+  /**
+   * \brief Get the destination interface
+   * \returns the destination interface
+   */
+  const uint8_t* GetDstInterface () const;
+
+  /**
+   * \brief Get the destination prefix
+   * \returns the destination prefix
+   */
+  const uint8_t* GetDstPrefix () const;
+
+  /**
+   * \brief Get the Flow Label value
+   * \returns the Flow Label
+   */
+  uint32_t GetFlowLabel () const;
+
+  /**
+   * \brief Get the Next Header value
+   * \returns the Next Header value
+   */
+  uint8_t GetNextHeader () const;
+
+  /**
+   * \brief Get Source Compression type
+   * \returns the kind of address compression
+   */
+  LowPanHc1Addr_e GetSrcCompression () const;
+
+  /**
+   * \brief Get the source interface
+   * \returns the source interface
+   */
+  const uint8_t* GetSrcInterface () const;
+
+  /**
+   * \brief Get the source prefix
+   * \returns the source prefix
+   */
+  const uint8_t* GetSrcPrefix () const;
+
+  /**
+   * \brief Get the Traffic Class value
+   * \returns the Traffic Class value
+   */
+  uint8_t GetTrafficClass () const;
+
+  /**
+   * \brief Check if the Traffic Class and Flow Labels are compressed
+   * \returns true if TC and FL are compressed
+   */
+  bool IsTcflCompression () const;
+
+  /**
+   * \brief Check if there is a HC2 compressed header
+   * \returns true if next header is HC2 copressed
+   */
+  bool IsHc2HeaderPresent () const;
+
+  /**
+   * \brief Set Destination Compression type
+   * \param dstCompression the kind of address compression
+   */
+  void SetDstCompression (LowPanHc1Addr_e dstCompression);
+
+  /**
+   * \brief Set the destination interface
+   * \param dstInterface the destination interface
+   */
+  void SetDstInterface (const uint8_t* dstInterface);
+
+  /**
+   * \brief Set the destination prefix
+   * \param dstPrefix the destination prefix
+   */
+  void SetDstPrefix (const uint8_t* dstPrefix);
+
+  /**
+   * \brief Set the Flow Label value
+   * \param flowLabel the Flow Label
+   */
+  void SetFlowLabel (uint32_t flowLabel);
+
+  /**
+   * \brief Set the Next Header value
+   * \param nextHeader the Next Header value
+   */
+  void SetNextHeader (uint8_t nextHeader);
+
+  /**
+   * \brief Set Source Compression type
+   * \param srcCompression the kind of address compression
+   */
+  void SetSrcCompression (LowPanHc1Addr_e srcCompression);
+
+  /**
+   * \brief Set the source interface
+   * \param srcInterface the source interface
+   */
+  void SetSrcInterface (const uint8_t* srcInterface);
+
+  /**
+   * \brief Set the source prefix
+   * \param srcPrefix the source prefix
+   */
+  void SetSrcPrefix (const uint8_t* srcPrefix);
+
+  /**
+   * \brief Set the Traffic Class and Flow Labels as compressed
+   * \param tcflCompression true if TC and FL are compressed
+   */
+  void SetTcflCompression (bool tcflCompression);
+
+  /**
+   * \brief Set the next header a HC2 compressed header
+   * \param hc2HeaderPresent true if next header is HC2 compressed
+   */
+  void SetHc2HeaderPresent (bool hc2HeaderPresent);
+
+  /**
+   * \brief Set the Traffic Class value
+   * \param trafficClass the Traffic Class value
+   */
+  void SetTrafficClass (uint8_t trafficClass);
+
+private:
+  uint8_t m_hopLimit;           //!< Hop Limit
+  uint8_t m_srcPrefix[8];       //!< Source prefix
+  uint8_t m_srcInterface[8];    //!< Source interface
+  uint8_t m_dstPrefix[8];       //!< Destinaiton prefix
+  uint8_t m_dstInterface[8];    //!< Destination interface
+  uint8_t m_trafficClass;       //!< Traffic Class
+  uint32_t m_flowLabel;         //!< Flow Label
+  uint8_t m_nextHeader;         //!< Next header
+  LowPanHc1Addr_e m_srcCompression; //!< Source compresison type
+  LowPanHc1Addr_e m_dstCompression; //!< Destination compresison type
+  bool m_tcflCompression;       //!< is TC and FL compressed
+  LowPanHc1NextHeader_e m_nextHeaderCompression; //!< next header compression
+  bool m_hc2HeaderPresent;      //!< is next header HC2 compressed
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param header the HC1 Header
+ * \returns the reference to the output stream
+ */
+std::ostream & operator<< (std::ostream & os, SixLowPanHc1 const &header);
+
+/**
+ * \ingroup sixlowpan
+ * \brief 6LoWPAN FRAG1 header - see RFC 4944
+ */
+class SixLowPanFrag1 : public Header
+{
+public:
+  SixLowPanFrag1 (void);
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \brief Return the instance type identifier.
+   * \return instance type ID
+   */
+  virtual TypeId GetInstanceTypeId (void) const;
+
+  virtual void Print (std::ostream& os) const;
+
+  /**
+   * \brief Get the serialized size of the packet.
+   * \return size
+   */
+  virtual uint32_t GetSerializedSize (void) const;
+
+  /**
+   * \brief Serialize the packet.
+   * \param start Buffer iterator
+   */
+  virtual void Serialize (Buffer::Iterator start) const;
+
+  /**
+   * \brief Deserialize the packet.
+   * \param start Buffer iterator
+   * \return size of the packet
+   */
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+  /**
+   * \brief Get the Dispatch type.
+   * \return the Dispatch type
+   */
+  // virtual Dispatch_e GetDispatchType (void) const;
+
+  /**
+   * \brief Set the datagram size
+   * \param datagramSize the datagram size
+   */
+  void SetDatagramSize (uint16_t datagramSize);
+
+  /**
+   * \brief Get the datagram size
+   * \returns the datagram size
+   */
+  uint16_t GetDatagramSize (void) const;
+
+  /**
+   * \brief Set the datagram tag
+   * \param datagramTag the datagram tag
+   */
+  void SetDatagramTag (uint16_t datagramTag);
+
+  /**
+   * \brief Get the datagram tag
+   * \returns the datagram tag
+   */
+  uint16_t GetDatagramTag (void) const;
+
+private:
+  uint16_t m_datagramSize; //!< datagram size
+  uint16_t m_datagramTag;  //!< datagram tag
+
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param header the Frag1 Header
+ * \returns the reference to the output stream
+ */
+std::ostream & operator<< (std::ostream & os, SixLowPanFrag1 const & header);
+
+/**
+ * \ingroup sixlowpan
+ * \brief 6LoWPAN FRAGN header - see RFC 4944
+ */
+class SixLowPanFragN : public Header
+{
+public:
+  SixLowPanFragN (void);
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \brief Return the instance type identifier.
+   * \return instance type ID
+   */
+  virtual TypeId GetInstanceTypeId (void) const;
+
+  virtual void Print (std::ostream& os) const;
+
+  /**
+   * \brief Get the serialized size of the packet.
+   * \return size
+   */
+  virtual uint32_t GetSerializedSize (void) const;
+
+  /**
+   * \brief Serialize the packet.
+   * \param start Buffer iterator
+   */
+  virtual void Serialize (Buffer::Iterator start) const;
+
+  /**
+   * \brief Deserialize the packet.
+   * \param start Buffer iterator
+   * \return size of the packet
+   */
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+  /**
+   * \brief Get the Dispatch type.
+   * \return the Dispatch type
+   */
+  // virtual Dispatch_e GetDispatchType (void) const;
+
+  /**
+   * \brief Set the datagram size
+   * \param datagramSize the datagram size
+   */
+  void SetDatagramSize (uint16_t datagramSize);
+
+  /**
+   * \brief Get the datagram size
+   * \returns the datagram size
+   */
+  uint16_t GetDatagramSize (void) const;
+
+  /**
+   * \brief Set the datagram tag
+   * \param datagramTag the datagram tag
+   */
+  void SetDatagramTag (uint16_t datagramTag);
+
+  /**
+   * \brief Get the datagram tag
+   * \returns the datagram tag
+   */
+  uint16_t GetDatagramTag (void) const;
+
+  /**
+   * \brief Set the datagram offset
+   * \param datagramOffset the datagram offset
+   */
+  void SetDatagramOffset (uint8_t datagramOffset);
+
+  /**
+   * \brief Get the datagram offset
+   * \returns the datagram offset
+   */
+  uint8_t GetDatagramOffset (void) const;
+
+private:
+  uint16_t m_datagramSize;  //!< datagram size
+  uint16_t m_datagramTag;   //!< datagram tag
+  uint8_t m_datagramOffset; //!< datagram offset
+
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param header the FragN Header
+ * \returns the reference to the output stream
+ */
+std::ostream & operator<< (std::ostream & os, SixLowPanFragN const &header);
+
+/**
+* \ingroup sixlowpan
+* \brief   LOWPAN_IPHC base Encoding - see RFC 6282
+  \verbatim
+       0                                       1
+       0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5
+     +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+     | 0 | 1 | 1 |  TF   |NH | HLIM  |CID|SAC|  SAM  | M |DAC|  DAM  |
+     +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
+  \endverbatim
+*/
+class SixLowPanIphc : public Header
+{
+public:
+  /**
+   *  \brief TF: Traffic Class, Flow Label
+   *
+   *  00:  ECN + DSCP + 4-bit Pad + Flow Label (4 bytes)
+   *  01:  ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided.
+   *  10:  ECN + DSCP (1 byte), Flow Label is elided.
+   *  11:  Traffic Class and Flow Label are elided.
+   *
+   */
+  enum TrafficClassFlowLabel_e
+  {
+    TF_FULL = 0,
+    TF_DSCP_ELIDED,
+    TF_FL_ELIDED,
+    TF_ELIDED
+  };
+
+  /**
+   *  \brief HLIM: Hop Limit
+   *
+   *  00:  The Hop Limit field is carried in-line.
+   *  01:  The Hop Limit field is compressed and the hop limit is 1.
+   *  10:  The Hop Limit field is compressed and the hop limit is 64.
+   *  11:  The Hop Limit field is compressed and the hop limit is 255.
+   */
+  enum Hlim_e
+  {
+    HLIM_INLINE = 0,
+    HLIM_COMPR_1,
+    HLIM_COMPR_64,
+    HLIM_COMPR_255
+  };
+
+  /**
+   *  \brief Source or Destination Address Mode
+   *
+   *  00:  128 bits.
+   *  01:  64 bits (or 48 bits if multicast).
+   *  10:  16 bits (or 32 bits if multicast).
+   *  11:  Fully elided (or 8 bits if multicast).
+   */
+  enum HeaderCompression_e
+  {
+    HC_INLINE = 0,
+    HC_COMPR_64,
+    HC_COMPR_16,
+    HC_COMPR_0
+  };
+
+  SixLowPanIphc (void);
+  /**
+   * \brief Constructor
+   * \param dispatch dispatch value
+   */
+  SixLowPanIphc (uint8_t dispatch);
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \brief Return the instance type identifier.
+   * \return instance type ID
+   */
+  virtual TypeId GetInstanceTypeId (void) const;
+
+  virtual void Print (std::ostream& os) const;
+
+  /**
+   * \brief Get the serialized size of the packet.
+   * \return size
+   */
+  virtual uint32_t GetSerializedSize (void) const;
+
+  /**
+   * \brief Serialize the packet.
+   * \param start Buffer iterator
+   */
+  virtual void Serialize (Buffer::Iterator start) const;
+
+  /**
+   * \brief Deserialize the packet.
+   * \param start Buffer iterator
+   * \return size of the packet
+   */
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+  /**
+   * \brief Get the Dispatch type.
+   * \return the Dispatch type
+   */
+  // virtual Dispatch_e GetDispatchType (void) const;
+
+  /**
+   * \brief Set the TF (Traffic Class, Flow Label) compression.
+   * \param tfField ECN, DSCP, Flow Label compression type
+   */
+  void SetTf (TrafficClassFlowLabel_e tfField);
+
+  /**
+   * \brief Get the TF (Traffic Class, Flow Label) compression.
+   * \return the ECN, DSCP, Flow Label compression type
+   */
+  TrafficClassFlowLabel_e GetTf (void) const;
+
+  /**
+   * \brief Set the NH (Next Header) compression.
+   * \param nhField false (Next Header carried in-line), true (compressed NH)
+   */
+  void SetNh (bool nhField);
+
+  /**
+   * \brief Get the NH (Next Header) compression.
+   * \return false (Next Header carried in-line), true (compressed NH)
+   */
+  bool GetNh (void) const;
+
+  /**
+   * \brief Set the HLIM (Hop Limit) compression.
+   * \param hlimField Hop Limit compression type
+   */
+  void SetHlim (Hlim_e hlimField);
+
+  /**
+   * \brief Get the HLIM (Hop Limit) compression.
+   * \return Hop Limit compression type
+   */
+  Hlim_e GetHlim (void) const;
+
+  /**
+   * \brief Set the CID (Context Identifier Extension) compression.
+   * \param cidField false (no CID present), true (CID follows)
+   */
+  void SetCid (bool cidField);
+
+  /**
+   * \brief Get the CID (Context Identifier Extension) compression.
+   * \return false (no CID present), true (CID follows)
+   */
+  bool GetCid (void) const;
+
+  /**
+   * \brief Set the SAC (Source Address Compression) compression.
+   * \param sacField false (stateless), true (stateful)
+   */
+  void SetSac (bool sacField);
+
+  /**
+   * \brief Get the SAC (Source Address Compression) compression.
+   * \return false (stateless), true (stateful)
+   */
+  bool GetSac (void) const;
+
+  /**
+   * \brief Set the SAM (Source Address Mode) compression.
+   * \param samField - depends on the SAC
+   */
+  void SetSam (HeaderCompression_e samField);
+
+  /**
+   * \brief Get the SAM (Source Address Mode) compression.
+   * \return depends on the SAC field
+   */
+  HeaderCompression_e GetSam (void) const;
+
+  /**
+   * \brief Set the M (Multicast) compression.
+   * \param mField true if destination is multicast
+   */
+  void SetM (bool mField);
+
+  /**
+   * \brief Get the M (Multicast) compression.
+   * \return true if destination is multicast
+   */
+  bool GetM (void) const;
+
+  /**
+   * \brief Set the DAC (Destination Address Compression) compression.
+   * \param dacField false (stateless), true (stateful)
+   */
+  void SetDac (bool dacField);
+
+  /**
+   * \brief Get the DAC (Destination Address Compression) compression.
+   * \return false (stateless), true (stateful)
+   */
+  bool GetDac (void) const;
+
+  /**
+   * \brief Set the DAM (Destination Address Mode) compression.
+   * \param damField - depends on the DAC and M fields
+   */
+  void SetDam (HeaderCompression_e damField);
+
+  /**
+   * \brief Get the DAM (Destination Address Mode) compression.
+   * \return depends on the DAC and M fields
+   */
+  HeaderCompression_e GetDam (void) const;
+
+  /**
+   * \brief Set the SrcContextId.
+   * \param srcContextId - valid values are [0:15]
+   */
+  void SetSrcContextId (uint8_t srcContextId);
+
+  /**
+   * \brief Get the SrcContextId.
+   * \return the SrcContextId
+   */
+  uint8_t GetSrcContextId (void) const;
+
+  /**
+   * \brief Set the DstContextId.
+   * \param dstContextId - valid values are [0:15]
+   */
+  void SetDstContextId (uint8_t dstContextId);
+
+  /**
+   * \brief Get the DstContextId.
+   * \return the DstContextId
+   */
+  uint8_t GetDstContextId (void) const;
+
+  /**
+   * \brief Set the ECN (2bits).
+   * \param ecn - valid values are [0:3]
+   */
+  void SetEcn (uint8_t ecn);
+
+  /**
+   * \brief Get the ECN.
+   * \return the ECN
+   */
+  uint8_t GetEcn (void) const;
+
+  /**
+   * \brief Set the DSCP (6bits).
+   * \param dscp - valid values are [0:63]
+   */
+  void SetDscp (uint8_t dscp);
+
+  /**
+   * \brief Get the DSCP.
+   * \return the DSCP
+   */
+  uint8_t GetDscp (void) const;
+
+  /**
+   * \brief Set the Flow Label (20bits).
+   * \param flowLabel - valid values are 20 bits long.
+   */
+  void SetFlowLabel (uint32_t flowLabel);
+
+  /**
+   * \brief Get the Flow Label.
+   * \return the Flow Label
+   */
+  uint32_t GetFlowLabel (void) const;
+
+  /**
+   * \brief Set the Next Header field.
+   * \param nextHeader Next Header field.
+   */
+  void SetNextHeader (uint8_t nextHeader);
+
+  /**
+   * \brief Get the Next Header field.
+   * \return the Next Header field.
+   */
+  uint8_t GetNextHeader (void) const;
+
+  /**
+   * \brief Set the Hop Limit field.
+   * \param hopLimit Hop Limit field.
+   */
+  void SetHopLimit (uint8_t hopLimit);
+
+  /**
+   * \brief Get the Hop Limit field.
+   * \return the Hop Limit field.
+   */
+  uint8_t GetHopLimit (void) const;
+
+  /**
+   * \brief Set the Source Address.
+   * \param srcAddress the Source Address.
+   */
+  void SetSrcAddress (Ipv6Address srcAddress);
+
+  /**
+   * \brief Get the Source Address.
+   * \return the Source Address.
+   */
+  Ipv6Address GetSrcAddress () const;
+
+  /**
+   * \brief Set the Destination Address.
+   * \param dstAddress the Destination Address.
+   */
+  void SetDstAddress (Ipv6Address dstAddress);
+
+  /**
+   * \brief Get the Destination Address.
+   * \return the Destination Address.
+   */
+  Ipv6Address GetDstAddress () const;
+
+private:
+  uint16_t m_baseFormat;      //!< Dispatch + encoding fields
+  uint8_t m_srcdstContextId;  //!< Src and Dst Context ID
+  uint8_t m_ecn : 2;          //!< ECN bits
+  uint8_t m_dscp : 6;         //!< DSCP bits
+  uint32_t m_flowLabel : 20;  //!< Flow Label bits
+  uint8_t m_nextHeader;       //!< Next header
+  uint8_t m_hopLimit;         //!< Hop Limit
+  Ipv6Address m_srcAddress;   //!< Src address
+  Ipv6Address m_dstAddress;   //!< Dst address
+
+  /**
+   * \brief Post-process the Source address stateful compression
+   * \note currently unsupported
+   */
+  void PostProcessSac ();
+  /**
+   * \brief Post-process the Destination address stateful compression
+   * \note currently unsupported
+   */
+  void PostProcessDac ();
+
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param header the IPHC Header
+ * \returns the reference to the output stream
+ */
+std::ostream & operator<< (std::ostream & os, SixLowPanIphc const &header);
+
+/**
+* \ingroup sixlowpan
+* \brief   LOWPAN_NHC Extension Header Encoding - see RFC 6282
+  \verbatim
+     0   1   2   3   4   5   6   7
+   +---+---+---+---+---+---+---+---+
+   | 1 | 1 | 1 | 0 |    EID    |NH |
+   +---+---+---+---+---+---+---+---+
+  \endverbatim
+*/
+class SixLowPanNhcExtension : public Header
+{
+public:
+  /**
+   *  \brief EID: IPv6 Extension Header ID
+   *
+   *   EID: IPv6 Extension Header ID:
+   *      0: IPv6 Hop-by-Hop Options Header [RFC2460]
+   *      1: IPv6 Routing Header [RFC2460]
+   *      2: IPv6 Fragment Header [RFC2460]
+   *      3: IPv6 Destination Options Header [RFC2460]
+   *      4: IPv6 Mobility Header [RFC6275]
+   *      5: Reserved
+   *      6: Reserved
+   *      7: IPv6 Header
+   */
+  enum Eid_e
+  {
+    EID_HOPBYHOP_OPTIONS_H = 0,
+    EID_ROUTING_H,
+    EID_FRAGMENTATION_H,
+    EID_DESTINATION_OPTIONS_H,
+    EID_MOBILITY_H,
+    EID_IPv6_H = 7
+  };
+
+  SixLowPanNhcExtension (void);
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \brief Return the instance type identifier.
+   * \return instance type ID
+   */
+  virtual TypeId GetInstanceTypeId (void) const;
+
+  virtual void Print (std::ostream& os) const;
+
+  /**
+   * \brief Get the serialized size of the packet.
+   * \return size
+   */
+  virtual uint32_t GetSerializedSize (void) const;
+
+  /**
+   * \brief Serialize the packet.
+   * \param start Buffer iterator
+   */
+  virtual void Serialize (Buffer::Iterator start) const;
+
+  /**
+   * \brief Deserialize the packet.
+   * \param start Buffer iterator
+   * \return size of the packet
+   */
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+  /**
+   * \brief Get the NhcDispatch type.
+   * \return the NhcDispatch type
+   */
+  virtual SixLowPanDispatch::NhcDispatch_e GetNhcDispatchType (void) const;
+
+  /**
+   * \brief Set the Extension Header Type.
+   * \param extensionHeaderType the Extension Header Type
+   */
+  void SetEid (Eid_e extensionHeaderType);
+
+  /**
+   * \brief Get the Extension Header Type.
+   * \return the Extension Header Type
+   */
+  Eid_e GetEid (void) const;
+
+  /**
+   * \brief Set the Next Header field values.
+   * \param nextHeader the Next Header field value
+   */
+  void SetNextHeader (uint8_t nextHeader);
+
+  /**
+   * \brief Get the Next Header field value.
+   * \return the Next Header field value
+   */
+  uint8_t GetNextHeader (void) const;
+
+  /**
+   * \brief Set the NH field values.
+   * \param nhField the NH field value
+   */
+  void SetNh (bool nhField);
+
+  /**
+   * \brief Get the Next Header field value.
+   * \return the NH field value
+   */
+  bool GetNh (void) const;
+
+  /**
+   * \brief Set the option header data blob.
+   * \param blob a buffer holding the blob data
+   * \param size the data blob size
+   */
+  void SetBlob (const uint8_t* blob, uint32_t size);
+
+  /**
+   * \brief Get the option header data blob.
+   * \param blob a buffer to copy the blob data into
+   * \param size the size of the buffer
+   * \return the length of the copied data
+   */
+  uint32_t CopyBlob (uint8_t* blob, uint32_t size) const;
+
+private:
+  uint8_t m_nhcExtensionHeader; //!< NHC extension header type
+  uint8_t m_nhcNextHeader;      //!< Next header
+  uint8_t m_nhcBlobLength;      //!< Length of the NHC compressed header
+  uint8_t m_nhcBlob[256];       //!< NHC compressed header
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param header the NHC Extension Header
+ * \returns the reference to the output stream
+ */
+std::ostream & operator<< (std::ostream & os, SixLowPanNhcExtension const &header);
+
+
+/**
+* \ingroup sixlowpan
+* \brief   UDP LOWPAN_NHC Extension Header Encoding - see RFC 6282
+  \verbatim
+     0   1   2   3   4   5   6   7
+   +---+---+---+---+---+---+---+---+
+   | 1 | 1 | 1 | 1 | 0 | C |   P   |
+   +---+---+---+---+---+---+---+---+
+  \endverbatim
+*/
+class SixLowPanUdpNhcExtension : public Header
+{
+public:
+  /**
+   *  \brief Ports:
+   *
+   *  00: 16 bits for both Source Port and Destination Port
+   *  01: 16 bits for Source Port. Last 8 bits for Destination Port
+   *  10: Last 8 bits for Source Port. All 16 bits for Destination Port
+   *  11: Last 4 bits of both Source Port and Destination Port
+   */
+  enum Ports_e
+  {
+    PORTS_INLINE = 0,
+    PORTS_ALL_SRC_LAST_DST,
+    PORTS_LAST_SRC_ALL_DST,
+    PORTS_LAST_SRC_LAST_DST
+  };
+
+  SixLowPanUdpNhcExtension (void);
+
+  /**
+   * \brief Return the instance type identifier.
+   * \return instance type ID
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * \brief Return the instance type identifier.
+   * \return instance type ID
+   */
+  virtual TypeId GetInstanceTypeId (void) const;
+
+  virtual void Print (std::ostream& os) const;
+
+  /**
+   * \brief Get the serialized size of the packet.
+   * \return size
+   */
+  virtual uint32_t GetSerializedSize (void) const;
+
+  /**
+   * \brief Serialize the packet.
+   * \param start Buffer iterator
+   */
+  virtual void Serialize (Buffer::Iterator start) const;
+
+  /**
+   * \brief Deserialize the packet.
+   * \param start Buffer iterator
+   * \return size of the packet
+   */
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+  /**
+   * \brief Get the NhcDispatch type.
+   * \return the NhcDispatch type
+   */
+  virtual SixLowPanDispatch::NhcDispatch_e GetNhcDispatchType (void) const;
+
+  /**
+   * \brief Set the compressed Src and Dst Ports.
+   * \param port Src and Dst the Ports
+   */
+  void SetPorts (Ports_e port);
+
+  /**
+   * \brief Get the compressed Src and Dst Ports.
+   * \return the Src and Dst Ports
+   */
+  Ports_e GetPorts (void) const;
+
+  /**
+   * \brief Set the Destination Port.
+   * \param port the Destination Port.
+   */
+  void SetSrcPort (uint16_t port);
+
+  /**
+   * \brief Get the Destination Port.
+   * \return the Destination Port.
+   */
+  uint16_t GetSrcPort () const;
+
+  /**
+   * \brief Set the Destination Port.
+   * \param port the Destination Port.
+   */
+  void SetDstPort (uint16_t port);
+
+  /**
+   * \brief Get the Destination Port.
+   * \return the Destination Port.
+   */
+  uint16_t GetDstPort () const;
+
+  /**
+   * \brief Set the C (Checksum).
+   * \param cField false (All checksum carried in-line), true (Checksum elided)
+   */
+  void SetC (bool cField);
+
+  /**
+   * \brief Get the C (Checksum).
+   * \return false (All checksum carried in-line), true (Checksum elided)
+   */
+  bool GetC (void) const;
+
+  /**
+   * \brief Set the Checksum field values.
+   * \param checksum the Checksum field value
+   */
+  void SetChecksum (uint16_t checksum);
+
+  /**
+   * \brief Get the Checksum field value.
+   * \return the Checksum field value
+   */
+  uint16_t GetChecksum (void) const;
+
+private:
+  uint8_t m_baseFormat; //!< Dispatch + encoding fields
+  uint16_t m_checksum;  //!< Checksum
+  uint16_t m_srcPort;   //!< Source port
+  uint16_t m_dstPort;   //!< Destination port
+};
+
+/**
+ * \brief Stream insertion operator.
+ *
+ * \param os the reference to the output stream
+ * \param header the UDP NHC Extension Header
+ * \returns the reference to the output stream
+ */
+std::ostream & operator<< (std::ostream & os, SixLowPanUdpNhcExtension const &header);
+
+}
+
+#endif /* SIXLOWPANHEADER_H_ */
diff -Naur ns-3.18.1/src/sixlowpan/model/sixlowpan-net-device.cc ns-3.19/src/sixlowpan/model/sixlowpan-net-device.cc
--- ns-3.18.1/src/sixlowpan/model/sixlowpan-net-device.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/model/sixlowpan-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,2118 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ *         Michele Muccio <michelemuccio@virgilio.it>
+ */
+
+#include "ns3/node.h"
+#include "ns3/channel.h"
+#include "ns3/packet.h"
+#include "ns3/log.h"
+#include "ns3/boolean.h"
+#include "ns3/abort.h"
+#include "ns3/simulator.h"
+#include "ns3/uinteger.h"
+#include "ns3/icmpv6-header.h"
+#include "ns3/ipv6-header.h"
+#include "ns3/random-variable.h"
+#include "ns3/mac16-address.h"
+#include "ns3/mac48-address.h"
+#include "ns3/mac64-address.h"
+#include "ns3/unused.h"
+#include "ns3/ipv6-l3-protocol.h"
+#include "ns3/ipv6-extension-header.h"
+#include "ns3/udp-header.h"
+#include "ns3/udp-l4-protocol.h"
+#include "sixlowpan-net-device.h"
+#include "sixlowpan-header.h"
+
+NS_LOG_COMPONENT_DEFINE ("SixLowPanNetDevice")
+  ;
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (SixLowPanNetDevice)
+  ;
+
+TypeId SixLowPanNetDevice::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::SixLowPanNetDevice")
+    .SetParent<NetDevice> ()
+    .AddConstructor<SixLowPanNetDevice> ()
+    .AddAttribute ("Rfc6282", "Use RFC6282 (IPHC) if true, RFC4944 (HC1) otherwise.",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&SixLowPanNetDevice::m_useIphc),
+                   MakeBooleanChecker ())
+    .AddAttribute ("OmitUdpChecksum",
+                   "Omit the UDP checksum in IPHC compression.",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&SixLowPanNetDevice::m_omitUdpChecksum),
+                   MakeBooleanChecker ())
+    .AddAttribute ("FragmentReassemblyListSize", "The maximum size of the reassembly buffer (in packets). Zero meaning infinite.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&SixLowPanNetDevice::m_fragmentReassemblyListSize),
+                   MakeUintegerChecker<uint16_t> ())
+    .AddAttribute ("FragmentExpirationTimeout",
+                   "When this timeout expires, the fragments will be cleared from the buffer.",
+                   TimeValue (Seconds (60)),
+                   MakeTimeAccessor (&SixLowPanNetDevice::m_fragmentExpirationTimeout),
+                   MakeTimeChecker ())
+    .AddAttribute ("ForceEtherType",
+                   "Force a specific EtherType in L2 frames.",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&SixLowPanNetDevice::m_forceEtherType),
+                   MakeBooleanChecker ())
+    .AddAttribute ("EtherType",
+                   "The specific EtherType to be used in L2 frames.",
+                   UintegerValue (0xFFFF),
+                   MakeUintegerAccessor (&SixLowPanNetDevice::m_etherType),
+                   MakeUintegerChecker<uint16_t> ())
+    .AddTraceSource ("Tx", "Send - packet (including 6LoWPAN header), SixLoWPanNetDevice Ptr, interface index.",
+                     MakeTraceSourceAccessor (&SixLowPanNetDevice::m_txTrace))
+    .AddTraceSource ("Rx", "Receive - packet (including 6LoWPAN header), SixLoWPanNetDevice Ptr, interface index.",
+                     MakeTraceSourceAccessor (&SixLowPanNetDevice::m_rxTrace))
+    .AddTraceSource ("Drop", "Drop - DropReason, packet (including 6LoWPAN header), SixLoWPanNetDevice Ptr, interface index.",
+                     MakeTraceSourceAccessor (&SixLowPanNetDevice::m_dropTrace))
+  ;
+  return tid;
+}
+
+SixLowPanNetDevice::SixLowPanNetDevice ()
+  : m_node (0),
+    m_netDevice (0),
+    m_ifIndex (0)
+{
+  NS_LOG_FUNCTION (this);
+  m_netDevice = 0;
+  m_rng = CreateObject<UniformRandomVariable> ();
+}
+
+Ptr<NetDevice> SixLowPanNetDevice::GetNetDevice () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_netDevice;
+}
+
+void SixLowPanNetDevice::SetNetDevice (Ptr<NetDevice> device)
+{
+  NS_LOG_FUNCTION (this << device);
+  m_netDevice = device;
+
+  NS_LOG_DEBUG ("RegisterProtocolHandler for " << device->GetInstanceTypeId ().GetName ());
+
+  uint16_t protocolType = 0;
+  if ( m_forceEtherType )
+    {
+      protocolType = m_etherType;
+    }
+  m_node->RegisterProtocolHandler (MakeCallback (&SixLowPanNetDevice::ReceiveFromDevice,
+                                                 this),
+                                   protocolType, device, false);
+}
+
+int64_t SixLowPanNetDevice::AssignStreams (int64_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  m_rng->SetStream (stream);
+  return 1;
+}
+
+void SixLowPanNetDevice::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
+
+  m_netDevice = 0;
+  m_node = 0;
+
+  for (MapFragmentsTimersI_t iter = m_fragmentsTimers.begin (); iter != m_fragmentsTimers.end (); iter++)
+    {
+      iter->second.Cancel ();
+    }
+  m_fragmentsTimers.clear ();
+
+  for (MapFragmentsI_t iter = m_fragments.begin (); iter != m_fragments.end (); iter++)
+    {
+      iter->second = 0;
+    }
+  m_fragments.clear ();
+
+  NetDevice::DoDispose ();
+}
+
+void SixLowPanNetDevice::ReceiveFromDevice (Ptr<NetDevice> incomingPort,
+                                            Ptr<const Packet> packet,
+                                            uint16_t protocol,
+                                            Address const &src,
+                                            Address const &dst,
+                                            PacketType packetType)
+{
+  NS_LOG_FUNCTION (this << incomingPort << packet << protocol << src << dst);
+  NS_LOG_DEBUG ("UID is " << packet->GetUid ());
+
+  uint8_t dispatchRawVal = 0;
+  SixLowPanDispatch::Dispatch_e dispatchVal;
+  Ptr<Packet> copyPkt = packet->Copy ();
+
+  m_rxTrace (copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+
+  copyPkt->CopyData (&dispatchRawVal, sizeof(dispatchRawVal));
+  dispatchVal = SixLowPanDispatch::GetDispatchType (dispatchRawVal);
+  bool isPktDecompressed = false;
+  bool fragmented = false;
+
+  NS_LOG_DEBUG ( "Packet received: " << *copyPkt );
+  NS_LOG_DEBUG ( "Packet length: " << copyPkt->GetSize () );
+  NS_LOG_DEBUG ( "Dispatches: " << int(dispatchRawVal) << " - " << int(dispatchVal) );
+
+  if ( dispatchVal == SixLowPanDispatch::LOWPAN_FRAG1 )
+    {
+      isPktDecompressed = ProcessFragment (copyPkt, src, dst, true);
+      fragmented = true;
+    }
+  else if ( dispatchVal == SixLowPanDispatch::LOWPAN_FRAGN )
+    {
+      isPktDecompressed = ProcessFragment (copyPkt, src, dst, false);
+      fragmented = true;
+    }
+  if ( fragmented )
+    {
+      if ( !isPktDecompressed )
+        {
+          return;
+        }
+      else
+        {
+          copyPkt->CopyData (&dispatchRawVal, sizeof(dispatchRawVal));
+          dispatchVal = SixLowPanDispatch::GetDispatchType (dispatchRawVal);
+        }
+    }
+
+  switch ( dispatchVal )
+    {
+    case SixLowPanDispatch::LOWPAN_MESH:
+      NS_LOG_DEBUG ("Unsupported 6LoWPAN encoding: MESH, dropping.");
+      m_dropTrace (DROP_UNKNOWN_EXTENSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+      break;
+    case SixLowPanDispatch::LOWPAN_BC0:
+      NS_LOG_DEBUG ("Unsupported 6LoWPAN encoding: BC0, dropping.");
+      m_dropTrace (DROP_UNKNOWN_EXTENSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+      break;
+    case SixLowPanDispatch::LOWPAN_NOTCOMPRESSED:
+      NS_LOG_DEBUG ( "Packet without compression:" << *copyPkt );
+      NS_LOG_DEBUG ( "Packet length:" << copyPkt->GetSize () );
+      m_dropTrace (DROP_UNKNOWN_EXTENSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+      break;
+    case SixLowPanDispatch::LOWPAN_HC1:
+      DecompressLowPanHc1 (copyPkt, src, dst);
+      isPktDecompressed = true;
+      break;
+    case SixLowPanDispatch::LOWPAN_IPHC:
+      DecompressLowPanIphc (copyPkt, src, dst);
+      isPktDecompressed = true;
+      break;
+    default:
+      NS_LOG_DEBUG ("Unsupported 6LoWPAN encoding: dropping.");
+      m_dropTrace (DROP_UNKNOWN_EXTENSION, copyPkt, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+      break;
+    }
+
+  if ( !isPktDecompressed )
+    {
+      return;
+    }
+
+  NS_LOG_DEBUG ( "Packet decompressed length: " << copyPkt->GetSize () );
+  NS_LOG_DEBUG ( "Packet decompressed received: " << *copyPkt );
+
+  if (!m_promiscRxCallback.IsNull ())
+    {
+      m_promiscRxCallback (this, copyPkt, Ipv6L3Protocol::PROT_NUMBER, src, dst, packetType);
+    }
+
+  m_rxCallback (this, copyPkt, Ipv6L3Protocol::PROT_NUMBER, src);
+
+  return;
+}
+
+void SixLowPanNetDevice::SetIfIndex (const uint32_t index)
+{
+  NS_LOG_FUNCTION (this << index);
+  // NS_ASSERT_MSG ( m_port != 0, "Sixlowpan: can't find any lower-layer protocol " << m_port );
+  m_ifIndex = index;
+}
+
+uint32_t SixLowPanNetDevice::GetIfIndex (void) const
+{
+  NS_LOG_FUNCTION (this);
+  // NS_ASSERT_MSG ( m_port != 0, "Sixlowpan: can't find any lower-layer protocol " << m_port );
+  return m_netDevice->GetIfIndex ();
+}
+
+Ptr<Channel> SixLowPanNetDevice::GetChannel (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->GetChannel ();
+}
+
+void SixLowPanNetDevice::SetAddress (Address address)
+{
+  NS_LOG_FUNCTION (this << address);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  m_netDevice->SetAddress (address);
+}
+
+Address SixLowPanNetDevice::GetAddress (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->GetAddress ();
+}
+
+bool SixLowPanNetDevice::SetMtu (const uint16_t mtu)
+{
+  NS_LOG_FUNCTION (this << mtu);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->SetMtu (mtu);
+}
+
+uint16_t SixLowPanNetDevice::GetMtu (void) const
+{
+  NS_LOG_FUNCTION (this);
+
+  uint16_t mtu = m_netDevice->GetMtu ();
+
+  // RFC 4944, section 4.
+  if (mtu < 1280)
+    {
+      mtu = 1280;
+    }
+  return mtu;
+}
+
+bool SixLowPanNetDevice::IsLinkUp (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->IsLinkUp ();
+}
+
+void SixLowPanNetDevice::AddLinkChangeCallback (Callback<void> callback)
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->AddLinkChangeCallback (callback);
+}
+
+bool SixLowPanNetDevice::IsBroadcast (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->IsBroadcast ();
+}
+
+Address SixLowPanNetDevice::GetBroadcast (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->GetBroadcast ();
+}
+
+bool SixLowPanNetDevice::IsMulticast (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->IsMulticast ();
+}
+
+Address SixLowPanNetDevice::GetMulticast (Ipv4Address multicastGroup) const
+{
+  NS_LOG_FUNCTION (this << multicastGroup);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->GetMulticast (multicastGroup);
+}
+
+Address SixLowPanNetDevice::GetMulticast (Ipv6Address addr) const
+{
+  NS_LOG_FUNCTION (this << addr);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->GetMulticast (addr);
+}
+
+bool SixLowPanNetDevice::IsPointToPoint (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->IsPointToPoint ();
+}
+
+bool SixLowPanNetDevice::IsBridge (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->IsBridge ();
+}
+
+bool SixLowPanNetDevice::Send (Ptr<Packet> packet,
+                               const Address& dest,
+                               uint16_t protocolNumber)
+{
+  NS_LOG_FUNCTION (this << *packet << dest << protocolNumber);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  uint32_t origHdrSize = 0;
+  uint32_t origPacketSize = packet->GetSize ();
+  bool ret = false;
+
+  if (m_forceEtherType)
+    {
+      protocolNumber = m_etherType;
+    }
+
+  if (m_useIphc)
+    {
+      origHdrSize += CompressLowPanIphc (packet, m_netDevice->GetAddress (), dest);
+    }
+  else
+    {
+      origHdrSize += CompressLowPanHc1 (packet, m_netDevice->GetAddress (), dest);
+    }
+
+  if ( packet->GetSize () > m_netDevice->GetMtu () )
+    {
+      NS_LOG_LOGIC ("Fragmentation: Packet size " << packet->GetSize () << " - Mtu " << m_netDevice->GetMtu () );
+      // fragment
+      std::list<Ptr<Packet> > fragmentList;
+      DoFragmentation (packet, origPacketSize, origHdrSize, fragmentList);
+      std::list<Ptr<Packet> >::iterator it;
+      bool success = true;
+      for ( it = fragmentList.begin (); it != fragmentList.end (); it++ )
+        {
+          NS_LOG_DEBUG ( "SixLowPanNetDevice::Send (Fragment) " << **it );
+          m_txTrace (*it, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          success &= m_netDevice->Send (*it, dest, protocolNumber);
+        }
+      ret = success;
+    }
+  else
+    {
+      NS_LOG_DEBUG ( "SixLowPanNetDevice::Send " << m_node->GetId () << " " << *packet );
+      m_txTrace (packet, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+      ret = m_netDevice->Send (packet, dest, protocolNumber);
+    }
+
+  return ret;
+}
+
+bool SixLowPanNetDevice::SendFrom (Ptr<Packet> packet,
+                                   const Address& src,
+                                   const Address& dest,
+                                   uint16_t protocolNumber)
+{
+  NS_LOG_FUNCTION (this << packet << src << dest << protocolNumber);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  uint32_t origHdrSize = 0;
+  uint32_t origPacketSize = packet->GetSize ();
+  bool ret = false;
+
+  if (m_forceEtherType)
+    {
+      protocolNumber = m_etherType;
+    }
+
+  if (m_useIphc)
+    {
+      origHdrSize += CompressLowPanIphc (packet, m_netDevice->GetAddress (), dest);
+    }
+  else
+    {
+      origHdrSize += CompressLowPanHc1 (packet, m_netDevice->GetAddress (), dest);
+    }
+
+  if ( packet->GetSize () > m_netDevice->GetMtu () )
+    {
+      // fragment
+      std::list<Ptr<Packet> > fragmentList;
+      DoFragmentation (packet, origPacketSize, origHdrSize, fragmentList);
+      std::list<Ptr<Packet> >::iterator it;
+      bool err = false;
+      for ( it = fragmentList.begin (); it != fragmentList.end (); it++ )
+        {
+          NS_LOG_DEBUG ( "SixLowPanNetDevice::SendFrom (Fragment) " << **it );
+          m_txTrace (*it, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+          err |= !(m_netDevice->SendFrom (*it, src, dest, protocolNumber));
+        }
+      ret = !err;
+    }
+  else
+    {
+      NS_LOG_DEBUG ( "SixLowPanNetDevice::SendFrom " << *packet );
+      m_txTrace (packet, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+      ret = m_netDevice->SendFrom (packet, src, dest, protocolNumber);
+    }
+
+  return ret;
+}
+
+Ptr<Node> SixLowPanNetDevice::GetNode (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_node;
+}
+
+void SixLowPanNetDevice::SetNode (Ptr<Node> node)
+{
+  NS_LOG_FUNCTION (this << node);
+  m_node = node;
+}
+
+bool SixLowPanNetDevice::NeedsArp (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT_MSG ( m_netDevice != 0, "Sixlowpan: can't find any lower-layer protocol " << m_netDevice );
+
+  return m_netDevice->NeedsArp ();
+}
+
+void SixLowPanNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
+{
+  NS_LOG_FUNCTION (this << &cb);
+  m_rxCallback = cb;
+}
+
+void SixLowPanNetDevice::SetPromiscReceiveCallback (NetDevice::PromiscReceiveCallback cb)
+{
+  NS_LOG_FUNCTION (this << &cb);
+  m_promiscRxCallback = cb;
+}
+
+bool SixLowPanNetDevice::SupportsSendFrom () const
+{
+  NS_LOG_FUNCTION (this);
+  return true;
+}
+
+uint32_t
+SixLowPanNetDevice::CompressLowPanHc1 (Ptr<Packet> packet, Address const &src, Address const &dst)
+{
+  NS_LOG_FUNCTION (this << *packet << src << dst);
+
+  Ipv6Header ipHeader;
+  SixLowPanHc1 hc1Header;
+  uint32_t size = 0;
+
+  if ( packet->PeekHeader (ipHeader) != 0 )
+    {
+      packet->RemoveHeader (ipHeader);
+      size += ipHeader.GetSerializedSize ();
+
+      hc1Header.SetHopLimit (ipHeader.GetHopLimit ());
+
+      uint8_t bufOne[16];
+      uint8_t bufTwo[16];
+      Ipv6Address srcAddr = ipHeader.GetSourceAddress ();
+      srcAddr.GetBytes (bufOne);
+      Ipv6Address mySrcAddr = MakeLinkLocalAddressFromMac (src);
+
+      NS_LOG_LOGIC ("Checking source compression: " << mySrcAddr << " - " << srcAddr );
+
+      mySrcAddr.GetBytes (bufTwo);
+      bool isSrcSrc = (memcmp (bufOne + 8, bufTwo + 8, 8) == 0);
+
+      if (srcAddr.IsLinkLocal () && isSrcSrc )
+        {
+          hc1Header.SetSrcCompression (SixLowPanHc1::HC1_PCIC);
+        }
+      else if (srcAddr.IsLinkLocal () )
+        {
+          hc1Header.SetSrcCompression (SixLowPanHc1::HC1_PCII);
+          hc1Header.SetSrcInterface (bufOne + 8);
+        }
+      else if ( isSrcSrc )
+        {
+          hc1Header.SetSrcCompression (SixLowPanHc1::HC1_PIIC);
+          hc1Header.SetSrcPrefix (bufOne);
+        }
+      else
+        {
+          hc1Header.SetSrcCompression (SixLowPanHc1::HC1_PIII);
+          hc1Header.SetSrcInterface (bufOne + 8);
+          hc1Header.SetSrcPrefix (bufOne);
+        }
+
+      Ipv6Address dstAddr = ipHeader.GetDestinationAddress ();
+      dstAddr.GetBytes (bufOne);
+      Ipv6Address myDstAddr = MakeLinkLocalAddressFromMac (dst);
+
+      NS_LOG_LOGIC ("Checking destination compression: " << myDstAddr << " - " << dstAddr );
+
+      myDstAddr.GetBytes (bufTwo);
+      bool isDstDst = (memcmp (bufOne + 8, bufTwo + 8, 8) == 0);
+
+      if (dstAddr.IsLinkLocal () && isDstDst )
+        {
+          hc1Header.SetDstCompression (SixLowPanHc1::HC1_PCIC);
+        }
+      else if (dstAddr.IsLinkLocal () )
+        {
+          hc1Header.SetDstCompression (SixLowPanHc1::HC1_PCII);
+          hc1Header.SetDstInterface (bufOne + 8);
+        }
+      else if ( isDstDst )
+        {
+          hc1Header.SetDstCompression (SixLowPanHc1::HC1_PIIC);
+          hc1Header.SetDstPrefix (bufOne);
+        }
+      else
+        {
+          hc1Header.SetDstCompression (SixLowPanHc1::HC1_PIII);
+          hc1Header.SetDstInterface (bufOne + 8);
+          hc1Header.SetDstPrefix (bufOne);
+        }
+
+      if ( (ipHeader.GetFlowLabel () == 0) && (ipHeader.GetTrafficClass () == 0) )
+        {
+          hc1Header.SetTcflCompression (true);
+        }
+      else
+        {
+          hc1Header.SetTcflCompression (false);
+          hc1Header.SetTrafficClass (ipHeader.GetTrafficClass ());
+          hc1Header.SetFlowLabel (ipHeader.GetFlowLabel ());
+        }
+
+      uint8_t nextHeader = ipHeader.GetNextHeader ();
+      hc1Header.SetNextHeader (nextHeader);
+
+      // \todo implement HC2 compression
+      hc1Header.SetHc2HeaderPresent (false);
+
+      NS_LOG_DEBUG ("HC1 Compression - HC1 header size = " << hc1Header.GetSerializedSize () );
+      NS_LOG_DEBUG ("HC1 Compression - packet size = " << packet->GetSize () );
+
+      packet->AddHeader (hc1Header);
+
+      return size;
+    }
+
+  return 0;
+}
+
+void
+SixLowPanNetDevice::DecompressLowPanHc1 (Ptr<Packet> packet, Address const &src, Address const &dst)
+{
+  NS_LOG_FUNCTION (this << *packet << src << dst);
+
+  Ipv6Header ipHeader;
+  SixLowPanHc1 encoding;
+
+  uint32_t ret = packet->RemoveHeader (encoding);
+  NS_LOG_DEBUG ("removed " << ret << " bytes - pkt is " << *packet);
+  NS_UNUSED (ret);
+
+  ipHeader.SetHopLimit (encoding.GetHopLimit ());
+
+  switch (encoding.GetSrcCompression ())
+    {
+      const uint8_t* interface;
+      const uint8_t* prefix;
+      uint8_t address[16];
+
+    case SixLowPanHc1::HC1_PIII:
+      prefix = encoding.GetSrcPrefix ();
+      interface = encoding.GetSrcInterface ();
+      for (int j = 0; j < 8; j++)
+        {
+          address[j + 8] = interface[j];
+          address[j] = prefix[j];
+        }
+      ipHeader.SetSourceAddress ( Ipv6Address (address) );
+      break;
+    case SixLowPanHc1::HC1_PIIC:
+      prefix = encoding.GetSrcPrefix ();
+      for (int j = 0; j < 8; j++)
+        {
+          address[j + 8] = 0;
+          address[j] = prefix[j];
+        }
+      ipHeader.SetSourceAddress ( MakeGlobalAddressFromMac (src, Ipv6Address (address)));
+      break;
+    case SixLowPanHc1::HC1_PCII:
+      interface = encoding.GetSrcInterface ();
+      address[0] = 0xfe;
+      address[1] = 0x80;
+      for (int j = 0; j < 8; j++)
+        {
+          address[j + 8] = interface[j];
+        }
+      ipHeader.SetSourceAddress ( Ipv6Address (address) );
+      break;
+    case SixLowPanHc1::HC1_PCIC:
+      ipHeader.SetSourceAddress (MakeLinkLocalAddressFromMac (src));
+      break;
+    }
+
+  switch (encoding.GetDstCompression ())
+    {
+      const uint8_t* interface;
+      const uint8_t* prefix;
+      uint8_t address[16];
+
+    case SixLowPanHc1::HC1_PIII:
+      prefix = encoding.GetDstPrefix ();
+      interface = encoding.GetDstInterface ();
+      for (int j = 0; j < 8; j++)
+        {
+          address[j + 8] = interface[j];
+          address[j] = prefix[j];
+        }
+      ipHeader.SetDestinationAddress ( Ipv6Address (address) );
+      break;
+    case SixLowPanHc1::HC1_PIIC:
+      prefix = encoding.GetDstPrefix ();
+      for (int j = 0; j < 8; j++)
+        {
+          address[j + 8] = 0;
+          address[j] = prefix[j];
+        }
+      ipHeader.SetDestinationAddress ( MakeGlobalAddressFromMac (dst, Ipv6Address (address)));
+      break;
+    case SixLowPanHc1::HC1_PCII:
+      interface = encoding.GetDstInterface ();
+      address[0] = 0xfe;
+      address[1] = 0x80;
+      for (int j = 0; j < 8; j++)
+        {
+          address[j + 8] = interface[j];
+        }
+      ipHeader.SetDestinationAddress ( Ipv6Address (address) );
+      break;
+    case SixLowPanHc1::HC1_PCIC:
+      ipHeader.SetDestinationAddress (MakeLinkLocalAddressFromMac (dst));
+      break;
+    }
+
+  if ( !encoding.IsTcflCompression () )
+    {
+      ipHeader.SetFlowLabel (encoding.GetFlowLabel ());
+      ipHeader.SetTrafficClass (encoding.GetTrafficClass ());
+    }
+  else
+    {
+      ipHeader.SetFlowLabel (0);
+      ipHeader.SetTrafficClass (0);
+    }
+
+  ipHeader.SetNextHeader (encoding.GetNextHeader ());
+
+  ipHeader.SetPayloadLength (packet->GetSize ());
+
+  NS_ASSERT_MSG (encoding.IsHc2HeaderPresent () == false,
+                 "6LoWPAN: error in decompressing HC1 encoding, unsupported L4 compressed header present.");
+
+  packet->AddHeader (ipHeader);
+
+  NS_LOG_DEBUG ( "Rebuilt packet: " << *packet << " Size " << packet->GetSize () );
+}
+
+uint32_t
+SixLowPanNetDevice::CompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst)
+{
+  NS_LOG_FUNCTION (this << *packet << src << dst);
+
+  Ipv6Header ipHeader;
+  SixLowPanIphc iphcHeader;
+  uint32_t size = 0;
+
+
+  if ( packet->PeekHeader (ipHeader) != 0 )
+    {
+      packet->RemoveHeader (ipHeader);
+      size += ipHeader.GetSerializedSize ();
+
+      // Set the TF field
+      if ( (ipHeader.GetFlowLabel () == 0) && (ipHeader.GetTrafficClass () == 0) )
+        {
+          iphcHeader.SetTf (SixLowPanIphc::TF_ELIDED);
+        }
+      else if ( (ipHeader.GetFlowLabel () != 0) && (ipHeader.GetTrafficClass () != 0) )
+        {
+          iphcHeader.SetTf (SixLowPanIphc::TF_FULL);
+          iphcHeader.SetEcn ( (ipHeader.GetTrafficClass () & 0xC0) >> 6);
+          iphcHeader.SetDscp ( ipHeader.GetTrafficClass () & 0x3F );
+          iphcHeader.SetFlowLabel (ipHeader.GetFlowLabel ());
+        }
+      else if ( (ipHeader.GetFlowLabel () == 0) && (ipHeader.GetTrafficClass () != 0) )
+        {
+          iphcHeader.SetTf (SixLowPanIphc::TF_FL_ELIDED);
+          iphcHeader.SetEcn ( (ipHeader.GetTrafficClass () & 0xC0) >> 6);
+          iphcHeader.SetDscp ( ipHeader.GetTrafficClass () & 0x3F );
+        }
+      else
+        {
+          iphcHeader.SetTf (SixLowPanIphc::TF_DSCP_ELIDED);
+          iphcHeader.SetEcn ( (ipHeader.GetTrafficClass () & 0xC0) >> 6);
+          iphcHeader.SetFlowLabel (ipHeader.GetFlowLabel ());
+        }
+
+      // Set the NH field and NextHeader
+
+      uint8_t nextHeader = ipHeader.GetNextHeader ();
+      if (CanCompressLowPanNhc (nextHeader))
+        {
+          if (nextHeader == Ipv6Header::IPV6_UDP)
+            {
+              iphcHeader.SetNh (true);
+              size += CompressLowPanUdpNhc (packet, m_omitUdpChecksum);
+            }
+          else if (nextHeader == Ipv6Header::IPV6_IPV6)
+            {
+              iphcHeader.SetNh (true);
+              size += CompressLowPanIphc (packet, src, dst);
+            }
+          else
+            {
+              uint32_t sizeNhc = CompressLowPanNhc (packet, nextHeader, src, dst);
+              // the compression might fail due to Extension header size.
+              if (sizeNhc)
+                {
+                  iphcHeader.SetNh (true);
+                  size += sizeNhc;
+                }
+              else
+                {
+                  iphcHeader.SetNh (false);
+                  iphcHeader.SetNextHeader (nextHeader);
+                }
+            }
+        }
+      else
+        {
+          iphcHeader.SetNh (false);
+          iphcHeader.SetNextHeader (nextHeader);
+        }
+
+
+      // Set the HLIM field
+      if (ipHeader.GetHopLimit () == 1)
+        {
+          iphcHeader.SetHlim (SixLowPanIphc::HLIM_COMPR_1);
+        }
+      else if (ipHeader.GetHopLimit () == 0x40)
+        {
+          iphcHeader.SetHlim (SixLowPanIphc::HLIM_COMPR_64);
+        }
+      else if (ipHeader.GetHopLimit () == 0xFF)
+        {
+          iphcHeader.SetHlim (SixLowPanIphc::HLIM_COMPR_255);
+        }
+      else
+        {
+          iphcHeader.SetHlim (SixLowPanIphc::HLIM_INLINE);
+          // Set the HopLimit
+          iphcHeader.SetHopLimit (ipHeader.GetHopLimit ());
+        }
+
+      // \todo Add the check of CID if there is context-based compression
+      // Set the CID field
+      iphcHeader.SetCid (false);
+
+      // \todo Add the check of SAC if there is context-based compression
+      // Set the SAC field
+      iphcHeader.SetSac (false);
+
+      uint8_t addressBuf[16];
+      uint8_t unicastAddrCheckerBuf[16];
+      Ipv6Address srcAddr = ipHeader.GetSourceAddress ();
+      srcAddr.GetBytes (addressBuf);
+
+      Ipv6Address checker = Ipv6Address ("fe80:0000:0000:0000:0000:00ff:fe00:1");
+      checker.GetBytes (unicastAddrCheckerBuf);
+
+      // \todo Add the check of SAC if there is context-based compression
+      // Set the Source Address
+      iphcHeader.SetSrcAddress (srcAddr);
+
+      Ipv6Address mySrcAddr = MakeLinkLocalAddressFromMac (src);
+      NS_LOG_LOGIC ("Checking source compression: " << mySrcAddr << " - " << srcAddr );
+
+      if ( mySrcAddr == srcAddr )
+        {
+          iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_0);
+        }
+      else if (memcmp (addressBuf, unicastAddrCheckerBuf, 14) == 0)
+        {
+          iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_16);
+        }
+      else if ( srcAddr.IsLinkLocal () )
+        {
+          iphcHeader.SetSam (SixLowPanIphc::HC_COMPR_64);
+        }
+      else
+        {
+          iphcHeader.SetSam (SixLowPanIphc::HC_INLINE);
+        }
+
+      // Set the M field
+      if (ipHeader.GetDestinationAddress ().IsMulticast ())
+        {
+          iphcHeader.SetM (true);
+        }
+      else
+        {
+          iphcHeader.SetM (false);
+        }
+
+      // \todo Add the check of DAC if there is context-based compression
+      // Set the DAC field
+      iphcHeader.SetDac (false);
+
+      Ipv6Address dstAddr = ipHeader.GetDestinationAddress ();
+      dstAddr.GetBytes (addressBuf);
+
+      // \todo Add the check of DAC if there is context-based compression
+      // Set the Destination Address
+      iphcHeader.SetDstAddress (dstAddr);
+
+      Ipv6Address myDstAddr = MakeLinkLocalAddressFromMac (dst);
+      NS_LOG_LOGIC ("Checking destination compression: " << myDstAddr << " - " << dstAddr );
+
+      if ( !iphcHeader.GetM () )
+      // Unicast address
+        {
+          if ( myDstAddr == dstAddr )
+            {
+              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_0);
+            }
+          else if (memcmp (addressBuf, unicastAddrCheckerBuf, 14) == 0)
+            {
+              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_16);
+            }
+          else if ( dstAddr.IsLinkLocal () )
+            {
+              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_64);
+            }
+          else
+            {
+              iphcHeader.SetDam (SixLowPanIphc::HC_INLINE);
+            }
+        }
+      else
+        {
+          // Multicast address
+          uint8_t multicastAddrCheckerBuf[16];
+          Ipv6Address multicastCheckAddress = Ipv6Address ("ff02::1");
+          multicastCheckAddress.GetBytes (multicastAddrCheckerBuf);
+
+          // The address takes the form ff02::00XX.
+          if ( memcmp (addressBuf, multicastAddrCheckerBuf, 15) == 0 )
+            {
+              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_0);
+            }
+          // The address takes the form ffXX::00XX:XXXX.
+          //                            ffXX:0000:0000:0000:0000:0000:00XX:XXXX.
+          else if ( (addressBuf[0] == multicastAddrCheckerBuf[0])
+                    && (memcmp (addressBuf + 2, multicastAddrCheckerBuf + 2, 11) ) )
+            {
+              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_16);
+            }
+          // The address takes the form ffXX::00XX:XXXX:XXXX.
+          //                            ffXX:0000:0000:0000:0000:00XX:XXXX:XXXX.
+          else if ( (addressBuf[0] == multicastAddrCheckerBuf[0])
+                    && (memcmp (addressBuf + 2, multicastAddrCheckerBuf + 2, 9) ) )
+            {
+              iphcHeader.SetDam (SixLowPanIphc::HC_COMPR_64);
+            }
+          else
+            {
+              iphcHeader.SetDam (SixLowPanIphc::HC_INLINE);
+            }
+        }
+
+      NS_LOG_DEBUG ("IPHC Compression - IPHC header size = " << iphcHeader.GetSerializedSize () );
+      NS_LOG_DEBUG ("IPHC Compression - packet size = " << packet->GetSize () );
+
+      packet->AddHeader (iphcHeader);
+
+      NS_LOG_DEBUG ("Packet after IPHC compression: " << *packet);
+
+      return size;
+    }
+
+  return 0;
+}
+
+bool
+SixLowPanNetDevice::CanCompressLowPanNhc (uint8_t nextHeader)
+{
+  bool ret = false;
+
+  switch (nextHeader)
+    {
+    case Ipv6Header::IPV6_UDP:
+    case Ipv6Header::IPV6_EXT_HOP_BY_HOP:
+    case Ipv6Header::IPV6_EXT_ROUTING:
+    case Ipv6Header::IPV6_EXT_FRAGMENTATION:
+    case Ipv6Header::IPV6_IPV6:
+      ret = true;
+      break;
+    case Ipv6Header::IPV6_EXT_MOBILITY:
+    default:
+      ret = false;
+    }
+  return ret;
+}
+
+void
+SixLowPanNetDevice::DecompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst)
+{
+  NS_LOG_FUNCTION (this << *packet << src << dst);
+
+  Ipv6Header ipHeader;
+  SixLowPanIphc encoding;
+
+  uint32_t ret = packet->RemoveHeader (encoding);
+  NS_LOG_DEBUG ("removed " << ret << " bytes - pkt is " << *packet);
+  NS_UNUSED (ret);
+
+  // Hop Limit
+  ipHeader.SetHopLimit (encoding.GetHopLimit ());
+
+  // Source address
+  if ( encoding.GetSac () )
+    {
+      if ( encoding.GetSam () == SixLowPanIphc::HC_INLINE )
+        {
+          ipHeader.SetSourceAddress ( Ipv6Address::GetAny () );
+        }
+      else
+        {
+          NS_ABORT_MSG ("SAC option not yet implemented");
+        }
+    }
+  else
+    {
+      if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_0 )
+        {
+          ipHeader.SetSourceAddress (MakeLinkLocalAddressFromMac (src));
+        }
+      else
+        {
+          ipHeader.SetSourceAddress ( encoding.GetSrcAddress () );
+        }
+    }
+  // Destination address
+  if ( encoding.GetDac () )
+    {
+      if ((encoding.GetDam () == SixLowPanIphc::HC_INLINE  && !encoding.GetM ())
+          || (encoding.GetDam () == SixLowPanIphc::HC_COMPR_64  && encoding.GetM ())
+          || (encoding.GetDam () == SixLowPanIphc::HC_COMPR_16  && encoding.GetM ())
+          || (encoding.GetDam () == SixLowPanIphc::HC_COMPR_0  && encoding.GetM ()) )
+        {
+          NS_ABORT_MSG ("Reserved code found");
+        }
+      else
+        {
+          NS_ABORT_MSG ("DAC option not yet implemented");
+        }
+    }
+  else
+    {
+      if ( !encoding.GetM () && encoding.GetDam () == SixLowPanIphc::HC_COMPR_0 )
+        {
+          ipHeader.SetDestinationAddress (MakeLinkLocalAddressFromMac (dst));
+        }
+      else
+        {
+          ipHeader.SetDestinationAddress ( encoding.GetDstAddress () );
+        }
+    }
+
+  // Traffic class and Flow Label
+  uint8_t traf = 0x00;
+  switch (encoding.GetTf ())
+    {
+    case SixLowPanIphc::TF_FULL:
+      traf |= encoding.GetEcn ();
+      traf = ( traf << 6 ) | encoding.GetDscp ();
+      ipHeader.SetTrafficClass (traf);
+      ipHeader.SetFlowLabel ( encoding.GetFlowLabel () & 0xfff ); //Add 4-bit pad
+      break;
+    case SixLowPanIphc::TF_DSCP_ELIDED:
+      traf |= encoding.GetEcn ();
+      traf <<= 2;   // Add 2-bit pad
+      ipHeader.SetTrafficClass (traf);
+      ipHeader.SetFlowLabel (encoding.GetFlowLabel ());
+      break;
+    case SixLowPanIphc::TF_FL_ELIDED:
+      traf |= encoding.GetEcn ();
+      traf = ( traf << 6 ) | encoding.GetDscp ();
+      ipHeader.SetTrafficClass (traf);
+      ipHeader.SetFlowLabel (0);
+      break;
+    case SixLowPanIphc::TF_ELIDED:
+      ipHeader.SetFlowLabel (0);
+      ipHeader.SetTrafficClass (0);
+      break;
+    }
+
+  if ( encoding.GetNh () )
+    {
+      // Next Header
+      uint8_t dispatchRawVal = 0;
+      SixLowPanDispatch::NhcDispatch_e dispatchVal;
+
+      packet->CopyData (&dispatchRawVal, sizeof(dispatchRawVal));
+      dispatchVal = SixLowPanDispatch::GetNhcDispatchType (dispatchRawVal);
+
+      if (dispatchVal == SixLowPanDispatch::LOWPAN_UDPNHC)
+        {
+          ipHeader.SetNextHeader (Ipv6Header::IPV6_UDP);
+          DecompressLowPanUdpNhc (packet, ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress ());
+        }
+      else
+        {
+          ipHeader.SetNextHeader (DecompressLowPanNhc (packet, src, dst, ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress ()));
+        }
+    }
+  else
+    {
+      ipHeader.SetNextHeader (encoding.GetNextHeader ());
+    }
+
+  ipHeader.SetPayloadLength (packet->GetSize ());
+
+  packet->AddHeader (ipHeader);
+
+  NS_LOG_DEBUG ( "Rebuilt packet: " << *packet << " Size " << packet->GetSize () );
+
+}
+
+uint32_t
+SixLowPanNetDevice::CompressLowPanNhc (Ptr<Packet> packet, uint8_t headerType, Address const &src, Address const &dst)
+{
+  NS_LOG_FUNCTION (this << *packet << int(headerType));
+
+  SixLowPanNhcExtension nhcHeader;
+  uint32_t size = 0;
+  Buffer blob;
+
+  if (headerType == Ipv6Header::IPV6_EXT_HOP_BY_HOP)
+    {
+      Ipv6ExtensionHopByHopHeader hopHeader;
+      packet->PeekHeader (hopHeader);
+      if (hopHeader.GetLength () >= 0xff)
+        {
+          NS_LOG_DEBUG ("LOWPAN_NHC MUST NOT be used to encode IPv6 Extension Headers "
+                        "that have more than 255 octets following the Length field after compression. "
+                        "Packet uncompressed.");
+          return 0;
+        }
+
+      size += packet->RemoveHeader (hopHeader);
+      nhcHeader.SetEid (SixLowPanNhcExtension::EID_HOPBYHOP_OPTIONS_H);
+
+      // recursively compress other headers
+      uint8_t nextHeader = hopHeader.GetNextHeader ();
+      if (CanCompressLowPanNhc (nextHeader))
+        {
+          if (nextHeader == Ipv6Header::IPV6_UDP)
+            {
+              nhcHeader.SetNh (true);
+              size += CompressLowPanUdpNhc (packet, m_omitUdpChecksum);
+            }
+          else if (nextHeader == Ipv6Header::IPV6_IPV6)
+            {
+              nhcHeader.SetNh (true);
+              size += CompressLowPanIphc (packet, src, dst);
+            }
+          else
+            {
+              uint32_t sizeNhc = CompressLowPanNhc (packet, nextHeader, src, dst);
+              // the compression might fail due to Extension header size.
+              if (sizeNhc)
+                {
+                  nhcHeader.SetNh (true);
+                  size += sizeNhc;
+                }
+              else
+                {
+                  nhcHeader.SetNh (false);
+                  nhcHeader.SetNextHeader (nextHeader);
+                }
+            }
+        }
+      else
+        {
+          nhcHeader.SetNh (false);
+          nhcHeader.SetNextHeader (nextHeader);
+        }
+
+      uint32_t blobSize = hopHeader.GetSerializedSize ();
+      blob.AddAtStart (blobSize);
+      hopHeader.Serialize (blob.Begin ());
+      blob.RemoveAtStart (2);
+      blobSize = blob.GetSize ();
+      nhcHeader.SetBlob (blob.PeekData (), blobSize);
+    }
+  else if (headerType == Ipv6Header::IPV6_EXT_ROUTING)
+    {
+      Ipv6ExtensionRoutingHeader routingHeader;
+      packet->PeekHeader (routingHeader);
+      if (routingHeader.GetLength () >= 0xff)
+        {
+          NS_LOG_DEBUG ("LOWPAN_NHC MUST NOT be used to encode IPv6 Extension Headers "
+                        "that have more than 255 octets following the Length field after compression. "
+                        "Packet uncompressed.");
+          return 0;
+        }
+
+      size += packet->RemoveHeader (routingHeader);
+      nhcHeader.SetEid (SixLowPanNhcExtension::EID_ROUTING_H);
+
+      // recursively compress other headers
+      uint8_t nextHeader = routingHeader.GetNextHeader ();
+      if (CanCompressLowPanNhc (nextHeader))
+        {
+          if (nextHeader == Ipv6Header::IPV6_UDP)
+            {
+              nhcHeader.SetNh (true);
+              size += CompressLowPanUdpNhc (packet, m_omitUdpChecksum);
+            }
+          else if (nextHeader == Ipv6Header::IPV6_IPV6)
+            {
+              nhcHeader.SetNh (true);
+              size += CompressLowPanIphc (packet, src, dst);
+            }
+          else
+            {
+              uint32_t sizeNhc = CompressLowPanNhc (packet, nextHeader, src, dst);
+              // the compression might fail due to Extension header size.
+              if (sizeNhc)
+                {
+                  nhcHeader.SetNh (true);
+                  size += sizeNhc;
+                }
+              else
+                {
+                  nhcHeader.SetNh (false);
+                  nhcHeader.SetNextHeader (nextHeader);
+                }
+            }
+        }
+      else
+        {
+          nhcHeader.SetNh (false);
+          nhcHeader.SetNextHeader (nextHeader);
+        }
+
+      uint32_t blobSize = routingHeader.GetSerializedSize ();
+      blob.AddAtStart (blobSize);
+      routingHeader.Serialize (blob.Begin ());
+      blob.RemoveAtStart (2);
+      blobSize = blob.GetSize ();
+      nhcHeader.SetBlob (blob.PeekData (), blobSize);
+    }
+  else if (headerType == Ipv6Header::IPV6_EXT_FRAGMENTATION)
+    {
+      Ipv6ExtensionFragmentHeader fragHeader;
+      packet->PeekHeader (fragHeader);
+      if (fragHeader.GetLength () >= 0xff)
+        {
+          NS_LOG_DEBUG ("LOWPAN_NHC MUST NOT be used to encode IPv6 Extension Headers "
+                        "that have more than 255 octets following the Length field after compression. "
+                        "Packet uncompressed.");
+          return 0;
+        }
+      size += packet->RemoveHeader (fragHeader);
+      nhcHeader.SetEid (SixLowPanNhcExtension::EID_FRAGMENTATION_H);
+
+      // recursively compress other headers
+      uint8_t nextHeader = fragHeader.GetNextHeader ();
+      if (CanCompressLowPanNhc (nextHeader))
+        {
+          if (nextHeader == Ipv6Header::IPV6_UDP)
+            {
+              nhcHeader.SetNh (true);
+              size += CompressLowPanUdpNhc (packet, m_omitUdpChecksum);
+            }
+          else if (nextHeader == Ipv6Header::IPV6_IPV6)
+            {
+              nhcHeader.SetNh (true);
+              size += CompressLowPanIphc (packet, src, dst);
+            }
+          else
+            {
+              uint32_t sizeNhc = CompressLowPanNhc (packet, nextHeader, src, dst);
+              // the compression might fail due to Extension header size.
+              if (sizeNhc)
+                {
+                  nhcHeader.SetNh (true);
+                  size += sizeNhc;
+                }
+              else
+                {
+                  nhcHeader.SetNh (false);
+                  nhcHeader.SetNextHeader (nextHeader);
+                }
+            }
+        }
+      else
+        {
+          nhcHeader.SetNh (false);
+          nhcHeader.SetNextHeader (nextHeader);
+        }
+
+      uint32_t blobSize = fragHeader.GetSerializedSize ();
+      blob.AddAtStart (blobSize);
+      fragHeader.Serialize (blob.Begin ());
+      blob.RemoveAtStart (2);
+      blobSize = blob.GetSize ();
+      nhcHeader.SetBlob (blob.PeekData (), blobSize);
+    }
+  else if (headerType == Ipv6Header::IPV6_EXT_DESTINATION)
+    {
+      Ipv6ExtensionDestinationHeader destHeader;
+      packet->PeekHeader (destHeader);
+      if (destHeader.GetLength () >= 0xff)
+        {
+          NS_LOG_DEBUG ("LOWPAN_NHC MUST NOT be used to encode IPv6 Extension Headers "
+                        "that have more than 255 octets following the Length field after compression. "
+                        "Packet uncompressed.");
+          return 0;
+        }
+      size += packet->RemoveHeader (destHeader);
+      nhcHeader.SetEid (SixLowPanNhcExtension::EID_DESTINATION_OPTIONS_H);
+
+      // recursively compress other headers
+      uint8_t nextHeader = destHeader.GetNextHeader ();
+      if (CanCompressLowPanNhc (nextHeader))
+        {
+          if (nextHeader == Ipv6Header::IPV6_UDP)
+            {
+              nhcHeader.SetNh (true);
+              size += CompressLowPanUdpNhc (packet, m_omitUdpChecksum);
+            }
+          else if (nextHeader == Ipv6Header::IPV6_IPV6)
+            {
+              nhcHeader.SetNh (true);
+              size += CompressLowPanIphc (packet, src, dst);
+            }
+          else
+            {
+              uint32_t sizeNhc = CompressLowPanNhc (packet, nextHeader, src, dst);
+              // the compression might fail due to Extension header size.
+              if (sizeNhc)
+                {
+                  nhcHeader.SetNh (true);
+                  size += sizeNhc;
+                }
+              else
+                {
+                  nhcHeader.SetNh (false);
+                  nhcHeader.SetNextHeader (nextHeader);
+                }
+            }
+        }
+      else
+        {
+          nhcHeader.SetNh (false);
+          nhcHeader.SetNextHeader (nextHeader);
+        }
+
+      uint32_t blobSize = destHeader.GetSerializedSize ();
+      blob.AddAtStart (blobSize);
+      destHeader.Serialize (blob.Begin ());
+      blob.RemoveAtStart (2);
+      blobSize = blob.GetSize ();
+      nhcHeader.SetBlob (blob.PeekData (), blobSize);
+    }
+  else if (headerType == Ipv6Header::IPV6_EXT_MOBILITY)
+    {
+      // \todo: IPv6 Mobility Header is not supported in ns-3
+      NS_ABORT_MSG ("IPv6 Mobility Header is not supported in ns-3 yet");
+      return 0;
+    }
+  else
+    {
+      NS_ABORT_MSG ("Unexpected Extension Header");
+    }
+
+  NS_LOG_DEBUG ("NHC Compression - NHC header size = " << nhcHeader.GetSerializedSize () );
+  NS_LOG_DEBUG ("NHC Compression - packet size = " << packet->GetSize () );
+
+  packet->AddHeader (nhcHeader);
+
+  NS_LOG_DEBUG ("Packet after NHC compression: " << *packet);
+  return size;
+}
+
+uint8_t
+SixLowPanNetDevice::DecompressLowPanNhc (Ptr<Packet> packet, Address const &src, Address const &dst, Ipv6Address srcAddress, Ipv6Address dstAddress)
+{
+  NS_LOG_FUNCTION (this << *packet);
+
+  SixLowPanNhcExtension encoding;
+
+  uint32_t ret = packet->RemoveHeader (encoding);
+  NS_LOG_DEBUG ("removed " << ret << " bytes - pkt is " << *packet);
+  NS_UNUSED (ret);
+
+  Ipv6ExtensionHopByHopHeader hopHeader;
+  Ipv6ExtensionRoutingHeader routingHeader;
+  Ipv6ExtensionFragmentHeader fragHeader;
+  Ipv6ExtensionDestinationHeader destHeader;
+
+  uint32_t blobSize;
+  uint8_t blobData[260];
+  blobSize = encoding.CopyBlob (blobData + 2, 260);
+  uint8_t paddingSize = 0;
+
+  uint8_t actualEncodedHeaderType = encoding.GetEid ();
+  uint8_t actualHeaderType;
+  Buffer blob;
+
+  switch (actualEncodedHeaderType)
+    {
+    case SixLowPanNhcExtension::EID_HOPBYHOP_OPTIONS_H:
+      actualHeaderType = Ipv6Header::IPV6_EXT_HOP_BY_HOP;
+      if ( encoding.GetNh () )
+        {
+          // Next Header
+          uint8_t dispatchRawVal = 0;
+          SixLowPanDispatch::NhcDispatch_e dispatchVal;
+
+          packet->CopyData (&dispatchRawVal, sizeof(dispatchRawVal));
+          dispatchVal = SixLowPanDispatch::GetNhcDispatchType (dispatchRawVal);
+
+          if (dispatchVal == SixLowPanDispatch::LOWPAN_UDPNHC)
+            {
+              blobData [0] = Ipv6Header::IPV6_UDP;
+              DecompressLowPanUdpNhc (packet, srcAddress, dstAddress);
+            }
+          else
+            {
+              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress);
+            }
+        }
+      else
+        {
+          blobData [0] = encoding.GetNextHeader ();
+        }
+
+      // manually add some padding if needed
+      if ((blobSize + 2) % 8 > 0)
+        {
+          paddingSize = 8 - (blobSize + 2) % 8;
+        }
+      if (paddingSize == 1)
+        {
+          blobData[blobSize + 2] = 0;
+        }
+      else if (paddingSize > 1)
+        {
+          blobData[blobSize + 2] = 1;
+          blobData[blobSize + 2 + 1] = paddingSize - 2;
+          for (uint8_t i = 0; i < paddingSize - 2; i++)
+            {
+              blobData[blobSize + 2 + 2 + i] = 0;
+            }
+        }
+      blobData [1] = ((blobSize + 2 + paddingSize) >> 3) - 1;
+      blob.AddAtStart (blobSize + 2 + paddingSize);
+      blob.Begin ().Write (blobData, blobSize + 2 + paddingSize);
+      hopHeader.Deserialize (blob.Begin ());
+
+      packet->AddHeader (hopHeader);
+      break;
+
+    case SixLowPanNhcExtension::EID_ROUTING_H:
+      actualHeaderType = Ipv6Header::IPV6_EXT_ROUTING;
+      if ( encoding.GetNh () )
+        {
+          // Next Header
+          uint8_t dispatchRawVal = 0;
+          SixLowPanDispatch::NhcDispatch_e dispatchVal;
+
+          packet->CopyData (&dispatchRawVal, sizeof(dispatchRawVal));
+          dispatchVal = SixLowPanDispatch::GetNhcDispatchType (dispatchRawVal);
+
+          if (dispatchVal == SixLowPanDispatch::LOWPAN_UDPNHC)
+            {
+              blobData [0] = Ipv6Header::IPV6_UDP;
+              DecompressLowPanUdpNhc (packet, srcAddress, dstAddress);
+            }
+          else
+            {
+              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress);
+            }
+        }
+      else
+        {
+          blobData [0] = encoding.GetNextHeader ();
+        }
+      blobData [1] = ((blobSize + 2) >> 3) - 1;
+      blob.AddAtStart (blobSize + 2);
+      blob.Begin ().Write (blobData, blobSize + 2);
+      routingHeader.Deserialize (blob.Begin ());
+      packet->AddHeader (routingHeader);
+      break;
+
+    case SixLowPanNhcExtension::EID_FRAGMENTATION_H:
+      actualHeaderType = Ipv6Header::IPV6_EXT_FRAGMENTATION;
+      if ( encoding.GetNh () )
+        {
+          // Next Header
+          uint8_t dispatchRawVal = 0;
+          SixLowPanDispatch::NhcDispatch_e dispatchVal;
+
+          packet->CopyData (&dispatchRawVal, sizeof(dispatchRawVal));
+          dispatchVal = SixLowPanDispatch::GetNhcDispatchType (dispatchRawVal);
+
+          if (dispatchVal == SixLowPanDispatch::LOWPAN_UDPNHC)
+            {
+              blobData [0] = Ipv6Header::IPV6_UDP;
+              DecompressLowPanUdpNhc (packet, srcAddress, dstAddress);
+            }
+          else
+            {
+              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress);
+            }
+        }
+      else
+        {
+          blobData [0] = encoding.GetNextHeader ();
+        }
+      blobData [1] = 0;
+      fragHeader.Deserialize (blob.Begin ());
+      packet->AddHeader (fragHeader);
+      break;
+
+    case SixLowPanNhcExtension::EID_DESTINATION_OPTIONS_H:
+      actualHeaderType = Ipv6Header::IPV6_EXT_DESTINATION;
+      if ( encoding.GetNh () )
+        {
+          // Next Header
+          uint8_t dispatchRawVal = 0;
+          SixLowPanDispatch::NhcDispatch_e dispatchVal;
+
+          packet->CopyData (&dispatchRawVal, sizeof(dispatchRawVal));
+          dispatchVal = SixLowPanDispatch::GetNhcDispatchType (dispatchRawVal);
+
+          if (dispatchVal == SixLowPanDispatch::LOWPAN_UDPNHC)
+            {
+              blobData [0] = Ipv6Header::IPV6_UDP;
+              DecompressLowPanUdpNhc (packet, srcAddress, dstAddress);
+            }
+          else
+            {
+              blobData [0] = DecompressLowPanNhc (packet, src, dst, srcAddress, dstAddress);
+            }
+        }
+      else
+        {
+          blobData [0] = encoding.GetNextHeader ();
+        }
+
+      // manually add some padding if needed
+      if ((blobSize + 2) % 8 > 0)
+        {
+          paddingSize = 8 - (blobSize + 2) % 8;
+        }
+      if (paddingSize == 1)
+        {
+          blobData[blobSize + 2] = 0;
+        }
+      else if (paddingSize > 1)
+        {
+          blobData[blobSize + 2] = 1;
+          blobData[blobSize + 2 + 1] = paddingSize - 2;
+          for (uint8_t i = 0; i < paddingSize - 2; i++)
+            {
+              blobData[blobSize + 2 + 2 + i] = 0;
+            }
+        }
+      blobData [1] = ((blobSize + 2 + paddingSize) >> 3) - 1;
+      blob.AddAtStart (blobSize + 2 + paddingSize);
+      blob.Begin ().Write (blobData, blobSize + 2 + paddingSize);
+      destHeader.Deserialize (blob.Begin ());
+
+      packet->AddHeader (destHeader);
+      break;
+    case SixLowPanNhcExtension::EID_MOBILITY_H:
+      // \todo: IPv6 Mobility Header is not supported in ns-3
+      NS_ABORT_MSG ("IPv6 Mobility Header is not supported in ns-3 yet");
+      break;
+    case SixLowPanNhcExtension::EID_IPv6_H:
+      actualHeaderType = Ipv6Header::IPV6_IPV6;
+      DecompressLowPanIphc (packet, src, dst);
+      break;
+    default:
+      NS_ABORT_MSG ("Trying to decode unknown Extension Header");
+      break;
+    }
+
+  NS_LOG_DEBUG ( "Rebuilt packet: " << *packet << " Size " << packet->GetSize () );
+  return actualHeaderType;
+}
+
+uint32_t
+SixLowPanNetDevice::CompressLowPanUdpNhc (Ptr<Packet> packet, bool omitChecksum)
+{
+  NS_LOG_FUNCTION (this << *packet << int(omitChecksum));
+
+  UdpHeader udpHeader;
+  SixLowPanUdpNhcExtension udpNhcHeader;
+  uint32_t size = 0;
+
+  NS_ASSERT_MSG (packet->PeekHeader (udpHeader) != 0, "UDP header not found, abort");
+
+  size += packet->RemoveHeader (udpHeader);
+
+  // Set the C field and checksum
+  udpNhcHeader.SetC (false);
+  uint16_t checksum = udpHeader.GetChecksum ();
+  udpNhcHeader.SetChecksum (checksum);
+
+  if (omitChecksum && udpHeader.IsChecksumOk ())
+    {
+      udpNhcHeader.SetC (true);
+    }
+
+  // Set the value of the ports
+  udpNhcHeader.SetSrcPort (udpHeader.GetSourcePort ());
+  udpNhcHeader.SetDstPort (udpHeader.GetDestinationPort ());
+
+  //Set the P field
+  if ( (udpHeader.GetSourcePort () >> 4 ) == 0xf0b && (udpHeader.GetDestinationPort () >> 4 ) == 0xf0b )
+    {
+      udpNhcHeader.SetPorts (SixLowPanUdpNhcExtension::PORTS_LAST_SRC_LAST_DST);
+    }
+  else if ( (udpHeader.GetSourcePort () >> 8 ) == 0xf0 && (udpHeader.GetDestinationPort () >> 8 ) != 0xf0 )
+    {
+      udpNhcHeader.SetPorts (SixLowPanUdpNhcExtension::PORTS_LAST_SRC_ALL_DST);
+    }
+  else if ( (udpHeader.GetSourcePort () >> 8 ) != 0xf0 && (udpHeader.GetDestinationPort () >> 8 ) == 0xf0 )
+    {
+      udpNhcHeader.SetPorts (SixLowPanUdpNhcExtension::PORTS_ALL_SRC_LAST_DST);
+    }
+  else
+    {
+      udpNhcHeader.SetPorts (SixLowPanUdpNhcExtension::PORTS_INLINE);
+    }
+
+  NS_LOG_DEBUG ("UDP_NHC Compression - UDP_NHC header size = " << udpNhcHeader.GetSerializedSize () );
+  NS_LOG_DEBUG ("UDP_NHC Compression - packet size = " << packet->GetSize () );
+
+  packet->AddHeader (udpNhcHeader);
+
+  NS_LOG_DEBUG ("Packet after UDP_NHC compression: " << *packet);
+
+  return size;
+}
+
+void
+SixLowPanNetDevice::DecompressLowPanUdpNhc (Ptr<Packet> packet, Ipv6Address saddr, Ipv6Address daddr)
+{
+  NS_LOG_FUNCTION (this << *packet);
+
+  UdpHeader udpHeader;
+  SixLowPanUdpNhcExtension encoding;
+
+  uint32_t ret = packet->RemoveHeader (encoding);
+  NS_LOG_DEBUG ("removed " << ret << " bytes - pkt is " << *packet);
+  NS_UNUSED (ret);
+
+  // Set the value of the ports
+  switch ( encoding.GetPorts () )
+    {
+      uint16_t temp;
+    case SixLowPanUdpNhcExtension::PORTS_INLINE:
+      udpHeader.SetSourcePort (encoding.GetSrcPort ());
+      udpHeader.SetDestinationPort (encoding.GetDstPort ());
+      break;
+    case SixLowPanUdpNhcExtension::PORTS_ALL_SRC_LAST_DST:
+      udpHeader.SetSourcePort (encoding.GetSrcPort ());
+      temp = 0xf0;
+      temp |= (temp << 8) | encoding.GetDstPort ();
+      udpHeader.SetDestinationPort (temp);
+      break;
+    case SixLowPanUdpNhcExtension::PORTS_LAST_SRC_ALL_DST:
+      temp = 0xf0;
+      temp |= (temp << 8) | encoding.GetSrcPort ();
+      udpHeader.SetSourcePort (temp);
+      udpHeader.SetDestinationPort (encoding.GetDstPort ());
+      break;
+    case SixLowPanUdpNhcExtension::PORTS_LAST_SRC_LAST_DST:
+      temp = 0xf0b;
+      temp |= (temp << 4) | encoding.GetSrcPort ();
+      udpHeader.SetSourcePort (temp);
+      temp = 0xf0b;
+      temp |= (temp << 4) | encoding.GetDstPort ();
+      udpHeader.SetDestinationPort (temp);
+      break;
+    }
+
+  // Get the C field and checksum
+  if (Node::ChecksumEnabled ())
+    {
+      if ( encoding.GetC () )
+        {
+          NS_LOG_LOGIC ("Recalculating UDP Checksum");
+          udpHeader.EnableChecksums ();
+          udpHeader.InitializeChecksum (saddr,
+                                        daddr,
+                                        UdpL4Protocol::PROT_NUMBER);
+          packet->AddHeader (udpHeader);
+        }
+      else
+        {
+          NS_LOG_LOGIC ("Forcing UDP Checksum to " << encoding.GetChecksum ());
+          udpHeader.ForceChecksum (encoding.GetChecksum ());
+          packet->AddHeader (udpHeader);
+          NS_LOG_LOGIC ("UDP checksum is ok ? " << udpHeader.IsChecksumOk ());
+        }
+    }
+  else
+    {
+      packet->AddHeader (udpHeader);
+    }
+
+  NS_LOG_DEBUG ( "Rebuilt packet: " << *packet << " Size " << packet->GetSize () );
+}
+
+void SixLowPanNetDevice::DoFragmentation (Ptr<Packet> packet,
+                                          uint32_t origPacketSize,
+                                          uint32_t origHdrSize,
+                                          std::list<Ptr<Packet> >& listFragments)
+{
+  NS_LOG_FUNCTION (this << *packet);
+
+  Ptr<Packet> p = packet->Copy ();
+
+  uint16_t offsetData = 0;
+  uint16_t offset = 0;
+  uint16_t l2Mtu = m_netDevice->GetMtu ();
+  uint32_t packetSize = packet->GetSize ();
+  uint32_t compressedHeaderSize = packetSize - (origPacketSize - origHdrSize);
+
+  uint16_t tag = uint16_t (m_rng->GetValue (0, 65535));
+  NS_LOG_LOGIC ("random tag " << tag << " - test " << packetSize );
+
+  // first fragment
+  SixLowPanFrag1 frag1Hdr;
+  frag1Hdr.SetDatagramTag (tag);
+
+  uint32_t size;
+  NS_ASSERT_MSG ( l2Mtu > frag1Hdr.GetSerializedSize (),
+                  "6LoWPAN: can not fragment, 6LoWPAN headers are bigger than MTU");
+
+  size = l2Mtu - frag1Hdr.GetSerializedSize () - compressedHeaderSize;
+  size -= size % 8;
+  size += compressedHeaderSize;
+
+  frag1Hdr.SetDatagramSize (origPacketSize);
+
+  Ptr<Packet> fragment1 = p->CreateFragment (offsetData, size);
+  offset += size + origHdrSize - compressedHeaderSize;
+  offsetData += size;
+
+  fragment1->AddHeader (frag1Hdr);
+  listFragments.push_back (fragment1);
+
+  bool moreFrag = true;
+  do
+    {
+      SixLowPanFragN fragNHdr;
+      fragNHdr.SetDatagramTag (tag);
+      fragNHdr.SetDatagramSize (origPacketSize);
+      fragNHdr.SetDatagramOffset ((offset) >> 3);
+
+      size = l2Mtu - fragNHdr.GetSerializedSize ();
+      size -= size % 8;
+
+      if ( (offsetData + size) > packetSize )
+        {
+          size = packetSize - offsetData;
+          moreFrag = false;
+        }
+
+      NS_LOG_LOGIC ("Fragment creation - " << offset << ", " << offset );
+      Ptr<Packet> fragment = p->CreateFragment (offsetData, size);
+      NS_LOG_LOGIC ("Fragment created - " << offset << ", " << fragment->GetSize () );
+
+      offset += size;
+      offsetData += size;
+
+      fragment->AddHeader (fragNHdr);
+      listFragments.push_back (fragment);
+
+    }
+  while (moreFrag);
+
+  return;
+}
+
+bool SixLowPanNetDevice::ProcessFragment (Ptr<Packet>& packet, Address const &src, Address const &dst, bool isFirst)
+{
+  NS_LOG_FUNCTION ( this << *packet );
+  SixLowPanFrag1 frag1Header;
+  SixLowPanFragN fragNHeader;
+  FragmentKey key;
+  uint16_t packetSize;
+  key.first = std::pair<Address, Address> (src, dst);
+
+  Ptr<Packet> p = packet->Copy ();
+  uint16_t offset = 0;
+
+  /* Implementation note:
+   *
+   * The fragment offset is relative to the *uncompressed* packet.
+   * On the other hand, the packet can not be uncompressed correctly without all
+   * its fragments, as the UDP checksum can not be computed otherwise.
+   *
+   * As a consequence we must uncompress the packet twice, and save its first
+   * fragment for the final one.
+   */
+
+  if ( isFirst )
+    {
+      uint8_t dispatchRawValFrag1 = 0;
+      SixLowPanDispatch::Dispatch_e dispatchValFrag1;
+
+      p->RemoveHeader (frag1Header);
+      packetSize = frag1Header.GetDatagramSize ();
+      p->CopyData (&dispatchRawValFrag1, sizeof(dispatchRawValFrag1));
+      dispatchValFrag1 = SixLowPanDispatch::GetDispatchType (dispatchRawValFrag1);
+      NS_LOG_DEBUG ( "Dispatches: " << int(dispatchRawValFrag1) << " - " << int(dispatchValFrag1) );
+      NS_LOG_DEBUG ( "Packet: " << *p );
+
+      switch ( dispatchValFrag1 )
+        {
+        case SixLowPanDispatch::LOWPAN_NOTCOMPRESSED:
+          NS_LOG_DEBUG ( "Packet without compression:" << *p );
+          NS_LOG_DEBUG ( "Packet length:" << p->GetSize () );
+          break;
+        case SixLowPanDispatch::LOWPAN_HC1:
+          DecompressLowPanHc1 (p, src, dst);
+          break;
+        case SixLowPanDispatch::LOWPAN_IPHC:
+          DecompressLowPanIphc (p, src, dst);
+          break;
+        default:
+          NS_FATAL_ERROR ("Unsupported 6LoWPAN encoding, exiting.");
+          break;
+        }
+
+      key.second = std::pair<uint16_t, uint16_t> (frag1Header.GetDatagramSize (), frag1Header.GetDatagramTag ());
+    }
+  else
+    {
+      p->RemoveHeader (fragNHeader);
+      packetSize = fragNHeader.GetDatagramSize ();
+      offset = fragNHeader.GetDatagramOffset () << 3;
+      key.second = std::pair<uint16_t, uint16_t> (fragNHeader.GetDatagramSize (), fragNHeader.GetDatagramTag ());
+    }
+
+  Ptr<Fragments> fragments;
+
+  MapFragments_t::iterator it = m_fragments.find (key);
+  if (it == m_fragments.end ())
+    {
+      // erase the oldest packet.
+      if ( m_fragmentReassemblyListSize && (m_fragments.size () >= m_fragmentReassemblyListSize) )
+        {
+          MapFragmentsTimers_t::iterator iter;
+          MapFragmentsTimers_t::iterator iterFound = m_fragmentsTimers.begin ();
+          for ( iter = m_fragmentsTimers.begin (); iter != m_fragmentsTimers.end (); iter++)
+            {
+              if ( iter->second.GetTs () < iterFound->second.GetTs () )
+                {
+                  iterFound = iter;
+                }
+            }
+          FragmentKey oldestKey = iterFound->first;
+
+          std::list< Ptr<Packet> > storedFragments = m_fragments[oldestKey]->GetFraments ();
+          for (std::list< Ptr<Packet> >::iterator fragIter = storedFragments.begin ();
+               fragIter != storedFragments.end (); fragIter++)
+            {
+              m_dropTrace (DROP_FRAGMENT_BUFFER_FULL, *fragIter, m_node->GetObject<SixLowPanNetDevice> (), GetIfIndex ());
+            }
+
+          m_fragmentsTimers[oldestKey].Cancel ();
+          m_fragmentsTimers.erase (oldestKey);
+          m_fragments[oldestKey] = 0;
+          m_fragments.erase (oldestKey);
+
+        }
+      fragments = Create<Fragments> ();
+      fragments->SetPacketSize (packetSize);
+      m_fragments.insert (std::make_pair (key, fragments));
+      uint32_t ifIndex = GetIfIndex ();
+      m_fragmentsTimers[key] = Simulator::Schedule (m_fragmentExpirationTimeout,
+                                                    &SixLowPanNetDevice::HandleFragmentsTimeout, this,
+                                                    key, ifIndex);
+    }
+  else
+    {
+      fragments = it->second;
+    }
+
+  fragments->AddFragment (p, offset);
+
+  // add the very first fragment so we can correctly decode the packet once is rebuilt.
+  // this is needed because otherwise the UDP header length and checksum can not be calculated.
+  if ( isFirst )
+    {
+      fragments->AddFirstFragment (packet);
+    }
+
+  if ( fragments->IsEntire () )
+    {
+      packet = fragments->GetPacket ();
+      NS_LOG_LOGIC ("Reconstructed packet: " << *packet);
+
+      SixLowPanFrag1 frag1Header;
+      packet->RemoveHeader (frag1Header);
+
+      NS_LOG_LOGIC ("Rebuilt packet. Size " << packet->GetSize () << " - " << *packet);
+      fragments = 0;
+      m_fragments.erase (key);
+      if (m_fragmentsTimers[key].IsRunning ())
+        {
+          NS_LOG_LOGIC ("Stopping 6LoWPAN WaitFragmentsTimer at " << Simulator::Now ().GetSeconds () << " due to complete packet");
+          m_fragmentsTimers[key].Cancel ();
+        }
+      m_fragmentsTimers.erase (key);
+      return true;
+    }
+
+  return false;
+}
+
+SixLowPanNetDevice::Fragments::Fragments ()
+{
+  NS_LOG_FUNCTION (this);
+  m_packetSize = 0;
+}
+
+SixLowPanNetDevice::Fragments::~Fragments ()
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void SixLowPanNetDevice::Fragments::AddFragment (Ptr<Packet> fragment, uint16_t fragmentOffset)
+{
+  NS_LOG_FUNCTION (this << fragmentOffset << *fragment);
+
+  std::list<std::pair<Ptr<Packet>, uint16_t> >::iterator it;
+  bool duplicate = false;
+
+  for (it = m_fragments.begin (); it != m_fragments.end (); it++)
+    {
+      if (it->second > fragmentOffset)
+        {
+          break;
+        }
+      if (it->second == fragmentOffset)
+        {
+          duplicate = true;
+          NS_ASSERT_MSG (fragment->GetSize () == it->first->GetSize (), "Duplicate fragment size differs. Aborting.");
+          break;
+        }
+    }
+  if (!duplicate)
+    {
+      m_fragments.insert (it, std::make_pair (fragment, fragmentOffset));
+    }
+}
+
+void SixLowPanNetDevice::Fragments::AddFirstFragment (Ptr<Packet> fragment)
+{
+  NS_LOG_FUNCTION (this << *fragment);
+
+  m_firstFragment = fragment;
+}
+
+bool SixLowPanNetDevice::Fragments::IsEntire () const
+{
+  NS_LOG_FUNCTION (this);
+
+  bool ret = m_fragments.size () > 0;
+  uint16_t lastEndOffset = 0;
+
+  if (ret)
+    {
+      for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
+        {
+          // overlapping fragments should not exist
+          NS_LOG_LOGIC ("Checking overlaps " << lastEndOffset << " - " << it->second );
+
+          if (lastEndOffset < it->second)
+            {
+              ret = false;
+              break;
+            }
+          // fragments might overlap in strange ways
+          uint16_t fragmentEnd = it->first->GetSize () + it->second;
+          lastEndOffset = std::max ( lastEndOffset, fragmentEnd );
+        }
+    }
+
+  if ( ret && (lastEndOffset == m_packetSize))
+    {
+      return true;
+    }
+  return false;
+}
+
+Ptr<Packet> SixLowPanNetDevice::Fragments::GetPacket () const
+{
+  NS_LOG_FUNCTION (this);
+
+  std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin ();
+
+  Ptr<Packet> p = Create<Packet> ();
+  uint16_t lastEndOffset = 0;
+
+  p->AddAtEnd (m_firstFragment);
+  it = m_fragments.begin ();
+  lastEndOffset = it->first->GetSize ();
+
+  for ( it++; it != m_fragments.end (); it++)
+    {
+      if ( lastEndOffset > it->second )
+        {
+          NS_ABORT_MSG ("Overlapping fragments found, forbidden condition");
+        }
+      else
+        {
+          NS_LOG_LOGIC ("Adding: " << *(it->first) );
+          p->AddAtEnd (it->first);
+        }
+      lastEndOffset += it->first->GetSize ();
+    }
+
+  return p;
+}
+
+void SixLowPanNetDevice::Fragments::SetPacketSize (uint32_t packetSize)
+{
+  NS_LOG_FUNCTION (this << packetSize);
+  m_packetSize = packetSize;
+}
+
+std::list< Ptr<Packet> > SixLowPanNetDevice::Fragments::GetFraments () const
+{
+  std::list< Ptr<Packet> > fragments;
+  std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator iter;
+  for ( iter = m_fragments.begin (); iter != m_fragments.end (); iter ++)
+    {
+      fragments.push_back (iter->first);
+    }
+  return fragments;
+}
+
+void SixLowPanNetDevice::HandleFragmentsTimeout (FragmentKey key, uint32_t iif)
+{
+  NS_LOG_FUNCTION (this);
+
+  MapFragments_t::iterator it = m_fragments.find (key);
+  std::list< Ptr<Packet> > storedFragments = it->second->GetFraments ();
+  for (std::list< Ptr<Packet> >::iterator fragIter = storedFragments.begin ();
+       fragIter != storedFragments.end (); fragIter++)
+    {
+      m_dropTrace (DROP_FRAGMENT_TIMEOUT, *fragIter, m_node->GetObject<SixLowPanNetDevice> (), iif);
+    }
+  // clear the buffers
+  it->second = 0;
+
+  m_fragments.erase (key);
+  m_fragmentsTimers.erase (key);
+}
+
+Ipv6Address SixLowPanNetDevice::MakeLinkLocalAddressFromMac (Address const &addr)
+{
+  Ipv6Address ipv6Addr = Ipv6Address::GetAny ();
+
+  if (m_forceEtherType && Mac48Address::IsMatchingType (addr))
+    {
+      ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac48Address::ConvertFrom (addr));
+    }
+  else
+    {
+      if (Mac64Address::IsMatchingType (addr))
+        {
+          ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac64Address::ConvertFrom (addr));
+        }
+      else if (Mac16Address::IsMatchingType (addr))
+        {
+          ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac16Address::ConvertFrom (addr));
+        }
+    }
+  if (ipv6Addr.IsAny ())
+    {
+      NS_ABORT_MSG ("Unknown address type");
+    }
+  return ipv6Addr;
+}
+
+Ipv6Address SixLowPanNetDevice::MakeGlobalAddressFromMac (Address const &addr, Ipv6Address prefix)
+{
+  Ipv6Address ipv6Addr = Ipv6Address::GetAny ();
+
+  if (m_forceEtherType && Mac48Address::IsMatchingType (addr))
+    {
+      ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), Ipv6Address (prefix) );
+    }
+  else
+    {
+      if (Mac64Address::IsMatchingType (addr))
+        {
+          ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), Ipv6Address (prefix));
+        }
+      else if (Mac16Address::IsMatchingType (addr))
+        {
+          ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac16Address::ConvertFrom (addr), Ipv6Address (prefix) );
+        }
+    }
+  if (ipv6Addr.IsAny ())
+    {
+      NS_ABORT_MSG ("Unknown address type");
+    }
+  return ipv6Addr;
+}
+
+}
+
+// namespace ns3
diff -Naur ns-3.18.1/src/sixlowpan/model/sixlowpan-net-device.h ns-3.19/src/sixlowpan/model/sixlowpan-net-device.h
--- ns-3.18.1/src/sixlowpan/model/sixlowpan-net-device.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/model/sixlowpan-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,468 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ *         Michele Muccio <michelemuccio@virgilio.it>
+ */
+
+#ifndef SIXLOWPAN_NET_DEVICE_H
+#define SIXLOWPAN_NET_DEVICE_H
+
+#include <stdint.h>
+#include <string>
+#include <map>
+#include "ns3/traced-callback.h"
+#include "ns3/event-id.h"
+#include "ns3/nstime.h"
+#include "ns3/net-device.h"
+#include "ns3/packet.h"
+#include "sixlowpan-header.h"
+#include "ns3/random-variable-stream.h"
+
+namespace ns3 {
+
+class Node;
+
+/**
+ * \defgroup sixlowpan 6LoWPAN
+ * \brief Performs 6LoWPAN compression of IPv6 packets as specified by RFC 4944 and RFC 6282
+ *
+ * This module acts as a shim between IPv6 and a generic NetDevice.
+ *
+ * The module implements RFCs 4944 and 6282, with the following exceptions:
+ * <ul>
+ * <li> MESH and LOWPAN_BC0 dispatch types are not supported </li>
+ * <li> HC2 encoding is not supported </li>
+ * <li> IPHC's SAC and DAC are not supported </li>
+ *</ul>
+ */
+
+/**
+ * \ingroup sixlowpan
+ *
+ * \brief Shim performing 6LoWPAN compression, decompression and fragmentation.
+ *
+ * This class implements the shim between IPv6 and a generic NetDevice,
+ * performing packet compression, decompression and fragmentation in a transparent way.
+ * To this end, the class pretend to be a normal NetDevice, masquerading some functions
+ * of the underlying NetDevice.
+ */
+class SixLowPanNetDevice : public NetDevice
+{
+public:
+  /**
+   * Enumeration of the dropping reasons in SixLoWPAN.
+   */
+  enum DropReason
+  {
+    DROP_FRAGMENT_TIMEOUT = 1, /**< Fragment timeout exceeded */
+    DROP_FRAGMENT_BUFFER_FULL, /**< Fragment buffer size exceeded */
+    DROP_UNKNOWN_EXTENSION /**< Unsupported compression kind */
+  };
+
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
+  static TypeId GetTypeId (void);
+
+  /**
+   * Constructor for the SixLowPanNetDevice.
+   */
+  SixLowPanNetDevice ();
+
+  // inherited from NetDevice base class
+  virtual void SetIfIndex (const uint32_t index);
+  virtual uint32_t GetIfIndex (void) const;
+  virtual Ptr<Channel> GetChannel (void) const;
+  virtual void SetAddress (Address address);
+  virtual Address GetAddress (void) const;
+  virtual bool SetMtu (const uint16_t mtu);
+
+  /**
+   * \brief Returns the link-layer MTU for this interface.
+   * If the link-layer MTU is smaller than IPv6's minimum MTU (RFC 4944),
+   * 1280 will be returned.
+   *
+   * \return the link-level MTU in bytes for this interface.
+   */
+  virtual uint16_t GetMtu (void) const;
+  virtual bool IsLinkUp (void) const;
+  virtual void AddLinkChangeCallback (Callback<void> callback);
+  virtual bool IsBroadcast (void) const;
+  virtual Address GetBroadcast (void) const;
+  virtual bool IsMulticast (void) const;
+  virtual Address GetMulticast (Ipv4Address multicastGroup) const;
+  virtual bool IsPointToPoint (void) const;
+  virtual bool IsBridge (void) const;
+  virtual bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
+  virtual bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
+  virtual Ptr<Node> GetNode (void) const;
+  virtual void SetNode (Ptr<Node> node);
+  virtual bool NeedsArp (void) const;
+  virtual void SetReceiveCallback (NetDevice::ReceiveCallback cb);
+  virtual void SetPromiscReceiveCallback (NetDevice::PromiscReceiveCallback cb);
+  virtual bool SupportsSendFrom () const;
+  virtual Address GetMulticast (Ipv6Address addr) const;
+
+  /**
+   * \brief Returns a smart pointer to the underlying NetDevice.
+   *
+   * \return a smart pointer to the underlying NetDevice.
+   */
+  Ptr<NetDevice> GetNetDevice () const;
+
+  /**
+   * \brief Setup SixLowPan to be a proxy for the specified NetDevice.
+   * All the packets incoming and outgoing from the NetDevice will be
+   * processed by SixLowPanNetDevice.
+   *
+   * \param device a smart pointer to the NetDevice to be proxied.
+   */
+  void SetNetDevice (Ptr<NetDevice> device);
+
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by this model.  Return the number of streams (possibly zero) that
+   * have been assigned.
+   *
+   * \param stream first stream index to use
+   * \return the number of stream indices assigned by this model
+   */
+  int64_t AssignStreams (int64_t stream);
+
+protected:
+  virtual void DoDispose (void);
+
+private:
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   */
+  SixLowPanNetDevice (SixLowPanNetDevice const &);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   * \returns
+   */
+  SixLowPanNetDevice& operator= (SixLowPanNetDevice const &);
+  /**
+   * \brief receives all the packets from a NetDevice for further processing.
+   * \param device the NetDevice the packet ws received from
+   * \param packet the received packet
+   * \param protocol the protocol (if known)
+   * \param source the source address
+   * \param destination the destination address
+   * \param packetType the packet kind (e.g., HOST, BROADCAST, etc.)
+   * \return the IPv6 link-local address
+   */
+  void ReceiveFromDevice (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol,
+                          Address const &source, Address const &destination, PacketType packetType);
+
+  /**
+   * The callback used to notify higher layers that a packet has been received.
+   */
+  NetDevice::ReceiveCallback m_rxCallback;
+
+  /**
+   * The callback used to notify higher layers that a packet has been received in promiscuous mode.
+   */
+  NetDevice::PromiscReceiveCallback m_promiscRxCallback;
+
+  /**
+   * \brief Callback to trace TX (transmission) packets.
+   *
+   * Data passed:
+   * \li Packet received (including 6LoWPAN header)
+   * \li Ptr to SixLowPanNetDevice
+   * \li interface index
+   */
+  TracedCallback<Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_txTrace;
+
+  /**
+   * \brief Callback to trace RX (reception) packets.
+   *
+   * Data passed:
+   * \li Packet received (including 6LoWPAN header)
+   * \li Ptr to SixLowPanNetDevice
+   * \li interface index
+   */
+  TracedCallback<Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_rxTrace;
+
+  /**
+   * \brief Callback to trace drop packets.
+   *
+   * Data passed:
+   * \li DropReason
+   * \li Packet dropped (including 6LoWPAN header)
+   * \li Ptr to SixLowPanNetDevice
+   * \li interface index
+   */
+  TracedCallback<DropReason, Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_dropTrace;
+
+  /**
+   * \brief make a link-local address from a MAC address.
+   * \param addr the MAC address
+   * \return the IPv6 link-local address
+   */
+  Ipv6Address MakeLinkLocalAddressFromMac (Address const &addr);
+
+  /**
+   * \brief make a global address from a MAC address.
+   * \param addr the MAC address
+   * \param prefix the address prefix
+   * \return the IPv6 address
+   */
+  Ipv6Address MakeGlobalAddressFromMac (Address const &addr, Ipv6Address prefix);
+
+  /**
+   * \brief Compress the headers according to HC1 compression.
+   * \param packet the packet to be compressed
+   * \param src the MAC source address
+   * \param dst the MAC destination address
+   * \return the size of the removed headers
+   */
+  uint32_t CompressLowPanHc1 (Ptr<Packet> packet, Address const &src, Address const &dst);
+
+  /**
+   * \brief Decompress the headers according to HC1 compression.
+   * \param packet the packet to be compressed
+   * \param src the MAC source address
+   * \param dst the MAC destination address
+   */
+  void DecompressLowPanHc1 (Ptr<Packet> packet, Address const &src, Address const &dst);
+
+  /**
+   * \brief Compress the headers according to IPHC compression.
+   * \param packet the packet to be compressed
+   * \param src the MAC source address
+   * \param dst the MAC destination address
+   * \return the size of the removed headers
+   */
+  uint32_t CompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst);
+
+  /**
+   * \brief Checks if the next header can be compressed using NHC.
+   * \param headerType the header kind to be compressed
+   * \return true if the header can be compressed
+   */
+  bool CanCompressLowPanNhc (uint8_t headerType);
+
+  /**
+   * \brief Decompress the headers according to IPHC compression.
+   * \param packet the packet to be compressed
+   * \param src the MAC source address
+   * \param dst the MAC destination address
+   */
+  void DecompressLowPanIphc (Ptr<Packet> packet, Address const &src, Address const &dst);
+
+  /**
+   * \brief Compress the headers according to NHC compression.
+   * \param packet the packet to be compressed
+   * \param headerType the header type
+   * \param src the MAC source address
+   * \param dst the MAC destination address
+   * \return the size of the removed headers
+   */
+  uint32_t CompressLowPanNhc (Ptr<Packet> packet, uint8_t headerType, Address const &src, Address const &dst);
+
+  /**
+   * \brief Decompress the headers according to NHC compression.
+   * \param packet the packet to be compressed
+   * \param src the MAC source address
+   * \param dst the MAC destination address
+   * \param srcAddress the IPv6 source address
+   * \param dstAddress the IPv6 destination address
+   * \return the decompressed header type
+   */
+  uint8_t DecompressLowPanNhc (Ptr<Packet> packet, Address const &src, Address const &dst, Ipv6Address srcAddress, Ipv6Address dstAddress);
+
+  /**
+   * \brief Compress the headers according to NHC compression.
+   * \param packet the packet to be compressed
+   * \param omitChecksum omit UDP checksum (if true)
+   * \return the size of the removed headers
+   */
+  uint32_t CompressLowPanUdpNhc (Ptr<Packet> packet, bool omitChecksum);
+
+  /**
+   * \brief Decompress the headers according to NHC compression.
+   * \param packet the packet to be compressed
+   * \param saddr the IPv6 source address
+   * \param daddr the IPv6 destination address
+   */
+  void DecompressLowPanUdpNhc (Ptr<Packet> packet, Ipv6Address saddr, Ipv6Address daddr);
+
+  /**
+   * Fragment identifier type: src/dst address src/dst port
+   */
+  typedef std::pair< std::pair<Address, Address>, std::pair<uint16_t, uint16_t> > FragmentKey;
+
+  /**
+   * \class Fragments
+   * \brief A Set of Fragment
+   */
+  class Fragments : public SimpleRefCount<Fragments>
+  {
+public:
+    /**
+     * \brief Constructor.
+     */
+    Fragments ();
+
+    /**
+     * \brief Destructor.
+     */
+    ~Fragments ();
+
+    /**
+     * \brief Add a fragment to the pool.
+     * \param fragment the fragment
+     * \param fragmentOffset the offset of the fragment
+     */
+    void AddFragment (Ptr<Packet> fragment, uint16_t fragmentOffset);
+
+    /**
+     * \brief Add the first packet fragment. The first fragment is needed to
+     * allow the post-defragmentation decompression.
+     * \param fragment the fragment
+     */
+    void AddFirstFragment (Ptr<Packet> fragment);
+
+    /**
+     * \brief If all fragments have been added.
+     * \returns true if the packet is entire
+     */
+    bool IsEntire () const;
+
+    /**
+     * \brief Get the entire packet.
+     * \return the entire packet
+     */
+    Ptr<Packet> GetPacket () const;
+
+    /**
+     * \brief Set the packet-to-be-defragmented size.
+     * \param packetSize the packet size (bytes)
+     */
+    void SetPacketSize (uint32_t packetSize);
+
+    /**
+     * \brief Get a list of the current stored fragments.
+     */
+    std::list< Ptr<Packet> > GetFraments () const;
+
+private:
+    /**
+     * \brief The size of the reconstructed packet (bytes).
+     */
+    uint32_t m_packetSize;
+
+    /**
+     * \brief The current fragments.
+     */
+    std::list<std::pair<Ptr<Packet>, uint16_t> > m_fragments;
+
+    /**
+     * \brief The very first fragment
+     */
+    Ptr<Packet> m_firstFragment;
+
+  };
+
+  /**
+   * \brief Return the instance type identifier.
+   * \param packet the packet to be fragmented (with headers already compressed with 6LoWPAN)
+   * \param origPacketSize the size of the IP packet before the 6LoWPAN header compression, including the IP/L4 headers
+   * \param origHdrSize the size of the IP header before the 6LoWPAN header compression
+   * \param listFragments a reference to the list of the resulting packets, all with the proper headers in place
+   */
+  void DoFragmentation (Ptr<Packet> packet, uint32_t origPacketSize, uint32_t origHdrSize,
+                        std::list<Ptr<Packet> >& listFragments);
+
+  /**
+   * \brief Process a packet fragment
+   * \param packet the packet
+   * \param src the source MAC address
+   * \param dst the destination MAC address
+   * \param isFirst true if it is the first fragment, false otherwise
+   * \return true is the fragment completed the packet
+   */
+  bool ProcessFragment (Ptr<Packet>& packet, Address const &src, Address const &dst, bool isFirst);
+
+  /**
+   * \brief Process the timeout for packet fragments
+   * \param key representing the packet fragments
+   * \param iif Input Interface
+   */
+  void HandleFragmentsTimeout ( FragmentKey key, uint32_t iif);
+
+  /**
+   * \brief Drops the oldest fragment set
+   */
+  void DropOldestFragmentSet ();
+
+  /**
+   * Container for fragment key -> fragments
+   */
+  typedef std::map< FragmentKey, Ptr<Fragments> > MapFragments_t;
+  /**
+   * Container Iterator for fragment key -> fragments
+   */
+  typedef std::map< FragmentKey, Ptr<Fragments> >::iterator MapFragmentsI_t;
+  /**
+   * Container for fragment key -> exiration event
+   */
+  typedef std::map< FragmentKey, EventId > MapFragmentsTimers_t;
+  /**
+   * Container Iterator for fragment key -> exiration event
+   */
+  typedef std::map< FragmentKey, EventId >::iterator MapFragmentsTimersI_t;
+
+  MapFragments_t       m_fragments; /**< Fragments hold to be rebuilt */
+  MapFragmentsTimers_t m_fragmentsTimers; /**< Timers related to fragment rebuilding */
+  Time                 m_fragmentExpirationTimeout; /**< Time limit for fragment rebuilding */
+
+  /**
+   * \brief How many packets can be rebuilt at the same time.
+   * Some real implementation do limit this. Zero means no limit.
+   */
+  uint16_t             m_fragmentReassemblyListSize;
+
+  bool m_useIphc; /**< Use IPHC or HC1 */
+
+  Ptr<Node> m_node; /**< Smart pointer to the Node */
+  Ptr<NetDevice> m_netDevice; /**< Smart pointer to the underlying NetDevice */
+  uint32_t m_ifIndex; /**< Interface index */
+
+  /**
+   * \brief Force the EtherType number.
+   * Also implying that the underlying NetDevice is using 48-bit Addresses, e.g., Ethernet, WiFi, etc.
+   */
+  bool m_forceEtherType;
+
+  uint16_t m_etherType; /**< EtherType number (used only if m_forceEtherType is true) */
+  bool m_omitUdpChecksum; /**< Omit UDP checksum in NC1 encoding */
+
+  Ptr<UniformRandomVariable> m_rng; //!< Rng for the fragments tag.
+};
+
+} // namespace ns3
+
+#endif /* SIXLOWPAN_NET_DEVICE_H */
diff -Naur ns-3.18.1/src/sixlowpan/test/error-channel-sixlow.cc ns-3.19/src/sixlowpan/test/error-channel-sixlow.cc
--- ns-3.18.1/src/sixlowpan/test/error-channel-sixlow.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/test/error-channel-sixlow.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,196 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+#include "error-channel-sixlow.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
+#include "ns3/node.h"
+#include "ns3/log.h"
+
+NS_LOG_COMPONENT_DEFINE ("ErrorChannelSixlow")
+  ;
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (ErrorChannelSixlow)
+  ;
+
+TypeId
+ErrorChannelSixlow::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ErrorChannelSixlow")
+    .SetParent<Channel> ()
+    .AddConstructor<ErrorChannelSixlow> ()
+  ;
+  return tid;
+}
+
+ErrorChannelSixlow::ErrorChannelSixlow ()
+{
+  m_jumpingTime = Seconds (0.5);
+  m_jumping = false;
+  m_jumpingState = 0;
+  m_duplicateTime = Seconds (0.1);
+  m_duplicate = false;
+}
+
+void
+ErrorChannelSixlow::SetJumpingTime (Time delay)
+{
+  m_jumpingTime = delay;
+}
+
+void
+ErrorChannelSixlow::SetJumpingMode (bool mode)
+{
+  m_jumping = mode;
+  m_jumpingState = 0;
+}
+
+void
+ErrorChannelSixlow::SetDuplicateTime (Time delay)
+{
+  m_duplicateTime = delay;
+}
+
+void
+ErrorChannelSixlow::SetDuplicateMode (bool mode)
+{
+  m_duplicate = mode;
+  m_duplicateState = 0;
+}
+
+
+void
+ErrorChannelSixlow::Send (Ptr<Packet> p, uint16_t protocol,
+                          Mac48Address to, Mac48Address from,
+                          Ptr<SimpleNetDevice> sender)
+{
+  NS_LOG_FUNCTION (p << protocol << to << from << sender);
+  for (std::vector<Ptr<SimpleNetDevice> >::const_iterator i = m_devices.begin (); i != m_devices.end (); ++i)
+    {
+      Ptr<SimpleNetDevice> tmp = *i;
+      if (tmp == sender)
+        {
+          continue;
+        }
+      if (m_jumping)
+        {
+          if (m_jumpingState % 2)
+            {
+              Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), Seconds (0),
+                                              &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+            }
+          else
+            {
+              Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), m_jumpingTime,
+                                              &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+            }
+          m_jumpingState++;
+        }
+      else if (m_duplicate)
+        {
+          if (m_duplicateState % 2)
+            {
+              Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), Seconds (0),
+                                              &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+            }
+          else
+            {
+              Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), Seconds (0),
+                                              &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+              Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), m_duplicateTime,
+                                              &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+            }
+          m_duplicateState++;
+        }
+      else
+        {
+          Simulator::ScheduleWithContext (tmp->GetNode ()->GetId (), Seconds (0),
+                                          &SimpleNetDevice::Receive, tmp, p->Copy (), protocol, to, from);
+        }
+    }
+}
+
+void
+ErrorChannelSixlow::Add (Ptr<SimpleNetDevice> device)
+{
+  m_devices.push_back (device);
+}
+
+uint32_t
+ErrorChannelSixlow::GetNDevices (void) const
+{
+  return m_devices.size ();
+}
+Ptr<NetDevice>
+ErrorChannelSixlow::GetDevice (uint32_t i) const
+{
+  return m_devices[i];
+}
+
+NS_OBJECT_ENSURE_REGISTERED (BinaryErrorSixlowModel)
+  ;
+
+TypeId BinaryErrorSixlowModel::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::BinaryErrorSixlowModel")
+    .SetParent<ErrorModel> ()
+    .AddConstructor<BinaryErrorSixlowModel> ()
+  ;
+  return tid;
+}
+
+BinaryErrorSixlowModel::BinaryErrorSixlowModel ()
+{
+  m_counter = 0;
+}
+
+BinaryErrorSixlowModel::~BinaryErrorSixlowModel ()
+{
+}
+
+
+bool
+BinaryErrorSixlowModel::DoCorrupt (Ptr<Packet> p)
+{
+  if (!IsEnabled ())
+    {
+      return false;
+    }
+  bool ret = m_counter % 2;
+  m_counter++;
+  return ret;
+}
+
+void
+BinaryErrorSixlowModel::Reset (void)
+{
+  DoReset ();
+}
+
+void
+BinaryErrorSixlowModel::DoReset (void)
+{
+  m_counter = 0;
+}
+
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/sixlowpan/test/error-channel-sixlow.h ns-3.19/src/sixlowpan/test/error-channel-sixlow.h
--- ns-3.18.1/src/sixlowpan/test/error-channel-sixlow.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/test/error-channel-sixlow.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,107 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+#ifndef ERROR_CHANNEL_SIXLOW_H
+#define ERROR_CHANNEL_SIXLOW_H
+
+#include "ns3/channel.h"
+#include "ns3/simple-channel.h"
+#include "ns3/error-model.h"
+#include "ns3/mac48-address.h"
+#include "ns3/nstime.h"
+#include <vector>
+
+namespace ns3 {
+
+class SimpleNetDevice;
+class Packet;
+
+/**
+ * \ingroup channel
+ * \brief A Error channel, introducing deterministic delays on even/odd packets. Used for testing
+ */
+class ErrorChannelSixlow : public SimpleChannel
+{
+public:
+  static TypeId GetTypeId (void);
+  ErrorChannelSixlow ();
+
+  virtual void Send (Ptr<Packet> p, uint16_t protocol, Mac48Address to, Mac48Address from,
+                     Ptr<SimpleNetDevice> sender);
+
+  virtual void Add (Ptr<SimpleNetDevice> device);
+
+  // inherited from ns3::Channel
+  virtual uint32_t GetNDevices (void) const;
+  virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
+
+  /**
+   * \brief Set the delay for the odd packets (even ones are not delayed)
+   * \param delay Delay for the odd packets.
+   */
+  void SetJumpingTime (Time delay);
+
+  /**
+   * \brief Set if the odd packets are delayed (even ones are not delayed ever)
+   * \param mode true if the odd packets should be delayed.
+   */
+  void SetJumpingMode (bool mode);
+
+  /**
+   * \brief Set the delay for the odd duplicate packets (even ones are not duplicated)
+   * \param delay Delay for the odd packets.
+   */
+  void SetDuplicateTime (Time delay);
+
+  /**
+   * \brief Set if the odd packets are duplicated (even ones are not duplicated ever)
+   * \param mode true if the odd packets should be duplicated.
+   */
+  void SetDuplicateMode (bool mode);
+
+private:
+  std::vector<Ptr<SimpleNetDevice> > m_devices;
+  Time m_jumpingTime;
+  uint8_t m_jumpingState;
+  bool m_jumping;
+  Time m_duplicateTime;
+  bool m_duplicate;
+  uint8_t m_duplicateState;
+};
+
+class BinaryErrorSixlowModel : public ErrorModel
+{
+public:
+  static TypeId GetTypeId (void);
+
+  BinaryErrorSixlowModel ();
+  virtual ~BinaryErrorSixlowModel ();
+  void Reset (void);
+
+private:
+  virtual bool DoCorrupt (Ptr<Packet> p);
+  virtual void DoReset (void);
+
+  uint8_t m_counter;
+
+};
+
+} // namespace ns3
+
+#endif /* ERROR_CHANNEL_SIXLOW_H */
diff -Naur ns-3.18.1/src/sixlowpan/test/sixlowpan-fragmentation-test.cc ns-3.19/src/sixlowpan/test/sixlowpan-fragmentation-test.cc
--- ns-3.18.1/src/sixlowpan/test/sixlowpan-fragmentation-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/test/sixlowpan-fragmentation-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,463 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+#define NS3_LOG_ENABLE 1
+
+#include "ns3/test.h"
+#include "ns3/config.h"
+#include "ns3/uinteger.h"
+#include "ns3/socket-factory.h"
+#include "ns3/ipv6-raw-socket-factory.h"
+#include "ns3/udp-socket-factory.h"
+#include "ns3/simulator.h"
+#include "error-channel-sixlow.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/socket.h"
+#include "ns3/udp-socket.h"
+
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/boolean.h"
+
+#include "ns3/ipv6-static-routing.h"
+#include "ns3/ipv6-list-routing.h"
+#include "ns3/inet6-socket-address.h"
+#include "ns3/sixlowpan-net-device.h"
+
+#include "ns3/udp-l4-protocol.h"
+
+#include "ns3/ipv6-l3-protocol.h"
+#include "ns3/icmpv6-l4-protocol.h"
+
+#include <string>
+#include <limits>
+#include <netinet/in.h>
+
+using namespace ns3;
+
+class UdpSocketImpl;
+
+static void
+AddInternetStack (Ptr<Node> node)
+{
+  //IPV6
+  Ptr<Ipv6L3Protocol> ipv6 = CreateObject<Ipv6L3Protocol> ();
+
+  //Routing for Ipv6
+  Ptr<Ipv6ListRouting> ipv6Routing = CreateObject<Ipv6ListRouting> ();
+  ipv6->SetRoutingProtocol (ipv6Routing);
+  Ptr<Ipv6StaticRouting> ipv6staticRouting = CreateObject<Ipv6StaticRouting> ();
+  ipv6Routing->AddRoutingProtocol (ipv6staticRouting, 0);
+  node->AggregateObject (ipv6);
+
+  //ICMPv6
+  Ptr<Icmpv6L4Protocol> icmp6 = CreateObject<Icmpv6L4Protocol> ();
+  node->AggregateObject (icmp6);
+
+  //Ipv6 Extensions
+  ipv6->RegisterExtensions ();
+  ipv6->RegisterOptions ();
+
+  //UDP
+  Ptr<UdpL4Protocol> udp = CreateObject<UdpL4Protocol> ();
+  node->AggregateObject (udp);
+}
+
+
+class SixlowpanFragmentationTest : public TestCase
+{
+  Ptr<Packet> m_sentPacketClient;
+  Ptr<Packet> m_receivedPacketClient;
+  Ptr<Packet> m_receivedPacketServer;
+
+
+  Ptr<Socket> m_socketServer;
+  Ptr<Socket> m_socketClient;
+  uint32_t m_dataSize;
+  uint8_t *m_data;
+  uint32_t m_size;
+  uint8_t m_icmpType;
+  uint8_t m_icmpCode;
+
+public:
+  virtual void DoRun (void);
+  SixlowpanFragmentationTest ();
+  ~SixlowpanFragmentationTest ();
+
+  // server part
+  void StartServer (Ptr<Node> ServerNode);
+  void HandleReadServer (Ptr<Socket> socket);
+
+  // client part
+  void StartClient (Ptr<Node> ClientNode);
+  void HandleReadClient (Ptr<Socket> socket);
+  void HandleReadIcmpClient (Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType,
+                             uint8_t icmpCode,uint32_t icmpInfo);
+
+  void SetFill (uint8_t *fill, uint32_t fillSize, uint32_t dataSize);
+  Ptr<Packet> SendClient (void);
+
+};
+
+
+SixlowpanFragmentationTest::SixlowpanFragmentationTest ()
+  : TestCase ("Verify the 6LoWPAN protocol fragmentation and reassembly")
+{
+  m_socketServer = 0;
+  m_data = 0;
+  m_dataSize = 0;
+}
+
+SixlowpanFragmentationTest::~SixlowpanFragmentationTest ()
+{
+  if ( m_data )
+    {
+      delete[] m_data;
+    }
+  m_data = 0;
+  m_dataSize = 0;
+}
+
+
+void
+SixlowpanFragmentationTest::StartServer (Ptr<Node> ServerNode)
+{
+
+  if (m_socketServer == 0)
+    {
+      TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
+      m_socketServer = Socket::CreateSocket (ServerNode, tid);
+      Inet6SocketAddress local = Inet6SocketAddress (Ipv6Address ("2001:0100::1"), 9);
+      m_socketServer->Bind (local);
+      Ptr<UdpSocket> udpSocket = DynamicCast<UdpSocket> (m_socketServer);
+    }
+
+  m_socketServer->SetRecvCallback (MakeCallback (&SixlowpanFragmentationTest::HandleReadServer, this));
+}
+
+void
+SixlowpanFragmentationTest::HandleReadServer (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+      if (Inet6SocketAddress::IsMatchingType (from))
+        {
+          packet->RemoveAllPacketTags ();
+          packet->RemoveAllByteTags ();
+
+          m_receivedPacketServer = packet->Copy ();
+        }
+    }
+}
+
+void
+SixlowpanFragmentationTest::StartClient (Ptr<Node> ClientNode)
+{
+
+  if (m_socketClient == 0)
+    {
+      TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
+      m_socketClient = Socket::CreateSocket (ClientNode, tid);
+      m_socketClient->Bind (Inet6SocketAddress (Ipv6Address::GetAny (), 9));
+      m_socketClient->Connect (Inet6SocketAddress (Ipv6Address ("2001:0100::1"), 9));
+      CallbackValue cbValue = MakeCallback (&SixlowpanFragmentationTest::HandleReadIcmpClient, this);
+      m_socketClient->SetAttribute ("IcmpCallback6", cbValue);
+    }
+
+  m_socketClient->SetRecvCallback (MakeCallback (&SixlowpanFragmentationTest::HandleReadClient, this));
+}
+
+void
+SixlowpanFragmentationTest::HandleReadClient (Ptr<Socket> socket)
+{
+  Ptr<Packet> packet;
+  Address from;
+  while ((packet = socket->RecvFrom (from)))
+    {
+      if (Inet6SocketAddress::IsMatchingType (from))
+        {
+          m_receivedPacketClient = packet->Copy ();
+        }
+    }
+}
+
+void
+SixlowpanFragmentationTest::HandleReadIcmpClient (Ipv6Address icmpSource,
+                                                  uint8_t icmpTtl, uint8_t icmpType,
+                                                  uint8_t icmpCode, uint32_t icmpInfo)
+{
+  m_icmpType = icmpType;
+  m_icmpCode = icmpCode;
+}
+
+void
+SixlowpanFragmentationTest::SetFill (uint8_t *fill, uint32_t fillSize, uint32_t dataSize)
+{
+  if (dataSize != m_dataSize)
+    {
+      delete [] m_data;
+      m_data = new uint8_t [dataSize];
+      m_dataSize = dataSize;
+    }
+
+  if (fillSize >= dataSize)
+    {
+      memcpy (m_data, fill, dataSize);
+      return;
+    }
+
+  uint32_t filled = 0;
+  while (filled + fillSize < dataSize)
+    {
+      memcpy (&m_data[filled], fill, fillSize);
+      filled += fillSize;
+    }
+
+  memcpy (&m_data[filled], fill, dataSize - filled);
+
+  m_size = dataSize;
+}
+
+Ptr<Packet> SixlowpanFragmentationTest::SendClient (void)
+{
+  Ptr<Packet> p;
+  if (m_dataSize)
+    {
+      p = Create<Packet> (m_data, m_dataSize);
+    }
+  else
+    {
+      p = Create<Packet> (m_size);
+    }
+  m_socketClient->Send (p);
+
+  return p;
+}
+
+void
+SixlowpanFragmentationTest::DoRun (void)
+{
+  // Create topology
+
+  // Receiver Node
+  Ptr<Node> serverNode = CreateObject<Node> ();
+  AddInternetStack (serverNode);
+  Ptr<SimpleNetDevice> serverDev;
+  Ptr<BinaryErrorSixlowModel> serverDevErrorModel = CreateObject<BinaryErrorSixlowModel> ();
+  {
+    serverDev = CreateObject<SimpleNetDevice> ();
+    serverDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
+    serverDev->SetMtu (1500);
+    serverDev->SetReceiveErrorModel (serverDevErrorModel);
+    serverDevErrorModel->Disable ();
+    serverNode->AddDevice (serverDev);
+
+    Ptr<SixLowPanNetDevice> serverSix = CreateObject<SixLowPanNetDevice> ();
+    serverSix->SetAttribute ("ForceEtherType", BooleanValue (true) );
+    serverNode->AddDevice (serverSix);
+    serverSix->SetNetDevice (serverDev);
+
+    Ptr<Ipv6> ipv6 = serverNode->GetObject<Ipv6> ();
+    ipv6->AddInterface (serverDev);
+    uint32_t netdev_idx = ipv6->AddInterface (serverSix);
+    Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (Ipv6Address ("2001:0100::1"), Ipv6Prefix (64));
+    ipv6->AddAddress (netdev_idx, ipv6Addr);
+    ipv6->SetUp (netdev_idx);
+
+    Ptr<Icmpv6L4Protocol> icmpv6l4 = serverNode->GetObject<Icmpv6L4Protocol> ();
+    icmpv6l4->SetAttribute ("DAD", BooleanValue (false));
+  }
+  StartServer (serverNode);
+
+  // Sender Node
+  Ptr<Node> clientNode = CreateObject<Node> ();
+  AddInternetStack (clientNode);
+  Ptr<SimpleNetDevice> clientDev;
+  Ptr<BinaryErrorSixlowModel> clientDevErrorModel = CreateObject<BinaryErrorSixlowModel> ();
+  {
+    clientDev = CreateObject<SimpleNetDevice> ();
+    clientDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
+    clientDev->SetMtu (150);
+    clientDev->SetReceiveErrorModel (clientDevErrorModel);
+    clientDevErrorModel->Disable ();
+    clientNode->AddDevice (clientDev);
+
+    Ptr<SixLowPanNetDevice> clientSix = CreateObject<SixLowPanNetDevice> ();
+    clientSix->SetAttribute ("ForceEtherType", BooleanValue (true) );
+    serverNode->AddDevice (clientSix);
+    clientSix->SetNetDevice (clientDev);
+
+    Ptr<Ipv6> ipv6 = clientNode->GetObject<Ipv6> ();
+    ipv6->AddInterface (clientDev);
+    uint32_t netdev_idx = ipv6->AddInterface (clientSix);
+    Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (Ipv6Address ("2001:0100::2"), Ipv6Prefix (64));
+    ipv6->AddAddress (netdev_idx, ipv6Addr);
+    ipv6->SetUp (netdev_idx);
+
+    Ptr<Icmpv6L4Protocol> icmpv6l4 = clientNode->GetObject<Icmpv6L4Protocol> ();
+    icmpv6l4->SetAttribute ("DAD", BooleanValue (false));
+  }
+  StartClient (clientNode);
+
+  // link the two nodes
+  Ptr<ErrorChannelSixlow> channel = CreateObject<ErrorChannelSixlow> ();
+  serverDev->SetChannel (channel);
+  clientDev->SetChannel (channel);
+
+
+  // some small packets, some rather big ones
+  uint32_t packetSizes[5] = {200, 300, 400, 500, 600};
+
+  // using the alphabet
+  uint8_t fillData[78];
+  for ( uint32_t k = 48; k <= 125; k++ )
+    {
+      fillData[k - 48] = k;
+    }
+
+  // First test: normal channel, no errors, no delays
+  for ( int i = 0; i < 5; i++)
+    {
+      uint32_t packetSize = packetSizes[i];
+
+      SetFill (fillData, 78, packetSize);
+
+      m_receivedPacketServer = Create<Packet> ();
+      Simulator::ScheduleWithContext (m_socketClient->GetNode ()->GetId (), Seconds (0),
+                                      &SixlowpanFragmentationTest::SendClient, this);
+      Simulator::Run ();
+
+      uint8_t recvBuffer[65000];
+
+      uint16_t recvSize = m_receivedPacketServer->GetSize ();
+
+      NS_TEST_EXPECT_MSG_EQ (recvSize, packetSizes[i],
+                             "Packet size not correct: recvSize: " << recvSize << " packetSizes[" << i << "]: " << packetSizes[i] );
+
+      m_receivedPacketServer->CopyData (recvBuffer, 65000);
+      NS_TEST_EXPECT_MSG_EQ (memcmp (m_data, recvBuffer, m_receivedPacketServer->GetSize ()),
+                             0, "Packet content differs");
+    }
+
+  // Second test: normal channel, no errors, delays each 2 packets.
+  // Each other fragment will arrive out-of-order.
+  // The packets should be received correctly since reassembly will reorder the fragments.
+  channel->SetJumpingMode (true);
+  for ( int i = 0; i < 5; i++)
+    {
+      uint32_t packetSize = packetSizes[i];
+
+      SetFill (fillData, 78, packetSize);
+
+      m_receivedPacketServer = Create<Packet> ();
+      Simulator::ScheduleWithContext (m_socketClient->GetNode ()->GetId (), Seconds (0),
+                                      &SixlowpanFragmentationTest::SendClient, this);
+      Simulator::Run ();
+
+      uint8_t recvBuffer[65000];
+
+      uint16_t recvSize = m_receivedPacketServer->GetSize ();
+
+      NS_TEST_EXPECT_MSG_EQ (recvSize, packetSizes[i],
+                             "Packet size not correct: recvSize: " << recvSize << " packetSizes[" << i << "]: " << packetSizes[i] );
+
+      m_receivedPacketServer->CopyData (recvBuffer, 65000);
+      NS_TEST_EXPECT_MSG_EQ (memcmp (m_data, recvBuffer, m_receivedPacketServer->GetSize ()),
+                             0, "Packet content differs");
+    }
+  channel->SetJumpingMode (false);
+
+
+  // Third test: normal channel, some packets are duplicate.
+  // The duplicate fragments should be discarded, so no error should be fired.
+  channel->SetDuplicateMode (true);
+  for ( int i = 1; i < 5; i++)
+    {
+      uint32_t packetSize = packetSizes[i];
+
+      SetFill (fillData, 78, packetSize);
+
+      // reset the model, we want to receive the very first fragment.
+      serverDevErrorModel->Reset ();
+
+      m_receivedPacketServer = Create<Packet> ();
+      m_icmpType = 0;
+      m_icmpCode = 0;
+      Simulator::ScheduleWithContext (m_socketClient->GetNode ()->GetId (), Seconds (0),
+                                      &SixlowpanFragmentationTest::SendClient, this);
+      Simulator::Run ();
+
+      uint8_t recvBuffer[65000];
+
+      uint16_t recvSize = m_receivedPacketServer->GetSize ();
+
+      NS_TEST_EXPECT_MSG_EQ (recvSize, packetSizes[i],
+                             "Packet size not correct: recvSize: " << recvSize << " packetSizes[" << i << "]: " << packetSizes[i] );
+
+      m_receivedPacketServer->CopyData (recvBuffer, 65000);
+      NS_TEST_EXPECT_MSG_EQ (memcmp (m_data, recvBuffer, m_receivedPacketServer->GetSize ()),
+                             0, "Packet content differs");
+    }
+  channel->SetDuplicateMode (false);
+
+  // Fourth test: normal channel, some errors, no delays.
+  // The reassembly procedure does NOT fire any ICMP, so we do not expect any reply from the server.
+  // Client -> Server : errors enabled
+  // Server -> Client : errors disabled
+  clientDevErrorModel->Disable ();
+  serverDevErrorModel->Enable ();
+  for ( int i = 1; i < 5; i++)
+    {
+      uint32_t packetSize = packetSizes[i];
+
+      SetFill (fillData, 78, packetSize);
+
+      // reset the model, we want to receive the very first fragment.
+      serverDevErrorModel->Reset ();
+
+      m_receivedPacketServer = Create<Packet> ();
+      m_icmpType = 0;
+      m_icmpCode = 0;
+      Simulator::ScheduleWithContext (m_socketClient->GetNode ()->GetId (), Seconds (0),
+                                      &SixlowpanFragmentationTest::SendClient, this);
+      Simulator::Run ();
+
+      uint16_t recvSize = m_receivedPacketServer->GetSize ();
+
+      NS_TEST_EXPECT_MSG_EQ ((recvSize == 0), true, "Server got a packet, something wrong");
+      // Note that a 6LoWPAN fragment timeout does NOT send any ICMPv6.
+    }
+
+
+
+  Simulator::Destroy ();
+}
+//-----------------------------------------------------------------------------
+class SixlowpanFragmentationTestSuite : public TestSuite
+{
+public:
+  SixlowpanFragmentationTestSuite () : TestSuite ("sixlowpan-fragmentation", UNIT)
+  {
+    AddTestCase (new SixlowpanFragmentationTest, TestCase::QUICK);
+  }
+} g_sixlowpanFragmentationTestSuite;
diff -Naur ns-3.18.1/src/sixlowpan/test/sixlowpan-hc1-test.cc ns-3.19/src/sixlowpan/test/sixlowpan-hc1-test.cc
--- ns-3.18.1/src/sixlowpan/test/sixlowpan-hc1-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/test/sixlowpan-hc1-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,216 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include "ns3/test.h"
+#include "ns3/socket-factory.h"
+#include "ns3/udp-socket-factory.h"
+#include "ns3/simulator.h"
+#include "ns3/simple-channel.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/socket.h"
+#include "ns3/boolean.h"
+
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/inet6-socket-address.h"
+
+#include "ns3/ipv6-l3-protocol.h"
+#include "ns3/icmpv6-l4-protocol.h"
+#include "ns3/udp-l4-protocol.h"
+#include "ns3/ipv6-list-routing.h"
+#include "ns3/ipv6-static-routing.h"
+
+#include "ns3/sixlowpan-net-device.h"
+
+#include <string>
+#include <limits>
+
+using namespace ns3;
+
+static void
+AddInternetStack6 (Ptr<Node> node)
+{
+  //IPV6
+  Ptr<Ipv6L3Protocol> ipv6 = CreateObject<Ipv6L3Protocol> ();
+  //Routing for Ipv6
+  Ptr<Ipv6ListRouting> ipv6Routing = CreateObject<Ipv6ListRouting> ();
+  ipv6->SetRoutingProtocol (ipv6Routing);
+  Ptr<Ipv6StaticRouting> ipv6staticRouting = CreateObject<Ipv6StaticRouting> ();
+  ipv6Routing->AddRoutingProtocol (ipv6staticRouting, 0);
+  node->AggregateObject (ipv6);
+  //ICMP
+  Ptr<Icmpv6L4Protocol> icmp = CreateObject<Icmpv6L4Protocol> ();
+  node->AggregateObject (icmp);
+  //Ipv6 Extensions
+  ipv6->RegisterExtensions ();
+  ipv6->RegisterOptions ();
+  //UDP
+  Ptr<UdpL4Protocol> udp = CreateObject<UdpL4Protocol> ();
+  node->AggregateObject (udp);
+}
+
+
+class SixlowpanHc1ImplTest : public TestCase
+{
+  Ptr<Packet> m_receivedPacket;
+  void DoSendData (Ptr<Socket> socket, std::string to);
+  void SendData (Ptr<Socket> socket, std::string to);
+
+public:
+  virtual void DoRun (void);
+  SixlowpanHc1ImplTest ();
+
+  void ReceivePacket (Ptr<Socket> socket, Ptr<Packet> packet, const Address &from);
+  void ReceivePkt (Ptr<Socket> socket);
+};
+
+SixlowpanHc1ImplTest::SixlowpanHc1ImplTest ()
+  : TestCase ("Sixlowpan implementation")
+{
+}
+
+void SixlowpanHc1ImplTest::ReceivePacket (Ptr<Socket> socket, Ptr<Packet> packet, const Address &from)
+{
+  m_receivedPacket = packet;
+}
+
+void SixlowpanHc1ImplTest::ReceivePkt (Ptr<Socket> socket)
+{
+  uint32_t availableData;
+  availableData = socket->GetRxAvailable ();
+  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  //cast availableData to void, to suppress 'availableData' set but not used
+  //compiler warning
+  (void) availableData;
+}
+
+void
+SixlowpanHc1ImplTest::DoSendData (Ptr<Socket> socket, std::string to)
+{
+  Address realTo = Inet6SocketAddress (Ipv6Address (to.c_str ()), 1234);
+  uint8_t buffer [] = "\"Can you tell me where my country lies?\" \\ said the unifaun to his true love's eyes. \\ \"It lies with me!\" cried the Queen of Maybe \\ - for her merchandise, he traded in his prize.";
+
+  Ptr<Packet> packet = Create<Packet> (buffer, 180);
+  NS_TEST_EXPECT_MSG_EQ (socket->SendTo (packet, 0, realTo),
+                         180, "200");
+}
+
+void
+SixlowpanHc1ImplTest::SendData (Ptr<Socket> socket, std::string to)
+{
+  m_receivedPacket = Create<Packet> ();
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &SixlowpanHc1ImplTest::DoSendData, this, socket, to);
+  Simulator::Run ();
+}
+
+void
+SixlowpanHc1ImplTest::DoRun (void)
+{
+  // Create topology
+
+  // Receiver Node
+  Ptr<Node> rxNode = CreateObject<Node> ();
+  AddInternetStack6 (rxNode);
+  Ptr<SimpleNetDevice> rxDev;
+  { // first interface
+    rxDev = CreateObject<SimpleNetDevice> ();
+    rxDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
+    rxNode->AddDevice (rxDev);
+
+    Ptr<SixLowPanNetDevice> rxSix = CreateObject<SixLowPanNetDevice> ();
+    rxSix->SetAttribute ("ForceEtherType", BooleanValue (true) );
+    rxSix->SetAttribute ("Rfc6282", BooleanValue (false) );
+    rxNode->AddDevice (rxSix);
+    rxSix->SetNetDevice (rxDev);
+
+    Ptr<Ipv6> ipv6 = rxNode->GetObject<Ipv6> ();
+    ipv6->AddInterface (rxDev);
+    uint32_t netdev_idx = ipv6->AddInterface (rxSix);
+    Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (Ipv6Address ("2001:0100::1"), Ipv6Prefix (64));
+    ipv6->AddAddress (netdev_idx, ipv6Addr);
+    ipv6->SetUp (netdev_idx);
+  }
+
+  // Sender Node
+  Ptr<Node> txNode = CreateObject<Node> ();
+  AddInternetStack6 (txNode);
+  Ptr<SimpleNetDevice> txDev;
+  {
+    txDev = CreateObject<SimpleNetDevice> ();
+    txDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
+    txNode->AddDevice (txDev);
+
+    Ptr<SixLowPanNetDevice> txSix = CreateObject<SixLowPanNetDevice> ();
+    txSix->SetAttribute ("ForceEtherType", BooleanValue (true) );
+    txSix->SetAttribute ("Rfc6282", BooleanValue (false) );
+    txNode->AddDevice (txSix);
+    txSix->SetNetDevice (txDev);
+
+    Ptr<Ipv6> ipv6 = txNode->GetObject<Ipv6> ();
+    ipv6->AddInterface (txDev);
+    uint32_t netdev_idx = ipv6->AddInterface (txSix);
+    Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (Ipv6Address ("2001:0100::2"), Ipv6Prefix (64));
+    ipv6->AddAddress (netdev_idx, ipv6Addr);
+    ipv6->SetUp (netdev_idx);
+  }
+
+  // link the two nodes
+  Ptr<SimpleChannel> channel1 = CreateObject<SimpleChannel> ();
+  rxDev->SetChannel (channel1);
+  txDev->SetChannel (channel1);
+
+  // Create the UDP sockets
+  Ptr<SocketFactory> rxSocketFactory = rxNode->GetObject<UdpSocketFactory> ();
+  Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket ();
+  NS_TEST_EXPECT_MSG_EQ (rxSocket->Bind (Inet6SocketAddress (Ipv6Address ("2001:0100::1"), 1234)), 0, "trivial");
+  rxSocket->SetRecvCallback (MakeCallback (&SixlowpanHc1ImplTest::ReceivePkt, this));
+
+  Ptr<SocketFactory> txSocketFactory = txNode->GetObject<UdpSocketFactory> ();
+  Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
+  txSocket->SetAllowBroadcast (true);
+  // ------ Now the tests ------------
+
+  // Unicast test
+  SendData (txSocket, "2001:0100::1");
+  NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 180, "trivial");
+  uint8_t rxBuffer [180];
+  uint8_t txBuffer [180] = "\"Can you tell me where my country lies?\" \\ said the unifaun to his true love's eyes. \\ \"It lies with me!\" cried the Queen of Maybe \\ - for her merchandise, he traded in his prize.";
+  m_receivedPacket->CopyData (rxBuffer, 180);
+  NS_TEST_EXPECT_MSG_EQ (memcmp (rxBuffer, txBuffer, 180), 0, "trivial");
+
+  m_receivedPacket->RemoveAllByteTags ();
+
+  Simulator::Destroy ();
+
+}
+
+
+//-----------------------------------------------------------------------------
+class SixlowpanHc1TestSuite : public TestSuite
+{
+public:
+  SixlowpanHc1TestSuite () : TestSuite ("sixlowpan-hc1", UNIT)
+  {
+    AddTestCase (new SixlowpanHc1ImplTest, TestCase::QUICK);
+  }
+} g_sixlowpanHc1TestSuite;
diff -Naur ns-3.18.1/src/sixlowpan/test/sixlowpan-iphc-test.cc ns-3.19/src/sixlowpan/test/sixlowpan-iphc-test.cc
--- ns-3.18.1/src/sixlowpan/test/sixlowpan-iphc-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/test/sixlowpan-iphc-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,214 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze, Italy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#include "ns3/test.h"
+#include "ns3/socket-factory.h"
+#include "ns3/udp-socket-factory.h"
+#include "ns3/simulator.h"
+#include "ns3/simple-channel.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/socket.h"
+#include "ns3/boolean.h"
+
+#include "ns3/log.h"
+#include "ns3/node.h"
+#include "ns3/inet6-socket-address.h"
+
+#include "ns3/ipv6-l3-protocol.h"
+#include "ns3/icmpv6-l4-protocol.h"
+#include "ns3/udp-l4-protocol.h"
+#include "ns3/ipv6-list-routing.h"
+#include "ns3/ipv6-static-routing.h"
+
+#include "ns3/sixlowpan-net-device.h"
+
+#include <string>
+#include <limits>
+
+using namespace ns3;
+
+static void
+AddInternetStack6 (Ptr<Node> node)
+{
+  //IPV6
+  Ptr<Ipv6L3Protocol> ipv6 = CreateObject<Ipv6L3Protocol> ();
+  //Routing for Ipv6
+  Ptr<Ipv6ListRouting> ipv6Routing = CreateObject<Ipv6ListRouting> ();
+  ipv6->SetRoutingProtocol (ipv6Routing);
+  Ptr<Ipv6StaticRouting> ipv6staticRouting = CreateObject<Ipv6StaticRouting> ();
+  ipv6Routing->AddRoutingProtocol (ipv6staticRouting, 0);
+  node->AggregateObject (ipv6);
+  //ICMP
+  Ptr<Icmpv6L4Protocol> icmp = CreateObject<Icmpv6L4Protocol> ();
+  node->AggregateObject (icmp);
+  //Ipv6 Extensions
+  ipv6->RegisterExtensions ();
+  ipv6->RegisterOptions ();
+  //UDP
+  Ptr<UdpL4Protocol> udp = CreateObject<UdpL4Protocol> ();
+  node->AggregateObject (udp);
+}
+
+
+class SixlowpanIphcImplTest : public TestCase
+{
+  Ptr<Packet> m_receivedPacket;
+  void DoSendData (Ptr<Socket> socket, std::string to);
+  void SendData (Ptr<Socket> socket, std::string to);
+
+public:
+  virtual void DoRun (void);
+  SixlowpanIphcImplTest ();
+
+  void ReceivePacket (Ptr<Socket> socket, Ptr<Packet> packet, const Address &from);
+  void ReceivePkt (Ptr<Socket> socket);
+};
+
+SixlowpanIphcImplTest::SixlowpanIphcImplTest ()
+  : TestCase ("Sixlowpan implementation")
+{
+}
+
+void SixlowpanIphcImplTest::ReceivePacket (Ptr<Socket> socket, Ptr<Packet> packet, const Address &from)
+{
+  m_receivedPacket = packet;
+}
+
+void SixlowpanIphcImplTest::ReceivePkt (Ptr<Socket> socket)
+{
+  uint32_t availableData;
+  availableData = socket->GetRxAvailable ();
+  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+  //cast availableData to void, to suppress 'availableData' set but not used
+  //compiler warning
+  (void) availableData;
+}
+
+void
+SixlowpanIphcImplTest::DoSendData (Ptr<Socket> socket, std::string to)
+{
+  Address realTo = Inet6SocketAddress (Ipv6Address (to.c_str ()), 1234);
+  uint8_t buffer [] = "\"Can you tell me where my country lies?\" \\ said the unifaun to his true love's eyes. \\ \"It lies with me!\" cried the Queen of Maybe \\ - for her merchandise, he traded in his prize.";
+
+  Ptr<Packet> packet = Create<Packet> (buffer, 180);
+  NS_TEST_EXPECT_MSG_EQ (socket->SendTo (packet, 0, realTo),
+                         180, "200");
+}
+
+void
+SixlowpanIphcImplTest::SendData (Ptr<Socket> socket, std::string to)
+{
+  m_receivedPacket = Create<Packet> ();
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &SixlowpanIphcImplTest::DoSendData, this, socket, to);
+  Simulator::Run ();
+}
+
+void
+SixlowpanIphcImplTest::DoRun (void)
+{
+  // Create topology
+
+  // Receiver Node
+  Ptr<Node> rxNode = CreateObject<Node> ();
+  AddInternetStack6 (rxNode);
+  Ptr<SimpleNetDevice> rxDev;
+  { // first interface
+    rxDev = CreateObject<SimpleNetDevice> ();
+    rxDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
+    rxNode->AddDevice (rxDev);
+
+    Ptr<SixLowPanNetDevice> rxSix = CreateObject<SixLowPanNetDevice> ();
+    rxSix->SetAttribute ("ForceEtherType", BooleanValue (true) );
+    rxNode->AddDevice (rxSix);
+    rxSix->SetNetDevice (rxDev);
+
+    Ptr<Ipv6> ipv6 = rxNode->GetObject<Ipv6> ();
+    ipv6->AddInterface (rxDev);
+    uint32_t netdev_idx = ipv6->AddInterface (rxSix);
+    Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (Ipv6Address ("2001:0100::1"), Ipv6Prefix (64));
+    ipv6->AddAddress (netdev_idx, ipv6Addr);
+    ipv6->SetUp (netdev_idx);
+  }
+
+  // Sender Node
+  Ptr<Node> txNode = CreateObject<Node> ();
+  AddInternetStack6 (txNode);
+  Ptr<SimpleNetDevice> txDev;
+  {
+    txDev = CreateObject<SimpleNetDevice> ();
+    txDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ()));
+    txNode->AddDevice (txDev);
+
+    Ptr<SixLowPanNetDevice> txSix = CreateObject<SixLowPanNetDevice> ();
+    txSix->SetAttribute ("ForceEtherType", BooleanValue (true) );
+    txNode->AddDevice (txSix);
+    txSix->SetNetDevice (txDev);
+
+    Ptr<Ipv6> ipv6 = txNode->GetObject<Ipv6> ();
+    ipv6->AddInterface (txDev);
+    uint32_t netdev_idx = ipv6->AddInterface (txSix);
+    Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (Ipv6Address ("2001:0100::2"), Ipv6Prefix (64));
+    ipv6->AddAddress (netdev_idx, ipv6Addr);
+    ipv6->SetUp (netdev_idx);
+  }
+
+  // link the two nodes
+  Ptr<SimpleChannel> channel1 = CreateObject<SimpleChannel> ();
+  rxDev->SetChannel (channel1);
+  txDev->SetChannel (channel1);
+
+  // Create the UDP sockets
+  Ptr<SocketFactory> rxSocketFactory = rxNode->GetObject<UdpSocketFactory> ();
+  Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket ();
+  NS_TEST_EXPECT_MSG_EQ (rxSocket->Bind (Inet6SocketAddress (Ipv6Address ("2001:0100::1"), 1234)), 0, "trivial");
+  rxSocket->SetRecvCallback (MakeCallback (&SixlowpanIphcImplTest::ReceivePkt, this));
+
+  Ptr<SocketFactory> txSocketFactory = txNode->GetObject<UdpSocketFactory> ();
+  Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
+  txSocket->SetAllowBroadcast (true);
+  // ------ Now the tests ------------
+
+  // Unicast test
+  SendData (txSocket, "2001:0100::1");
+  NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 180, "trivial");
+  uint8_t rxBuffer [180];
+  uint8_t txBuffer [180] = "\"Can you tell me where my country lies?\" \\ said the unifaun to his true love's eyes. \\ \"It lies with me!\" cried the Queen of Maybe \\ - for her merchandise, he traded in his prize.";
+  m_receivedPacket->CopyData (rxBuffer, 180);
+  NS_TEST_EXPECT_MSG_EQ (memcmp (rxBuffer, txBuffer, 180), 0, "trivial");
+
+  m_receivedPacket->RemoveAllByteTags ();
+
+  Simulator::Destroy ();
+
+}
+
+
+//-----------------------------------------------------------------------------
+class SixlowpanIphcTestSuite : public TestSuite
+{
+public:
+  SixlowpanIphcTestSuite () : TestSuite ("sixlowpan-iphc", UNIT)
+  {
+    AddTestCase (new SixlowpanIphcImplTest, TestCase::QUICK);
+  }
+} g_sixlowpanIphcTestSuite;
diff -Naur ns-3.18.1/src/sixlowpan/wscript ns-3.19/src/sixlowpan/wscript
--- ns-3.18.1/src/sixlowpan/wscript	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/sixlowpan/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,33 @@
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+def build(bld):
+    module = bld.create_ns3_module('sixlowpan', ['internet', 'network', 'core'])
+    module.includes = '.'
+    module.source = [
+        'model/sixlowpan-net-device.cc',
+        'model/sixlowpan-header.cc',
+        'helper/sixlowpan-helper.cc',
+        ]
+
+    module_test = bld.create_ns3_module_test_library('sixlowpan')
+    module_test.source = [
+        'test/sixlowpan-hc1-test.cc',
+        'test/sixlowpan-iphc-test.cc',
+        'test/error-channel-sixlow.cc',
+        'test/sixlowpan-fragmentation-test.cc',
+        
+        ]
+
+    headers = bld(features=['ns3header'])
+    headers.module = 'sixlowpan'
+    headers.source = [
+        'model/sixlowpan-net-device.h',
+        'model/sixlowpan-header.h',
+        'helper/sixlowpan-helper.h',
+        ]
+
+
+    if (bld.env['ENABLE_EXAMPLES']):
+        bld.recurse('examples')
+   
+    bld.ns3_python_bindings()
\ No newline at end of file
diff -Naur ns-3.18.1/src/spectrum/bindings/modulegen__gcc_ILP32.py ns-3.19/src/spectrum/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/spectrum/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -221,7 +221,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1584,10 +1584,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3606,6 +3607,11 @@
                    'void', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('ns3::Time', 'duration')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## spectrum-error-model.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## spectrum-error-model.h (module 'spectrum'): bool ns3::SpectrumErrorModel::IsRxCorrect() [member function]
     cls.add_method('IsRxCorrect', 
                    'bool', 
@@ -3934,6 +3940,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3944,6 +3955,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3959,6 +3975,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3984,6 +4005,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/spectrum/bindings/modulegen__gcc_LP64.py ns-3.19/src/spectrum/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/spectrum/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -221,7 +221,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1584,10 +1584,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3606,6 +3607,11 @@
                    'void', 
                    [param('ns3::SpectrumValue const &', 'sinr'), param('ns3::Time', 'duration')], 
                    is_pure_virtual=True, is_virtual=True)
+    ## spectrum-error-model.h (module 'spectrum'): static ns3::TypeId ns3::SpectrumErrorModel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
     ## spectrum-error-model.h (module 'spectrum'): bool ns3::SpectrumErrorModel::IsRxCorrect() [member function]
     cls.add_method('IsRxCorrect', 
                    'bool', 
@@ -3934,6 +3940,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3944,6 +3955,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3959,6 +3975,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3984,6 +4005,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/spectrum/doc/spectrum.rst ns-3.19/src/spectrum/doc/spectrum.rst
--- ns-3.18.1/src/spectrum/doc/spectrum.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/doc/spectrum.rst	2013-12-20 09:44:50.000000000 -0800
@@ -9,6 +9,6 @@
 
 The model is described in [Baldo2009]_. 
 
-.. [Baldo2009] N. Baldo and M. Miozzo, "Spectrum-aware Channel and PHY layer modeling for ns3", 
-   Proceedings of ICST NSTools 2009, Pisa, Italy. 
+..
+  Reference Baldo2009 is defined in lte/doc/lte-references.rst
 
diff -Naur ns-3.18.1/src/spectrum/model/aloha-noack-mac-header.cc ns-3.19/src/spectrum/model/aloha-noack-mac-header.cc
--- ns-3.18.1/src/spectrum/model/aloha-noack-mac-header.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/aloha-noack-mac-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (AlohaNoackMacHeader);
+NS_OBJECT_ENSURE_REGISTERED (AlohaNoackMacHeader)
+  ;
 
 TypeId
 AlohaNoackMacHeader::GetTypeId (void)
diff -Naur ns-3.18.1/src/spectrum/model/aloha-noack-net-device.cc ns-3.19/src/spectrum/model/aloha-noack-net-device.cc
--- ns-3.18.1/src/spectrum/model/aloha-noack-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/aloha-noack-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -55,7 +55,8 @@
 }
 
 
-NS_OBJECT_ENSURE_REGISTERED (AlohaNoackNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (AlohaNoackNetDevice)
+  ;
 
 TypeId
 AlohaNoackNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/spectrum/model/constant-spectrum-propagation-loss.cc ns-3.19/src/spectrum/model/constant-spectrum-propagation-loss.cc
--- ns-3.18.1/src/spectrum/model/constant-spectrum-propagation-loss.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/constant-spectrum-propagation-loss.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (ConstantSpectrumPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (ConstantSpectrumPropagationLossModel)
+  ;
 
 ConstantSpectrumPropagationLossModel::ConstantSpectrumPropagationLossModel ()
 {
diff -Naur ns-3.18.1/src/spectrum/model/friis-spectrum-propagation-loss.cc ns-3.19/src/spectrum/model/friis-spectrum-propagation-loss.cc
--- ns-3.18.1/src/spectrum/model/friis-spectrum-propagation-loss.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/friis-spectrum-propagation-loss.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (FriisSpectrumPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (FriisSpectrumPropagationLossModel)
+  ;
 
 
 FriisSpectrumPropagationLossModel::FriisSpectrumPropagationLossModel ()
diff -Naur ns-3.18.1/src/spectrum/model/half-duplex-ideal-phy.cc ns-3.19/src/spectrum/model/half-duplex-ideal-phy.cc
--- ns-3.18.1/src/spectrum/model/half-duplex-ideal-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/half-duplex-ideal-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (HalfDuplexIdealPhy);
+NS_OBJECT_ENSURE_REGISTERED (HalfDuplexIdealPhy)
+  ;
 
 HalfDuplexIdealPhy::HalfDuplexIdealPhy ()
   : m_mobility (0),
diff -Naur ns-3.18.1/src/spectrum/model/multi-model-spectrum-channel.cc ns-3.19/src/spectrum/model/multi-model-spectrum-channel.cc
--- ns-3.18.1/src/spectrum/model/multi-model-spectrum-channel.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/multi-model-spectrum-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -45,7 +45,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (MultiModelSpectrumChannel);
+NS_OBJECT_ENSURE_REGISTERED (MultiModelSpectrumChannel)
+  ;
 
 
 std::ostream& operator<< (std::ostream& lhs, TxSpectrumModelInfoMap_t& rhs)
diff -Naur ns-3.18.1/src/spectrum/model/non-communicating-net-device.cc ns-3.19/src/spectrum/model/non-communicating-net-device.cc
--- ns-3.18.1/src/spectrum/model/non-communicating-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/non-communicating-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (NonCommunicatingNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (NonCommunicatingNetDevice)
+  ;
 
 TypeId
 NonCommunicatingNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/spectrum/model/single-model-spectrum-channel.cc ns-3.19/src/spectrum/model/single-model-spectrum-channel.cc
--- ns-3.18.1/src/spectrum/model/single-model-spectrum-channel.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/single-model-spectrum-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -44,7 +44,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (SingleModelSpectrumChannel);
+NS_OBJECT_ENSURE_REGISTERED (SingleModelSpectrumChannel)
+  ;
 
 SingleModelSpectrumChannel::SingleModelSpectrumChannel ()
 {
diff -Naur ns-3.18.1/src/spectrum/model/spectrum-analyzer.cc ns-3.19/src/spectrum/model/spectrum-analyzer.cc
--- ns-3.18.1/src/spectrum/model/spectrum-analyzer.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/spectrum-analyzer.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SpectrumAnalyzer);
+NS_OBJECT_ENSURE_REGISTERED (SpectrumAnalyzer)
+  ;
 
 SpectrumAnalyzer::SpectrumAnalyzer ()
   : m_mobility (0),
diff -Naur ns-3.18.1/src/spectrum/model/spectrum-channel.cc ns-3.19/src/spectrum/model/spectrum-channel.cc
--- ns-3.18.1/src/spectrum/model/spectrum-channel.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/spectrum-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 namespace ns3 {
 
 
-NS_OBJECT_ENSURE_REGISTERED (SpectrumChannel);
+NS_OBJECT_ENSURE_REGISTERED (SpectrumChannel)
+  ;
 
 TypeId
 SpectrumChannel::GetTypeId (void)
diff -Naur ns-3.18.1/src/spectrum/model/spectrum-error-model.cc ns-3.19/src/spectrum/model/spectrum-error-model.cc
--- ns-3.18.1/src/spectrum/model/spectrum-error-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/spectrum-error-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,6 +27,17 @@
 
 namespace ns3 {
 
+NS_OBJECT_ENSURE_REGISTERED (SpectrumErrorModel);
+
+TypeId
+SpectrumErrorModel::GetTypeId ()
+{
+  static TypeId tid = TypeId ("ns3::SpectrumErrorModel")
+    .SetParent<Object> ()
+    ;
+  return tid;
+}
+
 SpectrumErrorModel::~SpectrumErrorModel ()
 {
 }
diff -Naur ns-3.18.1/src/spectrum/model/spectrum-error-model.h ns-3.19/src/spectrum/model/spectrum-error-model.h
--- ns-3.18.1/src/spectrum/model/spectrum-error-model.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/spectrum-error-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -39,6 +39,8 @@
 class SpectrumErrorModel :  public Object
 {
 public:
+
+  static TypeId GetTypeId ();
   virtual ~SpectrumErrorModel ();
   virtual void StartRx (Ptr<const Packet> p) = 0;
   virtual void EvaluateChunk (const SpectrumValue& sinr, Time duration) = 0;
@@ -72,31 +74,6 @@
 };
 
 
-// class EffectiveSnrSpectrumErrorModel
-// {
-// public:
-
-//   enum ModulationAndCoding {
-//     BPSK_1_2,
-//     BPSK_1_3,
-//     QPSK_1_2,
-//     QPSK_1_3,
-//     QAM16_1_2,
-//     QAM64_1_2
-//   };
-
-//   void StartRx (uint32_t bytes);
-//   void EvaluateChunk (const SpectrumValue& sinr, Time duration);
-//   bool IsRxCorrect ();
-
-// protected:
-//   uint32_t m_bytes;
-//   uint32_t m_deliverableBytes;
-
-// };
-
-
-
 } // namespace ns3
 
 
diff -Naur ns-3.18.1/src/spectrum/model/spectrum-phy.cc ns-3.19/src/spectrum/model/spectrum-phy.cc
--- ns-3.18.1/src/spectrum/model/spectrum-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/spectrum-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SpectrumPhy);
+NS_OBJECT_ENSURE_REGISTERED (SpectrumPhy)
+  ;
 
 
 TypeId
diff -Naur ns-3.18.1/src/spectrum/model/spectrum-propagation-loss-model.cc ns-3.19/src/spectrum/model/spectrum-propagation-loss-model.cc
--- ns-3.18.1/src/spectrum/model/spectrum-propagation-loss-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/spectrum-propagation-loss-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SpectrumPropagationLossModel);
+NS_OBJECT_ENSURE_REGISTERED (SpectrumPropagationLossModel)
+  ;
 
 SpectrumPropagationLossModel::SpectrumPropagationLossModel ()
   : m_next (0)
diff -Naur ns-3.18.1/src/spectrum/model/waveform-generator.cc ns-3.19/src/spectrum/model/waveform-generator.cc
--- ns-3.18.1/src/spectrum/model/waveform-generator.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/spectrum/model/waveform-generator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WaveformGenerator);
+NS_OBJECT_ENSURE_REGISTERED (WaveformGenerator)
+  ;
 
 WaveformGenerator::WaveformGenerator ()
   : m_mobility (0),
diff -Naur ns-3.18.1/src/stats/bindings/modulegen__gcc_ILP32.py ns-3.19/src/stats/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/stats/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -109,7 +109,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1749,6 +1749,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -1759,6 +1764,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -1774,6 +1784,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -1799,6 +1814,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/stats/bindings/modulegen__gcc_LP64.py ns-3.19/src/stats/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/stats/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -109,7 +109,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1749,6 +1749,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -1759,6 +1764,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -1774,6 +1784,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -1799,6 +1814,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/stats/doc/aggregator.rst ns-3.19/src/stats/doc/aggregator.rst
--- ns-3.18.1/src/stats/doc/aggregator.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/doc/aggregator.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 .. heading hierarchy:
    ************* Section (#.#)
diff -Naur ns-3.18.1/src/stats/doc/data-collection-helpers.rst ns-3.19/src/stats/doc/data-collection-helpers.rst
--- ns-3.18.1/src/stats/doc/data-collection-helpers.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/doc/data-collection-helpers.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 .. heading hierarchy:
    ************* Section (#.#)
@@ -162,26 +163,26 @@
 
 It has the following arguments:
 
-+--------------------------------+------------------------------+
-| Argument                       | Description                  |
-+================================+==============================+
-| outputFileNameWithoutExtension | Name of gnuplot related files|
-|                                | to write with no extension.  |
-+--------------------------------+------------------------------+
-| title                          | Plot title string to use for |
-|                                | this plot.                   |
-+--------------------------------+------------------------------+
-| xLegend                        | The legend for the x         |
-|                                | horizontal axis.             |
-+--------------------------------+------------------------------+
-| yLegend                        | The legend for the y         |
-|                                | vertical axis.               |
-+--------------------------------+------------------------------+
-| terminalType                   | Terminal type setting string |
-|                                | for output.  The default     |
-|                                | terminal type is "png".      |
-+--------------------------------+------------------------------+
-
+  +--------------------------------+------------------------------+
+  | Argument                       | Description                  |
+  +================================+==============================+
+  | outputFileNameWithoutExtension | Name of gnuplot related files|
+  |                                | to write with no extension.  |
+  +--------------------------------+------------------------------+
+  | title                          | Plot title string to use for |
+  |                                | this plot.                   |
+  +--------------------------------+------------------------------+
+  | xLegend                        | The legend for the x         |
+  |                                | horizontal axis.             |
+  +--------------------------------+------------------------------+
+  | yLegend                        | The legend for the y         |
+  |                                | vertical axis.               |
+  +--------------------------------+------------------------------+
+  | terminalType                   | Terminal type setting string |
+  |                                | for output.  The default     |
+  |                                | terminal type is "png".      |
+  +--------------------------------+------------------------------+
+  
 The GnuplotHelper's ``ConfigurePlot()`` function configures plot 
 related parameters for this gnuplot helper so
 that it will create a space separated gnuplot data file named
@@ -219,26 +220,26 @@
 
 It has the following arguments:
 
-+------------------+------------------------------+
-| Argument         | Description                  |
-+==================+==============================+
-| typeId           | The type ID for the probe    |
-|                  | used when it is created.     |
-+------------------+------------------------------+
-| path             | Config path to access the    |
-|                  | probe.                       |
-+------------------+------------------------------+
-| probeTraceSource | The probe trace source to    |
-|                  | access.                      |
-+------------------+------------------------------+
-| title            | The title to be associated   |
-|                  | to this dataset              |
-+------------------+------------------------------+
-| keyLocation      | The location of the key in   |
-|                  | the plot.  The default       |
-|                  | location is inside.          |
-+------------------+------------------------------+
-
+  +------------------+------------------------------+
+  | Argument         | Description                  |
+  +==================+==============================+
+  | typeId           | The type ID for the probe    |
+  |                  | used when it is created.     |
+  +------------------+------------------------------+
+  | path             | Config path to access the    |
+  |                  | probe.                       |
+  +------------------+------------------------------+
+  | probeTraceSource | The probe trace source to    |
+  |                  | access.                      |
+  +------------------+------------------------------+
+  | title            | The title to be associated   |
+  |                  | to this dataset              |
+  +------------------+------------------------------+
+  | keyLocation      | The location of the key in   |
+  |                  | the plot.  The default       |
+  |                  | location is inside.          |
+  +------------------+------------------------------+
+  
 The GnuplotHelper's ``PlotProbe()`` function 
 plots a dataset generated by hooking the |ns3| trace source with a
 probe, and then plotting the values from the probeTraceSource. 
@@ -365,7 +366,7 @@
 code that was added to the original |ns3| Tutorial example's code.  
 Only the first 10 lines of this file are shown here for brevity.
 
-::
+.. sourcecode:: text
 
   Time (Seconds) = 1.000e+00	Packet Byte Count = 40
   Time (Seconds) = 1.004e+00	Packet Byte Count = 40
@@ -386,7 +387,7 @@
 |ns3| Tutorial example's code.  Only the first 10 lines of this 
 file are shown here for brevity.
 
-::
+.. sourcecode:: text
 
   Time (Seconds) = 1.002e+00	Packet Byte Count = 40
   Time (Seconds) = 1.007e+00	Packet Byte Count = 40
@@ -445,17 +446,17 @@
 
 It has the following arguments:
 
-+--------------------------------+------------------------------+
-| Argument                       | Description                  |
-+================================+==============================+
-| outputFileNameWithoutExtension | Name of output file to write |
-|                                | with no extension.           |
-+--------------------------------+------------------------------+
-| fileType                       | Type of file to write.  The  | 
-|                                | default type of file is space| 
-|                                | separated.                   |
-+--------------------------------+------------------------------+
-
+  +--------------------------------+------------------------------+
+  | Argument                       | Description                  |
+  +================================+==============================+
+  | outputFileNameWithoutExtension | Name of output file to write |
+  |                                | with no extension.           |
+  +--------------------------------+------------------------------+
+  | fileType                       | Type of file to write.  The  | 
+  |                                | default type of file is space| 
+  |                                | separated.                   |
+  +--------------------------------+------------------------------+
+  
 The FileHelper's ``ConfigureFile()`` function configures text file 
 related parameters for the file helper so that
 it will create a file named outputFileNameWithoutExtension plus
@@ -487,19 +488,19 @@
 
 It has the following arguments:
 
-+------------------+------------------------------+
-| Argument         | Description                  |
-+==================+==============================+
-| typeId           | The type ID for the probe    |
-|                  | used when it is created.     |
-+------------------+------------------------------+
-| path             | Config path to access the    |
-|                  | probe.                       |
-+------------------+------------------------------+
-| probeTraceSource | The probe trace source to    |
-|                  | access.                      |
-+------------------+------------------------------+
-
+  +------------------+------------------------------+
+  | Argument         | Description                  |
+  +==================+==============================+
+  | typeId           | The type ID for the probe    |
+  |                  | used when it is created.     |
+  +------------------+------------------------------+
+  | path             | Config path to access the    |
+  |                  | probe.                       |
+  +------------------+------------------------------+
+  | probeTraceSource | The probe trace source to    |
+  |                  | access.                      |
+  +------------------+------------------------------+
+  
 The FileHelper's ``WriteProbe()`` function
 creates output text files generated by hooking the ns-3 trace source
 with a probe, and then writing the values from the
@@ -544,7 +545,7 @@
 ``file-helper-example.txt`` was created using the example.  
 Only the first 10 lines of this file are shown here for brevity.
 
-::
+.. sourcecode:: text
 
   Time (Seconds) = 4.995e-01	Count = 1
   Time (Seconds) = 1.463e+00	Count = 2
diff -Naur ns-3.18.1/src/stats/doc/data-collection.rst ns-3.19/src/stats/doc/data-collection.rst
--- ns-3.18.1/src/stats/doc/data-collection.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/doc/data-collection.rst	2013-12-20 09:44:50.000000000 -0800
@@ -32,5 +32,6 @@
    collector.rst
    aggregator.rst
    adaptor.rst
+   statistics.rst
    scope-and-limitations.rst
 
diff -Naur ns-3.18.1/src/stats/doc/probe.rst ns-3.19/src/stats/doc/probe.rst
--- ns-3.18.1/src/stats/doc/probe.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/doc/probe.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 .. heading hierarchy:
    ************* Section (#.#)
@@ -46,13 +47,17 @@
 * Probes register a name in the ns3::Config namespace (using
   ``Names::Add ()``) so that other objects may refer to them.
 * Probes provide a static method that allows one to manipulate a Probe
-  by name, such as what is done in ns2measure [Cic06]_ ::
+  by name, such as what is done in ns2measure [Cic06]_
 
-   Stat::put ("my_metric", ID, sample);
+  ::
 
-  The ns-3 equivalent of the above ns2measure code is, e.g.::
+    Stat::put ("my_metric", ID, sample);
 
-  DoubleProbe::SetValueByPath ("/path/to/probe", sample);
+  The ns-3 equivalent of the above ns2measure code is, e.g.
+
+  ::
+
+    DoubleProbe::SetValueByPath ("/path/to/probe", sample);
 
 Creation
 ########
@@ -245,23 +250,23 @@
 
 1. through a traced variable hooked to one Probe: 
 
-::
+   ::
   
-    TracedValue<double> m_counter;  // normally this would be integer type
+     TracedValue<double> m_counter;  // normally this would be integer type
   
 2. through a counter whose value is posted to a second Probe, referenced by its name in the Config system:
 
-::
+  ::
 
-  void
-  Emitter::Count (void)
-  {
-    NS_LOG_FUNCTION (this);
-    NS_LOG_DEBUG ("Counting at " << Simulator::Now ().GetSeconds ());
-    m_counter += 1.0;
-    DoubleProbe::SetValueByPath ("/Names/StaticallyAccessedProbe", m_counter);
-    Simulator::Schedule (Seconds (m_var->GetValue ()), &Emitter::Count, this);
-  }
+    void
+    Emitter::Count (void)
+    {
+      NS_LOG_FUNCTION (this);
+      NS_LOG_DEBUG ("Counting at " << Simulator::Now ().GetSeconds ());
+      m_counter += 1.0;
+      DoubleProbe::SetValueByPath ("/Names/StaticallyAccessedProbe", m_counter);
+      Simulator::Schedule (Seconds (m_var->GetValue ()), &Emitter::Count, this);
+    }
 
 Let's look at the Probe more carefully.  Probes can receive their values
 in a multiple ways:
@@ -303,7 +308,7 @@
 
 Case 0):
 
-::
+  ::
 
     // The below shows typical functionality without a probe
     // (connect a sink function to a trace source)
@@ -314,7 +319,7 @@
 
 case 1):
 
-::
+  ::
 
     // 
     // Probe1 will be hooked directly to the Emitter trace source object
@@ -331,7 +336,7 @@
 
 case 2):
 
-::
+  ::
 
     // 
     // Probe2 will be hooked to the Emitter trace source object by 
@@ -347,7 +352,7 @@
   
 case 4) (case 3 is not shown in this example):
 
-::
+  ::
 
     // 
     // Probe3 will be called by the emitter directly through the 
@@ -361,12 +366,14 @@
 And finally, the example shows how the probes can be hooked to
 generate output:
 
-::
+  ::
 
     // The probe itself should generate output.  The context that we provide
     // to this probe (in this case, the probe name) will help to disambiguate
     // the source of the trace
-    connected = probe3->TraceConnect ("Output", "/Names/Probes/StaticallyAccessedProbe/Output", MakeCallback (&NotifyViaProbe));
+    connected = probe3->TraceConnect ("Output",
+                                      "/Names/Probes/StaticallyAccessedProbe/Output",
+                                      MakeCallback (&NotifyViaProbe));
     NS_ASSERT_MSG (connected, "Trace source not .. connected to probe3 Output");
   
 The following callback is hooked to the Probe in this example for 
@@ -390,21 +397,18 @@
 Tutorial.  It can be found in 
 ``src/stats/examples/ipv4-packet-plot-example.cc``.
 
-::
-
-    // ===========================================================================
-    //
-    //         node 0                 node 1
-    //   +----------------+    +----------------+
-    //   |    ns-3 TCP    |    |    ns-3 TCP    |
-    //   +----------------+    +----------------+
-    //   |    10.1.1.1    |    |    10.1.1.2    |
-    //   +----------------+    +----------------+
-    //   | point-to-point |    | point-to-point |
-    //   +----------------+    +----------------+
-    //           |                     |
-    //           +---------------------+
+.. sourcecode:: text
 
+          node 0                 node 1
+    +----------------+    +----------------+
+    |    ns-3 TCP    |    |    ns-3 TCP    |
+    +----------------+    +----------------+
+    |    10.1.1.1    |    |    10.1.1.2    |
+    +----------------+    +----------------+
+    | point-to-point |    | point-to-point |
+    +----------------+    +----------------+
+            |                     |
+            +---------------------+
 
 
 We'll just look at the Probe, as it illustrates that Probes may also
diff -Naur ns-3.18.1/src/stats/doc/statistics.rst ns-3.19/src/stats/doc/statistics.rst
--- ns-3.18.1/src/stats/doc/statistics.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/doc/statistics.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 Statistical Framework
 ---------------------
@@ -35,8 +36,8 @@
 
 * The core framework and two basic data collectors: A counter, and a min/max/avg/total observer.
 * Extensions of those to easily work with times and packets.
-* Plaintext output formatted for omnetpp.
-* Database output using sqlite3, a standalone, lightweight, high performance SQL engine.
+* Plaintext output formatted for `OMNet++`_.
+* Database output using SQLite_, a standalone, lightweight, high performance SQL engine.
 * Mandatory and open ended metadata for describing and working with runs.
 * An example based on the notional experiment of examining the properties of NS-3's default ad hoc WiFi performance.  It incorporates the following:
 
@@ -47,6 +48,9 @@
   * An example of using packet tags to track end-to-end delay.
   * A simple control script which runs a number of trials of the experiment at varying distances and queries the resulting database to produce a graph using GNUPlot.
 
+.. _OMNet++: http://www.omnetpp.org
+.. _SQLite:  http://www.sqlite.org
+
 To-Do
 *****
 
@@ -98,17 +102,18 @@
 
   ::
 
+    double distance = 50.0;
+    string format ("OMNet++");
+    string experiment ("wifi-distance-test");
+    string strategy ("wifi-default");
+    string runID;
+
     CommandLine cmd;
-    cmd.AddValue("distance", "Distance apart to place nodes (in meters).",
-                 distance);
-    cmd.AddValue("format", "Format to use for data output.",
-                 format);
-    cmd.AddValue("experiment", "Identifier for experiment.",
-                 experiment);
-    cmd.AddValue("strategy", "Identifier for strategy.",
-                 strategy);
-    cmd.AddValue("run", "Identifier for run.",
-                 runID);
+    cmd.AddValue("distance",   "Distance apart to place nodes (in meters).", distance);
+    cmd.AddValue("format",     "Format to use for data output.",             format);
+    cmd.AddValue("experiment", "Identifier for experiment.",                 experiment);
+    cmd.AddValue("strategy",   "Identifier for strategy.",                   strategy);
+    cmd.AddValue("run",        "Identifier for run.",                        runID);
     cmd.Parse (argc, argv);
 
 * Creating nodes and network stacks using ``ns3::NodeContainer``, ``ns3::WiFiHelper``, and ``ns3::InternetStackHelper``.
@@ -170,30 +175,24 @@
   ::
 
     DataCollector data;
-    data.DescribeRun(experiment,
-                     strategy,
-                     input,
-                     runID);
+    data.DescribeRun(experiment, strategy, input, runID);
     data.AddMetadata("author", "tjkopena");
 
   Actual observation and calculating is done by ``ns3::DataCalculator`` objects, of which several different types exist.  These are created by the simulation program, attached to reporting or sampling code, and then registered with the ``ns3::DataCollector`` so they will be queried later for their output.  One easy observation mechanism is to use existing trace sources, for example to instrument objects in the ns-3 core without changing their code.  Here a counter is attached directly to a trace signal in the WiFi MAC layer on the target node.
 
   ::
 
-    Ptr<PacketCounterCalculator> totalRx =
-      CreateObject<PacketCounterCalculator>();
+    Ptr<PacketCounterCalculator> totalRx = CreateObject<PacketCounterCalculator>();
     totalRx->SetKey("wifi-rx-frames");
     Config::Connect("/NodeList/1/DeviceList/*/$ns3::WifiNetDevice/Rx",
-                    MakeCallback(&PacketCounterCalculator::FrameUpdate,
-                                      totalRx));
+                    MakeCallback(&PacketCounterCalculator::FrameUpdate, totalRx));
     data.AddDataCalculator(totalRx);
 
   Calculators may also be manipulated directly.  In this example, a counter is created and passed to the traffic sink application to be updated when packets are received.
 
   ::
 
-    Ptr<CounterCalculator<> > appRx =
-      CreateObject<CounterCalculator<> >();
+    Ptr<CounterCalculator<> > appRx = CreateObject<CounterCalculator<> >();
     appRx->SetKey("receiver-rx-packets");
     receiver->SetCounter(appRx);
     data.AddDataCalculator(appRx);
@@ -212,23 +211,24 @@
 
     Simulator::Run();    
 
-* Generating either omnetpp or sqlite output, depending on the command line arguments.  To do this a ``ns3::DataOutputInterface`` object is created and configured.  The specific type of this will determine the output format.  This object is then given the ``ns3::DataCollector`` object which it interrogates to produce the output.
+* Generating either `OMNet++`_ or SQLite_ output, depending on the command line arguments.  To do this a ``ns3::DataOutputInterface`` object is created and configured.  The specific type of this will determine the output format.  This object is then given the ``ns3::DataCollector`` object which it interrogates to produce the output.
 
-  ::
+  .. sourcecode:: cpp
 
     Ptr<DataOutputInterface> output;
-    if (format == "omnet") {
-      NS_LOG_INFO("Creating omnet formatted data output.");
+    if (format == "OMNet++") {
+      NS_LOG_INFO("Creating OMNet++ formatted data output.");
       output = CreateObject<OmnetDataOutput>();
     } else {
-      #ifdef STAT_USE_DB
-        NS_LOG_INFO("Creating sqlite formatted data output.");
+    #   ifdef STAT_USE_DB
+        NS_LOG_INFO("Creating SQLite formatted data output.");
         output = CreateObject<SqliteDataOutput>();
-      #endif
+    #   endif
     }
 
     output->Output(data);
 
+
 * Freeing any memory used by the simulation.  This should come at the end of the main function for the example.
 
   ::
@@ -240,18 +240,18 @@
 
 To see what the example program, applications, and stat framework are doing in detail, set the ``NS_LOG`` variable appropriately.  The following will provide copious output from all three.
   
-::
+.. sourcecode:: bash
 
-  export NS_LOG=StatFramework:WiFiDistanceExperiment:WiFiDistanceApps
+  $ export NS_LOG=WiFiDistanceExperiment:WiFiDistanceApps
 
 Note that this slows down the simulation extraordinarily.
 
 Sample Output
 =============
 
-Compiling and simply running the test program will append omnet++ formatted output such as the following to ``data.sca``.
+Compiling and simply running the test program will append `OMNet++`_ formatted output such as the following to ``data.sca``.
 
-::
+.. sourcecode:: text
  
   run run-1212239121
   
@@ -280,9 +280,11 @@
 Control Script
 ++++++++++++++
 
-In order to automate data collection at a variety of inputs (distances), a simple Bash script is used to execute a series of simulations.  It can be found at ``examples/stats/wifi-example-db.sh``.  The script runs through a set of distances, collecting the results into an sqlite3 database.  At each distance five trials are conducted to give a better picture of expected performance.  The entire experiment takes only a few dozen seconds to run on a low end machine as there is no output during the simulation and little traffic is generated.
+In order to automate data collection at a variety of inputs (distances), a simple Bash script is used to execute a series of simulations.  It can be found at ``examples/stats/wifi-example-db.sh``.  The script is meant to be run from the ``examples/stats/`` directory.
+
+The script runs through a set of distances, collecting the results into an SQLite_ database.  At each distance five trials are conducted to give a better picture of expected performance.  The entire experiment takes only a few dozen seconds to run on a low end machine as there is no output during the simulation and little traffic is generated.
   
-::
+.. sourcecode:: bash
 
   #!/bin/sh
   
@@ -314,9 +316,9 @@
 Analysis and Conclusion
 +++++++++++++++++++++++
 
-Once all trials have been conducted, the script executes a simple SQL query over the database using the sqlite3 command line program.  The query computes average packet loss in each set of trials associated with each distance.  It does not take into account different strategies, but the information is present in the database to make some simple extensions and do so.  The collected data is then passed to GNUPlot for graphing.
+Once all trials have been conducted, the script executes a simple SQL query over the database using the SQLite_ command line program.  The query computes average packet loss in each set of trials associated with each distance.  It does not take into account different strategies, but the information is present in the database to make some simple extensions and do so.  The collected data is then passed to GNUPlot for graphing.
   
-::
+.. sourcecode:: sql
 
   CMD="select exp.input,avg(100-((rx.value*100)/tx.value)) \
       from Singletons rx, Singletons tx, Experiments exp \
@@ -333,7 +335,7 @@
 
 The GNUPlot script found at ``examples/stats/wifi-example.gnuplot`` simply defines the output format and some basic formatting for the graph.
   
-::
+.. sourcecode:: bash
 
   set terminal postscript portrait enhanced lw 2 "Helvetica" 14
   
diff -Naur ns-3.18.1/src/stats/examples/double-probe-example.cc ns-3.19/src/stats/examples/double-probe-example.cc
--- ns-3.18.1/src/stats/examples/double-probe-example.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/examples/double-probe-example.cc	2013-12-20 09:44:50.000000000 -0800
@@ -50,7 +50,8 @@
 
 };
 
-NS_OBJECT_ENSURE_REGISTERED (Emitter);
+NS_OBJECT_ENSURE_REGISTERED (Emitter)
+  ;
 
 TypeId
 Emitter::GetTypeId (void)
diff -Naur ns-3.18.1/src/stats/examples/file-helper-example.cc ns-3.19/src/stats/examples/file-helper-example.cc
--- ns-3.18.1/src/stats/examples/file-helper-example.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/examples/file-helper-example.cc	2013-12-20 09:44:50.000000000 -0800
@@ -53,7 +53,8 @@
 
 };
 
-NS_OBJECT_ENSURE_REGISTERED (Emitter);
+NS_OBJECT_ENSURE_REGISTERED (Emitter)
+  ;
 
 TypeId
 Emitter::GetTypeId (void)
diff -Naur ns-3.18.1/src/stats/examples/gnuplot-helper-example.cc ns-3.19/src/stats/examples/gnuplot-helper-example.cc
--- ns-3.18.1/src/stats/examples/gnuplot-helper-example.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/examples/gnuplot-helper-example.cc	2013-12-20 09:44:50.000000000 -0800
@@ -53,7 +53,8 @@
 
 };
 
-NS_OBJECT_ENSURE_REGISTERED (Emitter);
+NS_OBJECT_ENSURE_REGISTERED (Emitter)
+  ;
 
 TypeId
 Emitter::GetTypeId (void)
diff -Naur ns-3.18.1/src/stats/helper/file-helper.cc ns-3.19/src/stats/helper/file-helper.cc
--- ns-3.18.1/src/stats/helper/file-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/helper/file-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("FileHelper");
+NS_LOG_COMPONENT_DEFINE ("FileHelper")
+  ;
 
 FileHelper::FileHelper ()
   : m_aggregator                     (0),
diff -Naur ns-3.18.1/src/stats/helper/file-helper.h ns-3.19/src/stats/helper/file-helper.h
--- ns-3.18.1/src/stats/helper/file-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/helper/file-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup stats
  * \brief Helper class used to put data values into a file.
  **/
 class FileHelper
@@ -133,12 +134,13 @@
 
   /**
    * \param probeName the probe's name.
-   *
+   * \return Ptr to the probe
    * \brief Gets the specified probe.
    */
   Ptr<Probe> GetProbe (std::string probeName) const;
 
   /**
+   * \return Ptr to a FileAggregator object
    * \brief Gets the single aggregator that is always constructed.
    *
    * This function is non-const because an aggregator may be lazily
@@ -149,7 +151,7 @@
   /**
    * \param aggregatorName name for aggregator.
    * \param outputFileName name of output file to write.
-   *
+   * \return Ptr to a FileAggregator object
    * \brief Gets one of the multiple aggregators from the map.
    *
    * This function is non-const because an aggregator may be lazily
@@ -303,17 +305,16 @@
   /// Heading line for the outputfile.
   std::string m_heading;
 
-  /// Format strings for C-style sprintf() function.
-  std::string m_1dFormat;
-  std::string m_2dFormat;
-  std::string m_3dFormat;
-  std::string m_4dFormat;
-  std::string m_5dFormat;
-  std::string m_6dFormat;
-  std::string m_7dFormat;
-  std::string m_8dFormat;
-  std::string m_9dFormat;
-  std::string m_10dFormat;
+  std::string m_1dFormat;  //!< Format string for 1D format C-style sprintf() function.
+  std::string m_2dFormat;  //!< Format string for 2D format C-style sprintf() function.
+  std::string m_3dFormat;  //!< Format string for 3D format C-style sprintf() function.
+  std::string m_4dFormat;  //!< Format string for 4D format C-style sprintf() function.
+  std::string m_5dFormat;  //!< Format string for 5D format C-style sprintf() function.
+  std::string m_6dFormat;  //!< Format string for 6D format C-style sprintf() function.
+  std::string m_7dFormat;  //!< Format string for 7D format C-style sprintf() function.
+  std::string m_8dFormat;  //!< Format string for 8D format C-style sprintf() function.
+  std::string m_9dFormat;  //!< Format string for 9D format C-style sprintf() function.
+  std::string m_10dFormat; //!< Format string for 10D format C-style sprintf() function.
 
 }; // class FileHelper
 
diff -Naur ns-3.18.1/src/stats/helper/gnuplot-helper.cc ns-3.19/src/stats/helper/gnuplot-helper.cc
--- ns-3.18.1/src/stats/helper/gnuplot-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/helper/gnuplot-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("GnuplotHelper");
+NS_LOG_COMPONENT_DEFINE ("GnuplotHelper")
+  ;
 
 GnuplotHelper::GnuplotHelper ()
   : m_aggregator                     (0),
diff -Naur ns-3.18.1/src/stats/helper/gnuplot-helper.h ns-3.19/src/stats/helper/gnuplot-helper.h
--- ns-3.18.1/src/stats/helper/gnuplot-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/helper/gnuplot-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -33,6 +33,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup gnuplot
  * \brief Helper class used to make gnuplot plots.
  **/
 class GnuplotHelper
@@ -139,12 +140,13 @@
 
   /**
    * \param probeName the probe's name.
-   *
+   * \return Ptr to probe
    * \brief Gets the specified probe.
    */
   Ptr<Probe> GetProbe (std::string probeName) const;
 
   /**
+   * \return Ptr to GnuplotAggregator object
    * \brief Gets the aggregator.
    *
    * This function is non-const because an aggregator may be lazily
diff -Naur ns-3.18.1/src/stats/model/average.h ns-3.19/src/stats/model/average.h
--- ns-3.18.1/src/stats/model/average.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/average.h	2013-12-20 09:44:50.000000000 -0800
@@ -30,12 +30,7 @@
 namespace ns3 {
 
 /**
- * \defgroup tools Tools
- *
- */
-
-/**
- * \ingroup tools
+ * \ingroup stats
  *
  * Simple average, min, max and std. deviation calculator
  *
@@ -106,9 +101,10 @@
   //\}
 
 private:
-  uint32_t m_size;
-  T      m_min, m_max;
-  MinMaxAvgTotalCalculator<double> m_varianceCalculator;
+  uint32_t m_size; //!< Number of sampled data.
+  T m_min; //!< Minimum value observed.
+  T m_max; //!< Maximum value observed.
+  MinMaxAvgTotalCalculator<double> m_varianceCalculator; //!< Variance calculator.
 };
 
 /// Print avg (err) [min, max]
diff -Naur ns-3.18.1/src/stats/model/basic-data-calculators.h ns-3.19/src/stats/model/basic-data-calculators.h
--- ns-3.18.1/src/stats/model/basic-data-calculators.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/basic-data-calculators.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,10 +27,11 @@
 namespace ns3 {
 
 /**
- * \defgroup stats Statistics
+ * \ingroup stats
+ * \class MinMaxAvgTotalCalculator
+ * \brief Template class MinMaxAvgTotalCalculator
  *
  */
-
 //------------------------------------------------------------
 //--------------------------------------------
 template <typename T  = uint32_t>
@@ -40,36 +41,75 @@
   MinMaxAvgTotalCalculator();
   virtual ~MinMaxAvgTotalCalculator();
 
+  /**
+   * Updates all variables of MinMaxAvgTotalCalculator
+   * \param i value of type T to use for updating the calculator
+   */
   void Update (const T i);
+  /**
+   * Reinitializes all variables of MinMaxAvgTotalCalculator
+   */
   void Reset ();
 
   virtual void Output (DataOutputCallback &callback) const;
 
+  /**
+   * Returns the count
+   * \return Count
+   */
   long getCount () const { return m_count; }
+  /**
+   * Returns the sum
+   * \return Total
+   */
   double getSum () const { return m_total; }
+  /**
+   * Returns the minimum value
+   * \return Min
+   */
   double getMin () const { return m_min; }
+  /**
+   * Returns the maximum value
+   * \return Max
+   */
   double getMax () const { return m_max; }
+  /**
+   * Returns the mean value
+   * \return Mean
+   */
   double getMean () const { return m_meanCurr; }
+  /**
+   * Returns the standard deviation
+   * \return Standard deviation
+   */
   double getStddev () const { return std::sqrt (m_varianceCurr); }
+  /**
+   * Returns the current variance
+   * \return Variance
+   */
   double getVariance () const { return m_varianceCurr; }
+  /**
+   * Returns the sum of squares
+   * \return Sum of squares
+   */
   double getSqrSum () const { return m_squareTotal; }
 
 protected:
   virtual void DoDispose (void);
 
-  uint32_t m_count;
+  uint32_t m_count;      //!< Count value of MinMaxAvgTotalCalculator
 
-  T m_total;
-  T m_squareTotal;
-  T m_min;
-  T m_max;
-
-  double m_meanCurr;
-  double m_sCurr;
-  double m_varianceCurr;
+  T m_total;             //!< Total value of MinMaxAvgTotalCalculator
+  T m_squareTotal;       //!< Sum of squares value of MinMaxAvgTotalCalculator
+  T m_min;               //!< Minimum value of MinMaxAvgTotalCalculator
+  T m_max;               //!< Maximum value of MinMaxAvgTotalCalculator
+
+  double m_meanCurr;     //!< Current mean of MinMaxAvgTotalCalculator
+  double m_sCurr;        //!< Current s of MinMaxAvgTotalCalculator
+  double m_varianceCurr; //!< Current variance of MinMaxAvgTotalCalculator
 
-  double m_meanPrev;
-  double m_sPrev;
+  double m_meanPrev;     //!< Previous mean of MinMaxAvgTotalCalculator
+  double m_sPrev;        //!< Previous s of MinMaxAvgTotalCalculator
 
   // end MinMaxAvgTotalCalculator
 };
@@ -197,6 +237,8 @@
 
 /**
  * \ingroup stats
+ * \class CounterCalculator
+ * \brief Template class CounterCalculator
  *
  */
 //------------------------------------------------------------
@@ -207,17 +249,32 @@
   CounterCalculator();
   virtual ~CounterCalculator();
 
+  /**
+   * Increments count by 1
+   */
   void Update ();
+  /**
+   * Increments count by i
+   * \param i value of type T to increment count
+   */
   void Update (const T i);
 
+  /**
+   * Returns the count of the CounterCalculator
+   * \return Count as a value of type T
+   */
   T GetCount () const;
 
+  /**
+   * Outputs the data based on the provided callback
+   * \param callback
+   */
   virtual void Output (DataOutputCallback &callback) const;
 
 protected:
   virtual void DoDispose (void);
 
-  T m_count;
+  T m_count; //!< Count value of CounterCalculator
 
   // end CounterCalculator
 };
diff -Naur ns-3.18.1/src/stats/model/boolean-probe.cc ns-3.19/src/stats/model/boolean-probe.cc
--- ns-3.18.1/src/stats/model/boolean-probe.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/boolean-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BooleanProbe);
+NS_OBJECT_ENSURE_REGISTERED (BooleanProbe)
+  ;
 
 TypeId
 BooleanProbe::GetTypeId ()
diff -Naur ns-3.18.1/src/stats/model/boolean-probe.h ns-3.19/src/stats/model/boolean-probe.h
--- ns-3.18.1/src/stats/model/boolean-probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/boolean-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,6 +34,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup probes
+ *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * a bool.  This probe exports a trace source "Output" of type bool.
  * The Output trace source emits a value when either the trace source
@@ -45,6 +47,10 @@
 class BooleanProbe : public Probe
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   BooleanProbe ();
   virtual ~BooleanProbe ();
@@ -97,7 +103,7 @@
    */
   void TraceSink (bool oldData, bool newData);
 
-  TracedValue<bool> m_output;
+  TracedValue<bool> m_output; //!< Output trace source.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/stats/model/data-calculator.h ns-3.19/src/stats/model/data-calculator.h
--- ns-3.18.1/src/stats/model/data-calculator.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/data-calculator.h	2013-12-20 09:44:50.000000000 -0800
@@ -26,11 +26,23 @@
 #include "ns3/simulator.h"
 
 namespace ns3 {
-extern const double NaN;
+extern const double NaN; //!< Stored representation of NaN
+
+/**
+ * \brief true if x is NaN
+ * \param x
+ * \return whether x is NaN
+ */
 inline bool isNaN (double x) { return x != x; }
 
 class DataOutputCallback;
 
+/**
+ * \ingroup stats
+ * \class StatisticalSummary
+ * \brief Abstract class for calculating statistical data 
+ *
+ */
 class StatisticalSummary {
 public:
   /**
@@ -40,81 +52,130 @@
   {
   }
   /**
-   * Returns the number of the observations.
+   * Returns the number of observations.
+   * \return Number of observations
    */
   virtual long getCount () const = 0;
 
   /**
-   * Returns the sum of the values.
+   * \return Sum of values
    * @see getWeightedSum()
    */
   virtual double getSum () const = 0;
 
   /**
-   * Returns the sum of the squared values.
+   * \return Sum of squared values
    * @see getWeightedSqrSum()
    */
   virtual double getSqrSum () const = 0;
 
   /**
    * Returns the minimum of the values.
+   * \return Minimum of values
    */
   virtual double getMin () const = 0;
 
   /**
    * Returns the maximum of the values.
+   * \return Maximum of values
    */
   virtual double getMax () const = 0;
 
   /**
    * Returns the mean of the (weighted) observations.
+   * \return Mean of (weighted) observations
    */
   virtual double getMean () const = 0;
 
   /**
    * Returns the standard deviation of the (weighted) observations.
+   * \return Standard deviation of (weighted) observations
    */
   virtual double getStddev () const = 0;
 
   /**
    * Returns the variance of the (weighted) observations.
+   * \return Variance of (weighted) observations
    */
   virtual double getVariance () const = 0;
 };
 
 //------------------------------------------------------------
 //--------------------------------------------
+/**
+ * \ingroup stats
+ * \class DataCalculator
+ * \brief Calculates data during a simulation
+ *
+ */
 class DataCalculator : public Object {
 public:
   DataCalculator();
   virtual ~DataCalculator();
 
+  /**
+   * Returns whether the DataCalculator is enabled
+   * \return true if DataCalculator is enabled
+   */
   bool GetEnabled () const;
+  /**
+   * Enables DataCalculator when simulation starts
+   */
   void Enable ();
+  /**
+   * Disables DataCalculator when simulation stops
+   */
   void Disable ();
-
+  /**
+   * Sets the DataCalculator key to the provided key
+   * \param key Key value as a string
+   */
   void SetKey (const std::string key);
+  /**
+   * Gets the DataCalculator key
+   * \return Key value as a string
+   */
   std::string GetKey () const;
 
+  /**
+   * Sets the DataCalculator context to the provided context
+   * \param context Context value as a string
+   */
   void SetContext (const std::string context);
+  /**
+   * Gets the DataCalculator context
+   * \return Context value as a string
+   */
   std::string GetContext () const;
 
+  /**
+   * Starts DataCalculator at a given time in the simulation
+   * \param startTime
+   */
   virtual void Start (const Time& startTime);
+  /**
+   * Stops DataCalculator at a given time in the simulation
+   * \param stopTime
+   */
   virtual void Stop (const Time& stopTime);
 
+  /**
+   * Outputs data based on the provided callback
+   * \param callback
+   */
   virtual void Output (DataOutputCallback &callback) const = 0;
 
 protected:
-  bool m_enabled;    // Descendant classes *must* check & respect m_enabled!
+  bool m_enabled;    //!< Descendant classes *must* check & respect m_enabled!
 
-  std::string m_key;
-  std::string m_context;
+  std::string m_key;      //!< Key value
+  std::string m_context;  //!< Context value
 
   virtual void DoDispose (void);
 
 private:
-  EventId m_startEvent;
-  EventId m_stopEvent;
+  EventId m_startEvent; //!< Start event
+  EventId m_stopEvent;  //!< Stop event
 
   // end class DataCalculator
 };
diff -Naur ns-3.18.1/src/stats/model/data-collection-object.cc ns-3.19/src/stats/model/data-collection-object.cc
--- ns-3.18.1/src/stats/model/data-collection-object.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/data-collection-object.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (DataCollectionObject);
+NS_OBJECT_ENSURE_REGISTERED (DataCollectionObject)
+  ;
 
 TypeId
 DataCollectionObject::GetTypeId (void)
diff -Naur ns-3.18.1/src/stats/model/data-collection-object.h ns-3.19/src/stats/model/data-collection-object.h
--- ns-3.18.1/src/stats/model/data-collection-object.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/data-collection-object.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,6 +27,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup aggregator
+ *
  * Base class for data collection framework objects.
  *
  * All data collection objects have 1) a string name, and 2) enabled
@@ -35,6 +37,10 @@
 class DataCollectionObject : public Object
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
 
   DataCollectionObject ();
@@ -42,6 +48,7 @@
 
   /// Set the status of an individual object.
   void Enable (void);
+  /// Unset the status of an individual object.
   void Disable (void);
 
   /// Check the status of an individual object.
diff -Naur ns-3.18.1/src/stats/model/data-collector.h ns-3.19/src/stats/model/data-collector.h
--- ns-3.18.1/src/stats/model/data-collector.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/data-collector.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,60 +28,126 @@
 
 namespace ns3 {
 
-/**
- * \ingroup stats
- *
- */
 class DataCalculator;
 
 //------------------------------------------------------------
 //--------------------------------------------
+/**
+ * List of Ptrs to DataCalculator objects
+ */
 typedef std::list<Ptr<DataCalculator> > DataCalculatorList;
+/**
+ * List of pairs of strings representing metadata
+ */
 typedef std::list<std::pair<std::string, std::string> > MetadataList;
 
 /**
- * \ingroup stats
- *
+ * \ingroup dataoutput
+ * \class DataCollector
+ * \brief Collects data 
  */
 class DataCollector : public Object {
 public:
   DataCollector();
   virtual ~DataCollector();
 
+  /**
+   * Provide specific parameters to the DataCollector
+   * \param experiment Label for the experiment
+   * \param strategy Label for the strategy
+   * \param input Label for the input
+   * \param runID Label for the runID
+   * \param description Description
+   */
   void DescribeRun (std::string experiment,
                     std::string strategy,
                     std::string input,
                     std::string runID,
                     std::string description = "");
 
+  /**
+   * Return the experiment label
+   * \return Experiment label
+   */
   std::string GetExperimentLabel () const { return m_experimentLabel; }
+  /**
+   * Return the strategy label
+   * \return Strategy label
+   */
   std::string GetStrategyLabel () const { return m_strategyLabel; }
+  /**
+   * Return the input label
+   * \return Input label
+   */
   std::string GetInputLabel () const { return m_inputLabel; }
+  /**
+   * Return the runID label
+   * \return Run label
+   */
   std::string GetRunLabel () const { return m_runLabel; }
+  /**
+   * Return the description label
+   * \return Description label
+   */
   std::string GetDescription () const { return m_description; }
 
+  /**
+   * Add the key and the value as a pair of strings to the metadata list
+   * \param key Key value to include
+   * \param value Value to include of type string
+   */
   void AddMetadata (std::string key, std::string value);
+  /**
+   * Add the key and the value as a pair of strings to the metadata list
+   * \param key Key value to include
+   * \param value Value to include of type double
+   */
   void AddMetadata (std::string key, double value);
+  /**
+   * Add the key and the value as a pair of strings to the metadata list
+   * \param key Key value to include
+   * \param value Value to include of type uint32_t
+   */
   void AddMetadata (std::string key, uint32_t value);
+  /**
+   * Returns an iterator to the beginning of the metadata list
+   * \return Iterator pointing to the first value of the metadata list
+   */
   MetadataList::iterator MetadataBegin ();
+  /**
+   * Returns an iterator to the past-the-end of the metadata list
+   * \return Iterator pointing to the past-the-end element of the metadata list
+   */
   MetadataList::iterator MetadataEnd ();
 
+  /**
+   * Add a DataCalculator object to the DataCollector
+   * \param datac DataCalculator object to be added
+   */
   void AddDataCalculator (Ptr<DataCalculator> datac);
+  /**
+   * Returns an iterator to the beginning of the DataCalculator list
+   * \return Iterator pointing to the first value of the DataCalculator list
+   */
   DataCalculatorList::iterator DataCalculatorBegin ();
+  /**
+   * Returns an iterator to the past-the-end of the DataCalculator list
+   * \return Iterator pointing to the past-the-end element of the DataCalculator list
+   */
   DataCalculatorList::iterator DataCalculatorEnd ();
 
 protected:
   virtual void DoDispose ();
 
 private:
-  std::string m_experimentLabel;
-  std::string m_strategyLabel;
-  std::string m_inputLabel;
-  std::string m_runLabel;
-  std::string m_description;
+  std::string m_experimentLabel; //!< Experiment label
+  std::string m_strategyLabel;   //!< Strategy label
+  std::string m_inputLabel;      //!< Input label
+  std::string m_runLabel;        //!< Run label
+  std::string m_description;     //!< Description label
 
-  MetadataList m_metadata;
-  DataCalculatorList m_calcList;
+  MetadataList m_metadata;       //!< List of experiment metadata
+  DataCalculatorList m_calcList; //!< List of data calculators
 
   // end class DataCollector
 };
diff -Naur ns-3.18.1/src/stats/model/data-output-interface.h ns-3.19/src/stats/model/data-output-interface.h
--- ns-3.18.1/src/stats/model/data-output-interface.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/data-output-interface.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,55 +32,109 @@
 //------------------------------------------------------------
 //--------------------------------------------
 /**
- * \ingroup stats
+ * \ingroup dataoutput
  *
- */
+ * \brief Abstract Data Output Interface class
+s */
 class DataOutputInterface : public Object {
 public:
   DataOutputInterface();
   virtual ~DataOutputInterface();
 
+  /**
+   * Outputs information from the provided DataCollector
+   * \param dc DataCollector object
+   */
   virtual void Output (DataCollector &dc) = 0;
 
+  /**
+   * Sets the DataOutputInterface prefix to the provided prefix
+   * \param prefix prefix as a string
+   */
   void SetFilePrefix (const std::string prefix);
+  /**
+   * Gets the file prefix of the DataOutputInterface
+   * \return File prefix as a string
+   */
   std::string GetFilePrefix () const;
 
 protected:
   virtual void DoDispose ();
 
-  std::string m_filePrefix;
+  std::string m_filePrefix; //!< File prefix for the DataOutputInterface
 
   // end class DataOutputInterface
 };
 
 /**
- * \ingroup stats
+ * \ingroup dataoutput
+ *
+ * \brief Callback class for the DataOutput classes
  *
  */
 class DataOutputCallback {
 public:
+  /**
+   * Destructor
+   */
   virtual ~DataOutputCallback() {}
 
+  /**
+   * Outputs the data from the specified StatisticalSummary
+   * \param key Key value of a DataCalculator
+   * \param variable Name of the variable for which statistics are being provided
+   * \param statSum Pointer to a StatisticalSummary object
+   */
   virtual void OutputStatistic (std::string key,
                                 std::string variable,
                                 const StatisticalSummary *statSum) = 0;
 
+  /**
+   * Associates the integer value with the variable name for a specific output format
+   * \param key Key value of a DataCalculator
+   * \param variable Name of the variable for which statistics are being provided
+   * \param val Value to be stored
+   */
   virtual void OutputSingleton (std::string key,
                                 std::string variable,
                                 int val) = 0;
 
+  /**
+   * Associates the uint32_t value with the variable name for a specific output format
+   * \param key Key value of a DataCalculator
+   * \param variable Name of the variable for which statistics are being provided
+   * \param val Value to be stored
+   */
   virtual void OutputSingleton (std::string key,
                                 std::string variable,
                                 uint32_t val) = 0;
 
+  /**
+   * Associates the double value with the variable name for a specific output format
+   * \param key Key value of a DataCalculator
+   * \param variable Name of the variable for which statistics are being provided
+   * \param val Value to be stored
+   */
   virtual void OutputSingleton (std::string key,
                                 std::string variable,
                                 double val) = 0;
 
+  /**
+   * Associates the string value with the variable name for a specific output format
+   * \param key Key value of a DataCalculator
+   * \param variable Name of the variable for which statistics are being provided
+   * \param val Value to be stored
+   */
   virtual void OutputSingleton (std::string key,
                                 std::string variable,
                                 std::string val) = 0;
 
+  /**
+   * Associates the Time value with the variable name for a specific output format
+   * \param key Key value of a DataCalculator
+   * \param variable Name of the variable for which statistics are being provided
+   * \param val Value to be stored
+   */
   virtual void OutputSingleton (std::string key,
                                 std::string variable,
                                 Time val) = 0;
diff -Naur ns-3.18.1/src/stats/model/double-probe.cc ns-3.19/src/stats/model/double-probe.cc
--- ns-3.18.1/src/stats/model/double-probe.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/double-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (DoubleProbe);
+NS_OBJECT_ENSURE_REGISTERED (DoubleProbe)
+  ;
 
 TypeId
 DoubleProbe::GetTypeId ()
diff -Naur ns-3.18.1/src/stats/model/double-probe.h ns-3.19/src/stats/model/double-probe.h
--- ns-3.18.1/src/stats/model/double-probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/double-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,6 +34,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup probes
+ *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * a double.  This probe exports a trace source "Output" of type double.
  * The Output trace source emits a value when either the trace source
@@ -45,6 +47,10 @@
 class DoubleProbe : public Probe
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   DoubleProbe ();
   virtual ~DoubleProbe ();
@@ -92,12 +98,10 @@
    *
    * \param oldData previous value of the double
    * \param newData new value of the double
-   *
-   * \internal
    */
   void TraceSink (double oldData, double newData);
 
-  TracedValue<double> m_output;
+  TracedValue<double> m_output; //!< Output trace source.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/stats/model/file-aggregator.cc ns-3.19/src/stats/model/file-aggregator.cc
--- ns-3.18.1/src/stats/model/file-aggregator.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/file-aggregator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,9 +28,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("FileAggregator");
+NS_LOG_COMPONENT_DEFINE ("FileAggregator")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (FileAggregator);
+NS_OBJECT_ENSURE_REGISTERED (FileAggregator)
+  ;
 
 TypeId
 FileAggregator::GetTypeId ()
diff -Naur ns-3.18.1/src/stats/model/file-aggregator.h ns-3.19/src/stats/model/file-aggregator.h
--- ns-3.18.1/src/stats/model/file-aggregator.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/file-aggregator.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup aggregator
+ *
  * This aggregator sends values it receives to a file.
  **/
 class FileAggregator : public DataCollectionObject
@@ -46,6 +48,10 @@
     TAB_SEPARATED
   };
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
 
   /**
@@ -364,17 +370,16 @@
   /// Heading line for the outputfile.
   std::string m_heading;
 
-  /// Format strings for C-style sprintf() function.
-  std::string m_1dFormat;
-  std::string m_2dFormat;
-  std::string m_3dFormat;
-  std::string m_4dFormat;
-  std::string m_5dFormat;
-  std::string m_6dFormat;
-  std::string m_7dFormat;
-  std::string m_8dFormat;
-  std::string m_9dFormat;
-  std::string m_10dFormat;
+  std::string m_1dFormat;  //!< Format string for 1D C-style sprintf() function.
+  std::string m_2dFormat;  //!< Format string for 2D C-style sprintf() function.
+  std::string m_3dFormat;  //!< Format string for 3D C-style sprintf() function.
+  std::string m_4dFormat;  //!< Format string for 4D C-style sprintf() function.
+  std::string m_5dFormat;  //!< Format string for 5D C-style sprintf() function.
+  std::string m_6dFormat;  //!< Format string for 6D C-style sprintf() function.
+  std::string m_7dFormat;  //!< Format string for 7D C-style sprintf() function.
+  std::string m_8dFormat;  //!< Format string for 8D C-style sprintf() function.
+  std::string m_9dFormat;  //!< Format string for 9D C-style sprintf() function.
+  std::string m_10dFormat; //!< Format string for 10D C-style sprintf() function.
 
 }; // class FileAggregator
 
diff -Naur ns-3.18.1/src/stats/model/get-wildcard-matches.h ns-3.19/src/stats/model/get-wildcard-matches.h
--- ns-3.18.1/src/stats/model/get-wildcard-matches.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/get-wildcard-matches.h	2013-12-20 09:44:50.000000000 -0800
@@ -30,6 +30,7 @@
  * \param matchedPath the path that matched the Config path.
  * \param wildcardSeparator the text to put betwen the wildcard
  * matches.  By default, a space is used.
+ * \return String value of text matches
  *
  * \brief Returns the text matches from the matched path for each of
  * the wildcards in the Config path, separated by the wild card
diff -Naur ns-3.18.1/src/stats/model/gnuplot-aggregator.cc ns-3.19/src/stats/model/gnuplot-aggregator.cc
--- ns-3.18.1/src/stats/model/gnuplot-aggregator.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/gnuplot-aggregator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,8 +28,10 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("GnuplotAggregator");
-NS_OBJECT_ENSURE_REGISTERED (GnuplotAggregator);
+NS_LOG_COMPONENT_DEFINE ("GnuplotAggregator")
+  ;
+NS_OBJECT_ENSURE_REGISTERED (GnuplotAggregator)
+  ;
 
 TypeId
 GnuplotAggregator::GetTypeId ()
diff -Naur ns-3.18.1/src/stats/model/gnuplot-aggregator.h ns-3.19/src/stats/model/gnuplot-aggregator.h
--- ns-3.18.1/src/stats/model/gnuplot-aggregator.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/gnuplot-aggregator.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,7 @@
 namespace ns3 {
 
 /**
+ * \ingroup aggregator
  * This aggregator produces output used to make gnuplot plots.
  **/
 class GnuplotAggregator : public DataCollectionObject
@@ -46,6 +47,10 @@
     KEY_BELOW
   };
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
 
   /**
diff -Naur ns-3.18.1/src/stats/model/gnuplot.cc ns-3.19/src/stats/model/gnuplot.cc
--- ns-3.18.1/src/stats/model/gnuplot.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/gnuplot.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,17 +27,24 @@
 
 // --- GnuplotDataset::Data ------------------------------------------------ //
 
+/**
+ * \ingroup gnuplot
+ *
+ * Structure storing the data to plot.
+ * Derived classes subclass this struct and add their own data fields.
+ */
 struct GnuplotDataset::Data
 {
   // *** Data Variables ***
 
-  unsigned int m_references;
+  unsigned int m_references; //!< ref/unref counter for garbage collection
 
-  std::string m_title;
-  std::string m_extra;
+  std::string m_title; //!< Dataset title
+  std::string m_extra; //!< Extra parameters for the plot
 
   /**
    * Initializes the reference counter to 1 and sets m_title and m_extra.
+   * \param title Dataset title
    */
   Data(const std::string& title);
 
@@ -45,7 +52,8 @@
   virtual ~Data();
 
   /**
-   * Returns "plot" or "splot".
+   * \brief Returns the plot type ("plot" or "splot").
+   * \returns the plot type ("plot" or "splot").
    */
   virtual std::string GetCommand () const = 0;
 
@@ -57,6 +65,11 @@
    * If more than one output file is being generated, i.e. separate
    * data and control files, then the index for the current dataset
    * and the name for the data file are also included.
+   *
+   * \param os Output stream
+   * \param generateOneOutputFile If true, generate only one output file.
+   * \param dataFileDatasetIndex Dataset Index
+   * \param dataFileName Dataset file name
    */
   virtual void PrintExpression (std::ostream &os,
                                 bool generateOneOutputFile,
@@ -66,6 +79,9 @@
   /**
    * Print the inline data file contents trailing the plot command. Empty for
    * functions.
+   *
+   * \param os Output stream
+   * \param generateOneOutputFile If true, generate only one output file.
    */
   virtual void PrintDataFile (std::ostream &os, bool generateOneOutputFile) const = 0;
 
@@ -140,17 +156,23 @@
 
 // --- Gnuplot2dDataset::Data2d -------------------------------------------- //
 
+/**
+ * \ingroup gnuplot
+ *
+ * Structure storing the data to for a 2D plot.
+ */
 struct Gnuplot2dDataset::Data2d : public GnuplotDataset::Data
 {
   // *** Data Variables ***
 
-  enum Style  m_style;
-  enum ErrorBars m_errorBars;
+  enum Style  m_style; //!< The plotting style to use for this dataset.
+  enum ErrorBars m_errorBars; //!< Whether errorbars should be used for this dataset.
 
-  PointSet    m_pointset;
+  PointSet    m_pointset; //!< The set of points in this data set
 
   /**
    * Initializes with the values from m_defaultStyle and m_defaultErrorBars.
+   * \param title Dataset title
    */
   Data2d(const std::string& title);
 
@@ -386,14 +408,22 @@
 
 // --- Gnuplot2dFunction::Function2d --------------------------------------- //
 
+/**
+ * \ingroup gnuplot
+ *
+ * Structure storing the function to be used for a 2D plot.
+ */
 struct Gnuplot2dFunction::Function2d : public GnuplotDataset::Data
 {
   // *** Data Variables ***
 
-  std::string m_function;
+  std::string m_function; //!< Function to use
 
   /**
    * Initializes with the function and title.
+   *
+   * \param title Title of the plot
+   * \param function Function to plot
    */
   Function2d(const std::string& title, const std::string& function);
 
@@ -459,16 +489,22 @@
 
 // --- Gnuplot3dDataset::Data3d -------------------------------------------- //
 
+/**
+ * \ingroup gnuplot
+ *
+ * Structure storing the data for a 3D plot.
+ */
 struct Gnuplot3dDataset::Data3d : public GnuplotDataset::Data
 {
   // *** Data Variables ***
 
-  std::string   m_style;
+  std::string   m_style; //!< The plotting style to use for this dataset.
 
-  PointSet      m_pointset;
+  PointSet      m_pointset; //!< The set of points in this data set
 
   /**
    * Initializes with value from m_defaultStyle.
+   * \param title Dataset title
    */
   Data3d(const std::string& title);
 
@@ -574,14 +610,22 @@
 
 // --- Gnuplot3dFunction::Function3d --------------------------------------- //
 
+/**
+ * \ingroup gnuplot
+ *
+ * Structure storing the function to be used for a 3D plot.
+ */
 struct Gnuplot3dFunction::Function3d : public GnuplotDataset::Data
 {
   // *** Data Variables ***
 
-  std::string m_function;
+  std::string m_function; //!< Function to use
 
   /**
    * Initializes with the function and title.
+   *
+   * \param title Title of the plot
+   * \param function Function to plot
    */
   Function3d(const std::string& title, const std::string& function);
 
diff -Naur ns-3.18.1/src/stats/model/gnuplot.h ns-3.19/src/stats/model/gnuplot.h
--- ns-3.18.1/src/stats/model/gnuplot.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/gnuplot.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,7 @@
 namespace ns3 {
 
 /**
- * \ingroup tools
+ * \ingroup gnuplot
  *
  * \brief Abstract class to store a plot line to be used by ns3::Gnuplot.
  *
@@ -41,6 +41,7 @@
 
   /**
    * Reference-counting copy constructor.
+   * \param original Original GnuPlotDataset
    */
   GnuplotDataset (const GnuplotDataset& original);
 
@@ -51,6 +52,8 @@
 
   /**
    * Reference-counting assignment operator.
+   * \param original Right-hand side of assignment operator
+   * \return Copy of original GnuplotDataset
    */
   GnuplotDataset& operator= (const GnuplotDataset& original);
 
@@ -101,6 +104,9 @@
 };
 
 /**
+ * \ingroup gnuplot
+ *
+ * \class Gnuplot2dDataset
  * \brief Class to represent a 2D points plot. Set the line or points style
  * using SetStyle() and set points using Add().
  */
@@ -201,24 +207,30 @@
 
 private:
 
+  /**
+   * A point in a 2D plot
+   */
   struct Point {
-    bool empty;
-    double x;
-    double y;
-    double dx;
-    double dy;
+    bool empty; //!< the point is empty
+    double x; //!< X coordinate
+    double y; //!< Y coordinate
+    double dx; //!< X error delta
+    double dy; //!< Y error delta
   };
 
+  /// The set of points in the dataset
   typedef std::vector<struct Point> PointSet;
 
-  static enum Style m_defaultStyle;
-  static enum ErrorBars m_defaultErrorBars;
+  static enum Style m_defaultStyle; //!< default plot style
+  static enum ErrorBars m_defaultErrorBars;  //!< default error bars type
 
   /// Forward declaration of the internal data class.
   struct Data2d;
 };
 
 /**
+ * \ingroup gnuplot
+ *
  * \brief Class to represent a 2D function expression plot.
  *
  * Since the function expression is not escaped, styles and extras could just
@@ -248,6 +260,8 @@
 };
 
 /**
+ * \ingroup gnuplot
+ *
  * \brief Class to represent a 3D points plot. Set the line or points style
  * using SetStyle() and set points using Add().
  */
@@ -290,20 +304,28 @@
 
 private:
 
+  /**
+   * A point in a 3D plot
+   */
   struct Point {
-    bool empty;
-    double x, y, z;
+    bool empty; //!< the point is empty
+    double x; //!< X coordinate
+    double y; //!< Y coordinate
+    double z; //!< Z coordinate
   };
 
+  /// The set of points in the dataset
   typedef std::vector<struct Point> PointSet;
 
-  static std::string m_defaultStyle;
+  static std::string m_defaultStyle; //!< default plot style
 
   /// Forward declaration of the internal data class.
   struct Data3d;
 };
 
 /**
+ * \ingroup gnuplot
+ *
  * \brief Class to represent a 3D function expression plot.
  *
  * Since the function expression is not escaped, styles and extras could just as
@@ -334,6 +356,8 @@
 };
 
 /**
+ * \ingroup gnuplot
+ *
  * \brief a simple class to generate gnuplot-ready plotting commands
  *        from a set of datasets.
  *
@@ -361,7 +385,8 @@
   /**
    * Crude attempt to auto-detect the correct terminal setting by inspecting
    * the filename's extension.
-   * \param filename output file name
+   * \param filename output filename
+   * \return File extension of the provided filename
    */
   static std::string DetectTerminal (const std::string& filename);
 
@@ -431,24 +456,27 @@
   void SetDataFileDatasetIndex (unsigned int index);
 
 private:
+  /// Type for Datasets to be used in plots
   typedef std::vector<GnuplotDataset> Datasets;
 
-  std::string m_outputFilename;
-  std::string m_terminal;
+  std::string m_outputFilename; //!< Output file name
+  std::string m_terminal; //!< Gnuplot "terminal" to use
 
-  Datasets m_datasets;
+  Datasets m_datasets; //!< Data sets
 
-  std::string m_title;
-  std::string m_xLegend;
-  std::string m_yLegend;
-  std::string m_extra;
+  std::string m_title; //!< Plot title
+  std::string m_xLegend; //!< X axis legend
+  std::string m_yLegend; //!< Y axis legend
+  std::string m_extra; //!< extra parameters for the plot
 
-  bool m_generateOneOutputFile;
+  bool m_generateOneOutputFile; //!< true if only one plot will be generated
 
-  unsigned int m_dataFileDatasetIndex;
+  unsigned int m_dataFileDatasetIndex; //!< Data set index to plot
 };
 
 /**
+ * \ingroup gnuplot
+ *
  * \brief a simple class to group together multiple gnuplots into one file,
  * e.g. for PDF multi-page output terminals.
  */
@@ -500,12 +528,13 @@
                        std::string dataFileName);
 
 private:
+  /// Type of the Gnuplot collection
   typedef std::vector<Gnuplot> Plots;
 
-  std::string m_outputFilename;
-  std::string m_terminal;
+  std::string m_outputFilename; //!< Output file name
+  std::string m_terminal; //!< Gnuplot "terminal" to use
 
-  Plots       m_plots;
+  Plots       m_plots; //!< Plots in the collection
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/stats/model/omnet-data-output.h ns-3.19/src/stats/model/omnet-data-output.h
--- ns-3.18.1/src/stats/model/omnet-data-output.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/omnet-data-output.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,9 @@
 //------------------------------------------------------------
 //--------------------------------------------
 /**
- * \ingroup stats
+ * \ingroup dataoutput
+ * \class OmnetDataOutput
+ * \brief Outputs data in a format compatible with OMNeT library and framework
  *
  */
 class OmnetDataOutput : public DataOutputInterface {
@@ -45,36 +47,81 @@
   virtual void DoDispose ();
 
 private:
+  /**
+   * \ingroup dataoutput
+   *
+   * \brief Class to generate OMNeT output
+   */
   class OmnetOutputCallback : public DataOutputCallback {
 public:
+    /**
+     * Constructor
+     * \param scalar the output stream
+     */
     OmnetOutputCallback(std::ostream *scalar);
 
+    /**
+     * \brief Generates data statistics
+     * \param context the output context
+     * \param name the output name
+     * \param statSum the stats to print
+     */
     void OutputStatistic (std::string context,
                           std::string name,
                           const StatisticalSummary *statSum);
 
+    /**
+     * \brief Generates a single data output
+     * \param context the output context
+     * \param name the output name
+     * \param val the value
+     */
     void OutputSingleton (std::string context,
                           std::string name,
                           int val);
 
+    /**
+     * \brief Generates a single data output
+     * \param context the output context
+     * \param name the output name
+     * \param val the value
+     */
     void OutputSingleton (std::string context,
                           std::string name,
                           uint32_t val);
 
+    /**
+     * \brief Generates a single data output
+     * \param context the output context
+     * \param name the output name
+     * \param val the value
+     */
     void OutputSingleton (std::string context,
                           std::string name,
                           double val);
 
+    /**
+     * \brief Generates a single data output
+     * \param context the output context
+     * \param name the output name
+     * \param val the value
+     */
     void OutputSingleton (std::string context,
                           std::string name,
                           std::string val);
 
+    /**
+     * \brief Generates a single data output
+     * \param context the output context
+     * \param name the output name
+     * \param val the value
+     */
     void OutputSingleton (std::string context,
                           std::string name,
                           Time val);
 
 private:
-    std::ostream *m_scalar;
+    std::ostream *m_scalar; //!< output stream
     // end class OmnetOutputCallback
   };
 
diff -Naur ns-3.18.1/src/stats/model/probe.cc ns-3.19/src/stats/model/probe.cc
--- ns-3.18.1/src/stats/model/probe.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Probe);
+NS_OBJECT_ENSURE_REGISTERED (Probe)
+  ;
 
 TypeId
 Probe::GetTypeId ()
diff -Naur ns-3.18.1/src/stats/model/probe.h ns-3.19/src/stats/model/probe.h
--- ns-3.18.1/src/stats/model/probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,6 +28,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup probes
+ *
  * Base class for probes.
  *
  * This class provides general functionality to control each
@@ -37,6 +39,10 @@
 class Probe : public DataCollectionObject
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   Probe ();
   virtual ~Probe ();
diff -Naur ns-3.18.1/src/stats/model/sqlite-data-output.h ns-3.19/src/stats/model/sqlite-data-output.h
--- ns-3.18.1/src/stats/model/sqlite-data-output.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/sqlite-data-output.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,8 +34,9 @@
 //------------------------------------------------------------
 //--------------------------------------------
 /**
- * \ingroup stats
- *
+ * \ingroup dataoutput
+ * \class SqliteDataOutput
+ * \brief Outputs data in a format compatible with SQLite
  */
 class SqliteDataOutput : public DataOutputInterface {
 public:
@@ -48,43 +49,95 @@
   virtual void DoDispose ();
 
 private:
+  /**
+   * \ingroup dataoutput
+   *
+   * \brief Class to generate OMNeT output
+   */
   class SqliteOutputCallback : public DataOutputCallback {
 public:
+    /**
+     * Constructor
+     * \param owner pointer to the instance this object belongs to
+     * \param run experiment descriptor
+     */
     SqliteOutputCallback(Ptr<SqliteDataOutput> owner, std::string run);
 
+    /**
+     * \brief Generates data statistics
+     * \param key the SQL key to use
+     * \param variable the variable name
+     * \param statSum the stats to print
+     */
     void OutputStatistic (std::string key,
                           std::string variable,
                           const StatisticalSummary *statSum);
 
+    /**
+     * \brief Generates a single data output
+     * \param key the SQL key to use
+     * \param variable the variable name
+     * \param val the value
+     */
     void OutputSingleton (std::string key,
                           std::string variable,
                           int val);
 
+    /**
+     * \brief Generates a single data output
+     * \param key the SQL key to use
+     * \param variable the variable name
+     * \param val the value
+     */
     void OutputSingleton (std::string key,
                           std::string variable,
                           uint32_t val);
 
+    /**
+     * \brief Generates a single data output
+     * \param key the SQL key to use
+     * \param variable the variable name
+     * \param val the value
+     */
     void OutputSingleton (std::string key,
                           std::string variable,
                           double val);
 
+    /**
+     * \brief Generates a single data output
+     * \param key the SQL key to use
+     * \param variable the variable name
+     * \param val the value
+     */
     void OutputSingleton (std::string key,
                           std::string variable,
                           std::string val);
 
+    /**
+     * \brief Generates a single data output
+     * \param key the SQL key to use
+     * \param variable the variable name
+     * \param val the value
+     */
     void OutputSingleton (std::string key,
                           std::string variable,
                           Time val);
 
 private:
-    Ptr<SqliteDataOutput> m_owner;
-    std::string m_runLabel;
+    Ptr<SqliteDataOutput> m_owner; //!< the instance this object belongs to
+    std::string m_runLabel; //!< Run label
 
     // end class SqliteOutputCallback
   };
 
 
-  sqlite3 *m_db;
+  sqlite3 *m_db; //!< pointer to the SQL database
+
+  /**
+   * \brief Execute a sqlite3 query
+   * \param exe the query to execute
+   * \return sqlite return code.
+   */
   int Exec (std::string exe);
 
   // end class SqliteDataOutput
diff -Naur ns-3.18.1/src/stats/model/stats.h ns-3.19/src/stats/model/stats.h
--- ns-3.18.1/src/stats/model/stats.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/stats/model/stats.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,78 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Universita' di Firenze
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tommaso Pecorella <tommaso.pecorella@unifi.it>
+ */
+
+#ifndef STATS_H
+#define STATS_H
+
+// Header file used only to define the stats group in Doxygen
+
+/**
+ * \defgroup stats Statistics
+ *
+ * The statistics module includes some useful features to ease data collection from experiments.
+ * In particular the following features are included:
+ * <ul>
+ * <li> The core framework and two basic data collectors: A counter, and a min/max/avg/total observer.</li>
+ * <li> Extensions of those to easily work with times and packets.</li>
+ * <li> Plaintext output formatted for OMNet++.</li>
+ * <li> Database output using SQLite, a standalone, lightweight, high performance SQL engine.</li>
+ * <li> Mandatory and open ended metadata for describing and working with runs.</li>
+ * </ul>
+ *
+ * See the manual for a complete documentation.
+ */
+
+/**
+ * \ingroup stats
+ * \defgroup aggregator Data Aggregators
+ *
+ * Data aggregators are classes used to collect data and produce output
+ * specialized for various purpose, e.g., Gnuplot, file output, etc.
+ */
+
+/**
+ * \ingroup stats
+ * \defgroup probes Probes
+ *
+ * Probes are used to probe an underlying ns3 TraceSource exporting
+ * its value.  This probe usually exports a trace source "Output".
+ * The Output trace source emits a value when either the trace source
+ * emits a new value, or when SetValue () is called.
+ *
+ * Probes are a special kind of Trace Source.
+ */
+
+/**
+ * \ingroup stats
+ * \defgroup gnuplot Gnuplot
+ *
+ * Classes in Gnuplot group are used to collect and prepare and output data
+ * for subsequent processing by Gnuplot.
+ */
+
+/**
+ * \ingroup stats
+ * \defgroup dataoutput Data Output
+ *
+ * Classes in Data Output group are used to collect and prepare and output data
+ * for subsequent ouput in a specific format, e.g., Omnet++, SQLite, etc.
+ */
+
+#endif /* STATS_H */
diff -Naur ns-3.18.1/src/stats/model/time-data-calculators.h ns-3.19/src/stats/model/time-data-calculators.h
--- ns-3.18.1/src/stats/model/time-data-calculators.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/time-data-calculators.h	2013-12-20 09:44:50.000000000 -0800
@@ -44,15 +44,25 @@
   TimeMinMaxAvgTotalCalculator();
   virtual ~TimeMinMaxAvgTotalCalculator();
 
+  /**
+   * Updates all variables of TimeMinMaxAvgTotalCalculator
+   * \param i value of type Time to use for updating the calculator
+   */
   void Update (const Time i);
 
+  /**
+   * Outputs data based on the provided callback
+   * \param callback
+   */
   virtual void Output (DataOutputCallback &callback) const;
 
 protected:
   virtual void DoDispose (void);
 
-  uint32_t m_count;
-  Time m_total, m_min, m_max;
+  uint32_t m_count; //!< Count value of TimeMinMaxAvgTotalCalculator
+  Time m_total;     //!< Total value of TimeMinMaxAvgTotalCalculator
+  Time m_min;       //!< Minimum value of TimeMinMaxAvgTotalCalculator
+  Time m_max;       //!< Maximum value of TimeMinMaxAvgTotalCalculator
 
   // end class TimeMinMaxAvgTotalCalculator
 };
diff -Naur ns-3.18.1/src/stats/model/time-series-adaptor.cc ns-3.19/src/stats/model/time-series-adaptor.cc
--- ns-3.18.1/src/stats/model/time-series-adaptor.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/time-series-adaptor.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (TimeSeriesAdaptor);
+NS_OBJECT_ENSURE_REGISTERED (TimeSeriesAdaptor)
+  ;
 
 TypeId
 TimeSeriesAdaptor::GetTypeId (void)
diff -Naur ns-3.18.1/src/stats/model/time-series-adaptor.h ns-3.19/src/stats/model/time-series-adaptor.h
--- ns-3.18.1/src/stats/model/time-series-adaptor.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/time-series-adaptor.h	2013-12-20 09:44:50.000000000 -0800
@@ -29,6 +29,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup aggregator
+ *
  * \brief Takes probed values of different types and outputs the
  * current time plus the value with both converted to doubles.
  *
@@ -46,6 +48,10 @@
 class TimeSeriesAdaptor : public DataCollectionObject
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   TimeSeriesAdaptor ();
@@ -107,7 +113,7 @@
   void TraceSinkUinteger32 (uint32_t oldData, uint32_t newData);
 
 private:
-  TracedCallback<double, double> m_output;
+  TracedCallback<double, double> m_output; //!< output trace
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/stats/model/uinteger-16-probe.cc ns-3.19/src/stats/model/uinteger-16-probe.cc
--- ns-3.18.1/src/stats/model/uinteger-16-probe.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/uinteger-16-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Uinteger16Probe);
+NS_OBJECT_ENSURE_REGISTERED (Uinteger16Probe)
+  ;
 
 TypeId
 Uinteger16Probe::GetTypeId ()
diff -Naur ns-3.18.1/src/stats/model/uinteger-16-probe.h ns-3.19/src/stats/model/uinteger-16-probe.h
--- ns-3.18.1/src/stats/model/uinteger-16-probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/uinteger-16-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,6 +31,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup probes
+ *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * an uint16_t.  This probe exports a trace source "Output" of type uint16_t.
  * The Output trace source emits a value when either the trace source
@@ -41,6 +43,10 @@
 class Uinteger16Probe : public Probe
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   Uinteger16Probe ();
   virtual ~Uinteger16Probe ();
@@ -88,12 +94,10 @@
    *
    * \param oldData previous value of the uint16_t
    * \param newData new value of the uint16_t
-   *
-   * \internal
    */
   void TraceSink (uint16_t oldData, uint16_t newData);
 
-  TracedValue<uint16_t> m_output;
+  TracedValue<uint16_t> m_output; //!< Output trace source.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/stats/model/uinteger-32-probe.cc ns-3.19/src/stats/model/uinteger-32-probe.cc
--- ns-3.18.1/src/stats/model/uinteger-32-probe.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/uinteger-32-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Uinteger32Probe);
+NS_OBJECT_ENSURE_REGISTERED (Uinteger32Probe)
+  ;
 
 TypeId
 Uinteger32Probe::GetTypeId ()
diff -Naur ns-3.18.1/src/stats/model/uinteger-32-probe.h ns-3.19/src/stats/model/uinteger-32-probe.h
--- ns-3.18.1/src/stats/model/uinteger-32-probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/uinteger-32-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,6 +31,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup probes
+ *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * an uint32_t.  This probe exports a trace source "Output" of type uint32_t.
  * The Output trace source emits a value when either the trace source
@@ -41,6 +43,10 @@
 class Uinteger32Probe : public Probe
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   Uinteger32Probe ();
   virtual ~Uinteger32Probe ();
@@ -88,12 +94,10 @@
    *
    * \param oldData previous value of the uint32_t
    * \param newData new value of the uint32_t
-   *
-   * \internal
    */
   void TraceSink (uint32_t oldData, uint32_t newData);
 
-  TracedValue<uint32_t> m_output;
+  TracedValue<uint32_t> m_output; //!< Output trace source.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/stats/model/uinteger-8-probe.cc ns-3.19/src/stats/model/uinteger-8-probe.cc
--- ns-3.18.1/src/stats/model/uinteger-8-probe.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/uinteger-8-probe.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Uinteger8Probe);
+NS_OBJECT_ENSURE_REGISTERED (Uinteger8Probe)
+  ;
 
 TypeId
 Uinteger8Probe::GetTypeId ()
diff -Naur ns-3.18.1/src/stats/model/uinteger-8-probe.h ns-3.19/src/stats/model/uinteger-8-probe.h
--- ns-3.18.1/src/stats/model/uinteger-8-probe.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/stats/model/uinteger-8-probe.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,6 +31,8 @@
 namespace ns3 {
 
 /**
+ * \ingroup probes
+ *
  * This class is designed to probe an underlying ns3 TraceSource exporting
  * an uint8_t.  This probe exports a trace source "Output" of type uint8_t.
  * The Output trace source emits a value when either the trace source
@@ -41,6 +43,10 @@
 class Uinteger8Probe : public Probe
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId ();
   Uinteger8Probe ();
   virtual ~Uinteger8Probe ();
@@ -88,12 +94,10 @@
    *
    * \param oldData previous value of the uint8_t
    * \param newData new value of the uint8_t
-   *
-   * \internal
    */
   void TraceSink (uint8_t oldData, uint8_t newData);
 
-  TracedValue<uint8_t> m_output;
+  TracedValue<uint8_t> m_output; //!< Output trace source.
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/tap-bridge/bindings/callbacks_list.py ns-3.19/src/tap-bridge/bindings/callbacks_list.py
--- ns-3.18.1/src/tap-bridge/bindings/callbacks_list.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/tap-bridge/bindings/callbacks_list.py	2013-12-20 09:44:50.000000000 -0800
@@ -1,7 +1,7 @@
 callback_classes = [
+    ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::Packet const>', 'unsigned short', 'ns3::Address const&', 'ns3::Address const&', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['bool', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::Packet const>', 'unsigned short', 'ns3::Address const&', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
-    ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'unsigned char*', 'long', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
     ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::Packet const>', 'unsigned short', 'ns3::Address const&', 'ns3::Address const&', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
 ]
diff -Naur ns-3.18.1/src/tap-bridge/bindings/modulegen__gcc_ILP32.py ns-3.19/src/tap-bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -147,7 +147,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1228,10 +1228,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -2577,6 +2578,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2587,6 +2593,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2602,6 +2613,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2627,6 +2643,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/tap-bridge/bindings/modulegen__gcc_LP64.py ns-3.19/src/tap-bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -147,7 +147,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1228,10 +1228,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -2577,6 +2578,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -2587,6 +2593,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -2602,6 +2613,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -2627,6 +2643,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/tap-bridge/doc/tap.h ns-3.19/src/tap-bridge/doc/tap.h
--- ns-3.18.1/src/tap-bridge/doc/tap.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/tap-bridge/doc/tap.h	2013-12-20 09:44:50.000000000 -0800
@@ -1,5 +1,5 @@
 /**
- * \defgroup tap-bridge Tap Bridge Device
+ * \defgroup tap-bridge Tap Bridge Network Device
  *
  * This section documents the API of the ns-3 tap-bridge module. For a
  * generic functional description, please refer to the ns-3 manual.
diff -Naur ns-3.18.1/src/tap-bridge/doc/tap.rst ns-3.19/src/tap-bridge/doc/tap.rst
--- ns-3.18.1/src/tap-bridge/doc/tap.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/tap-bridge/doc/tap.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: text
 
 Tap NetDevice
 -------------
@@ -49,6 +50,7 @@
 
 This is illustrated below: ::
 
+
     +--------+
     |  Linux |
     |  host  |                    +----------+
@@ -99,7 +101,9 @@
 going to "Use" an existing tap device previously created and configured
 by the user.  This mode is particularly useful when a virtualization 
 scheme automatically creates tap devices and ns-3 is used to provide 
-simulated networks for those devices. ::
+simulated networks for those devices.
+
+::
 
     +--------+
     |  Linux |
@@ -139,11 +143,13 @@
 incompatible with UseLocal mode.
 
 In UseLocal mode, the user is expected to create and configure a tap device
-completely outside the scope of the ns-3 simulation using something like: ::
+completely outside the scope of the ns-3 simulation using something like:
+
+.. sourcecode:: bash
 
-  sudo tunctl -t tap0
-  sudo ifconfig tap0 hw ether 08:00:2e:00:00:01
-  sudo ifconfig tap0 10.1.1.1 netmask 255.255.255.0 up
+  $ sudo tunctl -t tap0
+  $ sudo ifconfig tap0 hw ether 08:00:2e:00:00:01
+  $ sudo ifconfig tap0 10.1.1.1 netmask 255.255.255.0 up
 
 To tell the TapBridge what is going on, the user will set either directly
 into the TapBridge or via the TapBridgeHelper, the "DeviceName" attribute.
@@ -163,7 +169,9 @@
 an existing configuration.  In this case, the TapBridge is going to logically
 extend a Linux bridge into ns-3.  
 
-This is illustrated below: ::
+This is illustrated below:
+
+::
 
     +---------+
     |  Linux  |                             +----------+
@@ -203,15 +211,17 @@
 for use in UseBridge mode.
 
 It is expected that the user will do something like the following to
-configure the bridge and tap completely outside ns-3: ::
+configure the bridge and tap completely outside ns-3:
+
+.. sourcecode:: bash
 
-  sudo brctl addbr mybridge
-  sudo tunctl -t mytap
-  sudo ifconfig mytap hw ether 00:00:00:00:00:01
-  sudo ifconfig mytap 0.0.0.0 up
-  sudo brctl addif mybridge mytap
-  sudo brctl addif mybridge ...
-  sudo ifconfig mybridge 10.1.1.1 netmask 255.255.255.0 up
+  $ sudo brctl addbr mybridge
+  $ sudo tunctl -t mytap
+  $ sudo ifconfig mytap hw ether 00:00:00:00:00:01
+  $ sudo ifconfig mytap 0.0.0.0 up
+  $ sudo brctl addif mybridge mytap
+  $ sudo brctl addif mybridge ...
+  $ sudo ifconfig mybridge 10.1.1.1 netmask 255.255.255.0 up
 
 To tell the TapBridge what is going on, the user will set either directly
 into the TapBridge or via the TapBridgeHelper, the "DeviceName" attribute.
diff -Naur ns-3.18.1/src/tap-bridge/model/tap-bridge.cc ns-3.19/src/tap-bridge/model/tap-bridge.cc
--- ns-3.18.1/src/tap-bridge/model/tap-bridge.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/tap-bridge/model/tap-bridge.cc	2013-12-20 09:44:50.000000000 -0800
@@ -39,29 +39,13 @@
 #include <sys/stat.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
 #include <cerrno>
 #include <limits>
 #include <cstdlib>
 #include <unistd.h>
 
-//
-// Sometimes having a tap-creator is actually more trouble than solution.  In 
-// these cases you can uncomment the define of TAP_CREATOR below and the 
-// simulation will just use a device you have preconfigured.  This is useful
-// if you are running in an environment where you have got to run as root,
-// such as ORBIT or CORE.
-//
-
-
-// #define NO_CREATOR
-
-#ifdef NO_CREATOR
-#include <fcntl.h>
-#include <net/if.h>
-#include <linux/if_tun.h>
-#include <sys/ioctl.h>
-#endif
-
 NS_LOG_COMPONENT_DEFINE ("TapBridge");
 
 namespace ns3 {
@@ -89,7 +73,8 @@
 
 #define TAP_MAGIC 95549
 
-NS_OBJECT_ENSURE_REGISTERED (TapBridge);
+NS_OBJECT_ENSURE_REGISTERED (TapBridge)
+  ;
 
 TypeId
 TapBridge::GetTypeId (void)
@@ -236,6 +221,9 @@
   //
   CreateTap ();
 
+  // Declare the link up
+  NotifyLinkUp ();
+
   //
   // Now spin up a read thread to read packets from the tap device.
   //
@@ -630,7 +618,7 @@
                   int *rawSocket = (int*)CMSG_DATA (cmsg);
                   NS_LOG_INFO ("Got the socket from the socket creator = " << *rawSocket);
                   m_sock = *rawSocket;
-                  return;
+                  break;
                 }
               else
                 {
@@ -638,8 +626,40 @@
                 }
             }
         }
-      NS_FATAL_ERROR ("Did not get the raw socket from the socket creator");
+      if (cmsg == NULL)
+        {
+          NS_FATAL_ERROR ("Did not get the raw socket from the socket creator");
+        }
+
+      if (m_mode == USE_LOCAL || m_mode == USE_BRIDGE)
+        {
+          //
+          // Set the ns-3 device's mac address to the overlying container's
+          // mac address
+          //
+          struct ifreq s;
+          strncpy (s.ifr_name, m_tapDeviceName.c_str (), sizeof (s.ifr_name));
+
+          NS_LOG_INFO ("Trying to get MacAddr of " << m_tapDeviceName);
+          int ioctlResult = ioctl (sock, SIOCGIFHWADDR, &s);
+          if (ioctlResult == 0)
+            {
+              Mac48Address learnedMac;
+              learnedMac.CopyFrom ((uint8_t *)s.ifr_hwaddr.sa_data);
+              NS_LOG_INFO ("Learned Tap device MacAddr is " << learnedMac << ": setting ns-3 device to use this address");
+              m_bridgedDevice->SetAddress (learnedMac);
+              m_ns3AddressRewritten = true;
+            }
+
+          if (!m_ns3AddressRewritten)
+            {
+              NS_LOG_INFO ("Cannot get MacAddr of Tap device: " << m_tapDeviceName << " while in USE_LOCAL/USE_BRIDGE mode: " << std::strerror (errno));
+              NS_LOG_INFO ("Underlying ns-3 device will continue to use default address, what can lead to connectivity errors");
+            }
+        }
     }
+
+  close (sock);
 }
 
 void
@@ -1039,18 +1059,29 @@
   return m_mtu;
 }
 
+void
+TapBridge::NotifyLinkUp (void)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  if (!m_linkUp)
+    {
+      m_linkUp = true;
+      m_linkChangeCallbacks ();
+    }
+}
 
 bool 
 TapBridge::IsLinkUp (void) const
 {
   NS_LOG_FUNCTION_NOARGS ();
-  return true;
+  return m_linkUp;
 }
 
 void 
 TapBridge::AddLinkChangeCallback (Callback<void> callback)
 {
   NS_LOG_FUNCTION_NOARGS ();
+  m_linkChangeCallbacks.ConnectWithoutContext (callback);
 }
 
 bool 
diff -Naur ns-3.18.1/src/tap-bridge/model/tap-bridge.h ns-3.19/src/tap-bridge/model/tap-bridge.h
--- ns-3.18.1/src/tap-bridge/model/tap-bridge.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/tap-bridge/model/tap-bridge.h	2013-12-20 09:44:50.000000000 -0800
@@ -291,6 +291,8 @@
    */
   Ptr<Packet> Filter (Ptr<Packet> packet, Address *src, Address *dst, uint16_t *type);
 
+  void NotifyLinkUp (void);
+
   /**
    * \internal
    *
@@ -448,7 +450,7 @@
    * \internal
    *
    * Whether the MAC address of the underlying ns-3 device has already been
-   * rewritten is stored in this variable (for UseLocal mode only).
+   * rewritten is stored in this variable (for UseLocal/UseBridge mode only).
    */
   bool m_ns3AddressRewritten;
 
@@ -463,6 +465,22 @@
    * multithreaded apps is not a good thing.
    */
   uint32_t m_nodeId;
+
+  /**
+   * \internal
+   *
+   * Flag indicating whether or not the link is up.  In this case,
+   * whether or not ns-3 is connected to the underlying TAP device
+   * with a file descriptor.
+   */
+  bool m_linkUp;
+
+  /**
+   * \internal
+   *
+   * Callbacks to fire if the link changes state (up or down).
+   */
+  TracedCallback<> m_linkChangeCallbacks;
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/test/ns3tcp/ns3tcp.h ns-3.19/src/test/ns3tcp/ns3tcp.h
--- ns-3.18.1/src/test/ns3tcp/ns3tcp.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/test/ns3tcp/ns3tcp.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,9 +0,0 @@
-/**
- * \ingroup tests
- * \defgroup Ns3TcpTests ns-3 TCP Implementation Tests
- *
- * \section Ns3TcpTestsOverview ns-3 Tcp Implementation Tests Overview
- *
- * Includes tests of ns-3 TCP as well as tests involving the mix
- * of ns-3 and Network Simulation Cradle (nsc) TCP models.
- */
diff -Naur ns-3.18.1/src/test/ns3wifi/ns3wifi.h ns-3.19/src/test/ns3wifi/ns3wifi.h
--- ns-3.18.1/src/test/ns3wifi/ns3wifi.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/test/ns3wifi/ns3wifi.h	1969-12-31 16:00:00.000000000 -0800
@@ -1,8 +0,0 @@
-/**
- * \ingroup tests
- * \defgroup Ns3WifiTests ns-3 Wifi Implementation Tests
- *
- * \section Ns3WifiTestsOverview ns-3 Wifi Implementation Tests Overview
- *
- * ns-3 has a Wifi implementation and we test it a little.
- */
diff -Naur ns-3.18.1/src/topology-read/bindings/modulegen__gcc_ILP32.py ns-3.19/src/topology-read/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/topology-read/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -87,7 +87,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## topology-reader.h (module 'topology-read'): ns3::TopologyReader [class]
@@ -694,10 +694,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -1577,6 +1578,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -1587,6 +1593,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -1602,6 +1613,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -1627,6 +1643,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/topology-read/bindings/modulegen__gcc_LP64.py ns-3.19/src/topology-read/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/topology-read/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -87,7 +87,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## topology-reader.h (module 'topology-read'): ns3::TopologyReader [class]
@@ -694,10 +694,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -1577,6 +1578,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -1587,6 +1593,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -1602,6 +1613,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -1627,6 +1643,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/topology-read/helper/topology-reader-helper.cc ns-3.19/src/topology-read/helper/topology-reader-helper.cc
--- ns-3.18.1/src/topology-read/helper/topology-reader-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/helper/topology-reader-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,11 +28,12 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("TopologyReaderHelper");
+NS_LOG_COMPONENT_DEFINE ("TopologyReaderHelper")
+  ;
 
 TopologyReaderHelper::TopologyReaderHelper ()
 {
-  m_inFile = 0;
+  m_inputModel = 0;
 }
 
 void
@@ -51,7 +52,7 @@
 Ptr<TopologyReader>
 TopologyReaderHelper::GetTopologyReader ()
 {
-  if (!m_inFile)
+  if (!m_inputModel)
     {
       NS_ASSERT_MSG (!m_fileType.empty (), "Missing File Type");
       NS_ASSERT_MSG (!m_fileName.empty (), "Missing File Name");
@@ -59,26 +60,26 @@
       if (m_fileType == "Orbis")
         {
           NS_LOG_INFO ("Creating Orbis formatted data input.");
-          m_inFile = CreateObject<OrbisTopologyReader> ();
+          m_inputModel = CreateObject<OrbisTopologyReader> ();
         }
       else if (m_fileType == "Inet")
         {
           NS_LOG_INFO ("Creating Inet formatted data input.");
-          m_inFile = CreateObject<InetTopologyReader> ();
+          m_inputModel = CreateObject<InetTopologyReader> ();
         }
       else if (m_fileType == "Rocketfuel")
         {
           NS_LOG_INFO ("Creating Rocketfuel formatted data input.");
-          m_inFile = CreateObject<RocketfuelTopologyReader> ();
+          m_inputModel = CreateObject<RocketfuelTopologyReader> ();
         }
       else
         {
           NS_ASSERT_MSG (false, "Wrong (unknown) File Type");
         }
 
-      m_inFile->SetFileName (m_fileName);
+      m_inputModel->SetFileName (m_fileName);
     }
-  return m_inFile;
+  return m_inputModel;
 }
 
 
diff -Naur ns-3.18.1/src/topology-read/helper/topology-reader-helper.h ns-3.19/src/topology-read/helper/topology-reader-helper.h
--- ns-3.18.1/src/topology-read/helper/topology-reader-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/helper/topology-reader-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -56,9 +56,9 @@
   Ptr<TopologyReader> GetTopologyReader ();
 
 private:
-  Ptr<TopologyReader> m_inFile;
-  std::string m_fileName;
-  std::string m_fileType;
+  Ptr<TopologyReader> m_inputModel;  //!< Smart pointer to the actual topology model
+  std::string m_fileName;  //!< Name of the input file
+  std::string m_fileType;  //!< Type of the input file (e.g., "Inet", "Orbis", etc.).
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/topology-read/model/inet-topology-reader.cc ns-3.19/src/topology-read/model/inet-topology-reader.cc
--- ns-3.18.1/src/topology-read/model/inet-topology-reader.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/model/inet-topology-reader.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,9 +30,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("InetTopologyReader");
+NS_LOG_COMPONENT_DEFINE ("InetTopologyReader")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (InetTopologyReader);
+NS_OBJECT_ENSURE_REGISTERED (InetTopologyReader)
+  ;
 
 TypeId InetTopologyReader::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/topology-read/model/inet-topology-reader.h ns-3.19/src/topology-read/model/inet-topology-reader.h
--- ns-3.18.1/src/topology-read/model/inet-topology-reader.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/model/inet-topology-reader.h	2013-12-20 09:44:50.000000000 -0800
@@ -47,6 +47,10 @@
 class InetTopologyReader : public TopologyReader
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   InetTopologyReader ();
@@ -67,7 +71,18 @@
   virtual NodeContainer Read (void);
 
 private:
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   */
   InetTopologyReader (const InetTopologyReader&);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   * \returns
+   */
   InetTopologyReader& operator= (const InetTopologyReader&);
 
   // end class InetTopologyReader
diff -Naur ns-3.18.1/src/topology-read/model/orbis-topology-reader.cc ns-3.19/src/topology-read/model/orbis-topology-reader.cc
--- ns-3.18.1/src/topology-read/model/orbis-topology-reader.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/model/orbis-topology-reader.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,9 +30,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("OrbisTopologyReader");
+NS_LOG_COMPONENT_DEFINE ("OrbisTopologyReader")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (OrbisTopologyReader);
+NS_OBJECT_ENSURE_REGISTERED (OrbisTopologyReader)
+  ;
 
 TypeId OrbisTopologyReader::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/topology-read/model/orbis-topology-reader.h ns-3.19/src/topology-read/model/orbis-topology-reader.h
--- ns-3.18.1/src/topology-read/model/orbis-topology-reader.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/model/orbis-topology-reader.h	2013-12-20 09:44:50.000000000 -0800
@@ -44,6 +44,10 @@
 class OrbisTopologyReader : public TopologyReader
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   OrbisTopologyReader ();
@@ -62,7 +66,19 @@
   virtual NodeContainer Read (void);
 
 private:
+private:
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   */
   OrbisTopologyReader (const OrbisTopologyReader&);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   * \returns
+   */
   OrbisTopologyReader& operator= (const OrbisTopologyReader&);
 
   // end class OrbisTopologyReader
diff -Naur ns-3.18.1/src/topology-read/model/rocketfuel-topology-reader.cc ns-3.19/src/topology-read/model/rocketfuel-topology-reader.cc
--- ns-3.18.1/src/topology-read/model/rocketfuel-topology-reader.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/model/rocketfuel-topology-reader.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,9 +30,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("RocketfuelTopologyReader");
+NS_LOG_COMPONENT_DEFINE ("RocketfuelTopologyReader")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (RocketfuelTopologyReader);
+NS_OBJECT_ENSURE_REGISTERED (RocketfuelTopologyReader)
+  ;
 
 TypeId RocketfuelTopologyReader::GetTypeId (void)
 {
@@ -44,6 +46,8 @@
 
 RocketfuelTopologyReader::RocketfuelTopologyReader ()
 {
+  m_linksNumber = 0;
+  m_nodesNumber = 0;
   NS_LOG_FUNCTION (this);
 }
 
@@ -54,6 +58,7 @@
 
 /* uid @loc [+] [bb] (num_neigh) [&ext] -> <nuid-1> <nuid-2> ... {-euid} ... =name[!] rn */
 
+
 #define REGMATCH_MAX 16
 
 #define START "^"
@@ -73,10 +78,16 @@
 #define ROCKETFUEL_WEIGHTS_LINE \
   START "([^ \t]+)" SPACE "([^ \t]+)" SPACE "([0-9.]+)" MAYSPACE END
 
-int linksNumber = 0;
-int nodesNumber = 0;
-std::map<std::string, Ptr<Node> > nodeMap;
-
+/**
+ * \brief Print node info
+ * \param uid node ID
+ * \param loc node location
+ * \param dns is a DNS node ?
+ * \param bb is a BB node ?
+ * \param neighListSize size of neighbor list
+ * \param name node name
+ * \param radius node radius
+ */
 static inline void
 PrintNodeInfo (std::string & uid, std::string & loc, bool dns, bool bb,
                std::vector <std::string>::size_type neighListSize,
@@ -148,7 +159,7 @@
   /* externs */
   if (argv[7])
     {
-      //      euid = argv[7];
+      // euid = argv[7];
     }
 
   /* name */
@@ -168,12 +179,12 @@
   // Create node and link
   if (!uid.empty ())
     {
-      if (nodeMap[uid] == 0)
+      if (m_nodeMap[uid] == 0)
         {
           Ptr<Node> tmpNode = CreateObject<Node> ();
-          nodeMap[uid] = tmpNode;
+          m_nodeMap[uid] = tmpNode;
           nodes.Add (tmpNode);
-          nodesNumber++;
+          m_nodesNumber++;
         }
 
       for (uint32_t i = 0; i < neigh_list.size (); ++i)
@@ -185,19 +196,22 @@
               return nodes;
             }
 
-          if (nodeMap[nuid] == 0)
+          if (m_nodeMap[nuid] == 0)
             {
               Ptr<Node> tmpNode = CreateObject<Node> ();
-              nodeMap[nuid] = tmpNode;
+              m_nodeMap[nuid] = tmpNode;
               nodes.Add (tmpNode);
-              nodesNumber++;
+              m_nodesNumber++;
             }
-          NS_LOG_INFO (linksNumber << ":" << nodesNumber << " From: " << uid << " to: " << nuid);
-          Link link (nodeMap[uid], uid, nodeMap[nuid], nuid);
+          NS_LOG_INFO (m_linksNumber << ":" << m_nodesNumber << " From: " << uid << " to: " << nuid);
+          Link link (m_nodeMap[uid], uid, m_nodeMap[nuid], nuid);
           AddLink (link);
-          linksNumber++;
+          m_linksNumber++;
         }
     }
+
+  NS_LOG_INFO ("Rocketfuel topology created with " << m_nodesNumber << " nodes and " << m_linksNumber << " links");
+
   return nodes;
 }
 
@@ -223,28 +237,28 @@
   // Create node and link
   if (!sname.empty () && !tname.empty ())
     {
-      if (nodeMap[sname] == 0)
+      if (m_nodeMap[sname] == 0)
         {
           Ptr<Node> tmpNode = CreateObject<Node> ();
-          nodeMap[sname] = tmpNode;
+          m_nodeMap[sname] = tmpNode;
           nodes.Add (tmpNode);
-          nodesNumber++;
+          m_nodesNumber++;
         }
 
-      if (nodeMap[tname] == 0)
+      if (m_nodeMap[tname] == 0)
         {
           Ptr<Node> tmpNode = CreateObject<Node> ();
-          nodeMap[tname] = tmpNode;
+          m_nodeMap[tname] = tmpNode;
           nodes.Add (tmpNode);
-          nodesNumber++;
+          m_nodesNumber++;
         }
-      NS_LOG_INFO (linksNumber << ":" << nodesNumber << " From: " << sname << " to: " << tname);
+      NS_LOG_INFO (m_linksNumber << ":" << m_nodesNumber << " From: " << sname << " to: " << tname);
       TopologyReader::ConstLinksIterator iter;
       bool found = false;
       for (iter = LinksBegin (); iter != LinksEnd (); iter++)
         {
-          if ((iter->GetFromNode () == nodeMap[tname])
-              && (iter->GetToNode () == nodeMap[sname]))
+          if ((iter->GetFromNode () == m_nodeMap[tname])
+              && (iter->GetToNode () == m_nodeMap[sname]))
             {
               found = true;
               break;
@@ -253,11 +267,14 @@
 
       if (!found)
         {
-          Link link (nodeMap[sname], sname, nodeMap[tname], tname);
+          Link link (m_nodeMap[sname], sname, m_nodeMap[tname], tname);
           AddLink (link);
-          linksNumber++;
+          m_linksNumber++;
         }
     }
+
+  NS_LOG_INFO ("Rocketfuel topology created with " << m_nodesNumber << " nodes and " << m_linksNumber << " links");
+
   return nodes;
 }
 
@@ -423,7 +440,6 @@
 
   topgen.close ();
 
-  NS_LOG_INFO ("Rocketfuel topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
   return nodes;
 }
 
diff -Naur ns-3.18.1/src/topology-read/model/rocketfuel-topology-reader.h ns-3.19/src/topology-read/model/rocketfuel-topology-reader.h
--- ns-3.18.1/src/topology-read/model/rocketfuel-topology-reader.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/model/rocketfuel-topology-reader.h	2013-12-20 09:44:50.000000000 -0800
@@ -43,6 +43,10 @@
 class RocketfuelTopologyReader : public TopologyReader
 {
 public:
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   RocketfuelTopologyReader ();
@@ -61,23 +65,68 @@
   virtual NodeContainer Read (void);
 
 private:
-  RocketfuelTopologyReader (const RocketfuelTopologyReader&);
-  RocketfuelTopologyReader& operator= (const RocketfuelTopologyReader&);
-  // Parser for the *.cch file available at:
-  // http://www.cs.washington.edu/research/networking/rocketfuel/maps/rocketfuel_maps_cch.tar.gz
+  /**
+   * \brief Topology read function from a file containing the nodes map.
+   *
+   * Parser for the *.cch file available at:
+   * http://www.cs.washington.edu/research/networking/rocketfuel/maps/rocketfuel_maps_cch.tar.gz
+   *
+   * \param argc argument counter
+   * \param argv argument vector
+   * \return the container of the nodes created (or empty container if there was an error)
+   */
   NodeContainer GenerateFromMapsFile (int argc, char *argv[]);
-  // Parser for the weights.* file available at:
-  // http://www.cs.washington.edu/research/networking/rocketfuel/maps/weights-dist.tar.gz
+
+  /**
+   * \brief Topology read function from a file containing the nodes weights.
+   *
+   * Parser for the weights.* file available at:
+   * http://www.cs.washington.edu/research/networking/rocketfuel/maps/weights-dist.tar.gz
+   *
+   * \param argc argument counter
+   * \param argv argument vector
+   * \return the container of the nodes created (or empty container if there was an error)
+   */
   NodeContainer GenerateFromWeightsFile (int argc, char *argv[]);
 
+  /**
+   * \brief Enum of the possible file types.
+   */
   enum RF_FileType
   {
     RF_MAPS,
     RF_WEIGHTS,
     RF_UNKNOWN
   };
+
+
+  /**
+   * \brief Classifies the file type according to its content.
+   *
+   * \return the file type (RF_MAPS, RF_WEIGHTS, or RF_UNKNOWN)
+   */
   enum RF_FileType GetFileType (const char *);
 
+  int m_linksNumber; //!< number of links
+  int m_nodesNumber; //!< number of nodes
+  std::map<std::string, Ptr<Node> > m_nodeMap; //!< map of the nodes (name, node)
+
+private:
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   */
+  RocketfuelTopologyReader (const RocketfuelTopologyReader&);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   * \returns
+   */
+  RocketfuelTopologyReader& operator= (const RocketfuelTopologyReader&);
+
+
   // end class RocketfuelTopologyReader
 };
 
diff -Naur ns-3.18.1/src/topology-read/model/topology-reader.cc ns-3.19/src/topology-read/model/topology-reader.cc
--- ns-3.18.1/src/topology-read/model/topology-reader.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/model/topology-reader.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,9 +26,11 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("TopologyReader");
+NS_LOG_COMPONENT_DEFINE ("TopologyReader")
+  ;
 
-NS_OBJECT_ENSURE_REGISTERED (TopologyReader);
+NS_OBJECT_ENSURE_REGISTERED (TopologyReader)
+  ;
 
 TypeId TopologyReader::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/topology-read/model/topology-reader.h ns-3.19/src/topology-read/model/topology-reader.h
--- ns-3.18.1/src/topology-read/model/topology-reader.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/topology-read/model/topology-reader.h	2013-12-20 09:44:50.000000000 -0800
@@ -54,9 +54,9 @@
   class Link
   {
 public:
-  /**
-   * \brief Constant iterator to scan the map of link attributes.
-   */
+    /**
+     * \brief Constant iterator to scan the map of link attributes.
+     */
     typedef std::map<std::string, std::string>::const_iterator ConstAttributesIterator;
 
     /**
@@ -123,11 +123,11 @@
 
 private:
     Link ();
-    std::string m_fromName;
-    Ptr< Node > m_fromPtr;
-    std::string m_toName;
-    Ptr< Node > m_toPtr;
-    std::map<std::string, std::string> m_linkAttr;
+    std::string m_fromName; //!< Name of the node the links originates from
+    Ptr< Node > m_fromPtr;  //!< The node the links originates from
+    std::string m_toName;   //!< Name of the node the links is directed to
+    Ptr< Node > m_toPtr;    //!< The node the links is directed to
+    std::map<std::string, std::string> m_linkAttr;  ///< Container of the link attributes (if any)
   };
 
   /**
@@ -135,6 +135,10 @@
    */
   typedef std::list< Link >::const_iterator ConstLinksIterator;
 
+  /**
+   * \brief Get the type ID.
+   * \return the object TypeId
+   */
   static TypeId GetTypeId (void);
 
   TopologyReader ();
@@ -196,10 +200,29 @@
   void AddLink (Link link);
 
 private:
+
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   */
   TopologyReader (const TopologyReader&);
+  /**
+   * \brief Copy constructor
+   *
+   * Defined and unimplemented to avoid misuse
+   * \returns
+   */
   TopologyReader& operator= (const TopologyReader&);
 
+  /**
+   * the name of the input file
+   */
   std::string m_fileName;
+
+  /**
+   * the container of the links between the nodes
+   */
   std::list<Link> m_linksList;
 
   // end class TopologyReader
diff -Naur ns-3.18.1/src/uan/bindings/modulegen__gcc_ILP32.py ns-3.19/src/uan/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/uan/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -179,7 +179,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1569,10 +1569,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3497,6 +3498,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3507,6 +3513,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3522,6 +3533,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3547,6 +3563,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -4748,11 +4769,6 @@
                    'double', 
                    [param('double', 'db')], 
                    is_const=True)
-    ## uan-phy.h (module 'uan'): void ns3::UanPhyCalcSinr::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## uan-phy.h (module 'uan'): static ns3::TypeId ns3::UanPhyCalcSinr::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -4763,6 +4779,11 @@
                    'double', 
                    [param('double', 'kp')], 
                    is_const=True)
+    ## uan-phy.h (module 'uan'): void ns3::UanPhyCalcSinr::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3UanPhyCalcSinrDefault_methods(root_module, cls):
@@ -5135,14 +5156,14 @@
                    'void', 
                    [param('double', 'txpwr')], 
                    is_virtual=True)
-    ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::SetTxPowerDbPhy1(double arg0) [member function]
+    ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::SetTxPowerDbPhy1(double txpwr) [member function]
     cls.add_method('SetTxPowerDbPhy1', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::SetTxPowerDbPhy2(double arg0) [member function]
+                   [param('double', 'txpwr')])
+    ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::SetTxPowerDbPhy2(double txpwr) [member function]
     cls.add_method('SetTxPowerDbPhy2', 
                    'void', 
-                   [param('double', 'arg0')])
+                   [param('double', 'txpwr')])
     ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::StartRxPacket(ns3::Ptr<ns3::Packet> pkt, double rxPowerDb, ns3::UanTxMode txMode, ns3::UanPdp pdp) [member function]
     cls.add_method('StartRxPacket', 
                    'void', 
@@ -5372,16 +5393,16 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## uan-phy.h (module 'uan'): void ns3::UanPhyPer::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## uan-phy.h (module 'uan'): static ns3::TypeId ns3::UanPhyPer::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## uan-phy.h (module 'uan'): void ns3::UanPhyPer::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3UanPhyPerGenDefault_methods(root_module, cls):
diff -Naur ns-3.18.1/src/uan/bindings/modulegen__gcc_LP64.py ns-3.19/src/uan/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/uan/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -179,7 +179,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -1569,10 +1569,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3497,6 +3498,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -3507,6 +3513,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -3522,6 +3533,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -3547,6 +3563,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -4748,11 +4769,6 @@
                    'double', 
                    [param('double', 'db')], 
                    is_const=True)
-    ## uan-phy.h (module 'uan'): void ns3::UanPhyCalcSinr::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## uan-phy.h (module 'uan'): static ns3::TypeId ns3::UanPhyCalcSinr::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -4763,6 +4779,11 @@
                    'double', 
                    [param('double', 'kp')], 
                    is_const=True)
+    ## uan-phy.h (module 'uan'): void ns3::UanPhyCalcSinr::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3UanPhyCalcSinrDefault_methods(root_module, cls):
@@ -5135,14 +5156,14 @@
                    'void', 
                    [param('double', 'txpwr')], 
                    is_virtual=True)
-    ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::SetTxPowerDbPhy1(double arg0) [member function]
+    ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::SetTxPowerDbPhy1(double txpwr) [member function]
     cls.add_method('SetTxPowerDbPhy1', 
                    'void', 
-                   [param('double', 'arg0')])
-    ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::SetTxPowerDbPhy2(double arg0) [member function]
+                   [param('double', 'txpwr')])
+    ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::SetTxPowerDbPhy2(double txpwr) [member function]
     cls.add_method('SetTxPowerDbPhy2', 
                    'void', 
-                   [param('double', 'arg0')])
+                   [param('double', 'txpwr')])
     ## uan-phy-dual.h (module 'uan'): void ns3::UanPhyDual::StartRxPacket(ns3::Ptr<ns3::Packet> pkt, double rxPowerDb, ns3::UanTxMode txMode, ns3::UanPdp pdp) [member function]
     cls.add_method('StartRxPacket', 
                    'void', 
@@ -5372,16 +5393,16 @@
                    'void', 
                    [], 
                    is_virtual=True)
-    ## uan-phy.h (module 'uan'): void ns3::UanPhyPer::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True)
     ## uan-phy.h (module 'uan'): static ns3::TypeId ns3::UanPhyPer::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
+    ## uan-phy.h (module 'uan'): void ns3::UanPhyPer::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
     return
 
 def register_Ns3UanPhyPerGenDefault_methods(root_module, cls):
diff -Naur ns-3.18.1/src/uan/examples/uan-cw-example.cc ns-3.19/src/uan/examples/uan-cw-example.cc
--- ns-3.18.1/src/uan/examples/uan-cw-example.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/examples/uan-cw-example.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,17 +23,23 @@
  * \file uan-cw-example.cc
  * \ingroup uan
  * 
- * This example showcases the "CW-MAC" described in System Design Considerations for Undersea Networks
- * article in the IEEE Journal on Selected Areas of Communications 2008 by Nathan Parrish, Leonard Tracy
- * and Sumit Roy.  The MAC protocol is implemented in the class UanMacCw.  CW-MAC is similar in nature
- * to the IEEE 802.11 DCF with a constant backoff window.  It requires two parameters to be set,
- * the slot time and the contention window size.  The contention window size is the backoff window
- * size in slots, and the slot time is the duration of each slot.  These parameters should be set
- * according to the overall network size, internode spacing and the number of nodes in the network.
+ * This example showcases the "CW-MAC" described in System Design Considerations
+ * for Undersea Networks article in the IEEE Journal on Selected Areas of
+ * Communications 2008 by Nathan Parrish, Leonard Tracy and Sumit Roy.
+ * The MAC protocol is implemented in the class UanMacCw.  CW-MAC is similar
+ * in nature to the IEEE 802.11 DCF with a constant backoff window.
+ * It requires two parameters to be set, the slot time and
+ * the contention window size.  The contention window size is
+ * the backoff window size in slots, and the slot time is
+ * the duration of each slot.  These parameters should be set
+ * according to the overall network size, internode spacing and
+ * the number of nodes in the network.
  * 
- * This example deploys nodes randomly (according to RNG seed of course) in a finite square region with
- * the X and Y coordinates of the nodes distributed uniformly.  The CW parameter is varied throughout
- * the simulation in order to show the variation in throughput with respect to changes in CW.
+ * This example deploys nodes randomly (according to RNG seed of course)
+ * in a finite square region with the X and Y coordinates of the nodes
+ * distributed uniformly.  The CW parameter is varied throughout
+ * the simulation in order to show the variation in throughput
+ * with respect to changes in CW.
  */
 
 #include "uan-cw-example.h"
@@ -47,7 +53,8 @@
 
 using namespace ns3;
 
-NS_LOG_COMPONENT_DEFINE ("UanCwExample");
+NS_LOG_COMPONENT_DEFINE ("UanCwExample")
+  ;
 
 Experiment::Experiment () 
   : m_numNodes (15),
diff -Naur ns-3.18.1/src/uan/examples/uan-cw-example.h ns-3.19/src/uan/examples/uan-cw-example.h
--- ns-3.18.1/src/uan/examples/uan-cw-example.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/examples/uan-cw-example.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,39 +28,67 @@
 using namespace ns3;
 
 /**
- * \class Experiment
- * \brief Helper class for UAN CW MAC example
+ * \ingroup uan
+ * \brief Helper class for UAN CW MAC example.
  *
+ * An experiment measures the average throughput for a series of CW values.
+ *
+ * \see uan-cw-example.cc
  */
 class Experiment
 {
 public:
+  /**
+   * Run an experiment across a range of congestion window values.
+   *
+   * \param uan The Uan stack helper to configure nodes in the model.
+   * \return The data set of CW values and measured throughput
+   */
   Gnuplot2dDataset Run (UanHelper &uan);
+  /**
+   * Receive all available packets from a socket.
+   *
+   * \param socket The receive socket.
+   */
   void ReceivePacket (Ptr<Socket> socket);
+  /**
+   * Assign new random positions to a set of nodes.  New positions
+   * are randomly assigned within the bounding box.
+   *
+   * \param nodes The nodes to reposition.
+   */
   void UpdatePositions (NodeContainer &nodes);
+  /** Save the throughput from a single run. */
   void ResetData ();
+  /**
+   * Compute average throughput for a set of runs, then increment CW.
+   *
+   * \param cw CW value for completed runs.
+   */
   void IncrementCw (uint32_t cw);
-  uint32_t m_numNodes;
-  uint32_t m_dataRate;
-  double m_depth;
-  double m_boundary;
-  uint32_t m_packetSize;
-  uint32_t m_bytesTotal;
-  uint32_t m_cwMin;
-  uint32_t m_cwMax;
-  uint32_t m_cwStep;
-  uint32_t m_avgs;
-
-  Time m_slotTime;
-  Time m_simTime;
-
-  std::string m_gnudatfile;
-  std::string m_asciitracefile;
-  std::string m_bhCfgFile;
+  
+  uint32_t m_numNodes;                //!< Number of transmitting nodes.
+  uint32_t m_dataRate;                //!< DataRate in bps.
+  double m_depth;                     //!< Depth of transmitting and sink nodes.
+  double m_boundary;                  //!< Size of boundary in meters.
+  uint32_t m_packetSize;              //!< Generated packet size in bytes.
+  uint32_t m_bytesTotal;              //!< Total bytes received.
+  uint32_t m_cwMin;                   //!< Min CW to simulate.
+  uint32_t m_cwMax;                   //!< Max CW to simulate.
+  uint32_t m_cwStep;                  //!< CW step size, default 10.
+  uint32_t m_avgs;                    //!< Number of topologies to test for each cw point.
+                                 
+  Time m_slotTime;                    //!< Slot time duration.
+  Time m_simTime;                     //!< Simulation run time, default 1000 s.
+
+  std::string m_gnudatfile;           //!< Name for GNU Plot output, default uan-cw-example.gpl.
+  std::string m_asciitracefile;       //!< Name for ascii trace file, default uan-cw-example.asc.
+  std::string m_bhCfgFile;            //!< (Unused)
 
-  Gnuplot2dDataset m_data;
-  std::vector<double> m_throughputs;
+  Gnuplot2dDataset m_data;            //!< Container for the simulation data.
+  std::vector<double> m_throughputs;  //!< Throughput for each run.
 
+  /** Default constructor. */
   Experiment ();
 };
 
diff -Naur ns-3.18.1/src/uan/examples/uan-rc-example.cc ns-3.19/src/uan/examples/uan-rc-example.cc
--- ns-3.18.1/src/uan/examples/uan-rc-example.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/examples/uan-rc-example.cc	2013-12-20 09:44:50.000000000 -0800
@@ -65,7 +65,8 @@
 
 using namespace ns3;
 
-NS_LOG_COMPONENT_DEFINE ("UanRcExample");
+NS_LOG_COMPONENT_DEFINE ("UanRcExample")
+  ;
 
 
 Experiment::Experiment () 
@@ -262,7 +263,7 @@
   cmd.AddValue ("MaxRange", "Maximum range between gateway and acoustic node", exp.m_maxRange);
   cmd.AddValue ("SimMin", "Minimum parameter to test (nodes if DoNode=1, \"a\" param otherwise)", exp.m_simMin);
   cmd.AddValue ("SimMax", "Maximum parameter to test (nodes if DoNode=1, \"a\" param otherwise)", exp.m_simMax);
-  cmd.AddValue ("SimStep", "Ammount to increment param per trial", exp.m_simStep);
+  cmd.AddValue ("SimStep", "Amount to increment param per trial", exp.m_simStep);
   cmd.AddValue ("DataFile", "Filename for GnuPlot", exp.m_gnuplotfile);
   cmd.AddValue ("NumberNodes", "Number of nodes (invalid for doNode=1)", exp.m_numNodes);
   cmd.AddValue ("SIFS", "SIFS time duration", exp.m_sifs);
diff -Naur ns-3.18.1/src/uan/examples/uan-rc-example.h ns-3.19/src/uan/examples/uan-rc-example.h
--- ns-3.18.1/src/uan/examples/uan-rc-example.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/examples/uan-rc-example.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,36 +27,89 @@
 
 using namespace ns3;
 
+/**
+ * \ingroup uan
+ *
+ * Container for the parameters describing a single experiment.
+ *
+ * An experiment samples a range of parameter values.  The parameter
+ * controls the number of nodes (if m_doNode is true), or the
+ * UanMacRcGw MaxReservations attribute.
+ *
+ * \see uan-rc-example.cc
+ *
+ */
 class Experiment
 {
 public:
-  uint32_t m_simMin;
-  uint32_t m_simMax;
-  uint32_t m_simStep;
-  uint32_t m_numRates;
-  uint32_t m_totalRate;
-  uint32_t m_maxRange;
-  uint32_t m_numNodes;
-  uint32_t m_pktSize;
-  bool m_doNode;
-  Time m_sifs;
-  Time m_simTime;
-
-  std::string m_gnuplotfile;
-
-  uint32_t m_bytesTotal;
-
-  UanModesList m_dataModes;
-  UanModesList m_controlModes;
-
+  uint32_t m_simMin;     //!< Minimum parameter to test.
+  uint32_t m_simMax;     //!< Maximum parameter to test.
+  uint32_t m_simStep;    //!< Amount to increment param per trial
+  uint32_t m_numRates;   //!< Number of divided rates ( (NumberRates+1)%TotalRate should be 0).
+  uint32_t m_totalRate;  //!< Total channel capacity.
+  uint32_t m_maxRange;   //!< Maximum range between gateway and acoustic node.
+  uint32_t m_numNodes;   //!< Number of nodes (invalid for m_doNode true).
+  uint32_t m_pktSize;    //!< Packet size in bytes.
+  bool m_doNode;         //!< 1 for do max nodes simulation (invalidates AMin and AMax values).
+  Time m_sifs;           //!< SIFS time duration.
+  Time m_simTime;        //!< Simulation time per trial
+
+  std::string m_gnuplotfile;    //!< Filename for GnuPlot.
+
+  uint32_t m_bytesTotal; //!< Total number of bytes received in a simulation run.
+
+  UanModesList m_dataModes;     //!< List of UanTxModes used for data channels.
+  UanModesList m_controlModes;  //!< List of UanTxModes used for control channels.
+
+  /**
+   * Callback to receive a packet.
+   *
+   * \param socket The socket receiving packets.
+   */
   void ReceivePacket (Ptr<Socket> socket);
+  /**
+   * Create a UanTxMode.
+   *
+   * The mode physical rate is set equal to m_totalRate.
+   * The data rate and bandwidth are set to
+   *
+   * \f[{\rm{rate, bandwidth}} = {\rm{kass}}\frac{{{\rm{m\_totalRate}}}}{{{\rm{m\_numRates}} + 1}}\f]
+   *
+   * The center frequency is set to
+   *
+   * \f[{f_{center}} = {\rm{fc}} + \frac{{ \pm {\rm{m\_totalRate}} \mp {\rm{rate}}}}{2}\f]
+   *
+   * where the upper sign is taken if upperblock is true.
+   *
+   * \param kass Fraction of total bandwidth assigned to mode.
+   * \param fc Mode center frequency offset.
+   * \param upperblock Sign choise in setting the center frequency.
+   * \param name Mode name.
+   * \return The new mode.
+   */
   UanTxMode CreateMode (uint32_t kass,
                         uint32_t fc,
                         bool upperblock,
                         std::string name);
+  /**
+   * Create m_numRates matching control and data modes.
+   *
+   * \param fc Mode center frequency offset.
+   */
   void CreateDualModes (uint32_t fc);
+  /**
+   * Run a parametrized experiment.
+   *
+   * The parameter sets either the number of nodes (if m_doNode is true)
+   * or the \"a\" parameter, which controls the UanMacRcGw MaxReservations
+   * attribute.
+   *
+   * \param param The parameter value.
+   * \return The total number of bytes delivered.
+   */
   uint32_t Run (uint32_t param);
 
+  /** Default constructor. */
   Experiment();
 
 };
diff -Naur ns-3.18.1/src/uan/helper/acoustic-modem-energy-model-helper.h ns-3.19/src/uan/helper/acoustic-modem-energy-model-helper.h
--- ns-3.18.1/src/uan/helper/acoustic-modem-energy-model-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/helper/acoustic-modem-energy-model-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,35 +27,38 @@
 namespace ns3 {
 
 /**
- * \brief Assign AcousticModemEnergyModel to uan devices.
+ * \ingroup uan
  *
- * This installer installs AcousticModemEnergyModel for only UanNetDevice objects.
+ * Assign AcousticModemEnergyModel to uan devices.
+ *
+ * This installer installs AcousticModemEnergyModel for only
+ * UanNetDevice objects.
  */
 class AcousticModemEnergyModelHelper : public DeviceEnergyModelHelper
 {
 public:
-  /**
-   * Construct a helper which is used to add a radio energy model to a node
+  /** 
+   * Construct a helper which is used to add a radio energy model to a node.
    */
   AcousticModemEnergyModelHelper ();
 
   /**
-   * Destroy an AcousticModemEnergy Helper
+   * Destroy an AcousticModemEnergy Helper.
    */
   ~AcousticModemEnergyModelHelper ();
 
   /**
-   * \param name the name of the attribute to set
-   * \param v the value of the attribute
-   *
    * Sets an attribute of the underlying energy model object.
+   *
+   * \param name The name of the attribute to set.
+   * \param v The value of the attribute.
    */
   void Set (std::string name, const AttributeValue &v);
 
   /**
-   * \param callback Callback function for energy depletion handling.
-   *
    * Sets the callback to be invoked when energy is depleted.
+   *
+   * \param callback Callback function for energy depletion handling.
    */
   void SetDepletionCallback (
     AcousticModemEnergyModel::AcousticModemEnergyDepletionCallback callback);
@@ -63,16 +66,20 @@
 
 private:
   /**
+   * Implements DeviceEnergyModel::Install.
+   *
    * \param device Pointer to the NetDevice to install DeviceEnergyModel.
    * \param source Pointer to EnergySource installed on node.
-   *
-   * Implements DeviceEnergyModel::Install.
+   * \return The energy model.
    */
   virtual Ptr<DeviceEnergyModel> DoInstall (Ptr<NetDevice> device,
                                             Ptr<EnergySource> source) const;
 
 private:
+  /** Energy model factory. */
   ObjectFactory m_modemEnergy;
+
+  /** Callback for energy depletion. */
   AcousticModemEnergyModel::AcousticModemEnergyDepletionCallback m_depletionCallback;
 
 };
diff -Naur ns-3.18.1/src/uan/helper/uan-helper.cc ns-3.19/src/uan/helper/uan-helper.cc
--- ns-3.18.1/src/uan/helper/uan-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/helper/uan-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,12 +43,30 @@
 NS_LOG_COMPONENT_DEFINE ("UanHelper");
 namespace ns3 {
 
+/**
+ * Ascii trace callback on Phy transmit events.
+ *
+ * \param os The output stream.
+ * \param context The node and device ids.
+ * \param packet The transmitted packet.
+ * \param txPowerDb The transmission power.
+ * \param mode The transmission mode.
+ */
 static void AsciiPhyTxEvent (std::ostream *os, std::string context,
                              Ptr<const Packet> packet, double txPowerDb, UanTxMode mode)
 {
   *os << "+ " << Simulator::Now ().GetSeconds () << " " << context << " " << *packet << std::endl;
 }
 
+/**
+ * Ascii trace callback on successful packet reception.
+ *
+ * \param os The output stream.
+ * \param context The node and device ids.
+ * \param packet The received packet.
+ * \param snr The received signal to noise ratio.
+ * \param mode The channel transmission mode.
+ */
 static void AsciiPhyRxOkEvent (std::ostream *os, std::string context,
                                Ptr<const Packet> packet, double snr, UanTxMode mode)
 {
diff -Naur ns-3.18.1/src/uan/helper/uan-helper.h ns-3.19/src/uan/helper/uan-helper.h
--- ns-3.18.1/src/uan/helper/uan-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/helper/uan-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,30 +31,37 @@
 
 class UanChannel;
 
+/**
+ * \ingroup uan
+ *
+ * UAN configuration helper.
+ */
 class UanHelper
 {
 public:
-  UanHelper ();
-  virtual ~UanHelper ();
+  UanHelper ();           //!< Defalt constructor.
+  virtual ~UanHelper ();  //!< Destructor.
 
   /**
-   * \param type the type of ns3::UanMac to create.
-   * \param n0 the name of the attribute to set
-   * \param v0 the value of the attribute to set
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
-   * \param n2 the name of the attribute to set
-   * \param v2 the value of the attribute to set
-   * \param n3 the name of the attribute to set
-   * \param v3 the value of the attribute to set
-   * \param n4 the name of the attribute to set
-   * \param v4 the value of the attribute to set
-   * \param n5 the name of the attribute to set
-   * \param v5 the value of the attribute to set
-   * \param n6 the name of the attribute to set
-   * \param v6 the value of the attribute to set
-   * \param n7 the name of the attribute to set
-   * \param v7 the value of the attribute to set
+   * Set MAC attributes.
+   *
+   * \param type The type of ns3::UanMac to create.
+   * \param n0 The name of the attribute to set.
+   * \param v0 The value of the attribute to set.
+   * \param n1 The name of the attribute to set.
+   * \param v1 The value of the attribute to set.
+   * \param n2 The name of the attribute to set.
+   * \param v2 The value of the attribute to set.
+   * \param n3 The name of the attribute to set.
+   * \param v3 The value of the attribute to set.
+   * \param n4 The name of the attribute to set.
+   * \param v4 The value of the attribute to set.
+   * \param n5 The name of the attribute to set.
+   * \param v5 The value of the attribute to set.
+   * \param n6 The name of the attribute to set.
+   * \param v6 The value of the attribute to set.
+   * \param n7 The name of the attribute to set.
+   * \param v7 The value of the attribute to set.
    *
    * All the attributes specified in this method should exist
    * in the requested mac.
@@ -71,26 +78,28 @@
 
 
   /**
-   * \param phyType the type of ns3::UanPhy to create.
-   * \param n0 the name of the attribute to set
-   * \param v0 the value of the attribute to set
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
-   * \param n2 the name of the attribute to set
-   * \param v2 the value of the attribute to set
-   * \param n3 the name of the attribute to set
-   * \param v3 the value of the attribute to set
-   * \param n4 the name of the attribute to set
-   * \param v4 the value of the attribute to set
-   * \param n5 the name of the attribute to set
-   * \param v5 the value of the attribute to set
-   * \param n6 the name of the attribute to set
-   * \param v6 the value of the attribute to set
-   * \param n7 the name of the attribute to set
-   * \param v7 the value of the attribute to set
+   * Set PHY attributes.
+   *
+   * \param phyType The type of ns3::UanPhy to create.
+   * \param n0 The name of the attribute to set.
+   * \param v0 The value of the attribute to set.
+   * \param n1 The name of the attribute to set.
+   * \param v1 The value of the attribute to set.
+   * \param n2 The name of the attribute to set.
+   * \param v2 The value of the attribute to set.
+   * \param n3 The name of the attribute to set.
+   * \param v3 The value of the attribute to set.
+   * \param n4 The name of the attribute to set.
+   * \param v4 The value of the attribute to set.
+   * \param n5 The name of the attribute to set.
+   * \param v5 The value of the attribute to set.
+   * \param n6 The name of the attribute to set.
+   * \param v6 The value of the attribute to set.
+   * \param n7 The name of the attribute to set.
+   * \param v7 The value of the attribute to set.
    *
    * All the attributes specified in this method should exist
-   * in the requested phy.
+   * in the requested Phy.
    */
   void SetPhy (std::string phyType,
                std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
@@ -104,23 +113,25 @@
 
 
   /**
-   * \param type the type of ns3::Transducer to create
-   * \param n0 the name of the attribute to set
-   * \param v0 the value of the attribute to set
-   * \param n1 the name of the attribute to set
-   * \param v1 the value of the attribute to set
-   * \param n2 the name of the attribute to set
-   * \param v2 the value of the attribute to set
-   * \param n3 the name of the attribute to set
-   * \param v3 the value of the attribute to set
-   * \param n4 the name of the attribute to set
-   * \param v4 the value of the attribute to set
-   * \param n5 the name of the attribute to set
-   * \param v5 the value of the attribute to set
-   * \param n6 the name of the attribute to set
-   * \param v6 the value of the attribute to set
-   * \param n7 the name of the attribute to set
-   * \param v7 the value of the attribute to set
+   * Set the transducer attributes.
+   *
+   * \param type The type of ns3::Transducer to create.
+   * \param n0 The name of the attribute to set.
+   * \param v0 The value of the attribute to set.
+   * \param n1 The name of the attribute to set.
+   * \param v1 The value of the attribute to set.
+   * \param n2 The name of the attribute to set.
+   * \param v2 The value of the attribute to set.
+   * \param n3 The name of the attribute to set.
+   * \param v3 The value of the attribute to set.
+   * \param n4 The name of the attribute to set.
+   * \param v4 The value of the attribute to set.
+   * \param n5 The name of the attribute to set.
+   * \param v5 The value of the attribute to set.
+   * \param n6 The name of the attribute to set.
+   * \param v6 The value of the attribute to set.
+   * \param n7 The name of the attribute to set.
+   * \param v7 The value of the attribute to set.
    *
    * All the attributes specified in this method should exist
    * in the requested transducer.
@@ -135,47 +146,45 @@
                       std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
                       std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
   /**
-   * \param os output stream
-   * \param nodeid the id of the node to generate ascii output for.
-   * \param deviceid the id of the device to generate ascii output for.
-   *
    * Enable ascii output on the specified deviceid within the
    * specified nodeid if it is of type ns3::UanNetDevice and dump
    * that to the specified stdc++ output stream.
+   *
+   * \param os Output stream.
+   * \param nodeid The id of the node to generate ascii output for.
+   * \param deviceid The id of the device to generate ascii output for.
    */
   static void EnableAscii (std::ostream &os, uint32_t nodeid, uint32_t deviceid);
   /**
-   * \param os output stream
-   * \param d device container
-   *
    * Enable ascii output on each device which is of the
    * ns3::UanNetDevice type and which is located in the input
    * device container and dump that to the specified
    * stdc++ output stream.
+   *
+   * \param os Output stream.
+   * \param d Device container.
    */
   static void EnableAscii (std::ostream &os, NetDeviceContainer d);
   /**
-   * \param os output stream
-   * \param n node container
-   *
    * Enable ascii output on each device which is of the
    * ns3::UanNetDevice type and which is located in one
    * of the input node and dump that to the specified
    * stdc++ output stream.
+   *
+   * \param os Output stream.
+   * \param n Node container.
    */
   static void EnableAscii (std::ostream &os, NodeContainer n);
   /**
-   * \param os output stream
-   *
    * Enable ascii output on each device which is of the
    * ns3::UanNetDevice type and dump that to the specified
    * stdc++ output stream.
+   *
+   * \param os Output stream.
    */
   static void EnableAsciiAll (std::ostream &os);
 
   /**
-   * \param c a set of nodes
-   *
    * This method creates a simple ns3::UanChannel (with a default
    * ns3::UanNoiseModelDefault and ns3::UanPropModelIdeal) and
    * creates, for each of the input nodes, a new ns3::UanNetDevice
@@ -184,34 +193,41 @@
    * ns3::UanPhy, all of which are created based on the user-specified
    * attributes specified in UanHelper::SetTransducer,
    * UanHelper::SetMac, and, UanHelper::SetPhy.
+   *
+   * \param c A set of nodes.
+   * \return The installed netdevices.
    */
-
   NetDeviceContainer Install (NodeContainer c) const;
+  
   /**
-   * \param c a set of nodes
-   * \param channel a channel to use
-   *
    * For each of the input nodes, a new ns3::UanNetDevice is attached
    * to the shared input channel. Each ns3::UanNetDevice is also
    * configured with an ns3::UanTransducerHd, a ns3::UanMac, and ns3::UanPhy,
    * all of which are created based on the user-specified attributes
    * specified in UanHelper::SetTransducer, UanHelper::SetMac, and
    * UanHelper::SetPhy.
+   *
+   * \param c A set of nodes.
+   * \param channel A channel to use.
+   * \return The installed netdevices.
    */
   NetDeviceContainer Install (NodeContainer c, Ptr<UanChannel> channel) const;
 
   /**
-   * \param node a node where to install the uan components
-   * \param channel a channel to use
+   * Create a default an stack.
    *
-   * Create a default uan stack with:
-   * - default channel, ideal propagation and default noise model
-   * - default physical layer, with UanPhyGen
-   * - default transducer, half duplex acoustic modem with UanTransducerHd
-   * - default MAC layer, with UanMacAloha
+   * The stack includes:
+   * - default channel, ideal propagation and default noise model.
+   * - default physical layer, with UanPhyGen.
+   * - default transducer, half duplex acoustic modem with UanTransducerHd.
+   * - default MAC layer, with UanMacAloha.
    *
    * Channel, physical layer, transducer and mac layer are added to the
    * UanNetDevice and then added to the node.
+   *
+   * \param node A node where to install the uan components.
+   * \param channel A channel to use.
+   * \return The installed UanNetDevice.
    */
   Ptr<UanNetDevice> Install (Ptr<Node> node, Ptr<UanChannel> channel) const;
 
@@ -222,17 +238,17 @@
   * called by the user.
   *
   * \param c NetDeviceContainer of the set of net devices for which the 
-  *          UanNetDevice should be modified to use a fixed stream
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this helper
+  *          UanNetDevice should be modified to use a fixed stream.
+  * \param stream First stream index to use.
+  * \return The number of stream indices assigned by this helper.
   */
   int64_t AssignStreams (NetDeviceContainer c, int64_t stream);
 
 private:
-  ObjectFactory m_device;
-  ObjectFactory m_mac;
-  ObjectFactory m_phy;
-  ObjectFactory m_transducer;
+  ObjectFactory m_device;      //!< The device.
+  ObjectFactory m_mac;         //!< The MAC layer.
+  ObjectFactory m_phy;         //!< The PHY layer.
+  ObjectFactory m_transducer;  //!< The transducer.
 
 };
 
diff -Naur ns-3.18.1/src/uan/model/acoustic-modem-energy-model.cc ns-3.19/src/uan/model/acoustic-modem-energy-model.cc
--- ns-3.18.1/src/uan/model/acoustic-modem-energy-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/acoustic-modem-energy-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (AcousticModemEnergyModel);
+NS_OBJECT_ENSURE_REGISTERED (AcousticModemEnergyModel)
+  ;
 
 TypeId
 AcousticModemEnergyModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/uan/model/acoustic-modem-energy-model.h ns-3.19/src/uan/model/acoustic-modem-energy-model.h
--- ns-3.18.1/src/uan/model/acoustic-modem-energy-model.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/acoustic-modem-energy-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,9 @@
 namespace ns3 {
 
 /**
- * \brief WHOI micro-modem energy model
+ * \ingroup uan
+ *
+ * WHOI micro-modem energy model.
  *
  * Basing on the Device Energy Model interface, has been implemented a specific
  * energy model for the WHOI micro modem. The class follows pretty closely the
@@ -45,110 +47,105 @@
  * Sleep         5.8 mW
  *
  * References:
- * [1] Freitag et al., The whoi micro-modem: an acoustic communications and navigation system for multiple platforms,
+ * [1] Freitag et al., The whoi micro-modem: an acoustic communications
+ *     and navigation system for multiple platforms,
  *     in In Proc. IEEE OCEANS05 Conf, 2005.
  *     URL: http://ieeexplore.ieee.org/iel5/10918/34367/01639901.pdf
  */
 class AcousticModemEnergyModel : public DeviceEnergyModel
 {
 public:
-  /**
-   * Callback type for energy depletion handling.
-   */
+  /** Callback type for energy depletion handling. */
   typedef Callback<void> AcousticModemEnergyDepletionCallback;
 
-public:
+public:  
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
+  /** Constructor. */
   AcousticModemEnergyModel ();
+  /** Dummy destructor, see DoDispose */
   virtual ~AcousticModemEnergyModel ();
 
   /**
-   * \brief Sets pointer to node.
+   * Sets pointer to node.
    *
    * \param node Pointer to node.
-   *
-   * Implements DeviceEnergyModel::SetNode.
    */
   virtual void SetNode (Ptr<Node> node);
 
   /**
-   * \brief Gets pointer to node.
+   * Gets pointer to node.
    *
    * \return Pointer to node.
-   *
-   * Implements DeviceEnergyModel::GetNode.
    */
   virtual Ptr<Node> GetNode (void) const;
 
-  /**
-   * \brief Sets pointer to EnergySouce installed on node.
-   *
-   * \param source Pointer to EnergySource installed on node.
-   *
-   * Implements DeviceEnergyModel::SetEnergySource.
-   */
+  // Inherited methods.
   virtual void SetEnergySource (Ptr<EnergySource> source);
-
-  /**
-   * \return Total energy consumption of the modem
-   *
-   * Implements DeviceEnergyModel::GetTotalEnergyConsumption.
-   */
   virtual double GetTotalEnergyConsumption (void) const;
 
   /**
+   * Get the transmission power of the modem.
    *
-   * \return The transmission power of the modem in Watts
+   * \return The transmission power in Watts.
    */
   double GetTxPowerW (void) const;
 
   /**
-   * Set the transmission power of the modem
+   * Set the transmission power of the modem.
    *
-   * \param txPowerW Transmission power of the modem in watts
+   * \param txPowerW Transmission power in watts.
    */
   void SetTxPowerW (double txPowerW);
 
   /**
+   * Get the recieving power.
    *
-   * \return The receiving power of the modem in Watts
+   * \return The receiving power in Watts
    */
   double GetRxPowerW (void) const;
 
   /**
-   * Set the receiving power of the modem
+   * Set the receiving power of the modem.
    *
-   * \param rxPowerW Receiving power of the modem in watts
+   * \param rxPowerW Receiving power in watts
    */
   void SetRxPowerW (double rxPowerW);
 
   /**
+   *Get the idle power of the modem.
    *
-   * \return The idle power of the modem in Watts
+   * \return The idle power in Watts
    */
   double GetIdlePowerW (void) const;
 
   /**
-   * Set the idle power of the modem
+   * Set the idle state power of the modem.
    *
-   * \param idlePowerW Idle power of the modem in watts
+   * \param idlePowerW Idle power of the modem in watts.
    */
   void SetIdlePowerW (double idlePowerW);
 
   /**
+   * Get the sleep state power of the modem.
    *
-   * \return The sleep power of the modem in Watts
+   * \return Sleep power of the modem in Watts
    */
   double GetSleepPowerW (void) const;
 
   /**
-   * Set the sleep power of the modem
+   * Set the sleep power of the modem.
    *
-   * \param sleepPowerW Sleep power of the modem in watts
+   * \param sleepPowerW Sleep power of the modem in watts.
    */
   void SetSleepPowerW (double sleepPowerW);
 
   /**
+   * Get the current state of the modem.
+   *
    * \return Current state.
    */
   int GetCurrentState (void) const;
@@ -161,18 +158,14 @@
   void SetEnergyDepletionCallback (AcousticModemEnergyDepletionCallback callback);
 
   /**
-   * \brief Changes state of the AcousticModemEnergyModel.
+   * Changes state of the AcousticModemEnergyModel..
    *
    * \param newState New state the modem is in.
-   *
-   * Implements DeviceEnergyModel::ChangeState.
    */
   virtual void ChangeState (int newState);
 
   /**
-   * \brief Handles energy depletion.
-   *
-   * Implements DeviceEnergyModel::HandleEnergyDepletion
+   * Handles energy depletion.
    */
   virtual void HandleEnergyDepletion (void);
 
@@ -181,9 +174,7 @@
   void DoDispose (void);
 
   /**
-   * \returns Current draw of device, at current state.
-   *
-   * Implements DeviceEnergyModel::GetCurrentA.
+   * \return Current draw of device, at current state.
    */
   virtual double DoGetCurrentA (void) const;
 
@@ -204,25 +195,26 @@
   void SetMicroModemState (const int state);
 
 private:
-  Ptr<Node> m_node;
-  Ptr<EnergySource> m_source;
+  Ptr<Node> m_node;            //!< The node hosting this transducer.
+  Ptr<EnergySource> m_source;  //!< The energy source.
 
   // Member variables for power consumption in different modem states.
-  double m_txPowerW;
-  double m_rxPowerW;
-  double m_idlePowerW;
-  double m_sleepPowerW;
+  double m_txPowerW;           //!< The transmitter power, in watts.
+  double m_rxPowerW;           //!< The receiver power, in watts.
+  double m_idlePowerW;         //!< The idle power, in watts.
+  double m_sleepPowerW;        //!< The sleep power, in watts.
 
-  // This variable keeps track of the total energy consumed by this model.
+  /** The total energy consumed by this model. */
   TracedValue<double> m_totalEnergyConsumption;
 
   // State variables.
-  int m_currentState;  // current state the modem is in
-  Time m_lastUpdateTime;          // time stamp of previous energy update
+  int m_currentState;          //!< Current modem state.
+  Time m_lastUpdateTime;       //!< Time stamp of previous energy update.
 
-  // energy depletion callback
+  /** Energy depletion callback. */
   AcousticModemEnergyDepletionCallback m_energyDepletionCallback;
-};
+
+};  // class AcousticModemEnergyModel
 
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/uan/model/uan-address.cc ns-3.19/src/uan/model/uan-address.cc
--- ns-3.18.1/src/uan/model/uan-address.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-address.cc	2013-12-20 09:44:50.000000000 -0800
@@ -108,6 +108,12 @@
 }
 
 bool
+operator < (const UanAddress &a, const UanAddress &b)
+{
+  return a.m_address < b.m_address;
+}
+
+bool
 operator == (const UanAddress &a, const UanAddress &b)
 {
   return a.m_address == b.m_address;
diff -Naur ns-3.18.1/src/uan/model/uan-address.h ns-3.19/src/uan/model/uan-address.h
--- ns-3.18.1/src/uan/model/uan-address.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-address.h	2013-12-20 09:44:50.000000000 -0800
@@ -27,100 +27,159 @@
 namespace ns3 {
 
 /**
- * \class UanAddress
+ * \ingroup uan
  *
- * A class used for addressing UAN MAC's.  This implementation uses a simple 8 bit
- * flat addressing scheme.  It is unlikely that perceived underwater networks will
- * soon exceed 200 nodes (or the overlapping of two underwater networks - the ocean is big),
- * so this should provide adequate addressing for most applications.
+ * A class used for addressing UAN MAC's.
+ *
+ * This implementation uses a simple 8 bit flat addressing scheme.
+ * It is unlikely that perceived underwater networks will soon
+ * exceed 200 nodes (or the overlapping of two underwater networks
+ * - the ocean is big), so this should provide adequate addressing
+ * for most applications.
  */
 class UanAddress
 {
 public:
+  /** Constructor */
   UanAddress ();
   /**
-   * \param addr byte address to assign to this address
-   * \brief Create UanAddress object with address addr
+   * Create UanAddress object with address addr.
+   *
+   * \param addr Byte address to assign to this address.
    */
   UanAddress (uint8_t addr);
+  /** Destructor */
   virtual ~UanAddress ();
 
   /**
-   * \param address  Address to convert to UAN address
-   * \returns UanAddress from Address
+   * Convert a generic address to a UanAddress.
+   *
+   * \param address  Address to convert to UAN address.
+   * \return UanAddress from Address.
    */
   static UanAddress ConvertFrom (const Address &address);
 
   /**
-   * \param address  Address to test
-   * \returns True if address given is consistant with UanAddress
+   * Check that a generic Address is compatible with UanAddress.
+   *
+   * \param address  Address to test.
+   * \return True if address given is consistant with UanAddress.
    */
   static bool IsMatchingType  (const Address &address);
 
   /**
-   * \brief Create UanAddress object with broadcast address
+   * Create a generic Address.
+   *
+   * \return The Address.
    */
   operator Address () const;
 
   /**
-   * \param pBuffer Buffer to extract address from
-   * \brief Sets address to address stored in parameter
+   * Sets address to address stored in parameter.
+   *
+   * \param pBuffer Buffer to extract address from.
    */
   void CopyFrom (const uint8_t *pBuffer);
 
   /**
+   * Writes address to buffer parameter.
+   *
    * \param pBuffer
-   * \brief Writes address to buffer parameter
    */
   void CopyTo (uint8_t *pBuffer);
 
   /**
-   * \returns 8 bit integer version of address
+   * Convert to integer.
+   *
+   * \return 8 bit integer version of address.
    */
   uint8_t GetAsInt (void) const;
 
   /**
-   * \returns Broadcast address: 255
+   * Get the broadcast address (255).
+   *
+   * \return Broadcast address.
    */
   static UanAddress GetBroadcast (void);
 
   /**
-   * \brief Allocates UanAddress from 0-254 (will wrap back to 0 if more than 255 are allocated)
+   * Allocates UanAddress from 0-254
+   *
+   * Will wrap back to 0 if more than 254 are allocated.
+   * Excludes the broadcast address.
+   *
+   * \return The next sequential UanAddress.
    */
   static UanAddress Allocate ();
 
 
 private:
-  uint8_t m_address;
+  uint8_t m_address;  //!< The address.
 
+  /**
+   * Get the UanAddress type.
+   *
+   * \return The type value.
+   */
   static uint8_t GetType (void);
+  /**
+   * Convert to a generic Address.
+   *
+   * \return The Address value.
+   */
   Address ConvertTo (void) const;
 
+  friend bool operator <  (const UanAddress &a, const UanAddress &b);
   friend bool operator == (const UanAddress &a, const UanAddress &b);
   friend bool operator != (const UanAddress &a, const UanAddress &b);
   friend std::ostream& operator<< (std::ostream& os, const UanAddress & address);
   friend std::istream& operator>> (std::istream& is, UanAddress & address);
 
-};
+};  // class UanAddress
 
 
 /**
- * \brief Returns true if byte address a is equal to byte address b
+ * Address comparison, less than.
+ *
+ * \param a First address to compare.
+ * \param b Second address to compare.
+ * \return True if a < b.
+ */
+bool operator < (const UanAddress &a, const UanAddress &b);
+
+/**
+ * Address comparison, equalit.
+ *
+ * \param a First address to compare.
+ * \param b Second address to compare.
+ * \return True if a == b.
  */
 bool operator == (const UanAddress &a, const UanAddress &b);
 
 /**
- * \brief Returns true if byte address a is unequal to byte address b
+ * Address comparison, unequal.
+ *
+ * \param a First address to compare.
+ * \param b Second address to compare.
+ * \return True if a != b.
  */
 bool operator != (const UanAddress &a, const UanAddress &b);
 
 /**
- * \brief Writes param address to stream os as 8 bit integer
+ * Write \pname{address} to stream \pname{os} as 8 bit integer.
+ *
+ * \param os The output stream.
+ * \param address The address
+ * \return The output stream.
  */
 std::ostream& operator<< (std::ostream& os, const UanAddress & address);
 
 /**
- * \brief Inputs param address from stream is as 8 bit integer
+ * Read \pname{address} from stream \pname{is} as 8 bit integer.
+ *
+ * \param is The input stream.
+ * \param address The address variable to set.
+ * \return The input stream.
  */
 std::istream& operator>> (std::istream& is, UanAddress & address);
 
diff -Naur ns-3.18.1/src/uan/model/uan-channel.cc ns-3.19/src/uan/model/uan-channel.cc
--- ns-3.18.1/src/uan/model/uan-channel.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,8 @@
 NS_LOG_COMPONENT_DEFINE ("UanChannel");
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanChannel);
+NS_OBJECT_ENSURE_REGISTERED (UanChannel)
+  ;
 
 TypeId
 UanChannel::GetTypeId ()
diff -Naur ns-3.18.1/src/uan/model/uan-channel.h ns-3.19/src/uan/model/uan-channel.h
--- ns-3.18.1/src/uan/model/uan-channel.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-channel.h	2013-12-20 09:44:50.000000000 -0800
@@ -38,78 +38,102 @@
 class UanTxMode;
 
 /**
- * \class UanChannel
- * \brief Channel class used by UAN devices
+ * \ingroup uan
+ *
+ * Channel class used by UAN devices.
  */
 class UanChannel : public Channel
 {
 public:
   /**
-   * \brief UanDeviceList is a standard template vector of pairs (UanNetDevice, UanTransducer)
+   * UanDeviceList is a standard template vector of pairs
+   * (UanNetDevice, UanTransducer)
    */
   typedef std::vector<std::pair<Ptr<UanNetDevice>, Ptr<UanTransducer> > > UanDeviceList;
 
+  UanChannel ();           //!< Constructor
+  virtual ~UanChannel ();  //!< Dummy destructor, see DoDispose.
 
-  UanChannel ();
-  virtual ~UanChannel ();
-
-  static TypeId GetTypeId ();
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
+  static TypeId GetTypeId (void);
 
-  // Methods inherrited from base class
+  // Inherited methods
   virtual uint32_t GetNDevices (void) const;
   virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
 
   /**
-   * \param src Transducer transmitting packet
-   * \param packet Packet to be transmitted
-   * \param txPowerDb Transmission power in dB
-   * \param txmode UanTxMode defining modulation of transmitted packet
-   * Send a packet out on the channel
+   * Send a packet out on the channel.
+   *
+   * \param src Transducer transmitting packet.
+   * \param packet Packet to be transmitted.
+   * \param txPowerDb Transmission power in dB.
+   * \param txmode UanTxMode defining modulation of transmitted packet.
    */
   void TxPacket  (Ptr<UanTransducer> src, Ptr<Packet> packet, double txPowerDb,
                   UanTxMode txmode);
 
   /**
-   * \param dev Net Device of node
-   * \param trans Transducer of net device attached to this channel
+   * Adds device to receiver list for this channel.
    *
-   * Adds device to receiver list for this channel
+   * \param dev Net Device of node.
+   * \param trans Transducer of net device attached to this channel.
    */
   void AddDevice (Ptr<UanNetDevice> dev, Ptr<UanTransducer> trans);
 
   /**
-   * \param prop Propagation model this channel will use for path loss/propagation delay
+   * Set the propagation model this channel will use
+   * for path loss/propagation delay.
+   *
+   * \param prop The propagation model.
    */
   void SetPropagationModel (Ptr<UanPropModel> prop);
 
   /**
-   * \param noise Noise model this channel will use to determine ambient channel noise.
+   * Set the noise model this channel will use
+   * to determine ambient channel noise.
    *
+   * \param noise The noise model.
    */
   void SetNoiseModel  (Ptr<UanNoiseModel> noise);
 
   /**
-   * \param fKhz Frequency in kHz
-   * \returns Ambient noise in dB/Hz on channel at a frequency
+   * Get the noise level on the channel.
+   *
+   * \param fKhz Frequency in kHz.
+   * \return Ambient noise in dB/Hz on channel at a frequency.
    */
   double GetNoiseDbHz (double fKhz);
 
   /**
-   * Clears all pointer references
-   */
+   * Clear all pointer references. */
   void Clear (void);
 
 private:
-  UanDeviceList m_devList;
-  Ptr<UanPropModel> m_prop;
-  Ptr<UanNoiseModel> m_noise;
-  bool m_cleared;
+  UanDeviceList m_devList;     //!< The list of devices on this channel.
+  Ptr<UanPropModel> m_prop;    //!< The propagation model.
+  Ptr<UanNoiseModel> m_noise;  //!< The noise model.
+  /** Has Clear ever been called on the channel. */
+  bool m_cleared;              
 
+  /**
+   * Send a packet up to the receiving UanTransducer.
+   *
+   * \param i Device number.
+   * \param packet The received packet.
+   * \param rxPowerDb Signal power in dB of arriving packet.
+   * \param txMode Mode arriving packet is using.
+   * \param pdp PDP of arriving signal.
+   */
   void SendUp (uint32_t i, Ptr<Packet> packet, double rxPowerDb, UanTxMode txMode, UanPdp pdp);
+  
 protected:
-  virtual void DoDispose ();
-};
+  virtual void DoDispose (void);
+
+};  // class UanChannel
 
-}
+} // namespace ns3
 
 #endif /* UAN_CHANNEL_H */
diff -Naur ns-3.18.1/src/uan/model/uan-header-common.cc ns-3.19/src/uan/model/uan-header-common.cc
--- ns-3.18.1/src/uan/model/uan-header-common.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-header-common.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanHeaderCommon);
+NS_OBJECT_ENSURE_REGISTERED (UanHeaderCommon)
+  ;
 
 UanHeaderCommon::UanHeaderCommon ()
 {
diff -Naur ns-3.18.1/src/uan/model/uan-header-common.h ns-3.19/src/uan/model/uan-header-common.h
--- ns-3.18.1/src/uan/model/uan-header-common.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-header-common.h	2013-12-20 09:44:50.000000000 -0800
@@ -29,68 +29,91 @@
 namespace ns3 {
 
 /**
- * \class UanHeaderCommon
+ * \ingroup uan
  *
- * Header includes 1 byte src address, 1 byte dest address,
+ * Common packet header fields.
+ *
+ * Includes 1 byte src address, 1 byte dest address,
  * and a 1 byte type field.
+ *
+ * The type field is protocol specific; see the relevant MAC protocol.
  */
 class UanHeaderCommon : public Header
 {
 public:
+  /** Default constructor */
   UanHeaderCommon ();
   /**
-   * \brief Create UanHeaderCommon object with given source and destination address and header type
-   * \param src Source address defined in header
-   * \param dest Destination address defined in header
-   * \param type Header type
+   * Create UanHeaderCommon object with given source and destination
+   * address and header type
+   *
+   * \param src Source address defined in header.
+   * \param dest Destination address defined in header.
+   * \param type Header type.
    */
   UanHeaderCommon (const UanAddress src, const UanAddress dest, uint8_t type);
+  /** Destructor */
   virtual ~UanHeaderCommon ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \param dest Address of destination node
+   * Set the destination address.
+   *
+   * \param dest Address of destination node.
    */
   void SetDest (UanAddress dest);
   /**
-   * \param src Address of packet source node
+   * Set the source address.
+   *
+   * \param src Address of packet source node.
    */
   void SetSrc (UanAddress src);
   /**
-   * \param type Value to set 1 byte type field to.  Value has protocol specific meaning
+   * Set the header type.
+   *
+   * Use of this value is protocol specific.
+   * \param type The type value.
    */
   void SetType (uint8_t type);
 
   /**
-   * \returns UanAddress in destination field
+   * Get the destination address.
+   *
+   * \return UanAddress in destination field.
    */
   UanAddress GetDest (void) const;
   /**
-   * \returns UanAddress in source field
+   * Get the source address
+   *
+   * \return UanAddress in source field.
    */
   UanAddress GetSrc (void) const;
   /**
-   * \returns value of type field
+   * Get the header type value.
+   *
+   * \return value of type field.
    */
   uint8_t GetType (void) const;
 
 
-
-  // Inherrited methods
+  // Inherited methods
   virtual uint32_t GetSerializedSize (void) const;
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
   virtual void Print (std::ostream &os) const;
   virtual TypeId GetInstanceTypeId (void) const;
 private:
-  UanAddress m_dest;
-  UanAddress m_src;
-  uint8_t m_type;
-
+  UanAddress m_dest;  //!< The destination address.
+  UanAddress m_src;   //!< The source address.
+  uint8_t m_type;     //!< The type field.
 
-};
+};  // class UanHeaderCommon
 
-}
+} // namespace ns3
 
 #endif /* UAN_HEADER_COMMON_H */
diff -Naur ns-3.18.1/src/uan/model/uan-header-rc.cc ns-3.19/src/uan/model/uan-header-rc.cc
--- ns-3.18.1/src/uan/model/uan-header-rc.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-header-rc.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,11 +25,16 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcData);
-NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcRts);
-NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcCtsGlobal);
-NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcCts);
-NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcAck);
+NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcData)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcRts)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcCtsGlobal)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcCts)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanHeaderRcAck)
+  ;
 
 UanHeaderRcData::UanHeaderRcData ()
   : Header (),
diff -Naur ns-3.18.1/src/uan/model/uan-header-rc.h ns-3.19/src/uan/model/uan-header-rc.h
--- ns-3.18.1/src/uan/model/uan-header-rc.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-header-rc.h	2013-12-20 09:44:50.000000000 -0800
@@ -31,42 +31,58 @@
 namespace ns3 {
 
 /**
- * \class UanHeaderRcData
+ * \ingroup uan
  *
- * \brief Extra data header information
+ * Extra data header information.
  *
- * Adds prop. delay measure, and frame number info to
- * transmitted data packet
+ * Adds propagation delay measure, and frame number info to
+ * transmitted data packet.
  */
 class UanHeaderRcData : public Header
 {
 public:
+  /** Default constructor */
   UanHeaderRcData ();
   /**
-   * \param frameNum Data frame # of reservation being transmitted
-   * \param propDelay  Measured propagation delay found in handshaking
-   * \note Prop. delay is transmitted with 16 bits and ms accuracy
+   * Constructor.
+   *
+   * \param frameNum Data frame # of reservation being transmitted.
+   * \param propDelay  Measured propagation delay found in handshaking.
+   * \note Prop. delay is transmitted with 16 bits and ms accuracy.
    */
   UanHeaderRcData (uint8_t frameNum, Time propDelay);
+  /** Destructor */
   virtual ~UanHeaderRcData ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \param frameNum Data frame # of reservation being transmitted
+   * Set the frame number of the reservation being transmitted.
+   *
+   * \param frameNum The data frame number.
    */
   void SetFrameNo (uint8_t frameNum);
   /**
-   * \param propDelay Measured propagation delay found in handshaking
-   * \note Prop. delay is transmitted with 16 bits and ms accuracy
+   * Set the propagation delay as found in handshaking.
+   *
+   * \param propDelay The measured propagation delay.
+   * \note Prop. delay is transmitted with 16 bits and ms accuracy.
    */
   void SetPropDelay (Time propDelay);
   /**
-   * \returns Data frame # of reservation being transmitted
+   * Get the frame number of the reservation being transmitted.
+   * 
+   * \return The data frame number.
    */
   uint8_t GetFrameNo (void) const;
   /**
-   * \returns Measured propagation delay found in handshaking
+   * Get the propagation delay found in handshaking.
+   * 
+   * \return The measured propagation delay.
    * \note Prop. delay is transmitted with 16 bits and ms accuracy
    */
   Time GetPropDelay (void) const;
@@ -79,75 +95,106 @@
   virtual TypeId GetInstanceTypeId (void) const;
 
 private:
-  uint8_t m_frameNo;
-  Time m_propDelay;
-};
+  uint8_t m_frameNo;  //!< Data frame number.
+  Time m_propDelay;   //!< Propagation delay.
+
+};  // class UanHeaderRcData
 
 /**
- * \class UanHeaderRcRts
+ * \ingroup uan
  *
- * \brief RTS header
+ * RTS header.
  *
- * Contains frame #, retry #, # frames, length, and timestamp
+ * Contains frame number, retry number, number of frames, length, and timestamp.
  */
 class UanHeaderRcRts : public Header
 {
 public:
+  /** Default constructor */
   UanHeaderRcRts ();
   /**
-   * \param frameNo Reservation frame #
-   * \param retryNo Retry # of RTS packet
-   * \param noFrames # of data frames in reservation
-   * \param length # of bytes (including headers) in data
-   * \param ts RTS TX timestamp
-   * \note Timestamp is serialized into 32 bits with ms accuracy
+   * Constructor.
+   *
+   * \param frameNo Reservation frame number.
+   * \param retryNo Retry number of RTS packet.
+   * \param noFrames Number of data frames in reservation.
+   * \param length Number of bytes (including headers) in data.
+   * \param ts RTS TX timestamp.
+   * \note Timestamp is serialized into 32 bits with ms accuracy.
    */
   UanHeaderRcRts (uint8_t frameNo, uint8_t retryNo, uint8_t noFrames, uint16_t length, Time ts);
+  /** Destructor */
   virtual ~UanHeaderRcRts ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \param fno TX frame #
+   * Set the frame number.
+   *
+   * \param fno TX frame number
    */
   void SetFrameNo (uint8_t fno);
   /**
-   * \param no Number of data frames included in this reservation request
+   * Set the number of data frames included in this reservation request.
+   *
+   * \param no Number of frames.
    */
   void SetNoFrames (uint8_t no);
   /**
-   * \param timeStamp RTS transmission time
+   * Set RTS transmission time.
+   *
+   * \param timeStamp The RTS transmission time.
    */
   void SetTimeStamp (Time timeStamp);
   /**
-   * \param length Total number of data bytes in reservation (including headers)
-   * \note Timestamp is serialized with 32 bits in ms precision
+   * Set the number of data bytes in the reservation.
+   *
+   * \param length Total number of data bytes in reservation (including headers).
+   * \note Timestamp is serialized with 32 bits in ms precision.
    */
   void SetLength (uint16_t length);
   /**
-   * \param no Retry number of this RTS (Used to match timestamp to correctly received RTS)
+   * Set the retry number of this RTS packet.
+   *
+   * This is used to match timestamp to correctly received RTS.
+   *
+   * \param no Retry number.
    */
   void SetRetryNo (uint8_t no);
 
   /**
-   * \returns Frame #
+   * Get the frame number.
+   *
+   * \return The frame number.
    */
   uint8_t GetFrameNo (void) const;
   /**
-   * \returns # of data frames in reservation
+   * Get the number of data frames in the reservation.
+   *
+   * \return The number of data frames.
    */
   uint8_t GetNoFrames (void) const;
   /**
-   * \returns TX time of the RTS packet
-   * \note Timestamp is serialized with 32 bits in ms precision
+   * Get the transmit timestamp of this RTS packet.
+   *
+   * \return The TX time.
+   * \note Timestamp is serialized with 32 bits in ms precision.
    */
   Time GetTimeStamp (void) const;
   /**
-   * \returns Total # of bytes in data packets for reservation (including headers)
+   * Get the total number of bytes in the reservation, including headers.
+   *
+   * \return Total number of bytes in data packets for reservation.
    */
   uint16_t GetLength (void) const;
   /**
-   * \returns Retry number of this RTS packet
+   * Get the retry number of this RTS packet.
+   *
+   * \return The retry number.
    */
   uint8_t GetRetryNo (void) const;
 
@@ -159,71 +206,92 @@
   virtual TypeId GetInstanceTypeId (void) const;
 
 private:
-  uint8_t m_frameNo;
-  uint8_t m_noFrames;
-  uint16_t m_length;
-  Time m_timeStamp;
-  uint8_t m_retryNo;
-};
+  uint8_t m_frameNo;   //!< Reservation frame number.
+  uint8_t m_noFrames;  //!< Number of data frames in reservation.
+  uint16_t m_length;   //!< Number of bytes (including headers) in data.
+  Time m_timeStamp;    //!< RTS TX timestamp.
+  uint8_t m_retryNo;   //!< Retry number of RTS packet.
+
+};  // class UanHeaderRcRts
 
 /**
- * \class UanHeaderRcCtsGlobal
+ * \ingroup uan
+ *
+ * Cycle broadcast information.
  *
- * \brief Cycle broadcast information for
+ * This includes the rate number, retry rate and window time.
  */
-
-
 class UanHeaderRcCtsGlobal : public Header
 {
 public:
-  /**
-   * \brief Create UanHeaderRcCtsGlobal with fields zeroed out
-   */
+  /** Default constructor */
   UanHeaderRcCtsGlobal ();
   /**
-   * \brief Create object with given window time, time stamp, rate, and retry rate.
-   * \param wt Window time
-   * \param ts Timestamp
-   * \param rate Rate number
-   * \param retryRate  Retry rate value
+   * Constructor
+   *
+   * \param wt Window time.
+   * \param ts Timestamp.
+   * \param rate Rate number.
+   * \param retryRate  Retry rate value.
    */
   UanHeaderRcCtsGlobal (Time wt, Time ts, uint16_t rate, uint16_t retryRate);
+  /** Destructor */
   ~UanHeaderRcCtsGlobal ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \param rate Rate number corresponding to data rate of current cycle
+   * Set the rate number corresponding to data rate of current cycle.
+   * \param rate The rate number.
    */
   void SetRateNum (uint16_t rate);
   /**
-   * \param rate Retry rate number for current cycle
+   * Set the retry rate number for the current cycle.
+   * \param rate The retry rate number
    */
   void SetRetryRate (uint16_t rate);
   /**
-   * \param t Time duration following blocking time to allow RTS transmissions
+   * Set the window time (time duration following blocking time
+   * to allow RTS transmissions).
+   *
+   * \param t The window time.
    */
   void SetWindowTime (Time t);
 
   /**
-   * \param timeStamp Time of CTS transmission
+   * Set the CTS timestamp.
+   *
+   * \param timeStamp The time of CTS transmission.
    */
   void SetTxTimeStamp (Time timeStamp);
 
   /**
-   * \returns Rate # corresponding to data rate of current cycle
+   * Get the data rate number.
+   *
+   * \return The rate number.
    */
   uint16_t GetRateNum (void) const;
   /**
-   * \returns retry rate # of retry rate for current cycle
+   * Get the retry rate number.
+   *
+   * \return The retry rate number.
    */
   uint16_t GetRetryRate (void) const;
   /**
-   * \returns Time duration after blocking time allowed for RTS transmissions
+   * Get the window time (time duration following blocking time
+   * to allow RTS transmissions).
+   *
+   * \return The window time.
    */
   Time GetWindowTime (void) const;
   /**
-   * \returns Timestamp of CTS transmission
+   * Get the CTS transmit timestamp.
+   *
+   * \return The timestamp.
    */
   Time GetTxTimeStamp (void) const;
 
@@ -235,76 +303,106 @@
   virtual TypeId GetInstanceTypeId (void) const;
 
 private:
-  Time m_timeStampTx;
-  Time m_winTime;
-  uint16_t m_retryRate;
-  uint16_t m_rateNum;
-};
+  Time m_timeStampTx;    //!< Timestamp.
+  Time m_winTime;        //!< Window time.
+  uint16_t m_retryRate;  //!< Retry rate.
+  uint16_t m_rateNum;    //!< Rate number.
+
+};  // class UanHeaderRcCtsGlobal
+
 /**
- * \class UanHeaderRcCts
+ * \ingroup uan
  *
- * \brief CTS header
+ * CTS header
  *
  * Includes RTS RX time, CTS TX time, delay until TX, RTS blocking period,
  * RTS tx period, rate #, and retry rate #
  */
-
 class UanHeaderRcCts : public Header
 {
 public:
+  /** Default constructor */
   UanHeaderRcCts ();
   /**
-   * \param frameNo Resrvation frame # being cleared
-   * \param retryNo Retry # of received RTS packet
-   * \param rtsTs RX time of RTS packet at gateway
-   * \param delay Delay until transmission
-   * \param addr Destination of CTS packet
+   * Constructor
+   *
+   * \param frameNo Reservation frame # being cleared.
+   * \param retryNo Retry # of received RTS packet.
+   * \param rtsTs RX time of RTS packet at gateway.
+   * \param delay Delay until transmission.
+   * \param addr Destination of CTS packet.
    * \note Times are serialized, with ms precission, into 32 bit fields.
    */
   UanHeaderRcCts (uint8_t frameNo, uint8_t retryNo, Time rtsTs, Time delay, UanAddress addr);
+  /** Destructor */
   virtual ~UanHeaderRcCts ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \param frameNo Frame # of RTS being cleared
+   * Set the RTS frame number being cleared.
+   *
+   * \param frameNo The frame number.
    */
   void SetFrameNo (uint8_t frameNo);
   /**
-   * \param timeStamp Time of RTS reception
+   * Set the timestamp for RTS reception.
+   *
+   * \param timeStamp The timestamp.
    */
   void SetRtsTimeStamp (Time timeStamp);
   /**
-   * \param delay Time duration, from CTS TX, before first data frame arrival
+   * Set the time delay from CTS transmission to first data frame arrival.
+   *
+   * \param delay The delay time.
    */
   void SetDelayToTx (Time delay);
   /**
-   * \param no Retry number of RTS frame being cleared
+   * Set the retry number of the RTS frame being cleared.
+   *
+   * \param no The retry number.
    */
   void SetRetryNo (uint8_t no);
   /**
-   * \param addr Destination for scheduling info
+   * Set the destination address, for scheduling info.
+   *
+   * \param addr The destination address.
    */
   void SetAddress (UanAddress addr);
 
   /**
-   * \returns Frame # of RTS being cleared
+   * Get the frame number of the RTS being cleared.
+   *
+   * \return The frame number.
    */
   uint8_t GetFrameNo (void) const;
   /**
-   * \returns RX time of RTS being cleared
+   * Get the receive time of the RTS being cleared.
+   *
+   * \return The RX time.
    */
   Time GetRtsTimeStamp (void) const;
   /**
-   * \returns Delay from TX time of CTS packet until arrival of first data frame
+   * Get the time delay from TX time of CTS packet until
+   * arrival of first data frame.
+   *
+   * \return The delay time. 
    */
   Time GetDelayToTx (void) const;
   /**
-   * \returns Retry # of RTS packet being cleared
+   * Get the retry number of the RTS packet being cleared.
+   *
+   * \return The retry number
    */
   uint8_t GetRetryNo (void) const;
   /**
-   * \returns Destination for scheduling info
+   * Get the destination address, for scheduling info.
+   *
+   * \return The destination address.
    */
   UanAddress GetAddress (void) const;
 
@@ -316,44 +414,62 @@
   virtual TypeId GetInstanceTypeId (void) const;
 
 private:
-  uint8_t m_frameNo;
-  Time m_timeStampRts;
-  uint8_t m_retryNo;
-  Time m_delay;
-  UanAddress m_address;
-};
+  uint8_t m_frameNo;     //!< Reservation frame number being cleared.
+  Time m_timeStampRts;   //!< RX time of RTS packet at gateway.
+  uint8_t m_retryNo;     //!< Retry number of received RTS packet.
+  Time m_delay;          //!< Delay until transmission.
+  UanAddress m_address;  //!< Destination of CTS packet.
+
+};  // class UanHeaderRcCts
 
 /**
- * \class UanHeaderRcAck
- * \brief Header used for ACK packets by protocol ns3::UanMacRc
+ * \ingroup uan
+ *
+ * Header used for ACK packets by protocol UanMacRc
  */
 class UanHeaderRcAck : public Header
 {
 public:
+  /** Default constructor */
   UanHeaderRcAck ();
+  /** Destructor */
   virtual ~UanHeaderRcAck ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \param frameNo Frame # of reservation being acknowledged
+   * Set the frame number of the reservation being acknowledged.
+   *
+   * \param frameNo The frame number.
    */
   void SetFrameNo (uint8_t frameNo);
   /**
-   * \param frame Data frame # being nacked
+   * NACK a frame.
+   *
+   * \param frame The data frame number being NACKed.
    */
   void AddNackedFrame (uint8_t frame);
 
   /**
-   * \returns Set of nacked frames
+   * Get the set of NACK'ed frames.
+   *
+   * \return The set of NACK'ed frames.
    */
   const std::set<uint8_t> &GetNackedFrames (void) const;
   /**
-   * \returns Reservation frame # being acknowledged.
+   * Get the reservation frame number being ACKed.
+   *
+   * \return The frame number.
    */
   uint8_t GetFrameNo (void) const;
   /**
-   * \returns Number of data frames being NACKED
+   * Get the number of data frames being NACKed.
+   *
+   * \return The number of NACKed frames.
    */
   uint8_t GetNoNacks (void) const;
 
@@ -365,11 +481,11 @@
   virtual TypeId GetInstanceTypeId (void) const;
 
 private:
-  uint8_t m_frameNo;
-  std::set<uint8_t> m_nackedFrames;
+  uint8_t m_frameNo;                 //!< Next frame number.
+  std::set<uint8_t> m_nackedFrames;  //!< Marker for nacked frames.
 
-};
+};  // class UanHeaderRcAck
 
-}
+} // namespace ns3
 
 #endif /* UAN_HEADER_RC_H */
diff -Naur ns-3.18.1/src/uan/model/uan-mac-aloha.cc ns-3.19/src/uan/model/uan-mac-aloha.cc
--- ns-3.18.1/src/uan/model/uan-mac-aloha.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac-aloha.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,7 +32,8 @@
 namespace ns3
 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanMacAloha);
+NS_OBJECT_ENSURE_REGISTERED (UanMacAloha)
+  ;
 
 UanMacAloha::UanMacAloha ()
   : UanMac (),
diff -Naur ns-3.18.1/src/uan/model/uan-mac-aloha.h ns-3.19/src/uan/model/uan-mac-aloha.h
--- ns-3.18.1/src/uan/model/uan-mac-aloha.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac-aloha.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,22 +32,29 @@
 class UanTxMode;
 
 /**
- * \class UanMacAloha
- * \brief ALOHA MAC Protocol
+ * \ingroup uan
  *
- * The simplest MAC protocol for wireless networks.  Packets enqueued
- * are immediately transmitted.  This MAC attaches a UanHeaderCommon
- * to outgoing packets for address information.  (The type field is not used)
+ * ALOHA MAC Protocol, the simplest MAC protocol for wireless networks.
+ *
+ * Packets enqueued are immediately transmitted.  This MAC attaches
+ * a UanHeaderCommon to outgoing packets for address information.
+ * (The type field is not used)
  */
 class UanMacAloha : public UanMac
 {
 public:
+  /** Default constructor */
   UanMacAloha ();
+  /** Dummy destructor, see DoDispose. */
   virtual ~UanMacAloha ();
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
 
-  //Inheritted functions
+  // Inherited methods
   Address GetAddress (void);
   virtual void SetAddress (UanAddress addr);
   virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
@@ -55,41 +62,39 @@
   virtual void AttachPhy (Ptr<UanPhy> phy);
   virtual Address GetBroadcast (void) const;
   virtual void Clear (void);
-
- /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
-  *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
-  */
   int64_t AssignStreams (int64_t stream);
 
 private:
+  /** The MAC address. */
   UanAddress m_address;
+  /** PHY layer attached to this MAC. */
   Ptr<UanPhy> m_phy;
+  /** Forwarding up callback. */
   Callback<void, Ptr<Packet>, const UanAddress& > m_forUpCb;
+  /** Flag when we've been cleared. */
   bool m_cleared;
 
   /**
-   * \brief Receive packet from lower layer (passed to PHY as callback)
-   * \param pkt Packet being received
-   * \param sinr SINR of received packet
-   * \param txMode Mode of received packet
+   * Receive packet from lower layer (passed to PHY as callback).
+   *
+   * \param pkt Packet being received.
+   * \param sinr SINR of received packet.
+   * \param txMode Mode of received packet.
    */
   void RxPacketGood (Ptr<Packet> pkt, double sinr, UanTxMode txMode);
 
   /**
-   * \brief Packet received at lower layer in error
-   * \param pkt Packet received in error
-   * \param sinr SINR of received packet
+   * Packet received at lower layer in error.
+   *
+   * \param pkt Packet received in error.
+   * \param sinr SINR of received packet.
    */
   void RxPacketError (Ptr<Packet> pkt, double sinr);
 protected:
   virtual void DoDispose ();
-};
 
-}
+};  // class UanMacAloha
+
+} // namespace ns3
 
 #endif /* UAN_MAC_ALOHA_H */
diff -Naur ns-3.18.1/src/uan/model/uan-mac.cc ns-3.19/src/uan/model/uan-mac.cc
--- ns-3.18.1/src/uan/model/uan-mac.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanMac);
+NS_OBJECT_ENSURE_REGISTERED (UanMac)
+  ;
 
 TypeId UanMac::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/uan/model/uan-mac-cw.cc ns-3.19/src/uan/model/uan-mac-cw.cc
--- ns-3.18.1/src/uan/model/uan-mac-cw.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac-cw.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanMacCw);
+NS_OBJECT_ENSURE_REGISTERED (UanMacCw)
+  ;
 
 UanMacCw::UanMacCw ()
   : UanMac (),
@@ -80,23 +81,23 @@
     .SetParent<Object> ()
     .AddConstructor<UanMacCw> ()
     .AddAttribute ("CW",
-                   "The MAC parameter CW",
+                   "The MAC parameter CW.",
                    UintegerValue (10),
                    MakeUintegerAccessor (&UanMacCw::m_cw),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("SlotTime",
-                   "Time slot duration for MAC backoff",
+                   "Time slot duration for MAC backoff.",
                    TimeValue (MilliSeconds (20)),
                    MakeTimeAccessor (&UanMacCw::m_slotTime),
                    MakeTimeChecker ())
     .AddTraceSource ("Enqueue",
-                     "A packet arrived at the MAC for transmission",
+                     "A packet arrived at the MAC for transmission.",
                      MakeTraceSourceAccessor (&UanMacCw::m_enqueueLogger))
     .AddTraceSource ("Dequeue",
-                     "A was passed down to the PHY from the MAC",
+                     "A was passed down to the PHY from the MAC.",
                      MakeTraceSourceAccessor (&UanMacCw::m_dequeueLogger))
     .AddTraceSource ("RX",
-                     "A packet was destined for this MAC and was received",
+                     "A packet was destined for this MAC and was received.",
                      MakeTraceSourceAccessor (&UanMacCw::m_rxLogger))
 
   ;
diff -Naur ns-3.18.1/src/uan/model/uan-mac-cw.h ns-3.19/src/uan/model/uan-mac-cw.h
--- ns-3.18.1/src/uan/model/uan-mac-cw.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac-cw.h	2013-12-20 09:44:50.000000000 -0800
@@ -32,40 +32,57 @@
 namespace ns3 {
 
 /**
- * \class UanMacCw
- * \brief CW-MAC A MAC protocol similar in idea to the 802.11 DCF with constant backoff window
+ * \ingroup uan
+ *
+ * CW-MAC protocol, similar in idea to the 802.11 DCF with
+ * constant backoff window
  *
  * For more information on this MAC protocol, see:
  * Parrish, N.; Tracy, L.; Roy, S.; Arabshahi, P.; Fox, W.,
- * "System Design Considerations for Undersea Networks: Link and Multiple Access Protocols,"
- * Selected Areas in Communications, IEEE Journal on , vol.26, no.9, pp.1720-1730, December 2008
+ * "System Design Considerations for Undersea Networks: Link and
+ * Multiple Access Protocols," Selected Areas in Communications,
+ * IEEE Journal on , vol.26, no.9, pp.1720-1730, December 2008
  */
 class UanMacCw : public UanMac,
                  public UanPhyListener
 {
 public:
+  /** Default constructor */
   UanMacCw ();
+  /** Dummy destructor, DoDispose. */
   virtual ~UanMacCw ();
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \param cw Contention window size
+   * Set the contention window size.
+   *   
+   * \param cw Contention window size.
    */
   virtual void SetCw (uint32_t cw);
   /**
-   * \param duration Slot time duration
+   * Set the slot time duration.
+   *
+   * \param duration Slot time duration.
    */
   virtual void SetSlotTime (Time duration);
   /**
-   * \returns Contention window size
+   * Get the contention window size.
+   *
+   * \return Contention window size.
    */
   virtual uint32_t GetCw (void);
   /**
-   * \returns slot time duration
+   * Get the slot time duration.
+   *
+   * \return Slot time duration.
    */
   virtual Time GetSlotTime (void);
 
-  // Inherited methods
+  // Inherited methods from UanMac
   virtual Address GetAddress ();
   virtual void SetAddress (UanAddress addr);
   virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
@@ -73,71 +90,94 @@
   virtual void AttachPhy (Ptr<UanPhy> phy);
   virtual Address GetBroadcast (void) const;
   virtual void Clear (void);
+  int64_t AssignStreams (int64_t stream);
 
-  // PHY listeners
-  /// Function called by UanPhy object to notify of packet reception
+  // Inherited methods from UanPhyListener
   virtual void NotifyRxStart (void);
-  /// Function called by UanPhy object to notify of packet received successfully
   virtual void NotifyRxEndOk (void);
-  /// Function called by UanPhy object to notify of packet received in error
   virtual void NotifyRxEndError (void);
-  /// Function called by UanPhy object to notify of channel sensed busy
   virtual void NotifyCcaStart (void);
-  /// Function called by UanPhy object to notify of channel no longer sensed busy
   virtual void NotifyCcaEnd (void);
-  /// Function called by UanPhy object to notify of outgoing transmission start
   virtual void NotifyTxStart (Time duration);
 
- /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
-  *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
-  */
-  int64_t AssignStreams (int64_t stream);
 
 private:
+  /** Enum defining possible Phy states. */
   typedef enum {
-    IDLE, CCABUSY, RUNNING, TX
+    IDLE,     //!< Idle state.
+    CCABUSY,  //!< Channel busy.
+    RUNNING,  //!< Delay timer running.
+    TX        //!< Transmitting.
   } State;
 
+  /** Forwarding up callback. */
   Callback <void, Ptr<Packet>, const UanAddress& > m_forwardUpCb;
+  /** The MAC address. */
   UanAddress m_address;
+  /** PHY layer attached to this MAC. */
   Ptr<UanPhy> m_phy;
+  /** A packet destined for this MAC was received. */
   TracedCallback<Ptr<const Packet>, UanTxMode > m_rxLogger;
+  /** A packet arrived at the MAC for transmission. */
   TracedCallback<Ptr<const Packet>, uint16_t  > m_enqueueLogger;
+  /** A packet was passed down to the PHY from the MAC. */
   TracedCallback<Ptr<const Packet>, uint16_t  > m_dequeueLogger;
 
   // Mac parameters
-  uint32_t m_cw;
-  Time m_slotTime;
+  uint32_t m_cw;        //!< Contention window size.
+  Time m_slotTime;      //!< Slot time duration.
 
   // State variables
+  /** Time to send next packet. */
   Time m_sendTime;
+  /** Remaining delay until next send. */
   Time m_savedDelayS;
+  /** Next packet to send. */
   Ptr<Packet> m_pktTx;
+  /** Next packet protocol number (usage varies by MAC). */
   uint16_t m_pktTxProt;
+  /** Scheduled SendPacket event. */
   EventId m_sendEvent;
+  /** Scheduled EndTx event. */
   EventId m_txEndEvent;
+  /** Current state. */
   State m_state;
 
+  /** Flag when we've been cleared */
   bool m_cleared;
 
-  /// Provides uniform random variables.
+  /** Provides uniform random variable for contention window. */
   Ptr<UniformRandomVariable> m_rv;
 
+  /**
+   * Receive packet from lower layer (passed to PHY as callback).
+   *
+   * \param packet Packet being received.
+   * \param sinr SINR of received packet.
+   * \param mode Mode of received packet.
+   */
   void PhyRxPacketGood (Ptr<Packet> packet, double sinr, UanTxMode mode);
+  /**
+   * Packet received at lower layer in error.
+   *
+   * \param packet Packet received in error.
+   * \param sinr SINR of received packet.
+   */
   void PhyRxPacketError (Ptr<Packet> packet, double sinr);
+  /** Cancel SendEvent and save remaining delay. */
   void SaveTimer (void);
+  /** Schedule SendPacket after delay. */
   void StartTimer (void);
+  /** Send packet on PHY. */
   void SendPacket (void);
+  /** End TX state. */
   void EndTx (void);
+
 protected:
   virtual void DoDispose ();
-};
 
-}
+};  // class UanMacCw
+
+} // namespace ns3
 
 #endif /* UAN_MAC_CW_H */
diff -Naur ns-3.18.1/src/uan/model/uan-mac.h ns-3.19/src/uan/model/uan-mac.h
--- ns-3.18.1/src/uan/model/uan-mac.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac.h	2013-12-20 09:44:50.000000000 -0800
@@ -40,55 +40,69 @@
 
 
 /**
- * \class UanMac
+ * \ingroup uan
  *
- * \brief Virtual base class for all UAN MAC protocols
+ * Virtual base class for all UAN MAC protocols.
  */
 class UanMac : public Object
 {
 public:
-  static TypeId GetTypeId (void);
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+   static TypeId GetTypeId (void);
 
   /**
-   * \returns MAC Address
+   * Get the MAC Address.
+   *
+   * \return MAC Address.
    */
   virtual Address GetAddress (void) = 0;
 
   /**
-   * \param addr UanAddress for this MAC
+   * Set the address.
+   *
+   * \param addr UanAddress for this MAC.
    */
   virtual void SetAddress (UanAddress addr) = 0;
 
   /**
-   * Enqueue packet to be transmitted
-   * \param pkt Packet to be transmitted
-   * \param dest Destination address
-   * \param protocolNumber Protocol #.  Usage varies by MAC
+   * Enqueue packet to be transmitted.
+   *
+   * \param pkt Packet to be transmitted.
+   * \param dest Destination address.
+   * \param protocolNumber Protocol number.  Usage varies by MAC.
+   * \return True if packet was successfully enqueued.
    */
   virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber) = 0;
   /**
-   * \param cb  Callback to be called when a packet is forwarded up to higher layer
+   * Set the callback to forward packets up to higher layers.
+   * 
+   * \param cb The callback.
+   * \pname{packet} The packet.
+   * \pname{address} The source address.
    */
   virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb) = 0;
 
   /**
    * Attach PHY layer to this MAC.
+   *
    * Some MACs may be designed to work with multiple PHY
    * layers.  Others may only work with one.
    *
-   * \param phy Phy layer to attach to this MAC
-   *
+   * \param phy Phy layer to attach to this MAC.
    */
   virtual void AttachPhy (Ptr<UanPhy> phy) = 0;
 
   /**
-   * \returns Broadcast address
+   * Get the broadcast address.
+   *
+   * \return The broadcast address.
    */
   virtual Address GetBroadcast (void) const = 0;
 
-  /**
-   * Clears all pointer references
-   */
+  /** Clears all pointer references. */
   virtual void Clear (void) = 0;
 
  /**
@@ -96,13 +110,13 @@
   * used by this model.  Return the number of streams (possibly zero) that
   * have been assigned.
   *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
+  * \param stream First stream index to use.
+  * \return The number of stream indices assigned by this model.
   */
   virtual int64_t AssignStreams (int64_t stream) = 0;
 
-};
+};  // class UanMac
 
-}
+} // namespace ns3
 
 #endif /* UAN_MAC_H */
diff -Naur ns-3.18.1/src/uan/model/uan-mac-rc.cc ns-3.19/src/uan/model/uan-mac-rc.cc
--- ns-3.18.1/src/uan/model/uan-mac-rc.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac-rc.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,8 @@
 NS_LOG_COMPONENT_DEFINE ("UanMacRc");
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanMacRc);
+NS_OBJECT_ENSURE_REGISTERED (UanMacRc)
+  ;
 
 Reservation::Reservation ()
   : m_length (0),
@@ -210,53 +211,53 @@
     .SetParent<UanMac> ()
     .AddConstructor<UanMacRc> ()
     .AddAttribute ("RetryRate",
-                   "Number of retry attempts per second (of RTS/GWPING)",
+                   "Number of retry attempts per second (of RTS/GWPING).",
                    DoubleValue (1 / 5.0),
                    MakeDoubleAccessor (&UanMacRc::m_retryRate),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("MaxFrames",
-                   "Maximum number of frames to include in a single RTS",
+                   "Maximum number of frames to include in a single RTS.",
                    UintegerValue (1),
                    MakeUintegerAccessor (&UanMacRc::m_maxFrames),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("QueueLimit",
-                   "Maximum packets to queue at MAC",
+                   "Maximum packets to queue at MAC.",
                    UintegerValue (10),
                    MakeUintegerAccessor (&UanMacRc::m_queueLimit),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("SIFS",
-                   "Spacing to give between frames (this should match gateway)",
+                   "Spacing to give between frames (this should match gateway).",
                    TimeValue (Seconds (0.2)),
                    MakeTimeAccessor (&UanMacRc::m_sifs),
                    MakeTimeChecker ())
     .AddAttribute ("NumberOfRates",
-                   "Number of rate divisions supported by each PHY",
+                   "Number of rate divisions supported by each PHY.",
                    UintegerValue (0),
                    MakeUintegerAccessor (&UanMacRc::m_numRates),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("MinRetryRate",
-                   "Smallest allowed RTS retry rate",
+                   "Smallest allowed RTS retry rate.",
                    DoubleValue (0.01),
                    MakeDoubleAccessor (&UanMacRc::m_minRetryRate),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("RetryStep",
-                   "Retry rate increment",
+                   "Retry rate increment.",
                    DoubleValue (0.01),
                    MakeDoubleAccessor (&UanMacRc::m_retryStep),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("MaxPropDelay",
-                   "Maximum possible propagation delay to gateway",
+                   "Maximum possible propagation delay to gateway.",
                    TimeValue (Seconds (2)),
                    MakeTimeAccessor (&UanMacRc::m_learnedProp),
                    MakeTimeChecker ())
     .AddTraceSource ("Enqueue",
-                     "A  (data) packet arrived at MAC for transmission",
+                     "A  (data) packet arrived at MAC for transmission.",
                      MakeTraceSourceAccessor (&UanMacRc::m_enqueueLogger))
     .AddTraceSource ("Dequeue",
-                     "A  (data) packet was passed down to PHY from MAC",
+                     "A  (data) packet was passed down to PHY from MAC.",
                      MakeTraceSourceAccessor (&UanMacRc::m_dequeueLogger))
     .AddTraceSource ("RX",
-                     "A packet was destined for and received at this MAC layer",
+                     "A packet was destined for and received at this MAC layer.",
                      MakeTraceSourceAccessor (&UanMacRc::m_rxLogger))
   ;
   return tid;
diff -Naur ns-3.18.1/src/uan/model/uan-mac-rc-gw.cc ns-3.19/src/uan/model/uan-mac-rc-gw.cc
--- ns-3.18.1/src/uan/model/uan-mac-rc-gw.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac-rc-gw.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,14 +43,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanMacRcGw);
-
-bool
-operator < (UanAddress &a, UanAddress &b)
-{
-  return a.GetAsInt () < b.GetAsInt ();
-}
-
+NS_OBJECT_ENSURE_REGISTERED (UanMacRcGw)
+  ;
 
 UanMacRcGw::UanMacRcGw ()
   : UanMac (),
@@ -113,60 +107,60 @@
     .SetParent<UanMac> ()
     .AddConstructor<UanMacRcGw> ()
     .AddAttribute ("MaxReservations",
-                   "Maximum number of reservations to accept per cycle",
+                   "Maximum number of reservations to accept per cycle.",
                    UintegerValue (10),
                    MakeUintegerAccessor (&UanMacRcGw::m_maxRes),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("NumberOfRates",
-                   "Number of rates per Phy layer",
+                   "Number of rates per Phy layer.",
                    UintegerValue (1023),
                    MakeUintegerAccessor (&UanMacRcGw::m_numRates),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("MaxPropDelay",
-                   "Maximum propagation delay between gateway and non-gateway nodes",
+                   "Maximum propagation delay between gateway and non-gateway nodes.",
                    TimeValue (Seconds (2)),
                    MakeTimeAccessor (&UanMacRcGw::m_maxDelta),
                    MakeTimeChecker ())
     .AddAttribute ("SIFS",
-                   "Spacing between frames to account for timing error and processing delay",
+                   "Spacing between frames to account for timing error and processing delay.",
                    TimeValue (Seconds (0.2)),
                    MakeTimeAccessor (&UanMacRcGw::m_sifs),
                    MakeTimeChecker ())
     .AddAttribute ("NumberOfNodes",
-                   "Number of non-gateway nodes in this gateway's neighborhood",
+                   "Number of non-gateway nodes in this gateway's neighborhood.",
                    UintegerValue (10),
                    MakeUintegerAccessor (&UanMacRcGw::m_numNodes),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("MinRetryRate",
-                   "Smallest allowed RTS retry rate",
+                   "Smallest allowed RTS retry rate.",
                    DoubleValue (0.01),
                    MakeDoubleAccessor (&UanMacRcGw::m_minRetryRate),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("RetryStep",
-                   "Retry rate increment",
+                   "Retry rate increment.",
                    DoubleValue (0.01),
                    MakeDoubleAccessor (&UanMacRcGw::m_retryStep),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("TotalRate",
-                   "Total available channel rate in bps (for a single channel, without splitting reservation channel)",
+                   "Total available channel rate in bps (for a single channel, without splitting reservation channel).",
                    UintegerValue (4096),
                    MakeUintegerAccessor (&UanMacRcGw::m_totalRate),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("RateStep",
-                   "Increments available for rate assignment in bps",
+                   "Increments available for rate assignment in bps.",
                    UintegerValue (4),
                    MakeUintegerAccessor (&UanMacRcGw::m_rateStep),
                    MakeUintegerChecker<uint32_t> ())
     .AddAttribute ("FrameSize",
-                   "Size of data frames in bytes",
+                   "Size of data frames in bytes.",
                    UintegerValue (1000),
                    MakeUintegerAccessor (&UanMacRcGw::m_frameSize),
                    MakeUintegerChecker<uint32_t> ())
     .AddTraceSource ("RX",
-                     "A packet was destined for and received at this MAC layer",
+                     "A packet was destined for and received at this MAC layer.",
                      MakeTraceSourceAccessor (&UanMacRcGw::m_rxLogger))
     .AddTraceSource ("Cycle",
-                     "Trace cycle statistics",
+                     "Trace cycle statistics.",
                      MakeTraceSourceAccessor (&UanMacRcGw::m_cycleLogger))
 
   ;
diff -Naur ns-3.18.1/src/uan/model/uan-mac-rc-gw.h ns-3.19/src/uan/model/uan-mac-rc-gw.h
--- ns-3.18.1/src/uan/model/uan-mac-rc-gw.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac-rc-gw.h	2013-12-20 09:44:50.000000000 -0800
@@ -38,11 +38,9 @@
 class UanTxMode;
 
 /**
- * \class UanMacRcGw
- *
- * \brief Gateway side of RC-MAC
- *
+ * \ingroup uan
  *
+ * Gateway side of RC-MAC.
  *
  * This MAC protocol assumes a network topology where all traffic
  * is destined for a set of GW nodes which are connected via
@@ -56,16 +54,19 @@
  * lentracy@u.washington.edu
  * (This work is, as of yet, unpublished)
  */
-
 class UanMacRcGw : public UanMac
 {
 public:
-  UanMacRcGw ();
-  virtual ~UanMacRcGw ();
+  UanMacRcGw ();           //!< Constructor
+  virtual ~UanMacRcGw ();  //!< Dummy destructor, see DoDispose.
 
+  /**
+   * Register this type.
+   * \return The type ID.
+   */
   static TypeId GetTypeId (void);
 
-  // Inherited virtual functions
+  // Inherited methods
   virtual Address GetAddress (void);
   virtual void SetAddress (UanAddress addr);
   virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
@@ -73,103 +74,206 @@
   virtual void AttachPhy (Ptr<UanPhy> phy);
   virtual Address GetBroadcast (void) const;
   virtual void Clear (void);
-
- /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
-  *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
-  */
   int64_t AssignStreams (int64_t stream);
 
 private:
+  /** Gateway state. */
   enum State {
-    IDLE, INCYCLE, CTSING
+    IDLE,     //!< Initial idle state.
+    INCYCLE,  //!< Cycling through nodes.
+    CTSING    //!< Sending CTS.
   };
-  State m_state;
+  State m_state;  //!< Gateway processing state.
 
+  /**
+   * \ingroup uan
+   * Reservation request.
+   */
   struct Request
   {
-    uint8_t numFrames;
-    uint8_t frameNo;
-    uint8_t retryNo;
-    uint16_t length;
-    Time rxTime;
+    uint8_t numFrames;  //!< Number of frames.
+    uint8_t frameNo;    //!< Current frame number.
+    uint8_t retryNo;    //!< Retry number.
+    uint16_t length;    //!< Request header length.
+    Time rxTime;        //!< Time request received.
   };
 
+  /**
+   * \ingroup uan
+   * Packet ACK data.
+   */
   struct AckData
   {
-    uint8_t frameNo;
-    std::set<uint8_t> rxFrames;
-    uint8_t expFrames;
+    uint8_t frameNo;    //!< Frame number being ACK'ed.
+    std::set<uint8_t> rxFrames;  //!< Received frames.
+    uint8_t expFrames;  //!< Expected number of frames.
   };
+  /** Forwarding up callback. */
   Callback<void, Ptr<Packet>, const UanAddress& > m_forwardUpCb;
-  Ptr<UanPhy> m_phy;
-  UanAddress m_address;
-  Time m_maxDelta;
-  Time m_sifs;
-  uint32_t m_maxRes;
-  uint32_t m_numRates;
-  uint32_t m_rtsSize;
-  uint32_t m_ctsSizeN;
-  uint32_t m_ctsSizeG;
-  uint32_t m_ackSize;
-  uint16_t m_currentRetryRate;
-  uint32_t m_currentRateNum;
-  uint32_t m_numNodes;
-  uint32_t m_totalRate;
-  uint32_t m_rateStep;
-  uint32_t m_frameSize;
+  
+  Ptr<UanPhy> m_phy;            //!< PHY layer attached to this MAC.
+  UanAddress m_address;         //!< The MAC address.
+  Time m_maxDelta;              //!< Maximum propagation delay between gateway and non-gateway nodes .
+  Time m_sifs;                  //!< Spacing between frames to account for timing error and processing delay.
+  uint32_t m_maxRes;            //!< Maximum number of reservations to accept per cycle.
+  uint32_t m_numRates;          //!< Number of rates per Phy layer.
+  uint32_t m_rtsSize;           //!< Size of UanHeaderCommon and UanHeaderRcRts.
+  uint32_t m_ctsSizeN;          //!< Size of UanHeaderRcCts.
+  uint32_t m_ctsSizeG;          //!< Size of UanHeaderCommon and UanHeaderRcCtsGlobal.
+  uint32_t m_ackSize;           //!< Size of UanHeaderCommon and UanHeaderRcAck.
+  uint16_t m_currentRetryRate;  //!< Retry rate number for current cycle.
+  uint32_t m_currentRateNum;    //!< Rate number corresponding to data rate of current cycle.
+  uint32_t m_numNodes;          //!< Number of non-gateway nodes in this gateway's neighborhood.
+  uint32_t m_totalRate;         //!< Total available channel rate in bps (for a single channel, without splitting reservation channel).
+  uint32_t m_rateStep;          //!< Increments available for rate assignment in bps.
+  uint32_t m_frameSize;         //!< Size of data frames in bytes.
 
-  double m_minRetryRate;
-  double m_retryStep;
+  double m_minRetryRate;        //!< Smallest allowed RTS retry rate.
+  double m_retryStep;           //!< Retry rate increment.
 
+  /** Propagation delay to each node. */
   std::map<UanAddress, Time> m_propDelay;
 
+  /** AckData for each node. */
   std::map<UanAddress, AckData> m_ackData;
 
-
+  /** Request for each node. */
   std::map<UanAddress, Request> m_requests;
+  /** Queued request times. */
   std::set<std::pair<Time, UanAddress> > m_sortedRes;
 
+  /** Flag when we've been cleared. */
   bool m_cleared;
 
+  /** A packet was destined for and received at this MAC layer. */
   TracedCallback<Ptr<const Packet>, UanTxMode > m_rxLogger;
 
-  // Start time, min p-delay, reservations, frames, bytes, window size, ctl rate, retry rate
+  /**
+   * A packet was destined for and received at this MAC layer.
+   *
+   * \pname{Start time}
+   * \pname{min propagation delay}
+   * \pname{reservations}
+   * \pname{frames}
+   * \pname{bytes}
+   * \pname{window size}
+   * \pname{CTS rate}
+   * \pname{retry rate}
+   */
   TracedCallback<Time, Time, uint32_t, uint32_t, double, uint32_t, double> m_cycleLogger;
 
+  /**
+   * PHY recieve ok callback.
+   *
+   * \param pkt The Packet to receive
+   * \param sinr The SINR on the channel
+   * \param mode The transmission mode
+   */
   void ReceivePacket (Ptr<Packet> pkt, double sinr, UanTxMode mode);
+
+  /** Cycle through pending requests. */
   void StartCycle (void);
+  /** End cycle by scheduling pending ACKs. */
   void EndCycle (void);
+  /**
+   * Send packet on PHY.
+   *
+   * \param pkt The Packet.
+   * \param rate The UanTxMode number, m_currentRateNum.
+   */
   void SendPacket (Ptr<Packet> pkt, uint32_t rate);
+  /** Set state to INCYCLE. */
   void CycleStarted (void);
+  /**
+   * PHY receive error callback.
+   *
+   * \param pkt The failed packet.
+   * \param sinr The SINR value on the channel.
+   */
   void ReceiveError (Ptr<Packet> pkt, double sinr);
 
   // Stuff for computing exp throughput
-  double ComputeAlpha (uint32_t totalFrames, uint32_t totalBytes, uint32_t n, uint32_t a, double deltaK);
+  /**
+   * Compute alpha parameter.
+   *
+   * \param totalFrames Total number of frames in m_requests.
+   * \param totalBytes Total number of bytes in m_requests.
+   * \param n Number of nodes.
+   * \param a m_maxRes, or optimal A value.
+   * \param deltaK Propagation delay.
+   * \return Alpha parameter.
+   */
+   double ComputeAlpha (uint32_t totalFrames, uint32_t totalBytes, uint32_t n, uint32_t a, double deltaK);
+  /**
+   * Get the expected propagation delay to each node.
+   *
+   * \return Vector of expected propagation delays.
+   */
   std::vector<double>  GetExpPdk (void);
+  /**
+   * Throughput for \pname{a} reservations with framesize \pname{ld},
+   * given expected delays exppdk.
+   *
+   * \param a Number of reservations.
+   * \param ld Frame size.
+   * \param exppdk Expected delays, given by GetExpPdk.
+   * \return Expected throughput.
+   */
   double ComputeExpS (uint32_t a, uint32_t ld, std::vector<double> exppdk);
+  /**
+   * Throughput for \pname{a} reservations with framesize \pname{ld}.
+   *
+   * \param a Number of reservations.
+   * \param ld Frame size.
+   * \return Expected throughput.
+   */
   double ComputeExpS (uint32_t a, uint32_t ld);
+  /**
+   * Index to the k'th expected delay among n nodes.
+   *
+   * \param n Number of nodes.
+   * \param k Target index.
+   * \return The expected index.
+   */
   uint32_t CompExpMinIndex (uint32_t n, uint32_t k);
+  /**
+   * Numeric function.
+   *
+   * \param a Number of reservations.
+   * \param n number of nodes.
+   * \param k K'th node.
+   * \return Value.
+   */
   double ComputePiK (uint32_t a, uint32_t n, uint32_t k);
+  /**
+   * Numeric function.
+   *
+   * \param n Number of nodes.
+   * \param a Number of reservations.
+   * \param ldlh Sum of common header length and frame size.
+   * \param deltaK Result of GetExpPdk
+   * \return value.
+   */
   double ComputeExpBOverA (uint32_t n, uint32_t a, uint32_t ldlh, std::vector<double> deltaK);
+  /**
+   * Binomial coefficient.
+   *
+   * \param n Pool size.
+   * \param k Selection size.
+   * \return Binomial coefficient n choose k.
+   */
   uint64_t NchooseK (uint32_t n, uint32_t k);
+  /**
+   * Compute the optimum maximum number of reservations to accept per cycle.
+   *
+   * \return Optimum number.
+   */
   uint32_t FindOptA (void);
 protected:
   virtual void DoDispose ();
 
-};
-
-/**
- * \brief Defined for use in UanMacRcGw
- * \param a Address to compare
- * \param b Address to compare
- */
-bool operator < (UanAddress &a, UanAddress &b);
+};  // class UanMacRcGw
 
-}
+} // namespace ns3
 
 #endif /* UAN_MAC_RC_GW_H */
diff -Naur ns-3.18.1/src/uan/model/uan-mac-rc.h ns-3.19/src/uan/model/uan-mac-rc.h
--- ns-3.18.1/src/uan/model/uan-mac-rc.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-mac-rc.h	2013-12-20 09:44:50.000000000 -0800
@@ -46,84 +46,110 @@
 
 
 /**
- * \class Reservation
- * \brief Stores reservation info for use in scheduling data channel by reservation channel MAC
+ * Stores reservation info for use in scheduling data channel
+ * by reservation channel MAC.
  */
 class Reservation
 {
 public:
-  /**
-   * \brief Create empty object with default values
-   */
+  /** Default constructor. */
   Reservation ();
   /**
-   * \brief Create Reservation object with given packet list, frame number and max packets
-   * \param list List of packets for assigned to reservation
-   * \param frameNo Frame number of reservation transmission
-   * \param maxPkts Maximum number of packets to assign to reservation from packet list (0 = no maximum)
+   * Create Reservation object with given packet list,
+   * frame number and max packets.
+   * 
+   * \param list List of packets for assigned to reservation.
+   * \param frameNo Frame number of reservation transmission.
+   * \param maxPkts Maximum number of packets to assign to reservation
+   *   from packet list (0 = no maximum).
    */
   Reservation (std::list<std::pair <Ptr<Packet>, UanAddress > > &list, uint8_t frameNo, uint32_t maxPkts = 0);
+  /** Destructor */
   ~Reservation ();
   /**
-   * \returns number of frames in reservation
+   * Get the number of frames in this Reservation.
+   *
+   * \return Number of frames.
    */
   uint32_t GetNoFrames () const;
   /**
-   * \returns total byte length of reservation (sum of all packets with headers)
+   * Get the total length of the Reservation.
+   *
+   * This is the sum of packets with headers.
+   *
+   * \return Total length, in bytes.
    */
   uint32_t GetLength () const;
   /**
-   * \returns reference to list of packets in this reservation
+   * Get the list of packets.
+   *
+   * \return The list of packets.
    */
   const std::list<std::pair <Ptr<Packet>, UanAddress > > &GetPktList (void) const;
   /**
-   * \returns Frame number of reservation
+   * Get the frame number.
+   * 
+   * \return The frame number.
    */
   uint8_t GetFrameNo () const;
   /**
-   * \returns Retry number of reservation
+   * Get the retry number.
+   *
+   * \return The retry number.
    */
   uint8_t GetRetryNo () const;
   /**
-   * \returns Timestamp nth RTS send for this reservation
-   * \param n Timestamp for retry number n to return
+   * Get the timestamp for the n'th RTS.
+   *
+   * \param n Which retry number.
+   * \return N'th timestamp.
    */
   Time GetTimestamp (uint8_t n) const;
-  /**
-   * \returns True if reservation packets have been transmitted
-   */
+
+  /** \return True if reservation packets have been transmitted. */
   bool IsTransmitted () const;
   /**
-   * \param fn Frame number to set reservation to
+   * Set the frame number.
+   *
+   * \param fn The frame number.
    */
   void SetFrameNo (uint8_t fn);
   /**
-   * \param t Time of latest RTS send
+   * Set the time of the latest RTS sent.
+   *
+   * \param t RTS timestamp.
    */
   void AddTimestamp (Time t);
-  /**
-   * \brief Increments retry count by 1
-   */
+  /** Increment the retry count. */
   void IncrementRetry ();
   /**
-   * \param t True if resevation has been transmitted
-   * \brief Sets reservation transmitted state
+   * Set the reservation transmitted state.
+   * 
+   * \param t True if resevation has been transmitted.
    */
   void SetTransmitted (bool t = true);
+
 private:
+  /** Queued packets for each address. */
   std::list<std::pair <Ptr<Packet>, UanAddress > > m_pktList;
+  /** Total length of queued packets. */
   uint32_t m_length;
+  /** Frame number. */
   uint8_t m_frameNo;
+  /** Timestamps for each retry. */
   std::vector<Time> m_timestamp;
+  /** Number of retries. */
   uint8_t m_retryNo;
+  /** Has this reservation been transmitted. */
   bool m_transmitted;
 
-};
+};  // class Reservation
 
 
 /**
- * \class UanMacRc
- * \brief Non-gateway node MAC for reservation channel MAC protocol
+ * \ingroup uan
+ *
+ * Non-gateway node MAC for reservation channel MAC protocol.
  *
  * This MAC protocol assumes a network topology where all traffic
  * is destined for a set of GW nodes which are connected via
@@ -137,15 +163,26 @@
 class UanMacRc : public UanMac
 {
 public:
+  /** Packet types. */
   enum {
-    TYPE_DATA, TYPE_GWPING, TYPE_RTS, TYPE_CTS, TYPE_ACK
+    TYPE_DATA,    //!< Data.
+    TYPE_GWPING,  //!< Gateway ping.
+    TYPE_RTS,     //!< RTS.
+    TYPE_CTS,     //!< CTS.
+    TYPE_ACK      //!< ACK.
   };
+  /** Default constructor */
   UanMacRc ();
+  /** Dummy destructor, DoDispose. */
   virtual ~UanMacRc ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
-  // Inherited virtual functions
+  // Inherited methods
   virtual Address GetAddress (void);
   virtual void SetAddress (UanAddress addr);
   virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
@@ -153,78 +190,127 @@
   virtual void AttachPhy (Ptr<UanPhy> phy);
   virtual Address GetBroadcast (void) const;
   virtual void Clear (void);
-
- /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
-  *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
-  */
   int64_t AssignStreams (int64_t stream);
 
 private:
+  /** MAC state. */
   enum State {
-    UNASSOCIATED, GWPSENT, IDLE, RTSSENT, DATATX
+    UNASSOCIATED,  //!< Initial state.
+    GWPSENT,       //!< Associated with gateway.
+    IDLE,          //!< Finished scheduling packet sends.
+    RTSSENT,       //!< RTS just sent.
+    DATATX         //!< (Unused).
   };
 
-  State m_state;
-  bool m_rtsBlocked;
+  State m_state;           //!< MAC state.
+  bool m_rtsBlocked;       //!< RTS blocked while processing ACK.
 
-  EventId m_startAgain;
-  UanAddress m_address;
-  double m_retryRate;
-  UanAddress m_assocAddr;
-  Ptr<UanPhy> m_phy;
-  uint32_t m_numRates;
-  uint32_t m_currentRate;
-  uint32_t m_maxFrames;
-  uint32_t m_queueLimit;
-  uint8_t m_frameNo;
-  Time m_sifs;
-  Time m_learnedProp;
-
-  double m_minRetryRate;
-  double m_retryStep;
+  EventId m_startAgain;    //!< (Unused).
+  UanAddress m_address;    //!< My addrese.s
+  double m_retryRate;      //!< Number of retry attempts per second (of RTS/GWPING.
+  UanAddress m_assocAddr;  //!< Next hop address.
+  Ptr<UanPhy> m_phy;       //!< PHY layer attached to this MAC.
+  uint32_t m_numRates;     //!< Number of rates per Phy layer.
+  uint32_t m_currentRate;  //!< Rate number corresponding to data rate of current cycle.
+  uint32_t m_maxFrames;    //!< Maximum number of frames to include in a single RTS.
+  uint32_t m_queueLimit;   //!< Maximum packets to queue at MAC.
+  uint8_t m_frameNo;       //!< Current frame number.
+  Time m_sifs;             //!< Spacing between frames to account for timing error and processing delay.
+  Time m_learnedProp;      //!< Propagation delay to gateway.
+
+  double m_minRetryRate;   //!< Smallest allowed RTS retry rate.
+  double m_retryStep;      //!< Retry rate increment.
 
-  uint32_t m_ctsSizeN;
-  uint32_t m_ctsSizeG;
+  uint32_t m_ctsSizeN;     //!< Size of UanHeaderRcCts.
+  uint32_t m_ctsSizeG;     //!< Size of UanHeaderCommon and UanHeaderRcCtsGlobal.
 
-  bool m_cleared;
+  bool m_cleared;          //!< Flag when we've been cleared.
 
+  /** Pending packets. */
   std::list<std::pair <Ptr<Packet>, UanAddress > > m_pktQueue;
+  /** List of scheduled reservations. */
   std::list<Reservation> m_resList;
 
+  /** The callback to forward a packet up to higher layer. */
   Callback<void, Ptr<Packet>, const UanAddress& > m_forwardUpCb;
 
+  /** A packet was destined for and received at this MAC layer. */
   TracedCallback<Ptr<const Packet>, UanTxMode > m_rxLogger;
+  /** A packet arrived at the MAC for transmission. */
   TracedCallback<Ptr<const Packet>, uint16_t > m_enqueueLogger;
+  /** A was passed down to the PHY from the MAC. */
   TracedCallback<Ptr<const Packet>, uint16_t > m_dequeueLogger;
 
+  /** The RTS event. */
   EventId m_rtsEvent;
-  void ReceiveOkFromPhy (Ptr<Packet>, double sinr, UanTxMode mode);
-
+  /**
+   * PHY receive ok Callback.
+   *
+   * \param pkt The received packet.
+   * \param sinr (Unused).
+   * \param mode Modulation mode.
+   */
+  void ReceiveOkFromPhy (Ptr<Packet> pkt, double sinr, UanTxMode mode);
+  /** Associate with a gateway by sending the first GWPING. */
   void Associate (void);
+  /** Periodically retry association. */
   void AssociateTimeout (void);
+  /** Send RTS packet. */
   void SendRts (void);
+  /** Retry RTS. */
   void RtsTimeout (void);
+  /**
+   * Create the RTS header from a Reservation.
+   *
+   * \param res The Reservation.
+   * \return A RTS header.
+   */
   UanHeaderRcRts CreateRtsHeader (const Reservation &res);
+  /**
+   * Schedule Packet sends.
+   *
+   * \param ctsh The CTS header identifying the frame number and delay.
+   * \param ctsg The CTS global header giving the transmit time stamp base.
+   * \param ctsBytes Number of bytes total in CTS packet.
+   */
   void ScheduleData (const UanHeaderRcCts &ctsh, const UanHeaderRcCtsGlobal &ctsg, uint32_t ctsBytes);
+  /**
+   * Process a received ACK.
+   *
+   * \param ack The ACK packet.
+   */
   void ProcessAck (Ptr<Packet> ack);
+  /**
+   * Send on packet on the PHY.
+   *
+   * \param pkt The packet.
+   * \param rate The transmission rate.
+   */
   void SendPacket (Ptr<Packet> pkt, uint32_t rate);
+  /**
+   * Check that PHY is ok:
+   *   not CTS or ACK
+   *   not to my address
+   * \return True if PHY is ok.
+   */
   bool IsPhy1Ok (void);
+  /** Callback to block RST. */
   void BlockRtsing (void);
 
+  /**
+   * Global count of calls to Associate, AssociateTimeout,
+   * SendRts, and RtsTimeout.
+   */
   static uint32_t m_cntrlSends;
 
-  /// Provides exponential random variables.
+  /** Provides exponential random variables. */
   Ptr<ExponentialRandomVariable> m_ev;
 
 protected:
   void DoDispose ();
-};
 
-}
+};  // class UanMacRc
+
+} // namespace ns3
 
 #endif /* UAN_MAC_RC_H */
diff -Naur ns-3.18.1/src/uan/model/uan-net-device.cc ns-3.19/src/uan/model/uan-net-device.cc
--- ns-3.18.1/src/uan/model/uan-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (UanNetDevice)
+  ;
 
 UanNetDevice::UanNetDevice ()
   : NetDevice (),
@@ -92,7 +93,7 @@
 
   static TypeId tid = TypeId ("ns3::UanNetDevice")
     .SetParent<NetDevice> ()
-    .AddAttribute ("Channel", "The channel attached to this device",
+    .AddAttribute ("Channel", "The channel attached to this device.",
                    PointerValue (),
                    MakePointerAccessor (&UanNetDevice::DoGetChannel, &UanNetDevice::SetChannel),
                    MakePointerChecker<UanChannel> ())
diff -Naur ns-3.18.1/src/uan/model/uan-net-device.h ns-3.19/src/uan/model/uan-net-device.h
--- ns-3.18.1/src/uan/model/uan-net-device.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -41,69 +41,87 @@
 
 /**
  * \ingroup uan
- * \class UanNetDevice
  *
- * \brief Net device for UAN models
+ * Net device for UAN models.
  */
 class UanNetDevice : public NetDevice
 {
 public:
-  /**
-   * \brief UanPhyList is defined as a standard template lib list of UanPhy objects
-   */
+  /** List of UanPhy objects. */
   typedef std::list<Ptr<UanPhy> > UanPhyList;
-  /**
-   * \brief UanTransducerList is a standard template lib list of UanTransducer objects
-   */
+  /** List of UanTransducer objects. */
   typedef std::list<Ptr<UanTransducer> > UanTransducerList;
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
+  /** Default constructor */
   UanNetDevice ();
+  /** Dummy destructor, DoDispose. */
   virtual ~UanNetDevice ();
 
   /**
-   * \param mac Set MAC layer for this device
+   * Set the MAC layer for this device.
+   * 
+   * \param mac The MAC layer.
    */
   void SetMac (Ptr<UanMac> mac);
 
   /**
-   * \param phy Set PHY layer for this device
+   * Set the Phy layer for this device.
+   *   
+   * \param phy The PHY layer.
    */
   void SetPhy (Ptr<UanPhy> phy);
 
   /**
-   * \param channel The channel this device is attached to
+   * Attach a channel.
+   *
+   * \param channel The channel.
    */
   void SetChannel (Ptr<UanChannel> channel);
 
   /**
-   * \returns MAC this device is using
+   * Get the MAC used by this device.
+   *
+   * \return The MAC.
    */
   Ptr<UanMac> GetMac (void) const;
 
   /**
-   * \returns PHY this device is using
+   * Get the Phy used by this device.
+   *
+   * \return The Phy.
    */
   Ptr<UanPhy> GetPhy (void) const;
 
   /**
-   * \returns Transducer in net device
+   * Get the transducer associated with this device.
+   *
+   * \return The transducer.
    */
   Ptr<UanTransducer> GetTransducer (void) const;
   /**
-   * \param trans Transducer to use in this net device
+   * Set the transdcuer used by this device.
+   *
+   * \param trans The transducer.
    */
   void SetTransducer (Ptr<UanTransducer> trans);
 
-  /**
-   * Clears all pointer references
-   */
+  /** Clear all pointer references. */
   void Clear (void);
 
+  /**
+   * Set the Phy SLEEP mode.
+   *
+   * \param sleep SLEEP on or off.
+   */
   void SetSleepMode (bool sleep);
 
-  // Purely virtual functions from base class
+  // Inherited methods
   virtual void SetIfIndex (const uint32_t index);
   virtual uint32_t GetIfIndex (void) const;
   virtual Ptr<Channel> GetChannel (void) const;
@@ -128,31 +146,44 @@
   virtual bool SupportsSendFrom (void) const;
   virtual void AddLinkChangeCallback (Callback<void> callback);
   virtual void SetAddress (Address address);
+
 private:
+  /**
+   * Forward the packet to a higher level, set with SetReceiveCallback.
+   *
+   * \param pkt The packet.
+   * \param src The source address.
+   */
   virtual void ForwardUp (Ptr<Packet> pkt, const UanAddress &src);
+  
+  /** \return The channel attached to this device. */
   Ptr<UanChannel> DoGetChannel (void) const;
 
-  Ptr<UanTransducer> m_trans;
-  Ptr<Node> m_node;
-  Ptr<UanChannel> m_channel;
-  Ptr<UanMac> m_mac;
-  Ptr<UanPhy> m_phy;
-
-  std::string m_name;
-  uint32_t m_ifIndex;
-  uint16_t m_mtu;
-  bool m_linkup;
-  TracedCallback<> m_linkChanges;
-  ReceiveCallback m_forwardUp;
+  Ptr<UanTransducer> m_trans;      //!< The Transducer attached to this device.
+  Ptr<Node> m_node;                //!< The node hosting this device.
+  Ptr<UanChannel> m_channel;       //!< The channel attached to this device.
+  Ptr<UanMac> m_mac;               //!< The MAC layer attached to this device.
+  Ptr<UanPhy> m_phy;               //!< The PHY layer attached to this device.
+
+  //unused: std::string m_name;
+  uint32_t m_ifIndex;              //!< The interface index of this device.
+  uint16_t m_mtu;                  //!< The device MTU value, in bytes.
+  bool m_linkup;                   //!< The link state, true if up.
+  TracedCallback<> m_linkChanges;  //!< Callback to invoke when the link state changes to UP.
+  ReceiveCallback m_forwardUp;     //!< The receive callback.
 
+  /** Trace source triggered when forwarding up received payload from the MAC layer. */
   TracedCallback<Ptr<const Packet>, UanAddress> m_rxLogger;
+  /** Trace source triggered when sending to the MAC layer */
   TracedCallback<Ptr<const Packet>, UanAddress> m_txLogger;
 
+  /** Flag when we've been cleared. */
   bool m_cleared;
 
 protected:
   virtual void DoDispose ();
-};
+
+};  // class UanNetDevice
 
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/uan/model/uan-noise-model.cc ns-3.19/src/uan/model/uan-noise-model.cc
--- ns-3.18.1/src/uan/model/uan-noise-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-noise-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanNoiseModel);
+NS_OBJECT_ENSURE_REGISTERED (UanNoiseModel)
+  ;
 
 TypeId UanNoiseModel::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/uan/model/uan-noise-model-default.cc ns-3.19/src/uan/model/uan-noise-model-default.cc
--- ns-3.18.1/src/uan/model/uan-noise-model-default.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-noise-model-default.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanNoiseModelDefault);
+NS_OBJECT_ENSURE_REGISTERED (UanNoiseModelDefault)
+  ;
 
 UanNoiseModelDefault::UanNoiseModelDefault ()
 {
@@ -42,11 +43,11 @@
   static TypeId tid = TypeId ("ns3::UanNoiseModelDefault")
     .SetParent<Object> ()
     .AddConstructor<UanNoiseModelDefault> ()
-    .AddAttribute ("Wind", "Wind speed in m/s",
+    .AddAttribute ("Wind", "Wind speed in m/s.",
                    DoubleValue (1),
                    MakeDoubleAccessor (&UanNoiseModelDefault::m_wind),
                    MakeDoubleChecker<double> (0))
-    .AddAttribute ("Shipping", "Shipping contribution to noise between 0 and 1",
+    .AddAttribute ("Shipping", "Shipping contribution to noise between 0 and 1.",
                    DoubleValue (0),
                    MakeDoubleAccessor (&UanNoiseModelDefault::m_shipping),
                    MakeDoubleChecker<double> (0,1))
diff -Naur ns-3.18.1/src/uan/model/uan-noise-model-default.h ns-3.19/src/uan/model/uan-noise-model-default.h
--- ns-3.18.1/src/uan/model/uan-noise-model-default.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-noise-model-default.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,16 +28,19 @@
 namespace ns3 {
 
 /**
- * \class UanNoiseModelDefault
+ * \ingroup uan
  *
- * Standard ambient acoustic noise model.  See attributes for parameters
+ * Standard ambient acoustic noise model.
+ *
+ * See attributes for parameters
  *
  * This class returns ambient noise by following the algorithm given in
- * Harris, A. F. and Zorzi, M. 2007. Modeling the underwater acoustic channel in ns2.
- * In Proceedings of the 2nd international Conference on Performance Evaluation
- * Methodologies and Tools (Nantes, France, October 22 - 27, 2007). ValueTools,
- * vol. 321. ICST (Institute for Computer Sciences Social-Informatics and
- * Telecommunications Engineering), ICST, Brussels, Belgium, 1-8.
+ * Harris, A. F. and Zorzi, M. 2007. Modeling the underwater acoustic
+ * channel in ns2. In Proceedings of the 2nd international Conference
+ * on Performance Evaluation Methodologies and Tools (Nantes, France,
+ * October 22 - 27, 2007). ValueTools, vol. 321. ICST (Institute for
+ * Computer Sciences Social-Informatics and Telecommunications Engineering),
+ * ICST, Brussels, Belgium, 1-8.
  *
  * Which uses the noise model also given in the book
  * "Principles of Underwater Sound" by Urick
@@ -45,22 +48,24 @@
 class UanNoiseModelDefault : public UanNoiseModel
 {
 public:
-  UanNoiseModelDefault ();
-  virtual ~UanNoiseModelDefault ();
+  UanNoiseModelDefault ();           //!< Default constructor.
+  virtual ~UanNoiseModelDefault ();  //!< Dummy destructor, DoDispose.
 
-  static TypeId GetTypeId (void);
   /**
-   * \returns Noise power in dB re 1uPa/Hz
-   * \param fKhz Frequency in kHz
+   * Register this type.
+   * \return The TypeId.
    */
+  static TypeId GetTypeId (void);
+
+  // Inherited methods
   virtual double GetNoiseDbHz (double fKhz) const;
 
 private:
-  double m_wind;
-  double m_shipping;
+  double m_wind;      //!< Wind speed in m/s.
+  double m_shipping;  //!< Shipping contribution to noise between 0 and 1.
 
-};
+};  // class UanNoiseModelDefault
 
-}
+} // namespace ns3
 
 #endif /* UAN_NOISE_MODEL_DEFAULT_H */
diff -Naur ns-3.18.1/src/uan/model/uan-noise-model.h ns-3.19/src/uan/model/uan-noise-model.h
--- ns-3.18.1/src/uan/model/uan-noise-model.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-noise-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -25,24 +25,34 @@
 
 namespace ns3 {
 
+/**
+ * \ingroup uan
+ *
+ * UAN Noise Model base class.
+ */
 class UanNoiseModel : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
-   * \param fKhz Frequency in kHz
-   * \returns Noise power in dB re 1uPa/Hz
+   * Compute the noise power at a given frequency.
+   *
+   * \param fKhz Frequency in kHz.
+   * \return Noise power in dB re 1uPa/Hz.
    */
   virtual double GetNoiseDbHz (double fKhz) const = 0;
 
-  /**
-   * Clears all pointer references
-   */
+  /** Clear all pointer references. */
   virtual void Clear (void);
 
   virtual void DoDispose (void);
-};
+
+};  // class UanNoiseModel
 
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/uan/model/uan-phy.cc ns-3.19/src/uan/model/uan-phy.cc
--- ns-3.18.1/src/uan/model/uan-phy.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinr);
+NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinr)
+  ;
 
 TypeId UanPhyCalcSinr::GetTypeId (void)
 {
@@ -43,7 +44,8 @@
   Object::DoDispose ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (UanPhyPer);
+NS_OBJECT_ENSURE_REGISTERED (UanPhyPer)
+  ;
 
 TypeId UanPhyPer::GetTypeId (void)
 {
@@ -64,29 +66,30 @@
   Object::DoDispose ();
 }
 
-NS_OBJECT_ENSURE_REGISTERED (UanPhy);
+NS_OBJECT_ENSURE_REGISTERED (UanPhy)
+  ;
 
 TypeId UanPhy::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::UanPhy")
     .SetParent<Object> ()
     .AddTraceSource ("PhyTxBegin",
-                     "Trace source indicating a packet has begun transmitting over the channel medium",
+                     "Trace source indicating a packet has begun transmitting over the channel medium.",
                      MakeTraceSourceAccessor (&UanPhy::m_phyTxBeginTrace))
     .AddTraceSource ("PhyTxEnd",
                      "Trace source indicating a packet has been completely transmitted over the channel.",
                    MakeTraceSourceAccessor (&UanPhy::m_phyTxEndTrace))
     .AddTraceSource ("PhyTxDrop",
-                     "Trace source indicating a packet has been dropped by the device during transmission",
+                     "Trace source indicating a packet has been dropped by the device during transmission.",
                      MakeTraceSourceAccessor (&UanPhy::m_phyTxDropTrace))
     .AddTraceSource ("PhyRxBegin",
-                     "Trace source indicating a packet has begun being received from the channel medium by the device",
+                     "Trace source indicating a packet has begun being received from the channel medium by the device.",
                      MakeTraceSourceAccessor (&UanPhy::m_phyRxBeginTrace))
     .AddTraceSource ("PhyRxEnd",
-                     "Trace source indicating a packet has been completely received from the channel medium by the device",
+                     "Trace source indicating a packet has been completely received from the channel medium by the device.",
                      MakeTraceSourceAccessor (&UanPhy::m_phyRxEndTrace))
     .AddTraceSource ("PhyRxDrop",
-                     "Trace source indicating a packet has been dropped by the device during reception",
+                     "Trace source indicating a packet has been dropped by the device during reception.",
                      MakeTraceSourceAccessor (&UanPhy::m_phyRxDropTrace))
   ;
   return tid;
diff -Naur ns-3.18.1/src/uan/model/uan-phy-dual.cc ns-3.19/src/uan/model/uan-phy-dual.cc
--- ns-3.18.1/src/uan/model/uan-phy-dual.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-phy-dual.cc	2013-12-20 09:44:50.000000000 -0800
@@ -41,8 +41,10 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanPhyDual);
-NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrDual);
+NS_OBJECT_ENSURE_REGISTERED (UanPhyDual)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrDual)
+  ;
 
 UanPhyCalcSinrDual::UanPhyCalcSinrDual ()
 {
@@ -160,73 +162,73 @@
     .SetParent<UanPhy> ()
     .AddConstructor<UanPhyDual> ()
     .AddAttribute  ("CcaThresholdPhy1",
-                    "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy1",
+                    "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy1.",
                     DoubleValue (10),
                     MakeDoubleAccessor (&UanPhyDual::GetCcaThresholdPhy1, &UanPhyDual::SetCcaThresholdPhy1),
                     MakeDoubleChecker<double> ())
     .AddAttribute ("CcaThresholdPhy2",
-                   "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy2",
+                   "Aggregate energy of incoming signals to move to CCA Busy state dB of Phy2.",
                    DoubleValue (10),
                    MakeDoubleAccessor (&UanPhyDual::GetCcaThresholdPhy2, &UanPhyDual::SetCcaThresholdPhy2),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("TxPowerPhy1",
-                   "Transmission output power in dB of Phy1",
+                   "Transmission output power in dB of Phy1.",
                    DoubleValue (190),
                    MakeDoubleAccessor (&UanPhyDual::GetTxPowerDbPhy1, &UanPhyDual::SetTxPowerDbPhy1),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("TxPowerPhy2",
-                   "Transmission output power in dB of Phy2",
+                   "Transmission output power in dB of Phy2.",
                    DoubleValue (190),
                    MakeDoubleAccessor (&UanPhyDual::GetTxPowerDbPhy2, &UanPhyDual::SetTxPowerDbPhy2),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("RxGainPhy1",
-                   "Gain added to incoming signal at receiver of Phy1",
+                   "Gain added to incoming signal at receiver of Phy1.",
                    DoubleValue (0),
                    MakeDoubleAccessor (&UanPhyDual::GetRxGainDbPhy1, &UanPhyDual::SetRxGainDbPhy1),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("RxGainPhy2",
-                   "Gain added to incoming signal at receiver of Phy2",
+                   "Gain added to incoming signal at receiver of Phy2.",
                    DoubleValue (0),
                    MakeDoubleAccessor (&UanPhyDual::GetRxGainDbPhy2, &UanPhyDual::SetRxGainDbPhy2),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("SupportedModesPhy1",
-                   "List of modes supported by Phy1",
+                   "List of modes supported by Phy1.",
                    UanModesListValue (UanPhyGen::GetDefaultModes ()),
                    MakeUanModesListAccessor (&UanPhyDual::GetModesPhy1, &UanPhyDual::SetModesPhy1),
                    MakeUanModesListChecker () )
     .AddAttribute ("SupportedModesPhy2",
-                   "List of modes supported by Phy2",
+                   "List of modes supported by Phy2.",
                    UanModesListValue (UanPhyGen::GetDefaultModes ()),
                    MakeUanModesListAccessor (&UanPhyDual::GetModesPhy2, &UanPhyDual::SetModesPhy2),
                    MakeUanModesListChecker () )
     .AddAttribute ("PerModelPhy1",
-                   "Functor to calculate PER based on SINR and TxMode for Phy1",
+                   "Functor to calculate PER based on SINR and TxMode for Phy1.",
                    PointerValue (CreateObject<UanPhyPerGenDefault> ()),
                    MakePointerAccessor (&UanPhyDual::GetPerModelPhy1, &UanPhyDual::SetPerModelPhy1),
                    MakePointerChecker<UanPhyPer> ())
     .AddAttribute ("PerModelPhy2",
-                   "Functor to calculate PER based on SINR and TxMode for Phy2",
+                   "Functor to calculate PER based on SINR and TxMode for Phy2.",
                    PointerValue (CreateObject<UanPhyPerGenDefault> ()),
                    MakePointerAccessor (&UanPhyDual::GetPerModelPhy2, &UanPhyDual::SetPerModelPhy2),
                    MakePointerChecker<UanPhyPer> ())
     .AddAttribute ("SinrModelPhy1",
-                   "Functor to calculate SINR based on pkt arrivals and modes for Phy1",
+                   "Functor to calculate SINR based on pkt arrivals and modes for Phy1.",
                    PointerValue (CreateObject<UanPhyCalcSinrDual> ()),
                    MakePointerAccessor (&UanPhyDual::GetSinrModelPhy1, &UanPhyDual::SetSinrModelPhy1),
                    MakePointerChecker<UanPhyCalcSinr> ())
     .AddAttribute ("SinrModelPhy2",
-                   "Functor to calculate SINR based on pkt arrivals and modes for Phy2",
+                   "Functor to calculate SINR based on pkt arrivals and modes for Phy2.",
                    PointerValue (CreateObject<UanPhyCalcSinrDual> ()),
                    MakePointerAccessor (&UanPhyDual::GetSinrModelPhy2, &UanPhyDual::SetSinrModelPhy2),
                    MakePointerChecker<UanPhyCalcSinr> ())
     .AddTraceSource ("RxOk",
-                     "A packet was received successfully",
+                     "A packet was received successfully.",
                      MakeTraceSourceAccessor (&UanPhyDual::m_rxOkLogger))
     .AddTraceSource ("RxError",
-                     "A packet was received unsuccessfully",
+                     "A packet was received unsuccessfully.",
                      MakeTraceSourceAccessor (&UanPhyDual::m_rxErrLogger))
     .AddTraceSource ("Tx",
-                     "Packet transmission beginning",
+                     "Packet transmission beginning.",
                      MakeTraceSourceAccessor (&UanPhyDual::m_txLogger))
 
   ;
diff -Naur ns-3.18.1/src/uan/model/uan-phy-dual.h ns-3.19/src/uan/model/uan-phy-dual.h
--- ns-3.18.1/src/uan/model/uan-phy-dual.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-phy-dual.h	2013-12-20 09:44:50.000000000 -0800
@@ -33,8 +33,7 @@
 
 
 /**
- * \class UanPhyCalcSinrDual
- * \brief Default SINR model for UanPhyDual
+ * Default SINR model for UanPhyDual
  *
  * Considers interfering packet power as additional ambient noise only
  * if there is overlap in frequency band as found from supplied UanTxMode.
@@ -43,9 +42,17 @@
 class UanPhyCalcSinrDual : public UanPhyCalcSinr
 {
 public:
+  /** Constructor */
   UanPhyCalcSinrDual ();
+  /** Destructor */
   virtual ~UanPhyCalcSinrDual ();
+  
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
+
   virtual double CalcSinrDb (Ptr<Packet> pkt,
                              Time arrTime,
                              double rxPowerDb,
@@ -54,10 +61,13 @@
                              UanPdp pdp,
                              const UanTransducer::ArrivalList &arrivalList
                              ) const;
-};
+
+};  // class UanPhyCalcSinrDual
 
 /**
- * \class UanPhyDual
+ * \ingroup uan
+ *
+ * Two channel Phy.
  *
  * A class that wraps two generic UAN Phy layers (UanPhyGen) into a single PHY.
  * This is used to simulate two receivers (and transmitters) that use
@@ -72,20 +82,28 @@
 class UanPhyDual : public UanPhy
 {
 public:
+  /** Constructor */
   UanPhyDual ();
+  /** Dummy destructor \see DoDispose */
   virtual ~UanPhyDual ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId ();
 
+  // Inherited methods:
   virtual void SetEnergyModelCallback (DeviceEnergyModel::ChangeStateCallback callback);
   virtual void EnergyDepletionHandler (void);
   virtual void SendPacket (Ptr<Packet> pkt, uint32_t modeNum);
 
   /**
-   * \brief Register a class to receive phy state change notifications
-   * \param listener Class derived from UanPhyListener to receive notifications
+   * Register a UanPhyListener to be notified of common UanPhy events.
+   *
+   * \param listener New listener to register.
    *
-   * Note that, from UanPhyDual, you may receive duplicate
+   * \note You may receive duplicate
    * messages as underneath there are two generic phys here.
    * Each will notify of state changes independently.
    */
@@ -95,7 +113,6 @@
   virtual void SetReceiveErrorCallback (RxErrCallback cb);
   virtual void SetRxGainDb (double gain);
   virtual void SetTxPowerDb (double txpwr);
-  /** \deprecated Look at PER Functor attribute */
   virtual void SetRxThresholdDb (double thresh) NS_DEPRECATED;
   virtual void SetCcaThresholdDb (double thresh);
   virtual double GetRxGainDb (void);
@@ -120,179 +137,155 @@
   virtual uint32_t GetNModes (void);
   virtual UanTxMode GetMode (uint32_t n);
   virtual void Clear (void);
+  virtual void SetSleepMode (bool sleep)
+  {
+    /// \todo This method has to be implemented
+  }
+  int64_t AssignStreams (int64_t stream);
+  Ptr<Packet> GetPacketRx (void) const;
+  
 
-  /**
-   * /returns True if Phy1 is Idle
-   */
+  /** \copydoc UanPhy::IsStateIdle */
   bool IsPhy1Idle (void);
-  /**
-   * /returns True if Phy2 is Idle
-   */
+  /** \copydoc UanPhy::IsStateIdle */
   bool IsPhy2Idle (void);
-  /**
-   * /returns True if Phy1 is currently in RX mode
-   */
+  /** \copydoc UanPhy::IsStateRx */
   bool IsPhy1Rx (void);
-  /**
-   * /returns True if Phy2 is currently in RX mode
-   */
+  /** \copydoc UanPhy::IsStateRx */
   bool IsPhy2Rx (void);
-  /**
-   * /returns True if Phy1 is in TX mode
-   */
+  /** \copydoc UanPhy::IsStateTx */
   bool IsPhy1Tx (void);
-  /**
-   * /returns True if Phy2 is in TX mode
-   */
+  /** \copydoc UanPhy::IsStateTx */
   bool IsPhy2Tx (void);
 
   // Attribute getters and setters
-  /**
-   * \returns Clear channel assessment threshold of Phy1
-   */
+  /** \copydoc ns3::UanPhy::GetCcaThresholdDb() */
   double GetCcaThresholdPhy1 (void) const;
-  /**
-   * \returns Clear channel assessment threshold of Phy2
-   */
+  /** \copydoc UanPhy::GetCcaThresholdDb() */
   double GetCcaThresholdPhy2 (void) const;
-  /**
-   * \param thresh Signal power threshold in dB to set Phy1 to
-   */
+  /** \copydoc UanPhy::SetCcaThresholdDb */
   void SetCcaThresholdPhy1 (double thresh);
-  /**
-   * \param thresh Signal power threshold in dB to set Phy2 to
-   */
+  /** \copydoc UanPhy::SetCcaThresholdDb */
   void SetCcaThresholdPhy2 (double thresh);
 
-  /**
-   * \returns Current TX power setting of Phy 1 in dB
-   */
+  /** \copydoc UanPhy::GetTxPowerDb */
   double GetTxPowerDbPhy1 (void) const;
-  /**
-   * \returns Current TX power setting of Phy 2 in dB
-   */
+  /** \copydoc UanPhy::GetTxPowerDb */
   double GetTxPowerDbPhy2 (void) const;
-  /**
-   * \returns TX power setting of Phy1 in dB
-   */
-  void SetTxPowerDbPhy1 (double);
-  /**
-   * \returns TX power setting of Phy2 in dB
-   */
-  void SetTxPowerDbPhy2 (double);
+  /** \copydoc UanPhy::SetTxPowerDb */
+  void SetTxPowerDbPhy1 (double txpwr);
+  /** \copydoc UanPhy::SetTxPowerDb */
+  void SetTxPowerDbPhy2 (double txpwr);
 
-  /**
-   * \returns RX gain of Phy1 in dB
-   */
+  /** \copydoc UanPhy::GetRxGainDb */
   double GetRxGainDbPhy1 (void) const;
-  /**
-   * \returns RX gain of Phy2 in dB
-   */
+  /** \copydoc UanPhy::GetRxGainDb */
   double GetRxGainDbPhy2 (void) const;
-  /**
-   * \param gain value in dB to apply to RX gain of Phy1
-   */
+  /** \copydoc UanPhy::SetRxGainDb */
   void SetRxGainDbPhy1 (double gain);
-  /**
-   * \param gain value in dB to apply to RX gain of Phy2
-   */
+  /** \copydoc UanPhy::SetRxGainDb */
   void SetRxGainDbPhy2 (double gain);
 
   /**
-   * \returns List of available modes on Phy1
+   * Get the list of available modes.
+   *
+   * \return The mode list.
    */
   UanModesList GetModesPhy1 (void) const;
-  /**
-   * \returns List of available modes on Phy2
-   */
+  /** \copydoc GetModesPhy1 */
   UanModesList GetModesPhy2 (void) const;
+
   /**
-   * \param modes List of modes to use on Phy1 (index corresponds to mode #)
+   * Set the available modes.
+   * 
+   * \param modes List of modes.
    */
   void SetModesPhy1 (UanModesList modes);
-  /**
-   * \param modes List of modes to use on Phy2 (index corresponds to mode #)
-   */
+  /** \copydoc SetModesPhy1 */
   void SetModesPhy2 (UanModesList modes);
 
   /**
-   * \returns Ptr to PER model for Phy1
+   * Get the error probability model.
+   *
+   * \return The error model.
    */
   Ptr<UanPhyPer> GetPerModelPhy1 (void) const;
-  /**
-   * \returns Ptr to PER model for Phy2
-   */
+  /** \copydoc GetPerModelPhy1() */
   Ptr<UanPhyPer> GetPerModelPhy2 (void) const;
+
   /**
-   * \param per Ptr to PER model to use on Phy1
+   * Set the error probability model.
+   *
+   * \param per The error model.
    */
   void SetPerModelPhy1 (Ptr<UanPhyPer> per);
-  /**
-   * \param per Ptr to PER model to use on Phy2
-   */
+  /** \copydoc SetPerModelPhy1 */
   void SetPerModelPhy2 (Ptr<UanPhyPer> per);
 
   /**
-   * \returns Ptr to SINR model for Phy1
+   * Get the SINR calculator.
+   *
+   * \return The SINR calculator.
    */
   Ptr<UanPhyCalcSinr> GetSinrModelPhy1 (void) const;
-  /**
-   * \returns Ptr to SINR model for Phy2
-   */
+  /** \copydoc GetSinrModelPhy1 */
   Ptr<UanPhyCalcSinr> GetSinrModelPhy2 (void) const;
+  
   /**
-   * \param calcSinr Ptr to SINR model to use on Phy1
+   * Set the SINR calculator.
+   *
+   * \param calcSinr The SINR calculator.
    */
   void SetSinrModelPhy1 (Ptr<UanPhyCalcSinr> calcSinr);
-  /**
-   * \param calcSinr Ptr to SINR model to use on Phy2
-   */
+  /** \copydoc SetSinrModelPhy1 */
   void SetSinrModelPhy2 (Ptr<UanPhyCalcSinr> calcSinr);
 
-  virtual void SetSleepMode (bool sleep)
-  {
-    /// \todo This method has to be implemented
-  }
-
-  /**
-   * \returns Packet currently being received on Phy1 (Null Ptr if none)
-   */
+  
+  /** \copydoc UanPhy::GetPacketRx */
   Ptr<Packet> GetPhy1PacketRx (void) const;
-  /**
-   * \returns Packet currently being received on Phy2 (Null Ptr if none)
-   */
+  /** \copydoc UanPhy::GetPacketRx */
   Ptr<Packet> GetPhy2PacketRx (void) const;
-  /**
-   * \returns Packet currenty being received on Phy1 (Null Ptr if none)
-   */
-  Ptr<Packet> GetPacketRx (void) const;
 
- /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
-  *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
-  */
-  int64_t AssignStreams (int64_t stream);
 
 private:
+  /** First Phy layer. */
   Ptr<UanPhy> m_phy1;
+  /** Second Phy layer. */
   Ptr<UanPhy> m_phy2;
+
+  /** A packet was received successfully. */
   TracedCallback<Ptr<const Packet>, double, UanTxMode > m_rxOkLogger;
+  /** A packet was received unsuccessfully. */
   TracedCallback<Ptr<const Packet>, double, UanTxMode > m_rxErrLogger;
+  /** A packet was sent from this Phy. */
   TracedCallback<Ptr<const Packet>, double, UanTxMode > m_txLogger;
+  /** Callback when packet received without errors. */
   RxOkCallback m_recOkCb;
+  /** Callback when packet received with errors. */
   RxErrCallback m_recErrCb;
 
 
+  /**
+   * Handle callback and logger for packets received without error.
+   *
+   * \param pkt The packet.
+   * \param sinr The SINR.
+   * \param mode The channel mode.
+   */
   void RxOkFromSubPhy (Ptr<Packet> pkt, double sinr, UanTxMode mode);
+  /**
+   * Handle callback and logger for packets received with error.
+   *
+   * \param pkt The packet.
+   * \param sinr The SINR.
+   */
   void RxErrFromSubPhy (Ptr<Packet> pkt, double sinr);
+  
 protected:
   virtual void DoDispose ();
-};
 
-}
+};  // class UanPhyDual
+
+} // namespace ns3
 
 #endif /* UAN_PHY_DUAL_H */
diff -Naur ns-3.18.1/src/uan/model/uan-phy-gen.cc ns-3.19/src/uan/model/uan-phy-gen.cc
--- ns-3.18.1/src/uan/model/uan-phy-gen.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-phy-gen.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,11 +40,16 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanPhyGen);
-NS_OBJECT_ENSURE_REGISTERED (UanPhyPerGenDefault);
-NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrDefault);
-NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrFhFsk);
-NS_OBJECT_ENSURE_REGISTERED (UanPhyPerUmodem);
+NS_OBJECT_ENSURE_REGISTERED (UanPhyGen)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanPhyPerGenDefault)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrDefault)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanPhyCalcSinrFhFsk)
+  ;
+NS_OBJECT_ENSURE_REGISTERED (UanPhyPerUmodem)
+  ;
 
 
 /*************** UanPhyCalcSinrDefault definition *****************/
@@ -111,7 +116,7 @@
     .SetParent<Object> ()
     .AddConstructor<UanPhyCalcSinrFhFsk> ()
     .AddAttribute ("NumberOfHops",
-                   "Number of frequencies in hopping pattern",
+                   "Number of frequencies in hopping pattern.",
                    UintegerValue (13),
                    MakeUintegerAccessor (&UanPhyCalcSinrFhFsk::m_hops),
                    MakeUintegerChecker<uint32_t> ())
@@ -216,7 +221,7 @@
   static TypeId tid = TypeId ("ns3::UanPhyPerGenDefault")
     .SetParent<Object> ()
     .AddConstructor<UanPhyPerGenDefault> ()
-    .AddAttribute ("Threshold", "SINR cutoff for good packet reception",
+    .AddAttribute ("Threshold", "SINR cutoff for good packet reception.",
                    DoubleValue (8),
                    MakeDoubleAccessor (&UanPhyPerGenDefault::m_thresh),
                    MakeDoubleChecker<double> ());
@@ -432,48 +437,48 @@
     .SetParent<UanPhy> ()
     .AddConstructor<UanPhyGen> ()
     .AddAttribute ("CcaThreshold",
-                   "Aggregate energy of incoming signals to move to CCA Busy state dB",
+                   "Aggregate energy of incoming signals to move to CCA Busy state dB.",
                    DoubleValue (10),
                    MakeDoubleAccessor (&UanPhyGen::m_ccaThreshDb),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("RxThreshold",
-                   "Required SNR for signal acquisition in dB",
+                   "Required SNR for signal acquisition in dB.",
                    DoubleValue (10),
                    MakeDoubleAccessor (&UanPhyGen::m_rxThreshDb),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("TxPower",
-                   "Transmission output power in dB",
+                   "Transmission output power in dB.",
                    DoubleValue (190),
                    MakeDoubleAccessor (&UanPhyGen::m_txPwrDb),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("RxGain",
-                   "Gain added to incoming signal at receiver",
+                   "Gain added to incoming signal at receiver.",
                    DoubleValue (0),
                    MakeDoubleAccessor (&UanPhyGen::m_rxGainDb),
                    MakeDoubleChecker<double> ())
     .AddAttribute ("SupportedModes",
-                   "List of modes supported by this PHY",
+                   "List of modes supported by this PHY.",
                    UanModesListValue (UanPhyGen::GetDefaultModes ()),
                    MakeUanModesListAccessor (&UanPhyGen::m_modes),
                    MakeUanModesListChecker () )
     .AddAttribute ("PerModel",
-                   "Functor to calculate PER based on SINR and TxMode",
+                   "Functor to calculate PER based on SINR and TxMode.",
                    PointerValue (CreateObject<UanPhyPerGenDefault> ()),
                    MakePointerAccessor (&UanPhyGen::m_per),
                    MakePointerChecker<UanPhyPer> ())
     .AddAttribute ("SinrModel",
-                   "Functor to calculate SINR based on pkt arrivals and modes",
+                   "Functor to calculate SINR based on pkt arrivals and modes.",
                    PointerValue (CreateObject<UanPhyCalcSinrDefault> ()),
                    MakePointerAccessor (&UanPhyGen::m_sinr),
                    MakePointerChecker<UanPhyCalcSinr> ())
     .AddTraceSource ("RxOk",
-                     "A packet was received successfully",
+                     "A packet was received successfully.",
                      MakeTraceSourceAccessor (&UanPhyGen::m_rxOkLogger))
     .AddTraceSource ("RxError",
-                     "A packet was received unsuccessfully",
+                     "A packet was received unsuccessfully.",
                      MakeTraceSourceAccessor (&UanPhyGen::m_rxErrLogger))
     .AddTraceSource ("Tx",
-                     "Packet transmission beginning",
+                     "Packet transmission beginning.",
                      MakeTraceSourceAccessor (&UanPhyGen::m_txLogger))
   ;
   return tid;
diff -Naur ns-3.18.1/src/uan/model/uan-phy-gen.h ns-3.19/src/uan/model/uan-phy-gen.h
--- ns-3.18.1/src/uan/model/uan-phy-gen.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-phy-gen.h	2013-12-20 09:44:50.000000000 -0800
@@ -33,59 +33,93 @@
 namespace ns3 {
 
 /**
- * \class UanPhyPerGenDefault
- * \brief Default Packet Error Rate calculator for UanPhyGen
+ * \ingroup uan
+ *
+ * Default Packet Error Rate calculator for UanPhyGen
+ *
  * Considers no error if SINR is > user defined threshold
  * (configured by an attribute).
  */
 class UanPhyPerGenDefault : public UanPhyPer
 {
 public:
+  /** Constructor */
   UanPhyPerGenDefault ();
+  /** Destructor */
   virtual ~UanPhyPerGenDefault ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
+  
   virtual double CalcPer (Ptr<Packet> pkt, double sinrDb, UanTxMode mode);
 private:
-  double m_thresh;
+  
+  double m_thresh;  //!< SINR threshold.
 
-};
+};  // class UanPhyPerGenDefault
 
+  
 /**
- * \class UanPhyPerUmodem
- * \brief Packet error rate calculation assuming WHOI Micromodem like PHY
- * Calculates PER assuming rate 1/2 convolutional code with constraint length 9
- * with soft decision viterbi decoding and a CRC capable of correcting 1 bit error
+ * \ingroup uan
+ *
+ * Packet error rate calculation assuming WHOI Micromodem-like PHY.
+ *
+ * Calculates PER assuming rate 1/2 convolutional code with
+ * constraint length 9 with soft decision viterbi decoding and
+ * a CRC capable of correcting 1 bit error.
  */
 class UanPhyPerUmodem : public UanPhyPer
 {
 public:
+  /** Constructor */
   UanPhyPerUmodem ();
+  /** Destructor */
   virtual ~UanPhyPerUmodem ();
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
+   * Calculate the packet error probability based on
+   * SINR at the receiver and a tx mode.
    *
    * This implementation uses calculations
    * for binary FSK modulation coded by a rate 1/2 convolutional code
    * with constraint length = 9 and a viterbi decoder and finally a CRC capable
    * of correcting one bit error.  These equations can be found in
-   * the book, Digital Communications, by Proakis (Any version I think)
+   * the book, Digital Communications, by Proakis (any version I think).
    *
-   * \param pkt Packet which is under consideration
-   * \param sinrDb SINR at receiver
-   * \param mode TX mode used to transmit packet
-   * \returns Probability of packet error
+   * \param pkt Packet which is under consideration.
+   * \param sinrDb SINR at receiver.
+   * \param mode TX mode used to transmit packet.
+   * \return Probability of packet error.
    */
   virtual double CalcPer (Ptr<Packet> pkt, double sinrDb, UanTxMode mode);
+
 private:
+  /**
+   * Binomial coefficient
+   *
+   * \param n Pool size.
+   * \param k Number of draws.
+   * \return Binomial coefficient n choose k.
+   */
   double NChooseK (uint32_t n, uint32_t k);
 
-};
+};  // class UanPhyPerUmodem
+
+
 /**
- * \class UanPhyCalcSinrDefault
- * \brief Default SINR calculator for UanPhyGen
+ * \ingroup uan
+ *
+ * Default SINR calculator for UanPhyGen.
+ *
  * The default ignores mode data and assumes that all rxpower transmitted is
  * captured by the receiver, and that all signal power associated with
  * interfering packets affects SINR identically to additional ambient noise.
@@ -94,21 +128,31 @@
 {
 
 public:
+  /** Constructor */
   UanPhyCalcSinrDefault ();
+  /** Destructor */
   virtual ~UanPhyCalcSinrDefault ();
+  
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
+  
   /**
+   * Calculate the SINR value for a packet.
+   *
    * This implementation simply adds all arriving signal power
    * and assumes it acts identically to additional noise.
    *
-   * \param pkt Packet which is under consideration
-   * \param arrTime Arrival time of packet pkt
-   * \param rxPowerDb Received signal power at receiver
-   * \param ambNoiseDb Ambient channel noise in dB re 1 uPa
-   * \param mode TX mode used to transmit packet
-   * \param pdp Power delay profile of arriving packet pkt
-   * \param arrivalList List of other, simultaneously arriving packets
-   * \returns Probability of packet error
+   * \param pkt Packet to calculate SINR for.
+   * \param arrTime Arrival time of pkt.
+   * \param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
+   * \param ambNoiseDb Ambient channel noise in dB re 1 uPa.
+   * \param mode TX Mode of pkt.
+   * \param pdp  Power delay profile of pkt.
+   * \param arrivalList  List of interfering arrivals given from Transducer.
+   * \return The SINR in dB re 1 uPa.
    */
   virtual double CalcSinrDb (Ptr<Packet> pkt,
                              Time arrTime,
@@ -118,11 +162,14 @@
                              UanPdp pdp,
                              const UanTransducer::ArrivalList &arrivalList
                              ) const;
-};
+
+};  // class UanPhyCalcSinrDefault
+
 
 /**
- * \class UanPhyCalcSinrFhFsk
- * \brief WHOI Micromodem like FH-FSK model
+ * \ingroup uan
+ *
+ * WHOI Micromodem like FH-FSK model.
  *
  * Model of interference calculation for FH-FSK wherein all nodes
  * use an identical hopping pattern.  In this case, there is an (M-1)*SymbolTime
@@ -134,9 +181,17 @@
 {
 
 public:
+  /** Constructor */
   UanPhyCalcSinrFhFsk ();
+  /** Destructor */
   virtual ~UanPhyCalcSinrFhFsk ();
+  
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
+
   virtual double CalcSinrDb (Ptr<Packet> pkt,
                              Time arrTime,
                              double rxPowerDb,
@@ -146,12 +201,15 @@
                              const UanTransducer::ArrivalList &arrivalList
                              ) const;
 private:
-  uint32_t m_hops;
-};
+  uint32_t m_hops;  //!< Number of hops.
+
+};  // class UanPhyCalcSinrFhFsk
+
 
 /**
- * \class UanPhyGen
- * \brief Generic PHY model
+ * \ingroup uan
+ *
+ * Generic PHY model.
  *
  * This is a generic PHY class.  SINR and PER information
  * are controlled via attributes.  By adapting the SINR
@@ -161,14 +219,25 @@
 class UanPhyGen : public UanPhy
 {
 public:
+  /** Constructor */
   UanPhyGen ();
+  /** Dummy destructor, see DoDispose */
   virtual ~UanPhyGen ();
   /**
-   * \returns Default TX modes of UanPhyGen
+   * Get the default transmission modes.
+   *
+   * \return The default mode list.
    */
   static UanModesList GetDefaultModes (void);
 
+  
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
   static TypeId GetTypeId (void);
+
+  // Inherited methods
   virtual void SetEnergyModelCallback (DeviceEnergyModel::ChangeStateCallback cb);
   virtual void EnergyDepletionHandler (void);
   virtual void SendPacket (Ptr<Packet> pkt, uint32_t modeNum);
@@ -203,76 +272,134 @@
   virtual UanTxMode GetMode (uint32_t n);
   virtual Ptr<Packet> GetPacketRx (void) const;
   virtual void Clear (void);
-
   virtual void SetSleepMode (bool sleep);
-
- /**
-  * Assign a fixed random variable stream number to the random variables
-  * used by this model.  Return the number of streams (possibly zero) that
-  * have been assigned.
-  *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
-  */
   int64_t AssignStreams (int64_t stream);
 
 private:
+  /** List of Phy Listeners. */
   typedef std::list<UanPhyListener *> ListenerList;
 
-  UanModesList m_modes;
+  UanModesList m_modes;             //!< List of modes supported by this PHY.
 
-  State m_state;
-  ListenerList m_listeners;
-  RxOkCallback m_recOkCb;
-  RxErrCallback m_recErrCb;
-  Ptr<UanChannel> m_channel;
-  Ptr<UanTransducer> m_transducer;
-  Ptr<UanNetDevice> m_device;
-  Ptr<UanMac> m_mac;
-  Ptr<UanPhyPer> m_per;
-  Ptr<UanPhyCalcSinr> m_sinr;
-
-  double m_rxGainDb;
-  double m_txPwrDb;
-  double m_rxThreshDb;
-  double m_ccaThreshDb;
-
-  Ptr<Packet> m_pktRx;
-  double m_minRxSinrDb;
-  double m_rxRecvPwrDb;
-  Time m_pktRxArrTime;
-  UanPdp m_pktRxPdp;
-  UanTxMode m_pktRxMode;
+  State m_state;                    //!< Phy state.
+  ListenerList m_listeners;         //!< List of listeners.
+  RxOkCallback m_recOkCb;           //!< Callback for packets received without error.
+  RxErrCallback m_recErrCb;         //!< Callback for packets received with errors.
+  Ptr<UanChannel> m_channel;        //!< Attached channel.
+  Ptr<UanTransducer> m_transducer;  //!< Associated transducer.
+  Ptr<UanNetDevice> m_device;       //!< Device hosting this Phy.
+  Ptr<UanMac> m_mac;                //!< MAC layer.
+  Ptr<UanPhyPer> m_per;             //!< Error model.
+  Ptr<UanPhyCalcSinr> m_sinr;       //!< SINR calculator.
+
+  double m_rxGainDb;                //!< Receive gain.
+  double m_txPwrDb;                 //!< Transmit power.
+  double m_rxThreshDb;              //!< Receive SINR threshold.
+  double m_ccaThreshDb;             //!< CCA busy threshold.
+
+  Ptr<Packet> m_pktRx;              //!< Received packet.
+  double m_minRxSinrDb;             //!< Minimum receive SINR during packet reception.
+  double m_rxRecvPwrDb;             //!< Receiver power.
+  Time m_pktRxArrTime;              //!< Packet arrival time.
+  UanPdp m_pktRxPdp;                //!< Power delay profile of pakket.
+  UanTxMode m_pktRxMode;            //!< Packet transmission mode at receiver.
 
-  bool m_cleared;
-  bool m_disabled;
+  bool m_cleared;                   //!< Flag when we've been cleared.
+  bool m_disabled;                  //!< Energy depleted. 
 
-  /// Provides uniform random variables.
+  /** Provides uniform random variables. */
   Ptr<UniformRandomVariable> m_pg;
 
+  /** Energy model callback. */
   DeviceEnergyModel::ChangeStateCallback m_energyCallback;
+  /** A packet destined for this Phy was received without error. */
   TracedCallback<Ptr<const Packet>, double, UanTxMode > m_rxOkLogger;
+  /** A packet destined for this Phy was received with error. */
   TracedCallback<Ptr<const Packet>, double, UanTxMode > m_rxErrLogger;
+  /** A packet was sent from this Phy. */
   TracedCallback<Ptr<const Packet>, double, UanTxMode > m_txLogger;
 
-  double CalculateSinrDb (Ptr<Packet> pkt, Time arrTime, double rxPowerDb, UanTxMode mode, UanPdp pdp);
+  /**
+   * Calculate the SINR value for a packet.
+   *
+   * \param pkt Packet to calculate SINR for.
+   * \param arrTime Arrival time of pkt.
+   * \param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
+   * \param mode TX Mode of pkt.
+   * \param pdp  Power delay profile of pkt.
+   * \return The SINR in dB re 1 uPa.
+   */
+  double CalculateSinrDb (Ptr<Packet> pkt, Time arrTime, double rxPowerDb,
+                          UanTxMode mode, UanPdp pdp);
+
+  /**
+   * Calculate interference power from overlapping packet arrivals, in dB.
+   *
+   * The "signal" packet power is excluded.  Use
+   * GetInterferenceDb ( (Ptr<Packet>) 0) to treat all signals as
+   * interference, for instance in calculating the CCA busy.
+   *
+   * \param pkt The arriving (signal) packet.
+   * \return The total interference power, in dB.
+   */
   double GetInterferenceDb (Ptr<Packet> pkt);
+  /**
+   * Convert dB to kilopascals.
+   *
+   *   \f[{\rm{kPa}} = {10^{\frac{{{\rm{dB}}}}{{10}}}}\f]
+   *
+   * \param db Signal level in dB.
+   * \return Sound pressure in kPa.
+   */
   double DbToKp (double db);
+  /**
+   * Convert kilopascals to dB.
+   *
+   *   \f[{\rm{dB}} = 10{\log _{10}}{\rm{kPa}}\f]
+   *
+   * \param kp Sound pressure in kPa.
+   * \return Signal level in dB.
+   */
   double KpToDb (double kp);
+  /**
+   * Event to process end of packet reception.
+   *
+   * \param pkt The packet.
+   * \param rxPowerDb Received signal power.
+   * \param txMode Transmission mode.
+   */
   void RxEndEvent (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode);
+  /** Event to process end of packet transmission. */
   void TxEndEvent ();
+  /**
+   * Update energy source with new state.
+   *
+   * \param state The new Phy state.
+   */
   void UpdatePowerConsumption (const State state);
 
-  void NotifyListenersRxStart (void);
+
+  /** Call UanListener::NotifyRxStart on all listeners. */
+  void NotifyListenersRxStart (void);  
+  /** Call UanListener::NotifyRxEndOk on all listeners. */
   void NotifyListenersRxGood (void);
+  /** Call UanListener::NotifyRxEndError on all listeners. */
   void NotifyListenersRxBad (void);
+  /** Call UanListener::NotifyCcaStart on all listeners. */
   void NotifyListenersCcaStart (void);
+  /** Call UanListener::NotifyCcaEnd on all listeners. */
   void NotifyListenersCcaEnd (void);
+  /**
+   * Call UanListener::NotifyTxStart on all listeners.
+   *
+   * \param duration Duration of transmission.
+   */
   void NotifyListenersTxStart (Time duration);
+
 protected:
   virtual void DoDispose ();
 
-};
+};  // class UanPhyGen
 
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/uan/model/uan-phy.h ns-3.19/src/uan/model/uan-phy.h
--- ns-3.18.1/src/uan/model/uan-phy.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-phy.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,26 +34,27 @@
 
 
 /**
- * \class UanPhyCalcSinr
+ * \ingroup uan
  *
  * Class used for calculating SINR of packet in UanPhy.
+ *
  * Can be set to any derived class using attributes of UanPhy
  * to implement different models.
  */
 class UanPhyCalcSinr : public Object
 {
-
 public:
-  static TypeId GetTypeId (void);
-
   /**
-   * \param pkt Packet to calculate SINR for
-   * \param arrTime Arrival time of pkt
-   * \param rxPowerDb The received signal strength of the packet in dB re 1 uPa
-   * \param ambNoiseDb Ambient channel noise in dB re 1 uPa
-   * \param mode TX Mode of pkt
-   * \param pdp  Power delay profile of pkt
+   * Calculate the SINR value for a packet.
+   *
+   * \param pkt Packet to calculate SINR for.
+   * \param arrTime Arrival time of pkt.
+   * \param rxPowerDb The received signal strength of the packet in dB re 1 uPa.
+   * \param ambNoiseDb Ambient channel noise in dB re 1 uPa.
+   * \param mode TX Mode of pkt.
+   * \param pdp  Power delay profile of pkt.
    * \param arrivalList  List of interfering arrivals given from Transducer.
+   * \return The SINR in dB re 1 uPa.
    */
   virtual double CalcSinrDb (Ptr<Packet> pkt,
                              Time arrTime,
@@ -64,358 +65,421 @@
                              const UanTransducer::ArrivalList &arrivalList
                              ) const = 0;
   /**
-   * Clears all pointer references
+   * Register this type.
+   * \return The object TypeId.
    */
-  virtual void Clear (void);
+  static TypeId GetTypeId (void);
 
-  virtual void DoDispose (void);
+  /** Clear all pointer references. */
+  virtual void Clear (void);
 
   /**
-   * \param db dB value
-   * \returns kilopascals
-   * \brief Converts dB re 1 uPa to kilopascals
+   * Convert dB re 1 uPa to kilopascals.
+   *
+   * \param db dB value.
+   * \return Value in kilopascals.
    */
   inline double DbToKp (double db) const
   {
     return std::pow (10, db / 10.0);
   }
   /**
-   * \param kp value in kilopascals
-   * \returns dB re 1 uPa
-   * \brief Converts kilopascals to dB re 1 uPa
+   * Convert kilopascals to dB re 1 uPa.
+   *
+   * \param kp Value in kilopascals.
+   * \return Valeu in dB re 1 uPa
    */
   inline double KpToDb (double kp) const
   {
     return 10 * std::log10 (kp);
   }
-};
+
+protected:
+  virtual void DoDispose (void);
+  
+};  // class UanPhyCalcSinr
 
 /**
- * \class UanPhyPer
- * Used in UanPhy for determining probability of packet error based on received SINR and
- * modulation (mode).  Can be set in UanPhy via attributes
+ * \ingroup uan
+ *
+ * Calculate packet error probability, based on received SINR
+ * and modulation (mode).
+ *
+ * Can be set in UanPhy via attributes.
  */
 class UanPhyPer : public Object
 {
 public:
-  static TypeId GetTypeId (void);
-
   /**
-   * Calculates the prob. of packet error based on
+   * Calculate the packet error probability based on
    * SINR at the receiver and a tx mode.
-   * \param pkt Packet which is under consideration
-   * \param sinrDb SINR at receiver
-   * \param mode TX mode used to transmit packet
-   * \returns Probability of packet error
+   *
+   * \param pkt Packet which is under consideration.
+   * \param sinrDb SINR at receiver.
+   * \param mode TX mode used to transmit packet.
+   * \return Probability of packet error.
    */
   virtual double CalcPer (Ptr<Packet> pkt, double sinrDb, UanTxMode mode) = 0;
+
   /**
-   * Clears all pointer references
+   * Register this type.
+   * \return The TypeId.
    */
+  static TypeId GetTypeId (void);
+  /** Clear all pointer references. */
   virtual void Clear (void);
 
+protected:
   virtual void DoDispose (void);
-};
+
+};  // class UanPhyPer
 
 
 /**
- * \class UanPhyListener
+ * \ingroup uan
+ *
+ * Interface for PHY event listener.
  *
- * \brief Interface for PHY event listener
  * A class which implements this interface may register with Phy object
  * to receive notification of TX/RX/CCA events
  */
 class UanPhyListener
 {
 public:
-  virtual ~UanPhyListener ()
-  {
-  }
-  /**
-   * \brief Function called when Phy object begins receiving packet
-   */
+  /** Default destructor */
+  virtual ~UanPhyListener () { }
+  /** Called when UanPhy begins receiving packet. */
   virtual void NotifyRxStart (void) = 0;
-  /**
-   * \brief Function called when Phy object finishes receiving packet without error
-   */
+  /** Called when UanPhy finishes receiving packet without error. */
   virtual void NotifyRxEndOk (void) = 0;
-  /**
-   * \brief Function called when Phy object finishes receiving packet in error
-   */
+  /** Called when UanPhy finishes receiving packet in error. */
   virtual void NotifyRxEndError (void) = 0;
-  /**
-   * \brief Function called when Phy object begins sensing channel is busy
-   */
+  /** Called when UanPhy begins sensing channel is busy. */
   virtual void NotifyCcaStart (void) = 0;
-  /**
-   * \brief Function called when Phy object stops sensing channel is busy
-   */
+  /** Called when UanPhy stops sensing channel is busy. */
   virtual void NotifyCcaEnd (void) = 0;
   /**
-   * \param duration Duration of transmission
-   * \brief Function called when transmission starts from Phy object
+   * Called when transmission starts from Phy object.
+   *
+   * \param duration Duration of transmission.
    */
   virtual void NotifyTxStart (Time duration) = 0;
-};
+
+};  // class UanPhyListener
 
 /**
- * \class UanPhy
+ * \ingroup uan
  *
- * \brief Base class for UAN Phy models
+ * Base class for UAN Phy models.
  */
 class UanPhy : public Object
 {
 public:
-  static TypeId GetTypeId (void);
-
-  /// Enum defining possible Phy states
+  /// Enum defining possible Phy states.
   enum State
   {
-    IDLE, CCABUSY, RX, TX, SLEEP
+    IDLE,     //!< Idle state.
+    CCABUSY,  //!< Channel busy.
+    RX,       //!< Receiving.
+    TX,       //!< Transmitting.
+    SLEEP     //!< Sleeping.
   };
 
   /**
-   * arg1: packet received successfully
-   * arg2: snr of packet
-   * arg3: mode of packet
+   * Packet received successfully callback function type.
+   *
+   * \pname{arg1} Packet received successfully.
+   * \pname{arg2} SNIR of packet.
+   * \pname{arg3} Mode of packet.
    */
   typedef Callback<void, Ptr<Packet>, double, UanTxMode> RxOkCallback;
 
   /**
-   * arg1: packet received successfully
-   * arg2: snr of packet
+   * Packet receive error callback function type.
+   *
+   * \pname{arg1} Packet received successfully.
+   * \pname{arg2} SNIR of packet.
    */
   typedef Callback<void, Ptr<Packet>, double > RxErrCallback;
 
   /**
-   * \param callback DeviceEnergyModel change state callback.
-   *
-   * This function sets the DeviceEnergyModel callback for UanPhy device. Must
-   * be implemented by UanPhy child classes.
+   * Set the DeviceEnergyModel callback for UanPhy device. 
+   * 
+   * \param callback The DeviceEnergyModel change state callback.
    */
   virtual void SetEnergyModelCallback (DeviceEnergyModel::ChangeStateCallback callback) = 0;
   /**
-   * This function handles the energy depletion event. Must
-   * be implemented by UanPhy child classes.
+   * Handle the energy depletion event.
    */
   virtual void EnergyDepletionHandler (void) = 0;
   /**
-   * \param pkt  Packet to transmit
-   * \param modeNum  Index of mode in SupportedModes list to use for transmission
+   * Send a packet using a specific transmission mode.
+   *
+   * \param pkt  Packet to transmit.
+   * \param modeNum  Index of mode in SupportedModes list to use for transmission.
    */
   virtual void SendPacket (Ptr<Packet> pkt, uint32_t modeNum) = 0;
 
   /**
-   * \param listener New listener to register
+   * Register a UanPhyListener to be notified of common UanPhy events.
    *
-   * Register an object to be notified of common Phy events
+   * \param listener New listener to register.
    */
   virtual void RegisterListener (UanPhyListener *listener) = 0;
 
   /**
-   * \brief Packet arriving from channel:  i.e.  leading bit of packet has arrived.
-   * \param pkt Packet which is arriving
-   * \param rxPowerDb Signal power of incoming packet in dB
-   * \param txMode Transmission mode defining modulation of incoming packet
-   * \param pdp Power delay profile of incoming packet
+   * Packet arriving from channel:  i.e.  leading bit of packet has arrived.
+   *
+   * \param pkt Packet which is arriving.
+   * \param rxPowerDb Signal power of incoming packet in dB re 1 uPa.
+   * \param txMode Transmission mode defining modulation of incoming packet.
+   * \param pdp Power delay profile of incoming packet.
    */
   virtual void StartRxPacket (Ptr<Packet> pkt, double rxPowerDb, UanTxMode txMode, UanPdp pdp) = 0;
 
   /**
-   * \param cb Callback to be enabled when packet is received without error
+   * Set the callback to be used when a packet is received without error.
+   *
+   * \param cb The callback.
    */
   virtual void SetReceiveOkCallback (RxOkCallback cb) = 0;
 
   /**
-   * \param cb Callback to be enabled when a packet is received with errors
+   * Set the callback to be used when a packet is received with errors.
+   *
+   * \param cb The callback.
    */
   virtual void SetReceiveErrorCallback (RxErrCallback cb) = 0;
 
   /**
-   * \param gain Gain added at receiver
+   * Set the receiver gain.
+   *
+   * \param gain Gain added at receiver, in dB.
    */
-
   virtual void SetRxGainDb (double gain) = 0;
 
   /**
-   * \param txpwr Final output transmission power in dB
+   * Set the transmit power.
+   *
+   * \param txpwr Final output transmission power, in dB.
    */
   virtual void SetTxPowerDb (double txpwr) = 0;
 
   /**
-   * \param thresh Threshold SINR for propper reception in dB
+   * Set the minimum SINR threshold to receive a packet without errors.
+   *
+   * \deprecated See UanPhyPer.
+   *
+   * \param thresh Threshold SINR for propper reception in dB re 1 uPa.
    */
   virtual void SetRxThresholdDb (double thresh) = 0;
 
   /**
-   * \param thresh Signal power at receiver required for CCA busy state
+   * Set the threshold for detecting channel busy.
    *
+   * \param thresh Signal power threshold at receiver.
    */
   virtual void SetCcaThresholdDb (double thresh) = 0;
 
   /**
-   * \returns Gain added to signal at receiver in dB
+   * Get the receiver gain added to signal at receiver in dB.
+   *
+   * \return The gain.
    */
   virtual double GetRxGainDb (void) = 0;
 
   /**
-   * \returns Current TX power output
+   * Get the current transmit power, in dB.
+   *
+   * \return The transmit power.
    */
   virtual double GetTxPowerDb (void) = 0;
 
   /**
-   * \returns Required signal strength, in dB, to begin receiving packet
+   * Get the minimum received signal strength required
+   * to receive a packet without errors.
+   *
+   * \return The minimum required signal strength, in dB.
    */
   virtual double GetRxThresholdDb (void) = 0;
 
   /**
-   * \returns Threshold signal strength in dB to enter CCA busy mode
-   */
-  virtual double GetCcaThresholdDb (void) = 0;
-  /**
+   * Get the CCA threshold signal strength required to detect channel busy.
    *
-   * \returns True if Phy is SLEEP
+   * \return The CCA threshold signal strength in dB.
    */
+  virtual double GetCcaThresholdDb (void) = 0;
+  /** \return True if Phy is in SLEEP state. */
   virtual bool IsStateSleep (void) = 0;
-  /**
-   *
-   * \returns True if Phy is IDLE
-   */
+  /** \return True if Phy is in IDLE state. */
   virtual bool IsStateIdle (void) = 0;
-  /**
-   *
-   * \returns True if Phy is not IDLE
-   */
+  /** \return True if Phy is neither IDLE nor SLEEP. */
   virtual bool IsStateBusy (void) = 0;
-  /**
-   *
-   * \returns True if Phy is currently in receive mode
-   */
+  /** \return True if Phy is currently in receive mode. */
   virtual bool IsStateRx (void) = 0;
-  /**
-   *
-   * \returns True if Phy is busy transmitting
-   */
+  /** \return True if Phy is busy transmitting. */
   virtual bool IsStateTx (void) = 0;
-  /**
-   *
-   * \returns True if Phy is not TX or RX but the channel is sensed busy
-   */
+  /** \return True if Phy is in CCABUSY state. */
   virtual bool IsStateCcaBusy (void) = 0;
 
   /**
-   * \returns Channel this phy is attached to
+   * Get the attached channel.
+   *
+   * \return The channel.
    */
   virtual Ptr<UanChannel> GetChannel (void) const = 0;
 
   /**
-   * \returns the Net Device that this Phy is a part of
+   * Get the device hosting this Phy.
+   *
+   * \return The net device.
    */
   virtual Ptr<UanNetDevice> GetDevice (void) = 0;
 
   /**
-   * \param channel The channel this Phy is attached to
+   * Attach to a channel.
+   *
+   * \param channel The channel to attach to.
    */
   virtual void SetChannel (Ptr<UanChannel> channel) = 0;
 
   /**
-   * \param device The Net Device this Phy is a part of
+   * Set the device hosting this Phy.
+   *
+   * \param device The device.
    */
   virtual void SetDevice (Ptr<UanNetDevice> device) = 0;
 
   /**
-   * \param mac The MAC forwarding messages to this Phy
+   * Set the MAC forwarding messages to this Phy.
+   *
+   * \param mac The MAC.
    */
   virtual void SetMac (Ptr<UanMac> mac) = 0;
 
   /**
-   * \param packet Packet that is beginning transmission
-   * \param txPowerDb Transmit power of packet
-   * \param txMode  Transmission mode of packet
+   * Called when a transmission is beginning
+   * on the attched transducer.
    *
-   * Notification that there is a transmission beginning
-   * on the transducer that this Phy is attached to.
+   * \param packet Packet that is beginning transmission.
+   * \param txPowerDb Transmit power of packet.
+   * \param txMode  Transmission mode of packet.
    */
-
   virtual void NotifyTransStartTx (Ptr<Packet> packet, double txPowerDb, UanTxMode txMode) = 0;
 
   /**
-   *
-   * Function called when there has been a change in the
+   * Called when there has been a change in the
    * ammount of interference this node is experiencing
-   * from other transmissions
+   * from other transmissions.
    */
   virtual void NotifyIntChange (void) = 0;
 
   /**
+   * Attach a transducer to this Phy.
    *
-   * \param trans Transducer this Phy outputs to / receives from
+   * \param trans The transducer.
    */
   virtual void SetTransducer (Ptr<UanTransducer> trans) = 0;
 
   /**
-   * \returns Transducer this Phy outputs to / receives from
+   * Get the attached transducer.
+   *
+   * \return The transducer.
    */
   virtual Ptr<UanTransducer> GetTransducer (void) = 0;
 
   /**
-   * \returns Number of TX modes supported by this PHY
+   * Get the number of transmission modes supported by this Phy.
+   *
+   * \return The number modes.
    */
   virtual uint32_t GetNModes (void) = 0;
 
   /**
-   * \param n Mode number of mode to return (place in Modeslist)
-   * \returns Mode n
+   * Get a specific transmission mode.
+   *
+   * \param n The mode number.
+   * \return The mode.
    */
   virtual UanTxMode GetMode (uint32_t n) = 0;
 
   /**
-   * \warning Returns non-valid pointer if IsStateRx == false
-   * \returns Packet currently being received in PHY
+   * Get the packet currently being received.
+   *
+   * \warning Returns non-valid pointer if IsStateRx == false.
+   * \return The packet.
    */
   virtual Ptr<Packet> GetPacketRx (void) const = 0;
 
-  /**
-   * Clears all pointer references
-   */
+  /** Clear all pointer references. */
   virtual void Clear (void) = 0;
 
+  /**
+   * Set the Phy SLEEP mode.
+   *
+   * \param sleep SLEEP on or off.
+   */
   virtual void SetSleepMode (bool sleep) = 0;
 
 
   /**
-   * Public method used to fire a PhyTxBegin trace.  Implemented for encapsulation
+   * Called when the transducer begins transmitting a packet.
+   *
+   * This fires a PhyTxBegin trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet The packet.
    */
   void NotifyTxBegin (Ptr<const Packet> packet);
 
   /**
-   * Public method used to fire a PhyTxEnd trace.  Implemented for encapsulation
+   * Called when the transducer finishes transmitting a packet.
+   *
+   * This fires a PhyTxEnd trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet The packet.
    */
   void NotifyTxEnd (Ptr<const Packet> packet);
 
   /**
-   * Public method used to fire a PhyTxDrop trace.  Implemented for encapsulation
+   * Called when the transducer attempts to transmit a new packet while
+   * already transmitting a prior packet.
+   *
+   * This fires a PhyTxDrop trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet The packet.
    */
   void NotifyTxDrop (Ptr<const Packet> packet);
 
   /**
-   * Public method used to fire a PhyRxBegin trace.  Implemented for encapsulation
+   * Called when the Phy begins to receive a packet.
+   *
+   * This fires a PhyRxBegin trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet The packet.
    */
   void NotifyRxBegin (Ptr<const Packet> packet);
 
   /**
-   * Public method used to fire a PhyRxEnd trace.  Implemented for encapsulation
+   * Called when a packet is received without error.
+   *
+   * This fires a PhyRxEnd trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet The packet.
    */
   void NotifyRxEnd (Ptr<const Packet> packet);
 
   /**
-   * Public method used to fire a PhyRxDrop trace.  Implemented for encapsulation
+   * Called when the Phy drops a packet.
+   *
+   * This fires a PhyRxDrop trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet The packet.
    */
   void NotifyRxDrop (Ptr<const Packet> packet);
 
@@ -424,60 +488,68 @@
   * used by this model.  Return the number of streams (possibly zero) that
   * have been assigned.
   *
-  * \param stream first stream index to use
-  * \return the number of stream indices assigned by this model
+  * \param stream First stream index to use.
+  * \return The number of stream indices assigned by this model.
   */
   virtual int64_t AssignStreams (int64_t stream) = 0;
 
+  /**
+   * Register this type.
+   * \return The TypeId.
+   */
+  static TypeId GetTypeId (void);
+
 private:
   /**
-   * The trace source fired when a packet begins the transmission process on
-   * the medium.
+   * Trace source indicating a packet has begun transmitting
+   * over the channel medium.
    *
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_phyTxBeginTrace;
 
   /**
-   * The trace source fired when a packet ends the transmission process on
-   * the medium.
+   * Trace source indicating a packet has been completely transmitted
+   * over the channel.
    *
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_phyTxEndTrace;
 
   /**
-   * The trace source fired when the phy layer drops a packet as it tries
-   * to transmit it.
+   * Trace source indicating a packet has been dropped by the device
+   * during transmission.
    *
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_phyTxDropTrace;
 
   /**
-   * The trace source fired when a packet begins the reception process from
-   * the medium.
+   * Trace source indicating a packet has begun being received
+   * from the channel medium by the device.
    *
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_phyRxBeginTrace;
 
   /**
-   * The trace source fired when a packet ends the reception process from
-   * the medium.
+   * Trace source indicating a packet has been completely received
+   * from the channel medium by the device.
    *
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_phyRxEndTrace;
 
   /**
-   * The trace source fired when the phy layer drops a packet it has received.
+   * Trace source indicating a packet has been dropped by the device
+   * during reception.
    *
    * \see class CallBackTraceSource
    */
   TracedCallback<Ptr<const Packet> > m_phyRxDropTrace;
-};
 
-}
+};  // class UanPhy
+
+} // namespace ns3
 
 #endif /* UAN_PHY_H */
diff -Naur ns-3.18.1/src/uan/model/uan-prop-model.cc ns-3.19/src/uan/model/uan-prop-model.cc
--- ns-3.18.1/src/uan/model/uan-prop-model.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-prop-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,7 @@
 namespace ns3 {
 
 std::ostream &
-operator<< (std::ostream &os, UanPdp &pdp)
+operator<< (std::ostream &os, const UanPdp &pdp)
 {
   os << pdp.GetNTaps () << '|';
   os << pdp.GetResolution ().GetSeconds () << '|';
@@ -336,7 +336,8 @@
   return pdp;
 }
 
-NS_OBJECT_ENSURE_REGISTERED (UanPropModel);
+NS_OBJECT_ENSURE_REGISTERED (UanPropModel)
+  ;
 
 TypeId UanPropModel::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/uan/model/uan-prop-model.h ns-3.19/src/uan/model/uan-prop-model.h
--- ns-3.18.1/src/uan/model/uan-prop-model.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-prop-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -35,8 +35,9 @@
 class UanTxMode;
 
 /**
- * \class Tap
- * \brief Holds PDP Tap information (amplitude and delay)
+ * \ingroup uan
+ *
+ * Holds PDP Tap information (amplitude and delay)
  */
 class Tap
 {
@@ -46,26 +47,35 @@
    */
   Tap ();
   /**
+   * Constructor
+   *
    * \param delay Time delay (usually from first arrival) of signal
    * \param amp Complex amplitude of arrival
    */
   Tap (Time delay, std::complex<double> amp);
   /**
-   * \returns Complex amplitude of arrival
+   * Get the complex amplitude of arrival.
+   *
+   * \return The amplitude.
    */
   std::complex<double> GetAmp (void) const;
   /**
-   * \returns Time delay (usually from first arrival) of signal
+   * Get the delay time, usually from first arrival of signal.
+   * \return The time delay.
    */
   Time GetDelay (void) const;
 
 private:
-  std::complex<double> m_amplitude;
-  Time m_delay;
-};
+  std::complex<double> m_amplitude;  //!< The amplitude.
+  Time m_delay;                      //!< The time delay.
 
+};  // class Tap
+
+  
 /**
- * \class UanPdp
+ * \ingroup uan
+ *
+ * The power delay profile returned by propagation models.
  *
  * Container class to describe power delay profile returned
  * from UAN propagation models using tapped delay line model.
@@ -77,180 +87,242 @@
  * power on any interval (t1, t2) can then be found from
  * summing the taps on the interval and multiplying by
  * the total received power at the receiver.
- *
- *
  */
 class UanPdp
 {
 public:
   /**
-   * \brief Iterator is a standard template library constant interator
+   * Convenience iterator typedef.
    */
   typedef std::vector<Tap>::const_iterator Iterator;
   /**
-   * \brief Create empty PDP object
+   * Create empty PDP object.
    */
   UanPdp ();
   /**
-   * \brief Create PDP object from a vector of Tap objects
-   * \param taps Taps to include in this PDP
-   * \param resolution Resolution of PDP object
+   * Create PDP object from a vector of Tap objects.
+   *
+   * \param taps Taps to include in this PDP.
+   * \param resolution Resolution of PDP object.
    */
   UanPdp (std::vector<Tap> taps, Time resolution);
   /**
-   * \brief Create PDP object from vector of arrival amplitudes
-   * \param arrivals  Vector of complex amplitude arrivals
-   * \param resolution Time duration between arrivals in vector
+   * Create PDP object from vector of arrival amplitudes.
+   *
+   * \param arrivals  Vector of complex amplitude arrivals.
+   * \param resolution Time duration between arrivals in vector.
    */
   UanPdp (std::vector<std::complex<double > > arrivals, Time resolution);
   /**
-   * \brief Create PDP object from real valued arrival amplitudes
-   * \param arrivals vector of real valued arrivals
-   * \param resolution Time duration between arrivals in vector
+   * Create PDP object from real valued arrival amplitudes.
+   *
+   * \param arrivals Vector of real valued arrivals.
+   * \param resolution Time duration between arrivals in vector.
    */
   UanPdp (std::vector<double> arrivals, Time resolution);
+  /** Dummy destructor, see DoDispose. */
   ~UanPdp ();
 
   /**
-   * \param arrival complex arrival value
-   * \param index index of arrival
+   * Set the arrival value for a tap.
+   *
+   * The delay time is the index multiplied by the resolution.
+   * The tap vector will be expanded to accomadate the requested
+   * index.
+   *
+   * \param arrival Complex arrival value.
+   * \param index Index of arrival.
    */
   void SetTap (std::complex<double> arrival, uint32_t index);
   /**
-   * \param nTaps number of taps in this PDP
+   * Resize the tap vector.
+   *
+   * \param nTaps Number of taps in this PDP
    */
   void SetNTaps (uint32_t nTaps);
   /**
-   * \param resolution Resolution of PDP (time between arrivals)
+   * Set the time duration (resolution) between arrivals.
+   *
+   * \param resolution The resolution.
    */
   void SetResolution (Time resolution);
   /**
-   * \returns Iterator positioned at first arrival
+   * Get the beginning of the tap vector.
+   *
+   * \return Iterator positioned at first arrival.
    */
   Iterator GetBegin (void) const;
   /**
-   * \returns Iterator positioned after last arrival
+   * Get the end of the tap list (one beyond the last entry).
+   *
+   * \return Iterator positioned after last arrival
    */
   Iterator GetEnd (void) const;
   /**
-   * \returns Number of taps in PDP
+   * Get the number of taps.
+   *
+   * \return Number of taps in PDP.
    */
   uint32_t GetNTaps (void) const;
   /**
-   * \returns Tap object at index i
-   * \param i Index number of tap to return (0 based)
+   * Get the Tap at the specified delay index.
+   *
+   * \param i Index number of tap to return (0 based).
+   * \return Tap object at index i.
    */
   const Tap &GetTap (uint32_t i) const;
   /**
-   * \returns Resolution of PDP (time duration between arrivals)
+   * Get the delay time resolution (time duration between arrivals).
+   * 
+   * \return Resolution of PDP.
    */
   Time GetResolution (void) const;
   /**
-   * \param begin Time value to begin summing arrivals
-   * \param end Time value to end summing arrivals
-   * \returns Returns Non-coherent sum of arrivals between two time values
+   * Compute the non-coherent sum of tap amplitudes
+   * between a start and end time.
    *
    * Assuming that Tap at index 0 arrives at time 0,
    * this function sums non-coherently (sums amplitude of arrivals
    * ignoring phase difference) all arrivals between a start
    * and end time.
+   *
+   * \param begin Time value to begin summing arrivals.
+   * \param end Time value to end summing arrivals.
+   * \return Non-coherent sum of arrivals between two time values.
    */
   double SumTapsNc (Time begin, Time end) const;
   /**
-   * \param begin Time value to begin summing arrivals
-   * \param end Time value to end summing arrivals
-   * \returns Returns coherent sum of arrivals between two time values
+   * Compute the coherent sum of tap amplitudes
+   * between a start and end time.
    *
    * Assuming that Tap at index 0 arrives at time 0,
    * this function sums coherently (sums amplitude of arrivals
    * considering phase difference) all arrivals between a start
    * and end time.
+   *
+   * \param begin Time value to begin summing arrivals.
+   * \param end Time value to end summing arrivals.
+   * \return Coherent sum of arrivals between two time values.
    */
   std::complex<double> SumTapsC (Time begin, Time end) const;
   /**
-   * \param delay Time duratation after max to begin summing arrivals
-   * \param duration Time duration to sum arrivals for
-   * \returns non-coherent sum of arrivals after max in given window
+   * Compute the non-coherent sum of tap amplitudes
+   * starting after a delay from the maximum amplitude
+   * for a total time duration.
    *
-   * this function sums non-coherently (sums amplitude of arrivals
+   * This function sums non-coherently (sums amplitude of arrivals
    * ignoring phase difference) all arrivals in a given duration
-   * starting the given time after the maximum amplitude arrival received
+   * starting the given time after the maximum amplitude arrival received.
+   *
+   * \param delay Time duratation after max to begin summing arrivals.
+   * \param duration Time duration to sum arrivals for.
+   * \return Non-coherent sum of arrivals after max in given window.
    */
   double SumTapsFromMaxNc (Time delay, Time duration) const;
   /**
-   * \param delay Time duratation after max to begin summing arrivals
-   * \param duration Time duration to sum arrivals for
-   * \returns coherent sum of arrivals after max in given window
+   * Compute the coherent sum of tap amplitudes
+   * starting after a delay from the maximum amplitude
+   * for a total duration.
    *
    * this function sums coherently (sums amplitude of arrivals
    * considering phase difference) all arrivals in a given duration
    * starting the given time after the maximum amplitude arrival received
+   *
+   * \param delay Time duratation after max to begin summing arrivals.
+   * \param duration Time duration to sum arrivals for.
+   * \return Coherent sum of arrivals after max in given window.
    */
   std::complex<double> SumTapsFromMaxC (Time delay, Time duration) const;
 
   /**
-   * \returns A PDP with a singlue unit impulse arrival at time 0
+   * Get a unit impulse PDP at time 0.
+   *
+   * \return The unit impulse.
    */ 
   static UanPdp CreateImpulsePdp (void);
+  
 private:
-  friend std::ostream &operator<< (std::ostream &os, UanPdp &pdp);
+  friend std::ostream &operator<< (std::ostream &os, const UanPdp &pdp);
   friend std::istream &operator>> (std::istream &is, UanPdp &pdp);
-  std::vector<Tap> m_taps;
-  Time m_resolution;
+  
+  std::vector<Tap> m_taps;  //!< The vector of Taps.
+  Time m_resolution;        //!< The time resolution.
+
+};  // class UanPdp
+
 
-};
 /**
- * \brief Writes PDP to stream as list of arrivals
+ * \ingroup uan
+ *
+ * Writes PDP to stream as list of arrivals
+ *
+ * \param os The output stream.
+ * \param pdp The PDP.
+ * \return The output stream.
  */
-std::ostream &operator<< (std::ostream &os, UanPdp &pdp);
+std::ostream &operator<< (std::ostream &os, const UanPdp &pdp);
 /**
- * \brief Reads in list of arrivals from stream is
+ * \ingroup uan
+ *
+ * Reads in list of arrivals from stream is
+ *
+ * \param is The input stream.
+ * \param pdp The PDP variable to set.
+ * \return The input stream.
  */
-std::istream &operator>> (std::ostream &is, UanPdp &pdp);
+std::istream &operator>> (std::istream &is, UanPdp &pdp);  
 
+  
 /**
- * \class UanPropModel
+ * \ingroup uan
  *
  * Base class for implemented underwater propagation models
  */
 class UanPropModel : public Object
 {
 public:
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   /**
    * Computes pathloss between nodes a and b.
-   * \returns Pathloss in dB re 1 uPa
+   *
    * \param a Ptr to mobility model of node a
    * \param b Ptr to mobility model of node b
    * \param txMode TX mode of transmission between a and b
+   * \return Pathloss in dB re 1 uPa
    */
   virtual double GetPathLossDb (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode txMode) = 0;
 
   /**
-   * \returns PDP for link between nodes a and b
-   * \param a Ptr to mobility model of node a
-   * \param b Ptr to mobility model of node b
-   * \param mode TX mode of transmission from a to b
+   * Get the PDP for the path between two nodes.
+   *
+   * \param a Ptr to mobility model of node a.
+   * \param b Ptr to mobility model of node b.
+   * \param mode TX mode of transmission from a to b.
+   * \return PDP for link between nodes a and b.
    */
   virtual UanPdp GetPdp (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode) = 0;
   /**
-   * Finds propagation delay between nodes a and b
-   * \param a Ptr to mobility model of node a
-   * \param b Ptr to mobility model of node b
-   * \param mode TX mode of transmission
-   * \returns Propagation delay
+   * Finds propagation delay between nodes a and b.
+   *
+   * \param a Ptr to mobility model of node a.
+   * \param b Ptr to mobility model of node b.
+   * \param mode TX mode of transmission.
+   * \return Propagation delay.
    */
   virtual Time GetDelay (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode) = 0;
 
-  /**
-   * Clears all pointer references
-   */
+  /** Clear all pointer references. */
   virtual void Clear (void);
 
   virtual void DoDispose (void);
-};
 
-}
+};  // class UanPropModel
+
+} // namespace ns3
 
 #endif /* UAN_PROP_MODEL_H */
diff -Naur ns-3.18.1/src/uan/model/uan-prop-model-ideal.cc ns-3.19/src/uan/model/uan-prop-model-ideal.cc
--- ns-3.18.1/src/uan/model/uan-prop-model-ideal.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-prop-model-ideal.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanPropModelIdeal);
+NS_OBJECT_ENSURE_REGISTERED (UanPropModelIdeal)
+  ;
 
 UanPropModelIdeal::UanPropModelIdeal ()
 {
diff -Naur ns-3.18.1/src/uan/model/uan-prop-model-ideal.h ns-3.19/src/uan/model/uan-prop-model-ideal.h
--- ns-3.18.1/src/uan/model/uan-prop-model-ideal.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-prop-model-ideal.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,24 +28,31 @@
 namespace ns3 {
 
 /**
- * \class UanPropModelIdeal
+ * \ingroup uan
  *
- * \brief Ideal propagation model (no pathloss, impulse PDP)
+ * Ideal propagation model (no pathloss, impulse PDP).
  */
 class UanPropModelIdeal : public UanPropModel
 {
 public:
+  /** Default constructor. */
   UanPropModelIdeal ();
+  /** Destructor */
   virtual ~UanPropModelIdeal ();
 
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   // Inherited methods
   virtual double GetPathLossDb (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode);
   virtual UanPdp GetPdp (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode);
   virtual Time GetDelay (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode);
-};
 
-}
+};  // class UanPropModelIdeal
+
+} // namespace ns3
 
 #endif /* UAN_PROP_MODEL_IDEAL_H */
diff -Naur ns-3.18.1/src/uan/model/uan-prop-model-thorp.cc ns-3.19/src/uan/model/uan-prop-model-thorp.cc
--- ns-3.18.1/src/uan/model/uan-prop-model-thorp.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-prop-model-thorp.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanPropModelThorp);
+NS_OBJECT_ENSURE_REGISTERED (UanPropModelThorp)
+  ;
 
 UanPropModelThorp::UanPropModelThorp ()
 {
@@ -43,7 +44,7 @@
     .SetParent<Object> ()
     .AddConstructor<UanPropModelThorp> ()
     .AddAttribute ("SpreadCoef",
-                   "Spreading coefficient used in calculation of Thorp's approximation",
+                   "Spreading coefficient used in calculation of Thorp's approximation.",
                    DoubleValue (1.5),
                    MakeDoubleAccessor (&UanPropModelThorp::m_SpreadCoef),
                    MakeDoubleChecker<double> ())
diff -Naur ns-3.18.1/src/uan/model/uan-prop-model-thorp.h ns-3.19/src/uan/model/uan-prop-model-thorp.h
--- ns-3.18.1/src/uan/model/uan-prop-model-thorp.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-prop-model-thorp.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,28 +28,47 @@
 class UanTxMode;
 
 /**
- * \class UanPropModelThorp
- * \brief Uses Thorp's approximation to compute pathloss.  Assumes implulse PDP.
+ * \ingroup uan
+ *
+ * Uses Thorp's approximation to compute pathloss.  Assumes implulse PDP.
  */
 class UanPropModelThorp : public UanPropModel
 {
 public:
+  /** Default constructor. */
   UanPropModelThorp ();
+  /** Destructor */
   virtual ~UanPropModelThorp ();
 
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
+  // Inherited methods
   virtual double GetPathLossDb (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode);
   virtual UanPdp GetPdp (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode);
   virtual Time GetDelay (Ptr<MobilityModel> a, Ptr<MobilityModel> b, UanTxMode mode);
 
 private:
+  /**
+   * Get the attenuation in dB / 1000 yards..
+   * \param freqKhz The channel center frequency, in kHz.
+   * \return The attenuation, in dB / 1000 yards..
+   */
   double GetAttenDbKyd (double freqKhz);
+  /**
+   * Get the attenuation in dB / km.
+   * \param freqKhz The channel center frequency, in kHz.
+   * \return The attenuation, in dB/km.
+   */
   double GetAttenDbKm (double freqKhz);
 
-  double m_SpreadCoef;
-};
+  double m_SpreadCoef;  //!< Spreading coefficient used in calculation of Thorp's approximation.
 
-}
+};  // class UanPropModelThorp
+
+} // namespace ns3
 
 #endif /* UAN_PROP_MODEL_THORP_H */
diff -Naur ns-3.18.1/src/uan/model/uan-transducer.cc ns-3.19/src/uan/model/uan-transducer.cc
--- ns-3.18.1/src/uan/model/uan-transducer.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-transducer.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanTransducer);
+NS_OBJECT_ENSURE_REGISTERED (UanTransducer)
+  ;
 
 TypeId UanTransducer::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/uan/model/uan-transducer.h ns-3.19/src/uan/model/uan-transducer.h
--- ns-3.18.1/src/uan/model/uan-transducer.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-transducer.h	2013-12-20 09:44:50.000000000 -0800
@@ -35,25 +35,27 @@
 
 
 /**
- * \class UanPacketArrival
+ * \ingroup uan
  *
- * \brief Class consisting of packet arrival information (Time, RxPower, mode, PDP)
+ * Class consisting of packet arrival information (Time, RxPower, mode, PDP).
  */
 class UanPacketArrival
 {
 public:
 
-  /* default constructor so python scan works */
-  UanPacketArrival ()
+  /** Default constructor. */
+  UanPacketArrival () 
   {
   }
 
   /**
-   * \param packet Packet arriving
-   * \param rxPowerDb RX signal power in dB of arriving packet
-   * \param txMode TX mode of arriving packet
-   * \param pdp Power delay profile of arriving packet
-   * \param arrTime Arrival time of packet
+   * Constructor.
+   *
+   * \param packet Packet arriving.
+   * \param rxPowerDb RX signal power in dB of arriving packet.
+   * \param txMode TX mode of arriving packet.
+   * \param pdp Power delay profile of arriving packet.
+   * \param arrTime Arrival time of packet.
    */
   UanPacketArrival (Ptr<Packet> packet, double rxPowerDb, UanTxMode txMode, UanPdp pdp, Time arrTime)
     : m_packet (packet),
@@ -64,57 +66,70 @@
   {
   }
 
+  /** Destructor */
   ~UanPacketArrival()
   {
     m_packet = 0;
   }
 
   /**
-   * \returns Pointer to packet that arrived
+   * Get the arriving packet.
+   *
+   * \return Pointer to packet.
    */
   inline Ptr<Packet> GetPacket (void) const
   {
     return m_packet;
   }
   /**
-   * \returns Received signal strength in dB re 1uPa
+   * Get the received signal strength.
+   *
+   * \return Received signal strength in dB re 1uPa
    */
   inline double GetRxPowerDb (void) const
   {
     return m_rxPowerDb;
   }
   /**
-   * \returns UanTxMode used to transmit packet
+   * Get the transmission mode of the packet.
+   *
+   * \return UanTxMode.
    */
   inline const UanTxMode &GetTxMode (void) const
   {
     return m_txMode;
   }
   /**
-   * \returns Arrival time of packet
+   * Get the packet arrival time.
+   *
+   * \return Arrival time.
    */
   inline Time GetArrivalTime (void) const
   {
     return m_arrTime;
   }
   /**
-   * \returns PDP of arriving signal
+   * Get the propagation delay profile.
+   *
+   * \return PDP of arriving signal.
    */
   inline UanPdp GetPdp (void) const
   {
     return m_pdp;
   }
 private:
-  Ptr<Packet> m_packet;
-  double m_rxPowerDb;
-  UanTxMode m_txMode;
-  UanPdp m_pdp;
-  Time m_arrTime;
-};
+  Ptr<Packet> m_packet;  //!< The arrived packet.
+  double m_rxPowerDb;    //!< The received power, in dB.
+  UanTxMode m_txMode;    //!< The transmission mode.
+  UanPdp m_pdp;          //!< The propagation delay profile.
+  Time m_arrTime;        //!< The arrival time.
+
+};  // class UanPacketArrival
 
 /**
- * \class UanTransducer
- * \brief Virtual base for Transducer objects
+ * \ingroup uan
+ *
+ * Virtual base for Transducer objects.
  *
  * The Transducer was added to support classes such as UanPhyDual.
  * In a generic Phy setting, this class functions to hold information about all
@@ -123,79 +138,99 @@
 class UanTransducer : public Object
 {
 public:
-  static TypeId GetTypeId (void);
-
   /**
-   * \brief Transducer state (receiving or transmitting)
+   * Register this type.
+   * \return The object TypeId.
    */
+  static TypeId GetTypeId (void);
+
+  /** Transducer state. */
   enum State {
-    TX, RX
+    TX,  //!< Transmitting.
+    RX   //!< Receiving.
   };
 
-  /**
-   * \brief Arrival list is a standard template library list of UanPacketArrivals objects
-   */
+  /** List of arriving packets overlapping in time. */
   typedef std::list<UanPacketArrival> ArrivalList;
-  /**
-   * \brief UanPhyList is a standard template library list of UanPhy objects
-   */
+  /** List of UanPhy objects. */
   typedef std::list<Ptr<UanPhy> > UanPhyList;
 
   /**
-   * \returns State (TX or RX) of this transducer
+   * Get the transducer state.
+   *
+   * \return State (TX or RX) of this transducer.
    */
   virtual State GetState (void) const = 0;
 
   /**
-   * \returns True if this transducer is available for receiving an incoming packet.
+   * Is the state receiving (or available for reception)?
+   *
+   * \return True if this transducer is available for receiving
+   *   an incoming packet.
    */
   virtual bool IsRx (void) const = 0;
   /**
-   * \returns True if there is a packet being transmitted from this transducer.
+   * Is the state transmitting?
+   * 
+   * \return True if there is a packet being transmitted from this transducer.
    */
   virtual bool IsTx (void) const = 0;
   /**
-   * \returns List of all packets currently crossing this node in the water.
+   * Get the list of overlapped (in time) packets at this transducer.
+   *
+   * \return List of all packets currently crossing this node in the water.
    */
   virtual const ArrivalList &GetArrivalList (void) const = 0;
   /**
-   * \brief Receive Notify this object that a new packet has arrived at this nodes location
-   * \param packet Packet arriving
-   * \param rxPowerDb Signal power in dB of arriving packet
-   * \param txMode Mode arriving packet is using
-   * \param pdp PDP of arriving signal
+   * Notify this object that a new packet has arrived at this nodes location
+   *
+   * \param packet Packet arriving.
+   * \param rxPowerDb Signal power in dB of arriving packet.
+   * \param txMode Mode arriving packet is using.
+   * \param pdp PDP of arriving signal.
    */
   virtual void Receive (Ptr<Packet> packet, double rxPowerDb, UanTxMode txMode, UanPdp pdp) = 0;
   /**
-   * \brief Transmit a packet from this transducer
-   * \param src Source PHY
-   * \param packet Packet to transmit
-   * \param txPowerDb Outgoing Tx power of packet
+   * Transmit a packet from this transducer.
+   *
+   * \param src Source PHY.
+   * \param packet Packet to transmit.
+   * \param txPowerDb Outgoing Tx power of packet.
    * \param txMode Mode to transmit packet with.
    */
   virtual void Transmit (Ptr<UanPhy> src, Ptr<Packet> packet, double txPowerDb, UanTxMode txMode) = 0;
   /**
-   * \param chan Channel this transducer is attached to
+   * Attach this transducer to a channel.
+   * 
+   * \param chan The channel
    */
   virtual void SetChannel (Ptr<UanChannel> chan) = 0;
   /**
-   * \returns Channel this transducer is attached to
+   * Get the attached channel.
+   *
+   * \return The channel.
    */
   virtual Ptr<UanChannel> GetChannel (void) const = 0;
   /**
-   * \param phy Add phy above this transducer (may connect > 1 Phy to a transducer)
+   * Attach a physical network layer above this transducer.
+   *
+   * More than one physical layer may be attached.
+   *
+   * \param phy The physical layer.
    */
   virtual void AddPhy (Ptr<UanPhy> phy) = 0;
   /**
-   * \returns List of all Phy's this transducer sends packets to.
+   * Get the list of physical layer above this transducer.
+   *
+   * \return List of attached physical layers.
    */
   virtual const UanPhyList &GetPhyList (void) const = 0;
   /**
-   * Clears all pointer references
+   * Clears all pointer references.
    */
   virtual void Clear (void) = 0;
 
-};
+};  // class UanTransducer
 
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/uan/model/uan-transducer-hd.cc ns-3.19/src/uan/model/uan-transducer-hd.cc
--- ns-3.18.1/src/uan/model/uan-transducer-hd.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-transducer-hd.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,9 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UanTransducerHd);
+NS_OBJECT_ENSURE_REGISTERED (UanTransducerHd)
+  ;
+  
 UanTransducerHd::UanTransducerHd ()
   : UanTransducer (),
     m_state (RX),
@@ -153,8 +155,6 @@
                            double txPowerDb,
                            UanTxMode txMode)
 {
-
-  Time endTxTime;
   if (m_state == TX)
     {
       Simulator::Remove (m_endTxEvent);
diff -Naur ns-3.18.1/src/uan/model/uan-transducer-hd.h ns-3.19/src/uan/model/uan-transducer-hd.h
--- ns-3.18.1/src/uan/model/uan-transducer-hd.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-transducer-hd.h	2013-12-20 09:44:50.000000000 -0800
@@ -26,17 +26,25 @@
 namespace ns3 {
 
 /**
- * \class UanTransducerHd
- * \brief Half duplex implementation of transducer object
+ * \ingroup uan
  *
- * This class will only allow attached Phy's to receive packets if not in TX mode
+ * Half duplex implementation of transducer object
+ *
+ * This class will only allow attached Phy's to receive packets
+ * if not in TX mode.
  */
 class UanTransducerHd : public UanTransducer
 {
 public:
+  /** Constructor */
   UanTransducerHd ();
+  /** Dummy destructor, see DoDispose */
   virtual ~UanTransducerHd ();
 
+  /**
+   * Register this type.
+   * \return The object TypeId.
+   */
   static TypeId GetTypeId (void);
 
   // inherited methods
@@ -53,20 +61,27 @@
   virtual void Clear (void);
 
 private:
-  State m_state;
-  ArrivalList m_arrivalList;
-  UanPhyList m_phyList;
-  Ptr<UanChannel> m_channel;
-  EventId m_endTxEvent;
-  Time m_endTxTime;
-  bool m_cleared;
-
+  State m_state;              //!< Transducer state.
+  ArrivalList m_arrivalList;  //!< List of arriving packets which overlap in time.
+  UanPhyList m_phyList;       //!< List of physical layers attached above this tranducer.
+  Ptr<UanChannel> m_channel;  //!< The attached channel.
+  EventId m_endTxEvent;       //!< Event scheduled for end of transmission.
+  Time m_endTxTime;           //!< Time at which transmission will be completed.
+  bool m_cleared;             //!< Flab when we've been cleared.
+
+  /**
+   * Remove an entry from the arrival list.
+   *
+   * \param arrival The packet arrival to remove.
+   */
   void RemoveArrival (UanPacketArrival arrival);
+  /** Handle end of transmission event. */
   void EndTx (void);
 protected:
   virtual void DoDispose ();
-};
 
-}
+};  // class UanTransducerHd
+
+} // namespace ns3
 
 #endif /* UAN_TRANSDUCER_HD_H */
diff -Naur ns-3.18.1/src/uan/model/uan-tx-mode.cc ns-3.19/src/uan/model/uan-tx-mode.cc
--- ns-3.18.1/src/uan/model/uan-tx-mode.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-tx-mode.cc	2013-12-20 09:44:50.000000000 -0800
@@ -300,6 +300,7 @@
   return is;
 }
 
-ATTRIBUTE_HELPER_CPP (UanModesList);
+ATTRIBUTE_HELPER_CPP (UanModesList)
+  ;
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/uan/model/uan-tx-mode.h ns-3.19/src/uan/model/uan-tx-mode.h
--- ns-3.18.1/src/uan/model/uan-tx-mode.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/model/uan-tx-mode.h	2013-12-20 09:44:50.000000000 -0800
@@ -30,51 +30,75 @@
 class UanTxMode;
 
 /**
- * \class UanTxMode
- * \brief Abstraction of packet modulation information
+ * \ingroup uan
+ *
+ * Abstraction of packet modulation information.
+ *
+ * This contains a lightweight globally unique id for the mode.
+ * Mode details are held in the UanTxModeFactory.  Attributes
+ * are set in by the UanTxModeFactory constructor.
  */
 class UanTxMode
 {
 public:
-  UanTxMode ();
-  ~UanTxMode ();
+  UanTxMode ();   //!< Constructor.
+  ~UanTxMode ();  //!< Destructor.
 
   /**
-   * Modulation type
+   * Modulation type.
    */
   typedef enum {
-    PSK, QAM, FSK, OTHER
+    PSK,   //!< Phase shift keying.
+    QAM,   //!< Quadrature amplitude modulation.
+    FSK,   //!< Frequency shift keying.
+    OTHER  //!< Unspecified/undefined.
   } ModulationType;
   /**
-   * \returns The modulation type of the mode
+   * Get the modulation type of the mode.
+   *
+   * \return The modulation type.
    */
   ModulationType GetModType (void) const;
   /**
-   * \returns Data rate of the TX mode in bits per second
+   * Get the data rate of the transmit mode.
+   *
+   * \return Data rate of the TX mode, in bits per second.
    */
   uint32_t GetDataRateBps (void) const;
   /**
-   * \returns PHY rate in symbols per second
+   * Get the physical signaling rate.
+   *
+   * \return PHY rate in symbols per second.
    */
   uint32_t GetPhyRateSps (void) const;
   /**
-   * \returns Center frequency of transmitted signal in Hz
+   * Get the transmission center frequency.
+   *
+   * \return Center frequency, in Hz.
    */
   uint32_t GetCenterFreqHz (void) const;
   /**
-   * \returns Bandwidth of transmitted signal in Hz
+   * Get the transmission signal bandwidth.
+   *
+   * \return Bandwidth in Hz.
    */
   uint32_t GetBandwidthHz (void) const;
   /**
-   * \returns Number of constellation points in modulation
+   * Get the number of constellation points in the modulation scheme.
+   *
+   * \return Number of constellation points.
    */
   uint32_t GetConstellationSize (void) const;
   /**
-   * \returns Name
+   * Get the mode name.
+   *
+   * \return Name
    */
   std::string GetName (void) const;
   /**
-   * \returns Unique ID
+   * Get a unique id for the mode.
+   *
+   * \return Unique ID.
    */
   uint32_t GetUid (void) const;
 
@@ -84,33 +108,50 @@
   friend std::istream &operator>> (std::istream & is, UanTxMode &mode);
 
 
-  uint32_t m_uid;
+  uint32_t m_uid;  //!< Mode id
+
+};  // class UanTxMode
 
-};
+  
 /**
- * \brief Writes tx mode entry to stream os
+ * Writes tx mode entry to stream os.
+ *
+ * \param os The output stream.
+ * \param mode The mode.
+ * \return The stream.
  */
 std::ostream & operator << (std::ostream & os, const UanTxMode &mode);
 /**
- * \brief Reads tx mode entry from stream is
+ * Reads tx mode entry from stream is
+ *
+ * \param is The input stream.
+ * \param mode The mode.
+ * \return The stream.
  */
-std::istream & operator >> (std::istream & is, const UanTxMode &mode);
+std::istream & operator >> (std::istream & is, UanTxMode &mode);
 
+/**
+ * \ingroup uan
+ *
+ * Global database of UanTxMode objects, retrievable by id or name.
+ */
 class UanTxModeFactory
 {
 public:
-  UanTxModeFactory ();
-  ~UanTxModeFactory ();
+  UanTxModeFactory ();   //!< Constructor.
+  ~UanTxModeFactory ();  //!< Destructor.
 
   /**
    *
-   * \param type modulation type
-   * \param dataRateBps Data rate in BPS
-   * \param phyRateSps  Symbol rate in symbols per second
-   * \param cfHz Center frequency in Hz
-   * \param bwHz Bandwidth in Hz
-   * \param constSize Modulation constellation size (2 for BPSK, 4 for QPSK)
-   * \param name Unique string name for this transmission mode
+   * \param type Modulation type.
+   * \param dataRateBps Data rate in BPS.
+   * \param phyRateSps  Symbol rate in symbols per second.
+   * \param cfHz Center frequency in Hz.
+   * \param bwHz Bandwidth in Hz.
+   * \param constSize Modulation constellation size (2 for BPSK, 4 for QPSK).
+   * \param name Unique string name for this transmission mode.
+   *
+   * \return the transmit mode object
    */
   static UanTxMode CreateMode (UanTxMode::ModulationType type,
                                uint32_t dataRateBps,
@@ -121,87 +162,160 @@
                                std::string name);
 
   /**
-   * \param name String name of mode
-   * \returns Mode with given name
+   * Get a mode by name.
+   *
+   * \param name String name of mode.
+   * \return Mode with given name.
    */
   static UanTxMode GetMode (std::string name);
   /**
-   * \param uid Unique ID of mode
-   * \returns The mode with given uid
+   * Get a mode by id.
+   *
+   * \param uid Unique ID of mode.
+   * \return The mode with given uid.
    */
   static UanTxMode GetMode (uint32_t uid);
+
 private:
   friend class UanTxMode;
-  uint32_t m_nextUid;
+  uint32_t m_nextUid;                  //!< next id number
 
+  /**
+   * \ingroup uan
+   * Container for the UanTxMode properties.
+   */
   struct UanTxModeItem
   {
-    UanTxMode::ModulationType m_type;
-    uint32_t m_cfHz;
-    uint32_t m_bwHz;
-    uint32_t m_dataRateBps;
-    uint32_t m_phyRateSps;
-    uint32_t m_constSize;
-    uint32_t m_uid;
-    std::string m_name;
+    UanTxMode::ModulationType m_type;  //!< Modulation type.
+    uint32_t m_cfHz;                   //!< Center frequency in Hz.
+    uint32_t m_bwHz;                   //!< Bandwidth in Hz.
+    uint32_t m_dataRateBps;            //!< Data rate in BPS.
+    uint32_t m_phyRateSps;             //!< Symbol rate in symbols per second.
+    uint32_t m_constSize;              //!< Modulation constellation size (2 for BPSK, 4 for QPSK).
+    uint32_t m_uid;                    //!< Unique id.
+    std::string m_name;                //!< Unique string name for this transmission mode.
   };
 
+  /**
+   * Container for modes
+   *
+   * \internal
+   *   Accessed internally by uid and name, so a multimap might be more
+   *   appropriate.  If name accesses are predominant, perhaps a map
+   *   indexed by name, with a find for uid.  If accesses by uid dominate
+   *   then vector (since uid's are sequential), and find by name.
+   */
   std::map<uint32_t, UanTxModeItem> m_modes;
+
+  /**
+   * Check if the mode \pname{name} already exists.
+   *
+   * \param name The mode name to test.
+   * \return True if \pname{name} exists.
+   */
   bool NameUsed (std::string name);
+
+  /**
+   * Construct and get the static global factory instance.
+   *
+   * \return The global instance.
+   */
   static UanTxModeFactory &GetFactory (void);
+
+  /**
+   * Get a mode by id.
+   *
+   * \param uid The unique id to find.
+   * \return The corresponding mode.
+   */
   UanTxModeItem &GetModeItem (uint32_t uid);
+
+  /**
+   * Get a mode by name.
+   * \param name The mode name to find.
+   * \return The corresponding mode.
+   */
   UanTxModeItem &GetModeItem (std::string name);
+
+  /**
+   * Create a public UanTxMode from an internal UanTxModeItem.
+   *
+   * \param item The UanTxModeItem to reference.
+   * \return A public UanTxMode.
+   */
   UanTxMode MakeModeFromItem (const UanTxModeItem &item);
 
-};
+};  // class UanTxModeFactory
 
 /**
- * \class UanModesList
- * \brief Container for UanTxModes
+ * \ingroup uan
+ *
+ * Container for UanTxModes.
  */
-class UanModesList 
+class UanModesList
 {
 public:
-  UanModesList ();
-  virtual ~UanModesList ();
+  UanModesList ();           //!< Constructor
+  virtual ~UanModesList ();  //!< Destructor
 
   /**
-   * \param mode Add mode to list
+   * Add mode to this list.
+   * \param mode The mode to add.
    */
   void AppendMode (UanTxMode mode);
   /**
-   * \brief delete mode at given index
-   * \param num Index of mode to delete
+   * Delete the mode at given index.
+   * \param num Index of mode to delete.
    */
   void DeleteMode (uint32_t num);
   /**
-   * \param index Mode index
-   * \returns mode at given index
+   * Retrieve a mode by index.
+   *
+   * \param index Mode index.
+   * \return Mode at given index.
    */
   UanTxMode operator[] (uint32_t index) const;
   /**
-   * \returns Number of modes in list
+   * Get the number of modes in this list.
+   *
+   * \return Number of modes.
    */
   uint32_t GetNModes (void) const;
 
 
 private:
+  /** The vector of modes in this list. */
   std::vector<UanTxMode> m_modes;
+  
   friend std::ostream &operator << (std::ostream &os, const UanModesList &ml);
   friend std::istream &operator >> (std::istream &is, UanModesList &ml);
-};
+
+};  // class UanModesList
 
 /**
- * \brief Write UanModesList to stream os
+ * Write UanModesList to stream os
+ *
+ * \param os The output stream.
+ * \param ml The mode list.
+ * \return The stream.
  */
 std::ostream &operator << (std::ostream &os, const UanModesList &ml);
 /**
- * \brief Read UanModesList from stream is
+ * Read UanModesList from stream is.
+ *
+ * \param is The input stream.
+ * \param ml The mode list to fill.
+ * \return The stream.
  */
 std::istream &operator >> (std::istream &is, UanModesList &ml);
 
-/// UanModesList is attribute value
-ATTRIBUTE_HELPER_HEADER (UanModesList);
+/**
+ * \ingroup uan
+ * \class ns3::UanModesListValue
+ * \brief Attribute Value class for UanTxModes.
+ */
+ATTRIBUTE_HELPER_HEADER (UanModesList)
+  ;
 
 } // namespace ns3
 
diff -Naur ns-3.18.1/src/uan/test/uan-energy-model-test.cc ns-3.19/src/uan/test/uan-energy-model-test.cc
--- ns-3.18.1/src/uan/test/uan-energy-model-test.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/uan/test/uan-energy-model-test.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 
 namespace ns3 {
 
-NS_LOG_COMPONENT_DEFINE ("UanEnergyModelTestSuite");
+NS_LOG_COMPONENT_DEFINE ("UanEnergyModelTestSuite")
+  ;
 
 class AcousticModemEnergyTestCase : public TestCase
 {
diff -Naur ns-3.18.1/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py ns-3.19/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -1081,10 +1081,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
diff -Naur ns-3.18.1/src/virtual-net-device/bindings/modulegen__gcc_LP64.py ns-3.19/src/virtual-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -1081,10 +1081,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
diff -Naur ns-3.18.1/src/virtual-net-device/model/virtual-net-device.cc ns-3.19/src/virtual-net-device/model/virtual-net-device.cc
--- ns-3.18.1/src/virtual-net-device/model/virtual-net-device.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/virtual-net-device/model/virtual-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (VirtualNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (VirtualNetDevice)
+  ;
 
 TypeId
 VirtualNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/virtual-net-device/model/virtual-net-device.h ns-3.19/src/virtual-net-device/model/virtual-net-device.h
--- ns-3.18.1/src/virtual-net-device/model/virtual-net-device.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/virtual-net-device/model/virtual-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -33,12 +33,12 @@
 
 
 /**
- * \defgroup virtualdevice Virtual Device
+ * \defgroup virtual-net-device Virtual Device
  *
  */
 
 /**
- * \ingroup virtualdevice
+ * \ingroup virtual-net-device
  *
  * \class VirtualNetDevice
  * \brief A virtual device, similar to Linux TUN/TAP interfaces.
diff -Naur ns-3.18.1/src/visualizer/model/visual-simulator-impl.cc ns-3.19/src/visualizer/model/visual-simulator-impl.cc
--- ns-3.18.1/src/visualizer/model/visual-simulator-impl.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/visualizer/model/visual-simulator-impl.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (VisualSimulatorImpl);
+NS_OBJECT_ENSURE_REGISTERED (VisualSimulatorImpl)
+  ;
 
 namespace
 {
diff -Naur ns-3.18.1/src/wave/bindings/callbacks_list.py ns-3.19/src/wave/bindings/callbacks_list.py
--- ns-3.18.1/src/wave/bindings/callbacks_list.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/bindings/callbacks_list.py	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,9 @@
+callback_classes = [
+    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::WifiMacHeader const*', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::NetDevice>', 'ns3::Ptr<ns3::Packet const>', 'unsigned short', 'ns3::Address const&', 'ns3::Address const&', 'ns3::NetDevice::PacketType', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::WifiMacHeader const&', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Ptr<ns3::Packet>', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'unsigned char', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+    ['void', 'ns3::Mac48Address', 'unsigned char', 'bool', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
+]
diff -Naur ns-3.18.1/src/wave/bindings/modulegen__gcc_ILP32.py ns-3.19/src/wave/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/wave/bindings/modulegen__gcc_ILP32.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,9928 @@
+from pybindgen import Module, FileCodeSink, param, retval, cppclass, typehandlers
+
+
+import pybindgen.settings
+import warnings
+
+class ErrorHandler(pybindgen.settings.ErrorHandler):
+    def handle_error(self, wrapper, exception, traceback_):
+        warnings.warn("exception %r in wrapper %s" % (exception, wrapper))
+        return True
+pybindgen.settings.error_handler = ErrorHandler()
+
+
+import sys
+
+def module_init():
+    root_module = Module('ns.wave', cpp_namespace='::ns3')
+    return root_module
+
+def register_types(module):
+    root_module = module.get_root()
+    
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
+    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
+    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF'], import_from_module='ns.wifi')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
+    ## wifi-phy-standard.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
+    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## edca-txop-n.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'], import_from_module='ns.wifi')
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType [enumeration]
+    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
+    ## address.h (module 'network'): ns3::Address [class]
+    module.add_class('Address', import_from_module='ns.network')
+    ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
+    module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelper [class]
+    module.add_class('AsciiTraceHelper', import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelperForDevice [class]
+    module.add_class('AsciiTraceHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
+    module.add_class('AttributeConstructionList', import_from_module='ns.core')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
+    module.add_class('Item', import_from_module='ns.core', outer_class=root_module['ns3::AttributeConstructionList'])
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
+    module.add_class('Bar', import_from_module='ns.wifi')
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
+    module.add_class('BlockAckAgreement', import_from_module='ns.wifi')
+    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache [class]
+    module.add_class('BlockAckCache', import_from_module='ns.wifi')
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
+    module.add_class('BlockAckManager', import_from_module='ns.wifi')
+    ## buffer.h (module 'network'): ns3::Buffer [class]
+    module.add_class('Buffer', import_from_module='ns.network')
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::Buffer'])
+    ## packet.h (module 'network'): ns3::ByteTagIterator [class]
+    module.add_class('ByteTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagIterator'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList [class]
+    module.add_class('ByteTagList', import_from_module='ns.network')
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
+    ## callback.h (module 'core'): ns3::CallbackBase [class]
+    module.add_class('CallbackBase', import_from_module='ns.core')
+    ## capability-information.h (module 'wifi'): ns3::CapabilityInformation [class]
+    module.add_class('CapabilityInformation', import_from_module='ns.wifi')
+    ## event-id.h (module 'core'): ns3::EventId [class]
+    module.add_class('EventId', import_from_module='ns.core')
+    ## hash.h (module 'core'): ns3::Hasher [class]
+    module.add_class('Hasher', import_from_module='ns.core')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    module.add_class('Ipv4Address', import_from_module='ns.network')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
+    module.add_class('Ipv4Mask', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    module.add_class('Ipv6Address', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
+    module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener [class]
+    module.add_class('MacLowBlockAckEventListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener [class]
+    module.add_class('MacLowDcfListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener [class]
+    module.add_class('MacLowTransmissionListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionParameters [class]
+    module.add_class('MacLowTransmissionParameters', import_from_module='ns.wifi')
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
+    module.add_class('NetDeviceContainer', import_from_module='ns.network')
+    ## node-container.h (module 'network'): ns3::NodeContainer [class]
+    module.add_class('NodeContainer', import_from_module='ns.network')
+    ## object-base.h (module 'core'): ns3::ObjectBase [class]
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
+    ## object.h (module 'core'): ns3::ObjectDeleter [struct]
+    module.add_class('ObjectDeleter', import_from_module='ns.core')
+    ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
+    module.add_class('ObjectFactory', import_from_module='ns.core')
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier [class]
+    module.add_class('OrganizationIdentifier')
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifierType [enumeration]
+    module.add_enum('OrganizationIdentifierType', ['OUI24', 'OUI36', 'Unknown'], outer_class=root_module['ns3::OrganizationIdentifier'])
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement [class]
+    module.add_class('OriginatorBlockAckAgreement', import_from_module='ns.wifi', parent=root_module['ns3::BlockAckAgreement'])
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::State [enumeration]
+    module.add_enum('State', ['PENDING', 'ESTABLISHED', 'INACTIVE', 'UNSUCCESSFUL'], outer_class=root_module['ns3::OriginatorBlockAckAgreement'], import_from_module='ns.wifi')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
+    module.add_class('PacketMetadata', import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [enumeration]
+    module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item'], import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator [class]
+    module.add_class('ItemIterator', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet.h (module 'network'): ns3::PacketTagIterator [class]
+    module.add_class('PacketTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagIterator'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList [class]
+    module.add_class('PacketTagList', import_from_module='ns.network')
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
+    module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
+    module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## pcap-file.h (module 'network'): ns3::PcapFile [class]
+    module.add_class('PcapFile', import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
+    module.add_class('PcapHelper', import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
+    module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simulator.h (module 'core'): ns3::Simulator [class]
+    module.add_class('Simulator', destructor_visibility='private', import_from_module='ns.core')
+    ## status-code.h (module 'wifi'): ns3::StatusCode [class]
+    module.add_class('StatusCode', import_from_module='ns.wifi')
+    ## tag.h (module 'network'): ns3::Tag [class]
+    module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
+    module.add_class('TagBuffer', import_from_module='ns.network')
+    ## type-id.h (module 'core'): ns3::TypeId [class]
+    module.add_class('TypeId', import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
+    module.add_enum('AttributeFlag', ['ATTR_GET', 'ATTR_SET', 'ATTR_CONSTRUCT', 'ATTR_SGC'], outer_class=root_module['ns3::TypeId'], import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation [struct]
+    module.add_class('AttributeInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
+    module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificContentManager [class]
+    module.add_class('VendorSpecificContentManager')
+    ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
+    module.add_class('WifiHelper', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper [class]
+    module.add_class('WifiMacHelper', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
+    module.add_class('WifiMode', import_from_module='ns.wifi')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
+    module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper [class]
+    module.add_class('WifiPhyHelper', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener [class]
+    module.add_class('WifiPhyListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
+    module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
+    module.add_class('WifiRemoteStationInfo', import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [struct]
+    module.add_class('WifiRemoteStationState', import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [enumeration]
+    module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
+    module.add_class('WifiTxVector', import_from_module='ns.wifi')
+    ## empty.h (module 'core'): ns3::empty [class]
+    module.add_class('empty', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
+    module.add_class('int64x64_t', import_from_module='ns.core')
+    ## chunk.h (module 'network'): ns3::Chunk [class]
+    module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## header.h (module 'network'): ns3::Header [class]
+    module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## higher-tx-tag.h (module 'wave'): ns3::HigherDataTxVectorTag [class]
+    module.add_class('HigherDataTxVectorTag', parent=root_module['ns3::Tag'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader [class]
+    module.add_class('MgtAddBaRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaResponseHeader [class]
+    module.add_class('MgtAddBaResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocRequestHeader [class]
+    module.add_class('MgtAssocRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocResponseHeader [class]
+    module.add_class('MgtAssocResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtDelBaHeader [class]
+    module.add_class('MgtDelBaHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeRequestHeader [class]
+    module.add_class('MgtProbeRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeResponseHeader [class]
+    module.add_class('MgtProbeResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::NqosWifiMacHelper [class]
+    module.add_class('NqosWifiMacHelper', import_from_module='ns.wifi', parent=root_module['ns3::WifiMacHelper'])
+    ## object.h (module 'core'): ns3::Object [class]
+    module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
+    module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
+    module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## qos-wifi-mac-helper.h (module 'wifi'): ns3::QosWifiMacHelper [class]
+    module.add_class('QosWifiMacHelper', import_from_module='ns.wifi', parent=root_module['ns3::WifiMacHelper'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## nstime.h (module 'core'): ns3::Time [class]
+    module.add_class('Time', import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time [class]
+    root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
+    module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    ## trailer.h (module 'network'): ns3::Trailer [class]
+    module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificActionHeader [class]
+    module.add_class('VendorSpecificActionHeader', parent=root_module['ns3::Header'])
+    ## wifi-80211p-helper.h (module 'wave'): ns3::Wifi80211pHelper [class]
+    module.add_class('Wifi80211pHelper', parent=root_module['ns3::WifiHelper'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
+    module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
+    module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
+    module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METRIC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActionValue [enumeration]
+    module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionValue [enumeration]
+    module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinationActionValue [enumeration]
+    module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValue [enumeration]
+    module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_ACK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union]
+    module.add_class('ActionValue', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiActionHeader'])
+    ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement [class]
+    module.add_class('WifiInformationElement', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
+    module.add_class('WifiMac', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
+    module.add_class('WifiMacHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
+    module.add_enum('QosAckPolicy', ['NORMAL_ACK', 'NO_ACK', 'NO_EXPLICIT_ACK', 'BLOCK_ACK'], outer_class=root_module['ns3::WifiMacHeader'], import_from_module='ns.wifi')
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::AddressType [enumeration]
+    module.add_enum('AddressType', ['ADDR1', 'ADDR2', 'ADDR3', 'ADDR4'], outer_class=root_module['ns3::WifiMacHeader'], import_from_module='ns.wifi')
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue [class]
+    module.add_class('WifiMacQueue', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
+    module.add_class('WifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::State [enumeration]
+    module.add_enum('State', ['IDLE', 'CCA_BUSY', 'TX', 'RX', 'SWITCHING'], outer_class=root_module['ns3::WifiPhy'], import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
+    module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
+    module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    ## attribute.h (module 'core'): ns3::AttributeChecker [class]
+    module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    ## attribute.h (module 'core'): ns3::AttributeValue [class]
+    module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    ## callback.h (module 'core'): ns3::CallbackChecker [class]
+    module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## callback.h (module 'core'): ns3::CallbackImplBase [class]
+    module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    ## callback.h (module 'core'): ns3::CallbackValue [class]
+    module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader [class]
+    module.add_class('CtrlBAckRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader [class]
+    module.add_class('CtrlBAckResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## dcf.h (module 'wifi'): ns3::Dcf [class]
+    module.add_class('Dcf', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## edca-txop-n.h (module 'wifi'): ns3::EdcaTxopN [class]
+    module.add_class('EdcaTxopN', import_from_module='ns.wifi', parent=root_module['ns3::Dcf'])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
+    module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## event-impl.h (module 'core'): ns3::EventImpl [class]
+    module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE [class]
+    module.add_class('ExtendedSupportedRatesIE', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities [class]
+    module.add_class('HtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesChecker [class]
+    module.add_class('HtCapabilitiesChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesValue [class]
+    module.add_class('HtCapabilitiesValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
+    module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
+    module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
+    module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
+    module.add_class('Ipv4MaskValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
+    module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
+    module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
+    module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
+    module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker [class]
+    module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## mac-low.h (module 'wifi'): ns3::MacLow [class]
+    module.add_class('MacLow', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader [class]
+    module.add_class('MgtBeaconHeader', import_from_module='ns.wifi', parent=root_module['ns3::MgtProbeResponseHeader'])
+    ## net-device.h (module 'network'): ns3::NetDevice [class]
+    module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
+    module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
+    ## nix-vector.h (module 'network'): ns3::NixVector [class]
+    module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    ## node.h (module 'network'): ns3::Node [class]
+    module.add_class('Node', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper [class]
+    module.add_class('NqosWaveMacHelper', parent=root_module['ns3::NqosWifiMacHelper'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
+    module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
+    module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker [class]
+    module.add_class('OrganizationIdentifierChecker', parent=root_module['ns3::AttributeChecker'])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue [class]
+    module.add_class('OrganizationIdentifierValue', parent=root_module['ns3::AttributeValue'])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper [class]
+    module.add_class('OutputStreamWrapper', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
+    ## packet.h (module 'network'): ns3::Packet [class]
+    module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    ## pointer.h (module 'core'): ns3::PointerChecker [class]
+    module.add_class('PointerChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## pointer.h (module 'core'): ns3::PointerValue [class]
+    module.add_class('PointerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## wave-mac-helper.h (module 'wave'): ns3::QosWaveMacHelper [class]
+    module.add_class('QosWaveMacHelper', parent=root_module['ns3::QosWifiMacHelper'])
+    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
+    module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
+    ## ssid.h (module 'wifi'): ns3::Ssid [class]
+    module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
+    module.add_class('SsidChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## ssid.h (module 'wifi'): ns3::SsidValue [class]
+    module.add_class('SsidValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates [class]
+    module.add_class('SupportedRates', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## nstime.h (module 'core'): ns3::TimeValue [class]
+    module.add_class('TimeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
+    module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## type-id.h (module 'core'): ns3::TypeIdValue [class]
+    module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## uinteger.h (module 'core'): ns3::UintegerValue [class]
+    module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow [class]
+    module.add_class('WaveMacLow', parent=root_module['ns3::MacLow'])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
+    module.add_class('WifiModeChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue [class]
+    module.add_class('WifiModeValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
+    ## address.h (module 'network'): ns3::AddressChecker [class]
+    module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## address.h (module 'network'): ns3::AddressValue [class]
+    module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## dca-txop.h (module 'wifi'): ns3::DcaTxop [class]
+    module.add_class('DcaTxop', import_from_module='ns.wifi', parent=root_module['ns3::Dcf'])
+    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac [class]
+    module.add_class('OcbWifiMac', parent=root_module['ns3::RegularWifiMac'])
+    module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
+    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type='vector')
+    typehandlers.add_type_alias('std::vector< unsigned char, std::allocator< unsigned char > >', 'ns3::WifiMcsList')
+    typehandlers.add_type_alias('std::vector< unsigned char, std::allocator< unsigned char > >*', 'ns3::WifiMcsList*')
+    typehandlers.add_type_alias('std::vector< unsigned char, std::allocator< unsigned char > >&', 'ns3::WifiMcsList&')
+    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
+    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
+    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::VscCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::VscCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::VscCallback&')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', 'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', 'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >', 'ns3::WifiModeList')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >*', 'ns3::WifiModeList*')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >&', 'ns3::WifiModeList&')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', 'ns3::WifiMcsListIterator')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', 'ns3::WifiMcsListIterator*')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', 'ns3::WifiMcsListIterator&')
+    
+    ## Register a nested module for the namespace FatalImpl
+    
+    nested_module = module.add_cpp_namespace('FatalImpl')
+    register_types_ns3_FatalImpl(nested_module)
+    
+    
+    ## Register a nested module for the namespace Hash
+    
+    nested_module = module.add_cpp_namespace('Hash')
+    register_types_ns3_Hash(nested_module)
+    
+    
+    ## Register a nested module for the namespace internal
+    
+    nested_module = module.add_cpp_namespace('internal')
+    register_types_ns3_internal(nested_module)
+    
+
+def register_types_ns3_FatalImpl(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_Hash(module):
+    root_module = module.get_root()
+    
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation [class]
+    module.add_class('Implementation', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash64Function_ptr')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash64Function_ptr*')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash64Function_ptr&')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash32Function_ptr')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash32Function_ptr*')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash32Function_ptr&')
+    
+    ## Register a nested module for the namespace Function
+    
+    nested_module = module.add_cpp_namespace('Function')
+    register_types_ns3_Hash_Function(nested_module)
+    
+
+def register_types_ns3_Hash_Function(module):
+    root_module = module.get_root()
+    
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a [class]
+    module.add_class('Fnv1a', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32 [class]
+    module.add_class('Hash32', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64 [class]
+    module.add_class('Hash64', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
+    module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+
+def register_types_ns3_internal(module):
+    root_module = module.get_root()
+    
+
+def register_methods(root_module):
+    register_Ns3Address_methods(root_module, root_module['ns3::Address'])
+    register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
+    register_Ns3AsciiTraceHelperForDevice_methods(root_module, root_module['ns3::AsciiTraceHelperForDevice'])
+    register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
+    register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
+    register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
+    register_Ns3BlockAckCache_methods(root_module, root_module['ns3::BlockAckCache'])
+    register_Ns3BlockAckManager_methods(root_module, root_module['ns3::BlockAckManager'])
+    register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
+    register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
+    register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
+    register_Ns3ByteTagIteratorItem_methods(root_module, root_module['ns3::ByteTagIterator::Item'])
+    register_Ns3ByteTagList_methods(root_module, root_module['ns3::ByteTagList'])
+    register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
+    register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
+    register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
+    register_Ns3CapabilityInformation_methods(root_module, root_module['ns3::CapabilityInformation'])
+    register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
+    register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
+    register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
+    register_Ns3MacLowBlockAckEventListener_methods(root_module, root_module['ns3::MacLowBlockAckEventListener'])
+    register_Ns3MacLowDcfListener_methods(root_module, root_module['ns3::MacLowDcfListener'])
+    register_Ns3MacLowTransmissionListener_methods(root_module, root_module['ns3::MacLowTransmissionListener'])
+    register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
+    register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
+    register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
+    register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
+    register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
+    register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
+    register_Ns3OrganizationIdentifier_methods(root_module, root_module['ns3::OrganizationIdentifier'])
+    register_Ns3OriginatorBlockAckAgreement_methods(root_module, root_module['ns3::OriginatorBlockAckAgreement'])
+    register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
+    register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
+    register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
+    register_Ns3PacketTagIterator_methods(root_module, root_module['ns3::PacketTagIterator'])
+    register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
+    register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
+    register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3PcapFile_methods(root_module, root_module['ns3::PcapFile'])
+    register_Ns3PcapHelper_methods(root_module, root_module['ns3::PcapHelper'])
+    register_Ns3PcapHelperForDevice_methods(root_module, root_module['ns3::PcapHelperForDevice'])
+    register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
+    register_Ns3StatusCode_methods(root_module, root_module['ns3::StatusCode'])
+    register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
+    register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
+    register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
+    register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3VendorSpecificContentManager_methods(root_module, root_module['ns3::VendorSpecificContentManager'])
+    register_Ns3WifiHelper_methods(root_module, root_module['ns3::WifiHelper'])
+    register_Ns3WifiMacHelper_methods(root_module, root_module['ns3::WifiMacHelper'])
+    register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
+    register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
+    register_Ns3WifiPhyHelper_methods(root_module, root_module['ns3::WifiPhyHelper'])
+    register_Ns3WifiPhyListener_methods(root_module, root_module['ns3::WifiPhyListener'])
+    register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
+    register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
+    register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
+    register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
+    register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
+    register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
+    register_Ns3Header_methods(root_module, root_module['ns3::Header'])
+    register_Ns3HigherDataTxVectorTag_methods(root_module, root_module['ns3::HigherDataTxVectorTag'])
+    register_Ns3MgtAddBaRequestHeader_methods(root_module, root_module['ns3::MgtAddBaRequestHeader'])
+    register_Ns3MgtAddBaResponseHeader_methods(root_module, root_module['ns3::MgtAddBaResponseHeader'])
+    register_Ns3MgtAssocRequestHeader_methods(root_module, root_module['ns3::MgtAssocRequestHeader'])
+    register_Ns3MgtAssocResponseHeader_methods(root_module, root_module['ns3::MgtAssocResponseHeader'])
+    register_Ns3MgtDelBaHeader_methods(root_module, root_module['ns3::MgtDelBaHeader'])
+    register_Ns3MgtProbeRequestHeader_methods(root_module, root_module['ns3::MgtProbeRequestHeader'])
+    register_Ns3MgtProbeResponseHeader_methods(root_module, root_module['ns3::MgtProbeResponseHeader'])
+    register_Ns3NqosWifiMacHelper_methods(root_module, root_module['ns3::NqosWifiMacHelper'])
+    register_Ns3Object_methods(root_module, root_module['ns3::Object'])
+    register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3PcapFileWrapper_methods(root_module, root_module['ns3::PcapFileWrapper'])
+    register_Ns3QosWifiMacHelper_methods(root_module, root_module['ns3::QosWifiMacHelper'])
+    register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
+    register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
+    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
+    register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
+    register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
+    register_Ns3VendorSpecificActionHeader_methods(root_module, root_module['ns3::VendorSpecificActionHeader'])
+    register_Ns3Wifi80211pHelper_methods(root_module, root_module['ns3::Wifi80211pHelper'])
+    register_Ns3WifiActionHeader_methods(root_module, root_module['ns3::WifiActionHeader'])
+    register_Ns3WifiActionHeaderActionValue_methods(root_module, root_module['ns3::WifiActionHeader::ActionValue'])
+    register_Ns3WifiInformationElement_methods(root_module, root_module['ns3::WifiInformationElement'])
+    register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
+    register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
+    register_Ns3WifiMacQueue_methods(root_module, root_module['ns3::WifiMacQueue'])
+    register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
+    register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
+    register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
+    register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
+    register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
+    register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
+    register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
+    register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
+    register_Ns3CtrlBAckRequestHeader_methods(root_module, root_module['ns3::CtrlBAckRequestHeader'])
+    register_Ns3CtrlBAckResponseHeader_methods(root_module, root_module['ns3::CtrlBAckResponseHeader'])
+    register_Ns3Dcf_methods(root_module, root_module['ns3::Dcf'])
+    register_Ns3EdcaTxopN_methods(root_module, root_module['ns3::EdcaTxopN'])
+    register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3ExtendedSupportedRatesIE_methods(root_module, root_module['ns3::ExtendedSupportedRatesIE'])
+    register_Ns3HtCapabilities_methods(root_module, root_module['ns3::HtCapabilities'])
+    register_Ns3HtCapabilitiesChecker_methods(root_module, root_module['ns3::HtCapabilitiesChecker'])
+    register_Ns3HtCapabilitiesValue_methods(root_module, root_module['ns3::HtCapabilitiesValue'])
+    register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
+    register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
+    register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
+    register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
+    register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
+    register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
+    register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
+    register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
+    register_Ns3MacLow_methods(root_module, root_module['ns3::MacLow'])
+    register_Ns3MgtBeaconHeader_methods(root_module, root_module['ns3::MgtBeaconHeader'])
+    register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
+    register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
+    register_Ns3Node_methods(root_module, root_module['ns3::Node'])
+    register_Ns3NqosWaveMacHelper_methods(root_module, root_module['ns3::NqosWaveMacHelper'])
+    register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
+    register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3OrganizationIdentifierChecker_methods(root_module, root_module['ns3::OrganizationIdentifierChecker'])
+    register_Ns3OrganizationIdentifierValue_methods(root_module, root_module['ns3::OrganizationIdentifierValue'])
+    register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
+    register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
+    register_Ns3PointerChecker_methods(root_module, root_module['ns3::PointerChecker'])
+    register_Ns3PointerValue_methods(root_module, root_module['ns3::PointerValue'])
+    register_Ns3QosWaveMacHelper_methods(root_module, root_module['ns3::QosWaveMacHelper'])
+    register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
+    register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
+    register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
+    register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
+    register_Ns3SupportedRates_methods(root_module, root_module['ns3::SupportedRates'])
+    register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
+    register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
+    register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3UintegerValue_methods(root_module, root_module['ns3::UintegerValue'])
+    register_Ns3WaveMacLow_methods(root_module, root_module['ns3::WaveMacLow'])
+    register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
+    register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
+    register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
+    register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
+    register_Ns3DcaTxop_methods(root_module, root_module['ns3::DcaTxop'])
+    register_Ns3OcbWifiMac_methods(root_module, root_module['ns3::OcbWifiMac'])
+    register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
+    register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
+    register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
+    register_Ns3HashFunctionHash64_methods(root_module, root_module['ns3::Hash::Function::Hash64'])
+    register_Ns3HashFunctionMurmur3_methods(root_module, root_module['ns3::Hash::Function::Murmur3'])
+    return
+
+def register_Ns3Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## address.h (module 'network'): ns3::Address::Address() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::Address::Address(uint8_t type, uint8_t const * buffer, uint8_t len) [constructor]
+    cls.add_constructor([param('uint8_t', 'type'), param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): ns3::Address::Address(ns3::Address const & address) [copy constructor]
+    cls.add_constructor([param('ns3::Address const &', 'address')])
+    ## address.h (module 'network'): bool ns3::Address::CheckCompatible(uint8_t type, uint8_t len) const [member function]
+    cls.add_method('CheckCompatible', 
+                   'bool', 
+                   [param('uint8_t', 'type'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyAllFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllTo(uint8_t * buffer, uint8_t len) const [member function]
+    cls.add_method('CopyAllTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## address.h (module 'network'): void ns3::Address::Deserialize(ns3::TagBuffer buffer) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')])
+    ## address.h (module 'network'): uint8_t ns3::Address::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsInvalid() const [member function]
+    cls.add_method('IsInvalid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsMatchingType(uint8_t type) const [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('uint8_t', 'type')], 
+                   is_const=True)
+    ## address.h (module 'network'): static uint8_t ns3::Address::Register() [member function]
+    cls.add_method('Register', 
+                   'uint8_t', 
+                   [], 
+                   is_static=True)
+    ## address.h (module 'network'): void ns3::Address::Serialize(ns3::TagBuffer buffer) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')], 
+                   is_const=True)
+    return
+
+def register_Ns3AsciiTraceHelper_methods(root_module, cls):
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelper::AsciiTraceHelper(ns3::AsciiTraceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AsciiTraceHelper const &', 'arg0')])
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelper::AsciiTraceHelper() [constructor]
+    cls.add_constructor([])
+    ## trace-helper.h (module 'network'): ns3::Ptr<ns3::OutputStreamWrapper> ns3::AsciiTraceHelper::CreateFileStream(std::string filename, std::_Ios_Openmode filemode=std::ios_base::out) [member function]
+    cls.add_method('CreateFileStream', 
+                   'ns3::Ptr< ns3::OutputStreamWrapper >', 
+                   [param('std::string', 'filename'), param('std::_Ios_Openmode', 'filemode', default_value='std::ios_base::out')])
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultDequeueSinkWithContext(ns3::Ptr<ns3::OutputStreamWrapper> file, std::string context, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultDequeueSinkWithContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultDequeueSinkWithoutContext(ns3::Ptr<ns3::OutputStreamWrapper> file, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultDequeueSinkWithoutContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultDropSinkWithContext(ns3::Ptr<ns3::OutputStreamWrapper> file, std::string context, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultDropSinkWithContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultDropSinkWithoutContext(ns3::Ptr<ns3::OutputStreamWrapper> file, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultDropSinkWithoutContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultEnqueueSinkWithContext(ns3::Ptr<ns3::OutputStreamWrapper> file, std::string context, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultEnqueueSinkWithContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultEnqueueSinkWithoutContext(ns3::Ptr<ns3::OutputStreamWrapper> file, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultEnqueueSinkWithoutContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultReceiveSinkWithContext(ns3::Ptr<ns3::OutputStreamWrapper> file, std::string context, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultReceiveSinkWithContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultReceiveSinkWithoutContext(ns3::Ptr<ns3::OutputStreamWrapper> file, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultReceiveSinkWithoutContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): std::string ns3::AsciiTraceHelper::GetFilenameFromDevice(std::string prefix, ns3::Ptr<ns3::NetDevice> device, bool useObjectNames=true) [member function]
+    cls.add_method('GetFilenameFromDevice', 
+                   'std::string', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'useObjectNames', default_value='true')])
+    ## trace-helper.h (module 'network'): std::string ns3::AsciiTraceHelper::GetFilenameFromInterfacePair(std::string prefix, ns3::Ptr<ns3::Object> object, uint32_t interface, bool useObjectNames=true) [member function]
+    cls.add_method('GetFilenameFromInterfacePair', 
+                   'std::string', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::Object >', 'object'), param('uint32_t', 'interface'), param('bool', 'useObjectNames', default_value='true')])
+    return
+
+def register_Ns3AsciiTraceHelperForDevice_methods(root_module, cls):
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelperForDevice::AsciiTraceHelperForDevice(ns3::AsciiTraceHelperForDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AsciiTraceHelperForDevice const &', 'arg0')])
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelperForDevice::AsciiTraceHelperForDevice() [constructor]
+    cls.add_constructor([])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool explicitFilename=false) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'explicitFilename', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Ptr<ns3::NetDevice> nd) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Ptr< ns3::NetDevice >', 'nd')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, std::string ndName, bool explicitFilename=false) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('std::string', 'ndName'), param('bool', 'explicitFilename', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string ndName) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('std::string', 'ndName')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, ns3::NetDeviceContainer d) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::NetDeviceContainer', 'd')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::NetDeviceContainer d) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::NetDeviceContainer', 'd')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, ns3::NodeContainer n) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::NodeContainer', 'n')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::NodeContainer n) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::NodeContainer', 'n')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, uint32_t nodeid, uint32_t deviceid, bool explicitFilename) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('uint32_t', 'nodeid'), param('uint32_t', 'deviceid'), param('bool', 'explicitFilename')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, uint32_t nodeid, uint32_t deviceid) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('uint32_t', 'nodeid'), param('uint32_t', 'deviceid')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAsciiAll(std::string prefix) [member function]
+    cls.add_method('EnableAsciiAll', 
+                   'void', 
+                   [param('std::string', 'prefix')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAsciiAll(ns3::Ptr<ns3::OutputStreamWrapper> stream) [member function]
+    cls.add_method('EnableAsciiAll', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAsciiInternal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool explicitFilename) [member function]
+    cls.add_method('EnableAsciiInternal', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'explicitFilename')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeConstructionList_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList(ns3::AttributeConstructionList const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): void ns3::AttributeConstructionList::Add(std::string name, ns3::Ptr<ns3::AttributeChecker const> checker, ns3::Ptr<ns3::AttributeValue> value) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker'), param('ns3::Ptr< ns3::AttributeValue >', 'value')])
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::End() const [member function]
+    cls.add_method('End', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeConstructionList::Find(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True)
+    return
+
+def register_Ns3AttributeConstructionListItem_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item(ns3::AttributeConstructionList::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList::Item const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::value [variable]
+    cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
+    return
+
+def register_Ns3Bar_methods(root_module, cls):
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar(ns3::Bar const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Bar const &', 'arg0')])
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar() [constructor]
+    cls.add_constructor([])
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address recipient, uint8_t tid, bool immediate) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('bool', 'immediate')])
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::bar [variable]
+    cls.add_instance_attribute('bar', 'ns3::Ptr< ns3::Packet const >', is_const=False)
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::immediate [variable]
+    cls.add_instance_attribute('immediate', 'bool', is_const=False)
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::recipient [variable]
+    cls.add_instance_attribute('recipient', 'ns3::Mac48Address', is_const=False)
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::tid [variable]
+    cls.add_instance_attribute('tid', 'uint8_t', is_const=False)
+    return
+
+def register_Ns3BlockAckAgreement_methods(root_module, cls):
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::BlockAckAgreement const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement() [constructor]
+    cls.add_constructor([])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
+    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
+    cls.add_method('GetBufferSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
+    cls.add_method('GetPeer', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): uint8_t ns3::BlockAckAgreement::GetTid() const [member function]
+    cls.add_method('GetTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetTimeout() const [member function]
+    cls.add_method('GetTimeout', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsAmsduSupported() const [member function]
+    cls.add_method('IsAmsduSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsImmediateBlockAck() const [member function]
+    cls.add_method('IsImmediateBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetAmsduSupport(bool supported) [member function]
+    cls.add_method('SetAmsduSupport', 
+                   'void', 
+                   [param('bool', 'supported')])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetBufferSize(uint16_t bufferSize) [member function]
+    cls.add_method('SetBufferSize', 
+                   'void', 
+                   [param('uint16_t', 'bufferSize')])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetDelayedBlockAck() [member function]
+    cls.add_method('SetDelayedBlockAck', 
+                   'void', 
+                   [])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetImmediateBlockAck() [member function]
+    cls.add_method('SetImmediateBlockAck', 
+                   'void', 
+                   [])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    return
+
+def register_Ns3BlockAckCache_methods(root_module, cls):
+    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache() [constructor]
+    cls.add_constructor([])
+    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache(ns3::BlockAckCache const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BlockAckCache const &', 'arg0')])
+    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::FillBlockAckBitmap(ns3::CtrlBAckResponseHeader * blockAckHeader) [member function]
+    cls.add_method('FillBlockAckBitmap', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader *', 'blockAckHeader')])
+    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::Init(uint16_t winStart, uint16_t winSize) [member function]
+    cls.add_method('Init', 
+                   'void', 
+                   [param('uint16_t', 'winStart'), param('uint16_t', 'winSize')])
+    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithBlockAckReq(uint16_t startingSeq) [member function]
+    cls.add_method('UpdateWithBlockAckReq', 
+                   'void', 
+                   [param('uint16_t', 'startingSeq')])
+    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithMpdu(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('UpdateWithMpdu', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    return
+
+def register_Ns3BlockAckManager_methods(root_module, cls):
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager::BlockAckManager() [constructor]
+    cls.add_constructor([])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('CreateAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('DestroyAgreement', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreement(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('ExistsAgreement', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreementInState(ns3::Mac48Address recipient, uint8_t tid, ns3::OriginatorBlockAckAgreement::State state) const [member function]
+    cls.add_method('ExistsAgreementInState', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::OriginatorBlockAckAgreement::State', 'state')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNBufferedPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetNBufferedPackets', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetNRetryNeededPackets', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::BlockAckManager::GetNextPacket(ns3::WifiMacHeader & hdr) [member function]
+    cls.add_method('GetNextPacket', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader &', 'hdr')])
+    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNextPacketSize() const [member function]
+    cls.add_method('GetNextPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetSeqNumOfNextRetryPacket(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetSeqNumOfNextRetryPacket', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasBar(ns3::Bar & bar) [member function]
+    cls.add_method('HasBar', 
+                   'bool', 
+                   [param('ns3::Bar &', 'bar')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasOtherFragments(uint16_t sequenceNumber) const [member function]
+    cls.add_method('HasOtherFragments', 
+                   'bool', 
+                   [param('uint16_t', 'sequenceNumber')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() const [member function]
+    cls.add_method('HasPackets', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementEstablished(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
+    cls.add_method('NotifyAgreementEstablished', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementUnsuccessful(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyAgreementUnsuccessful', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient) [member function]
+    cls.add_method('NotifyGotBlockAck', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMpduTransmission(ns3::Mac48Address recipient, uint8_t tid, uint16_t nextSeqNumber) [member function]
+    cls.add_method('NotifyMpduTransmission', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'nextSeqNumber')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetBlockAckInactivityCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckThreshold(uint8_t nPackets) [member function]
+    cls.add_method('SetBlockAckThreshold', 
+                   'void', 
+                   [param('uint8_t', 'nPackets')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckType(ns3::BlockAckType bAckType) [member function]
+    cls.add_method('SetBlockAckType', 
+                   'void', 
+                   [param('ns3::BlockAckType', 'bAckType')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetBlockDestinationCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetMaxPacketDelay(ns3::Time maxDelay) [member function]
+    cls.add_method('SetMaxPacketDelay', 
+                   'void', 
+                   [param('ns3::Time', 'maxDelay')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetQueue(ns3::Ptr<ns3::WifiMacQueue> queue) [member function]
+    cls.add_method('SetQueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxMiddle(ns3::MacTxMiddle * txMiddle) [member function]
+    cls.add_method('SetTxMiddle', 
+                   'void', 
+                   [param('ns3::MacTxMiddle *', 'txMiddle')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetUnblockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetUnblockDestinationCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr, ns3::Time tStamp) [member function]
+    cls.add_method('StorePacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr'), param('ns3::Time', 'tStamp')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::SwitchToBlockAckIfNeeded(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
+    cls.add_method('SwitchToBlockAckIfNeeded', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::TearDownBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('TearDownBlockAck', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('UpdateAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+    return
+
+def register_Ns3Buffer_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize, bool initialize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    cls.add_method('AddAtEnd', 
+                   'bool', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    cls.add_method('AddAtStart', 
+                   'bool', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Buffer', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
+    cls.add_method('CreateFullCopy', 
+                   'ns3::Buffer', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
+    cls.add_method('GetCurrentEndOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
+    cls.add_method('GetCurrentStartOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint8_t const * ns3::Buffer::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3BufferIterator_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator(ns3::Buffer::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer::Iterator const &', 'arg0')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size, uint32_t initialChecksum) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size'), param('uint32_t', 'initialChecksum')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetDistanceFrom(ns3::Buffer::Iterator const & o) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator const &', 'o')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsEnd() const [member function]
+    cls.add_method('IsEnd', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsStart() const [member function]
+    cls.add_method('IsStart', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next(uint32_t delta) [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev(uint32_t delta) [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
+    cls.add_method('ReadLsbtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadLsbtohU32() [member function]
+    cls.add_method('ReadLsbtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadLsbtohU64() [member function]
+    cls.add_method('ReadLsbtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadNtohU16() [member function]
+    cls.add_method('ReadNtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadNtohU32() [member function]
+    cls.add_method('ReadNtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadNtohU64() [member function]
+    cls.add_method('ReadNtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('ns3::Buffer::Iterator', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU16(uint16_t data) [member function]
+    cls.add_method('WriteHtolsbU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU32(uint32_t data) [member function]
+    cls.add_method('WriteHtolsbU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU64(uint64_t data) [member function]
+    cls.add_method('WriteHtolsbU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU16(uint16_t data) [member function]
+    cls.add_method('WriteHtonU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU32(uint32_t data) [member function]
+    cls.add_method('WriteHtonU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU64(uint64_t data) [member function]
+    cls.add_method('WriteHtonU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU64(uint64_t data) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data, uint32_t len) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data'), param('uint32_t', 'len')])
+    return
+
+def register_Ns3ByteTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::ByteTagIterator(ns3::ByteTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::ByteTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item ns3::ByteTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item::Item(ns3::ByteTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetEnd() const [member function]
+    cls.add_method('GetEnd', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetStart() const [member function]
+    cls.add_method('GetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::ByteTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::ByteTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ByteTagList_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList() [constructor]
+    cls.add_constructor([])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList(ns3::ByteTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): ns3::TagBuffer ns3::ByteTagList::Add(ns3::TypeId tid, uint32_t bufferSize, int32_t start, int32_t end) [member function]
+    cls.add_method('Add', 
+                   'ns3::TagBuffer', 
+                   [param('ns3::TypeId', 'tid'), param('uint32_t', 'bufferSize'), param('int32_t', 'start'), param('int32_t', 'end')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Add(ns3::ByteTagList const & o) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+    cls.add_method('AddAtStart', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
+    cls.add_method('Begin', 
+                   'ns3::ByteTagList::Iterator', 
+                   [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIterator_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Iterator(ns3::ByteTagList::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Iterator::GetOffsetStart() const [member function]
+    cls.add_method('GetOffsetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): bool ns3::ByteTagList::Iterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item ns3::ByteTagList::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagList::Iterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIteratorItem_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::ByteTagList::Iterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator::Item const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::TagBuffer buf) [constructor]
+    cls.add_constructor([param('ns3::TagBuffer', 'buf')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::buf [variable]
+    cls.add_instance_attribute('buf', 'ns3::TagBuffer', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::end [variable]
+    cls.add_instance_attribute('end', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::size [variable]
+    cls.add_instance_attribute('size', 'uint32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::start [variable]
+    cls.add_instance_attribute('start', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3CallbackBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::CallbackBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::CallbackImplBase> ns3::CallbackBase::GetImpl() const [member function]
+    cls.add_method('GetImpl', 
+                   'ns3::Ptr< ns3::CallbackImplBase >', 
+                   [], 
+                   is_const=True)
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
+                        visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3CapabilityInformation_methods(root_module, cls):
+    ## capability-information.h (module 'wifi'): ns3::CapabilityInformation::CapabilityInformation(ns3::CapabilityInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CapabilityInformation const &', 'arg0')])
+    ## capability-information.h (module 'wifi'): ns3::CapabilityInformation::CapabilityInformation() [constructor]
+    cls.add_constructor([])
+    ## capability-information.h (module 'wifi'): ns3::Buffer::Iterator ns3::CapabilityInformation::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## capability-information.h (module 'wifi'): uint32_t ns3::CapabilityInformation::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## capability-information.h (module 'wifi'): bool ns3::CapabilityInformation::IsEss() const [member function]
+    cls.add_method('IsEss', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## capability-information.h (module 'wifi'): bool ns3::CapabilityInformation::IsIbss() const [member function]
+    cls.add_method('IsIbss', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## capability-information.h (module 'wifi'): ns3::Buffer::Iterator ns3::CapabilityInformation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## capability-information.h (module 'wifi'): void ns3::CapabilityInformation::SetEss() [member function]
+    cls.add_method('SetEss', 
+                   'void', 
+                   [])
+    ## capability-information.h (module 'wifi'): void ns3::CapabilityInformation::SetIbss() [member function]
+    cls.add_method('SetIbss', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3EventId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::EventId const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventId const &', 'arg0')])
+    ## event-id.h (module 'core'): ns3::EventId::EventId() [constructor]
+    cls.add_constructor([])
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::Ptr<ns3::EventImpl> const & impl, uint64_t ts, uint32_t context, uint32_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EventImpl > const &', 'impl'), param('uint64_t', 'ts'), param('uint32_t', 'context'), param('uint32_t', 'uid')])
+    ## event-id.h (module 'core'): void ns3::EventId::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetContext() const [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint64_t ns3::EventId::GetTs() const [member function]
+    cls.add_method('GetTs', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsExpired() const [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): ns3::EventImpl * ns3::EventId::PeekEventImpl() const [member function]
+    cls.add_method('PeekEventImpl', 
+                   'ns3::EventImpl *', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3Hasher_methods(root_module, cls):
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher() [constructor]
+    cls.add_constructor([])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Ptr<ns3::Hash::Implementation> hp) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Hash::Implementation >', 'hp')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(std::string const s) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(std::string const s) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): ns3::Hasher & ns3::Hasher::clear() [member function]
+    cls.add_method('clear', 
+                   'ns3::Hasher &', 
+                   [])
+    return
+
+def register_Ns3Ipv4Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(uint32_t address) [constructor]
+    cls.add_constructor([param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::CombineMask(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('CombineMask', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv4Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Address::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::GetSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('GetSubnetDirectedBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const &', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
+    cls.add_method('IsLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static bool ns3::Ipv4Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('IsSubnetDirectedBroadcast', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(uint32_t address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    return
+
+def register_Ns3Ipv4Mask_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(ns3::Ipv4Mask const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(uint32_t mask) [constructor]
+    cls.add_constructor([param('uint32_t', 'mask')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(char const * mask) [constructor]
+    cls.add_constructor([param('char const *', 'mask')])
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::GetInverse() const [member function]
+    cls.add_method('GetInverse', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint16_t ns3::Ipv4Mask::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'a'), param('ns3::Ipv4Address', 'b')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Set(uint32_t mask) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'mask')])
+    return
+
+def register_Ns3Ipv6Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(uint8_t * address) [constructor]
+    cls.add_constructor([param('uint8_t *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const & addr) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const * addr) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const *', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Address::CombinePrefix(ns3::Ipv6Prefix const & prefix) [member function]
+    cls.add_method('CombinePrefix', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv6Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllHostsMulticast() [member function]
+    cls.add_method('GetAllHostsMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllNodesMulticast() [member function]
+    cls.add_method('GetAllNodesMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllRoutersMulticast() [member function]
+    cls.add_method('GetAllRoutersMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv6Address::GetIpv4MappedAddress() const [member function]
+    cls.add_method('GetIpv4MappedAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllHostsMulticast() const [member function]
+    cls.add_method('IsAllHostsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllNodesMulticast() const [member function]
+    cls.add_method('IsAllNodesMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllRoutersMulticast() const [member function]
+    cls.add_method('IsAllRoutersMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAny() const [member function]
+    cls.add_method('IsAny', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsDocumentation() const [member function]
+    cls.add_method('IsDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Address const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
+    cls.add_method('IsIpv4MappedAddress', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
+    cls.add_method('IsLinkLocal', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocalMulticast() const [member function]
+    cls.add_method('IsLinkLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLocalhost() const [member function]
+    cls.add_method('IsLocalhost', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static bool ns3::Ipv6Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsSolicitedMulticast() const [member function]
+    cls.add_method('IsSolicitedMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac48Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac64Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac16Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac48Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac64Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeIpv4MappedAddress(ns3::Ipv4Address addr) [member function]
+    cls.add_method('MakeIpv4MappedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeSolicitedAddress(ns3::Ipv6Address addr) [member function]
+    cls.add_method('MakeSolicitedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(uint8_t * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t *', 'address')])
+    return
+
+def register_Ns3Ipv6Prefix_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t * prefix) [constructor]
+    cls.add_constructor([param('uint8_t *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(char const * prefix) [constructor]
+    cls.add_constructor([param('char const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t prefix) [constructor]
+    cls.add_constructor([param('uint8_t', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const & prefix) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): uint8_t ns3::Ipv6Prefix::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Prefix const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'a'), param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
+def register_Ns3MacLowBlockAckEventListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener(ns3::MacLowBlockAckEventListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowBlockAckEventListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
+    cls.add_method('BlockAckInactivityTimeout', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3MacLowDcfListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener::MacLowDcfListener(ns3::MacLowDcfListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowDcfListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener::MacLowDcfListener() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::AckTimeoutReset() [member function]
+    cls.add_method('AckTimeoutReset', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::AckTimeoutStart(ns3::Time duration) [member function]
+    cls.add_method('AckTimeoutStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::CtsTimeoutReset() [member function]
+    cls.add_method('CtsTimeoutReset', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::CtsTimeoutStart(ns3::Time duration) [member function]
+    cls.add_method('CtsTimeoutStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::NavReset(ns3::Time duration) [member function]
+    cls.add_method('NavReset', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::NavStart(ns3::Time duration) [member function]
+    cls.add_method('NavStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3MacLowTransmissionListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener::MacLowTransmissionListener(ns3::MacLowTransmissionListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowTransmissionListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener::MacLowTransmissionListener() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::EndTxNoAck() [member function]
+    cls.add_method('EndTxNoAck', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::GotAck(double snr, ns3::WifiMode txMode) [member function]
+    cls.add_method('GotAck', 
+                   'void', 
+                   [param('double', 'snr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address source) [member function]
+    cls.add_method('GotBlockAck', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'source')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::GotCts(double snr, ns3::WifiMode txMode) [member function]
+    cls.add_method('GotCts', 
+                   'void', 
+                   [param('double', 'snr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::MissedAck() [member function]
+    cls.add_method('MissedAck', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::MissedBlockAck() [member function]
+    cls.add_method('MissedBlockAck', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::MissedCts() [member function]
+    cls.add_method('MissedCts', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::StartNext() [member function]
+    cls.add_method('StartNext', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3MacLowTransmissionParameters_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters(ns3::MacLowTransmissionParameters const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowTransmissionParameters const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableAck() [member function]
+    cls.add_method('DisableAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableNextData() [member function]
+    cls.add_method('DisableNextData', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableOverrideDurationId() [member function]
+    cls.add_method('DisableOverrideDurationId', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableRts() [member function]
+    cls.add_method('DisableRts', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableAck() [member function]
+    cls.add_method('EnableAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBasicBlockAck() [member function]
+    cls.add_method('EnableBasicBlockAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableCompressedBlockAck() [member function]
+    cls.add_method('EnableCompressedBlockAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableFastAck() [member function]
+    cls.add_method('EnableFastAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableMultiTidBlockAck() [member function]
+    cls.add_method('EnableMultiTidBlockAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableNextData(uint32_t size) [member function]
+    cls.add_method('EnableNextData', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableOverrideDurationId(ns3::Time durationId) [member function]
+    cls.add_method('EnableOverrideDurationId', 
+                   'void', 
+                   [param('ns3::Time', 'durationId')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableRts() [member function]
+    cls.add_method('EnableRts', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableSuperFastAck() [member function]
+    cls.add_method('EnableSuperFastAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLowTransmissionParameters::GetDurationId() const [member function]
+    cls.add_method('GetDurationId', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowTransmissionParameters::GetNextPacketSize() const [member function]
+    cls.add_method('GetNextPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasDurationId() const [member function]
+    cls.add_method('HasDurationId', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasNextPacket() const [member function]
+    cls.add_method('HasNextPacket', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendRts() const [member function]
+    cls.add_method('MustSendRts', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitAck() const [member function]
+    cls.add_method('MustWaitAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitBasicBlockAck() const [member function]
+    cls.add_method('MustWaitBasicBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitCompressedBlockAck() const [member function]
+    cls.add_method('MustWaitCompressedBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitFastAck() const [member function]
+    cls.add_method('MustWaitFastAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitMultiTidBlockAck() const [member function]
+    cls.add_method('MustWaitMultiTidBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitNormalAck() const [member function]
+    cls.add_method('MustWaitNormalAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitSuperFastAck() const [member function]
+    cls.add_method('MustWaitSuperFastAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NetDeviceContainer_methods(root_module, cls):
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer() [constructor]
+    cls.add_constructor([])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::Ptr<ns3::NetDevice> dev) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::NetDevice >', 'dev')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(std::string devName) [constructor]
+    cls.add_constructor([param('std::string', 'devName')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & a, ns3::NetDeviceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'a'), param('ns3::NetDeviceContainer const &', 'b')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::NetDeviceContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'other')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(std::string deviceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'deviceName')])
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::NetDeviceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): uint32_t ns3::NetDeviceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NodeContainer_methods(root_module, cls):
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer() [constructor]
+    cls.add_constructor([])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(std::string nodeName) [constructor]
+    cls.add_constructor([param('std::string', 'nodeName')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c, ns3::NodeContainer const & d) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c'), param('ns3::NodeContainer const &', 'd')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c, ns3::NodeContainer const & d, ns3::NodeContainer const & e) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c'), param('ns3::NodeContainer const &', 'd'), param('ns3::NodeContainer const &', 'e')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(ns3::NodeContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NodeContainer', 'other')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(std::string nodeName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'nodeName')])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Create(uint32_t n) [member function]
+    cls.add_method('Create', 
+                   'void', 
+                   [param('uint32_t', 'n')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Create(uint32_t n, uint32_t systemId) [member function]
+    cls.add_method('Create', 
+                   'void', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'systemId')])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NodeContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## node-container.h (module 'network'): static ns3::NodeContainer ns3::NodeContainer::GetGlobal() [member function]
+    cls.add_method('GetGlobal', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_static=True)
+    ## node-container.h (module 'network'): uint32_t ns3::NodeContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ObjectBase_methods(root_module, cls):
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
+    cls.add_constructor([])
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase(ns3::ObjectBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectBase const &', 'arg0')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::GetAttribute(std::string name, ns3::AttributeValue & value) const [member function]
+    cls.add_method('GetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('GetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): ns3::TypeId ns3::ObjectBase::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## object-base.h (module 'core'): static ns3::TypeId ns3::ObjectBase::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object-base.h (module 'core'): void ns3::ObjectBase::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::SetAttributeFailSafe(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::ConstructSelf(ns3::AttributeConstructionList const & attributes) [member function]
+    cls.add_method('ConstructSelf', 
+                   'void', 
+                   [param('ns3::AttributeConstructionList const &', 'attributes')], 
+                   visibility='protected')
+    ## object-base.h (module 'core'): void ns3::ObjectBase::NotifyConstructionCompleted() [member function]
+    cls.add_method('NotifyConstructionCompleted', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectDeleter_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter(ns3::ObjectDeleter const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectDeleter const &', 'arg0')])
+    ## object.h (module 'core'): static void ns3::ObjectDeleter::Delete(ns3::Object * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::Object *', 'object')], 
+                   is_static=True)
+    return
+
+def register_Ns3ObjectFactory_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(ns3::ObjectFactory const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
+    cls.add_constructor([param('std::string', 'typeId')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): ns3::TypeId ns3::ObjectFactory::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('ns3::TypeId', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(char const * tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('char const *', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(std::string tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('std::string', 'tid')])
+    return
+
+def register_Ns3OrganizationIdentifier_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifier(ns3::OrganizationIdentifier const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OrganizationIdentifier const &', 'arg0')])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifier() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifier(uint8_t const * str, uint32_t length) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'str'), param('uint32_t', 'length')])
+    ## vendor-specific-action.h (module 'wave'): uint32_t ns3::OrganizationIdentifier::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## vendor-specific-action.h (module 'wave'): uint8_t ns3::OrganizationIdentifier::GetManagementId() const [member function]
+    cls.add_method('GetManagementId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): uint32_t ns3::OrganizationIdentifier::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifierType ns3::OrganizationIdentifier::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::OrganizationIdentifier::OrganizationIdentifierType', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): bool ns3::OrganizationIdentifier::IsNull() const [member function]
+    cls.add_method('IsNull', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::OrganizationIdentifier::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::OrganizationIdentifier::SetType(ns3::OrganizationIdentifier::OrganizationIdentifierType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier::OrganizationIdentifierType', 'type')])
+    return
+
+def register_Ns3OriginatorBlockAckAgreement_methods(root_module, cls):
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement(ns3::OriginatorBlockAckAgreement const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OriginatorBlockAckAgreement const &', 'arg0')])
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement() [constructor]
+    cls.add_constructor([])
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement(ns3::Mac48Address recipient, uint8_t tid) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::CompleteExchange() [member function]
+    cls.add_method('CompleteExchange', 
+                   'void', 
+                   [])
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsBlockAckRequestNeeded() const [member function]
+    cls.add_method('IsBlockAckRequestNeeded', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsEstablished() const [member function]
+    cls.add_method('IsEstablished', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsInactive() const [member function]
+    cls.add_method('IsInactive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsPending() const [member function]
+    cls.add_method('IsPending', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsUnsuccessful() const [member function]
+    cls.add_method('IsUnsuccessful', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::NotifyMpduTransmission(uint16_t nextSeqNumber) [member function]
+    cls.add_method('NotifyMpduTransmission', 
+                   'void', 
+                   [param('uint16_t', 'nextSeqNumber')])
+    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::SetState(ns3::OriginatorBlockAckAgreement::State state) [member function]
+    cls.add_method('SetState', 
+                   'void', 
+                   [param('ns3::OriginatorBlockAckAgreement::State', 'state')])
+    return
+
+def register_Ns3PacketMetadata_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
+    cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [param('ns3::Buffer', 'buffer')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::PacketMetadata', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'end')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint64_t ns3::PacketMetadata::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('RemoveHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketMetadataItem_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::current [variable]
+    cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentSize [variable]
+    cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromEnd [variable]
+    cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromStart [variable]
+    cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::isFragment [variable]
+    cls.add_instance_attribute('isFragment', 'bool', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3PacketMetadataItemIterator_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')])
+    ## packet-metadata.h (module 'network'): bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketMetadata::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::PacketTagIterator(ns3::PacketTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::PacketTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item ns3::PacketTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item::Item(ns3::PacketTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): void ns3::PacketTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::PacketTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketTagList_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList(ns3::PacketTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList const &', 'o')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::Add(ns3::Tag const & tag) const [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
+    cls.add_method('Head', 
+                   'ns3::PacketTagList::TagData const *', 
+                   [], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Peek(ns3::Tag & tag) const [member function]
+    cls.add_method('Peek', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Remove(ns3::Tag & tag) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Replace(ns3::Tag & tag) [member function]
+    cls.add_method('Replace', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    return
+
+def register_Ns3PacketTagListTagData_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData(ns3::PacketTagList::TagData const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList::TagData const &', 'arg0')])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
+    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
+    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
+    cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3PcapFile_methods(root_module, cls):
+    ## pcap-file.h (module 'network'): ns3::PcapFile::PcapFile() [constructor]
+    cls.add_constructor([])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Close() [member function]
+    cls.add_method('Close', 
+                   'void', 
+                   [])
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    cls.add_method('Diff', 
+                   'bool', 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   is_static=True)
+    ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
+    cls.add_method('Eof', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## pcap-file.h (module 'network'): bool ns3::PcapFile::Fail() const [member function]
+    cls.add_method('Fail', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## pcap-file.h (module 'network'): uint32_t ns3::PcapFile::GetDataLinkType() [member function]
+    cls.add_method('GetDataLinkType', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint32_t ns3::PcapFile::GetMagic() [member function]
+    cls.add_method('GetMagic', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint32_t ns3::PcapFile::GetSigFigs() [member function]
+    cls.add_method('GetSigFigs', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint32_t ns3::PcapFile::GetSnapLen() [member function]
+    cls.add_method('GetSnapLen', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): bool ns3::PcapFile::GetSwapMode() [member function]
+    cls.add_method('GetSwapMode', 
+                   'bool', 
+                   [])
+    ## pcap-file.h (module 'network'): int32_t ns3::PcapFile::GetTimeZoneOffset() [member function]
+    cls.add_method('GetTimeZoneOffset', 
+                   'int32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint16_t ns3::PcapFile::GetVersionMajor() [member function]
+    cls.add_method('GetVersionMajor', 
+                   'uint16_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint16_t ns3::PcapFile::GetVersionMinor() [member function]
+    cls.add_method('GetVersionMinor', 
+                   'uint16_t', 
+                   [])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Init(uint32_t dataLinkType, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT, int32_t timeZoneCorrection=ns3::PcapFile::ZONE_DEFAULT, bool swapMode=false) [member function]
+    cls.add_method('Init', 
+                   'void', 
+                   [param('uint32_t', 'dataLinkType'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT'), param('int32_t', 'timeZoneCorrection', default_value='ns3::PcapFile::ZONE_DEFAULT'), param('bool', 'swapMode', default_value='false')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Open(std::string const & filename, std::_Ios_Openmode mode) [member function]
+    cls.add_method('Open', 
+                   'void', 
+                   [param('std::string const &', 'filename'), param('std::_Ios_Openmode', 'mode')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Read(uint8_t * const data, uint32_t maxBytes, uint32_t & tsSec, uint32_t & tsUsec, uint32_t & inclLen, uint32_t & origLen, uint32_t & readLen) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t * const', 'data'), param('uint32_t', 'maxBytes'), param('uint32_t &', 'tsSec'), param('uint32_t &', 'tsUsec'), param('uint32_t &', 'inclLen'), param('uint32_t &', 'origLen'), param('uint32_t &', 'readLen')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, uint8_t const * const data, uint32_t totalLen) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('uint8_t const * const', 'data'), param('uint32_t', 'totalLen')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
+    cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
+    ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
+    cls.add_static_attribute('ZONE_DEFAULT', 'int32_t const', is_const=True)
+    return
+
+def register_Ns3PcapHelper_methods(root_module, cls):
+    ## trace-helper.h (module 'network'): ns3::PcapHelper::PcapHelper(ns3::PcapHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PcapHelper const &', 'arg0')])
+    ## trace-helper.h (module 'network'): ns3::PcapHelper::PcapHelper() [constructor]
+    cls.add_constructor([])
+    ## trace-helper.h (module 'network'): ns3::Ptr<ns3::PcapFileWrapper> ns3::PcapHelper::CreateFile(std::string filename, std::_Ios_Openmode filemode, uint32_t dataLinkType, uint32_t snapLen=65535, int32_t tzCorrection=0) [member function]
+    cls.add_method('CreateFile', 
+                   'ns3::Ptr< ns3::PcapFileWrapper >', 
+                   [param('std::string', 'filename'), param('std::_Ios_Openmode', 'filemode'), param('uint32_t', 'dataLinkType'), param('uint32_t', 'snapLen', default_value='65535'), param('int32_t', 'tzCorrection', default_value='0')])
+    ## trace-helper.h (module 'network'): std::string ns3::PcapHelper::GetFilenameFromDevice(std::string prefix, ns3::Ptr<ns3::NetDevice> device, bool useObjectNames=true) [member function]
+    cls.add_method('GetFilenameFromDevice', 
+                   'std::string', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'useObjectNames', default_value='true')])
+    ## trace-helper.h (module 'network'): std::string ns3::PcapHelper::GetFilenameFromInterfacePair(std::string prefix, ns3::Ptr<ns3::Object> object, uint32_t interface, bool useObjectNames=true) [member function]
+    cls.add_method('GetFilenameFromInterfacePair', 
+                   'std::string', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::Object >', 'object'), param('uint32_t', 'interface'), param('bool', 'useObjectNames', default_value='true')])
+    return
+
+def register_Ns3PcapHelperForDevice_methods(root_module, cls):
+    ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice::PcapHelperForDevice(ns3::PcapHelperForDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PcapHelperForDevice const &', 'arg0')])
+    ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice::PcapHelperForDevice() [constructor]
+    cls.add_constructor([])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool promiscuous=false, bool explicitFilename=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'promiscuous', default_value='false'), param('bool', 'explicitFilename', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, std::string ndName, bool promiscuous=false, bool explicitFilename=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('std::string', 'ndName'), param('bool', 'promiscuous', default_value='false'), param('bool', 'explicitFilename', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, ns3::NetDeviceContainer d, bool promiscuous=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::NetDeviceContainer', 'd'), param('bool', 'promiscuous', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, ns3::NodeContainer n, bool promiscuous=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::NodeContainer', 'n'), param('bool', 'promiscuous', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, uint32_t nodeid, uint32_t deviceid, bool promiscuous=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('uint32_t', 'nodeid'), param('uint32_t', 'deviceid'), param('bool', 'promiscuous', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcapAll(std::string prefix, bool promiscuous=false) [member function]
+    cls.add_method('EnablePcapAll', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('bool', 'promiscuous', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcapInternal(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool promiscuous, bool explicitFilename) [member function]
+    cls.add_method('EnablePcapInternal', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'promiscuous'), param('bool', 'explicitFilename')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount(ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3Simulator_methods(root_module, cls):
+    ## simulator.h (module 'core'): ns3::Simulator::Simulator(ns3::Simulator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Simulator const &', 'arg0')])
+    ## simulator.h (module 'core'): static void ns3::Simulator::Cancel(ns3::EventId const & id) [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static uint32_t ns3::Simulator::GetContext() [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::GetDelayLeft(ns3::EventId const & id) [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Ptr<ns3::SimulatorImpl> ns3::Simulator::GetImplementation() [member function]
+    cls.add_method('GetImplementation', 
+                   'ns3::Ptr< ns3::SimulatorImpl >', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::GetMaximumSimulationTime() [member function]
+    cls.add_method('GetMaximumSimulationTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static uint32_t ns3::Simulator::GetSystemId() [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static bool ns3::Simulator::IsExpired(ns3::EventId const & id) [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static bool ns3::Simulator::IsFinished() [member function]
+    cls.add_method('IsFinished', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::Now() [member function]
+    cls.add_method('Now', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Remove(ns3::EventId const & id) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::SetImplementation(ns3::Ptr<ns3::SimulatorImpl> impl) [member function]
+    cls.add_method('SetImplementation', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimulatorImpl >', 'impl')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
+    cls.add_method('SetScheduler', 
+                   'void', 
+                   [param('ns3::ObjectFactory', 'schedulerFactory')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop() [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [param('ns3::Time const &', 'time')], 
+                   is_static=True)
+    return
+
+def register_Ns3StatusCode_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## status-code.h (module 'wifi'): ns3::StatusCode::StatusCode(ns3::StatusCode const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::StatusCode const &', 'arg0')])
+    ## status-code.h (module 'wifi'): ns3::StatusCode::StatusCode() [constructor]
+    cls.add_constructor([])
+    ## status-code.h (module 'wifi'): ns3::Buffer::Iterator ns3::StatusCode::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## status-code.h (module 'wifi'): uint32_t ns3::StatusCode::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## status-code.h (module 'wifi'): bool ns3::StatusCode::IsSuccess() const [member function]
+    cls.add_method('IsSuccess', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## status-code.h (module 'wifi'): ns3::Buffer::Iterator ns3::StatusCode::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## status-code.h (module 'wifi'): void ns3::StatusCode::SetFailure() [member function]
+    cls.add_method('SetFailure', 
+                   'void', 
+                   [])
+    ## status-code.h (module 'wifi'): void ns3::StatusCode::SetSuccess() [member function]
+    cls.add_method('SetSuccess', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3Tag_methods(root_module, cls):
+    ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
+    cls.add_constructor([])
+    ## tag.h (module 'network'): ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Tag const &', 'arg0')])
+    ## tag.h (module 'network'): void ns3::Tag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tag.h (module 'network'): void ns3::Tag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3TagBuffer_methods(root_module, cls):
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
+    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'o')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): double ns3::TagBuffer::ReadDouble() [member function]
+    cls.add_method('ReadDouble', 
+                   'double', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint16_t ns3::TagBuffer::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint32_t ns3::TagBuffer::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint64_t ns3::TagBuffer::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint8_t ns3::TagBuffer::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::TrimAtEnd(uint32_t trim) [member function]
+    cls.add_method('TrimAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'trim')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteDouble(double v) [member function]
+    cls.add_method('WriteDouble', 
+                   'void', 
+                   [param('double', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU64(uint64_t v) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU8(uint8_t v) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'v')])
+    return
+
+def register_Ns3TypeId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
+    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'o')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, uint32_t flags, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('uint32_t', 'flags'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor) [member function]
+    cls.add_method('AddTraceSource', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation ns3::TypeId::GetAttribute(uint32_t i) const [member function]
+    cls.add_method('GetAttribute', 
+                   'ns3::TypeId::AttributeInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetAttributeFullName(uint32_t i) const [member function]
+    cls.add_method('GetAttributeFullName', 
+                   'std::string', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetAttributeN() const [member function]
+    cls.add_method('GetAttributeN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::Callback<ns3::ObjectBase*,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> ns3::TypeId::GetConstructor() const [member function]
+    cls.add_method('GetConstructor', 
+                   'ns3::Callback< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetGroupName() const [member function]
+    cls.add_method('GetGroupName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetHash() const [member function]
+    cls.add_method('GetHash', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::GetParent() const [member function]
+    cls.add_method('GetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::GetRegistered(uint32_t i) [member function]
+    cls.add_method('GetRegistered', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'i')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static uint32_t ns3::TypeId::GetRegisteredN() [member function]
+    cls.add_method('GetRegisteredN', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation ns3::TypeId::GetTraceSource(uint32_t i) const [member function]
+    cls.add_method('GetTraceSource', 
+                   'ns3::TypeId::TraceSourceInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetTraceSourceN() const [member function]
+    cls.add_method('GetTraceSourceN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint16_t ns3::TypeId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasConstructor() const [member function]
+    cls.add_method('HasConstructor', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasParent() const [member function]
+    cls.add_method('HasParent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::HideFromDocumentation() [member function]
+    cls.add_method('HideFromDocumentation', 
+                   'ns3::TypeId', 
+                   [])
+    ## type-id.h (module 'core'): bool ns3::TypeId::IsChildOf(ns3::TypeId other) const [member function]
+    cls.add_method('IsChildOf', 
+                   'bool', 
+                   [param('ns3::TypeId', 'other')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::LookupAttributeByName(std::string name, ns3::TypeId::AttributeInformation * info) const [member function]
+    cls.add_method('LookupAttributeByName', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::TypeId::AttributeInformation *', 'info', transfer_ownership=False)], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByHash(uint32_t hash) [member function]
+    cls.add_method('LookupByHash', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'hash')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static bool ns3::TypeId::LookupByHashFailSafe(uint32_t hash, ns3::TypeId * tid) [member function]
+    cls.add_method('LookupByHashFailSafe', 
+                   'bool', 
+                   [param('uint32_t', 'hash'), param('ns3::TypeId *', 'tid')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByName(std::string name) [member function]
+    cls.add_method('LookupByName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::TraceSourceAccessor const> ns3::TypeId::LookupTraceSourceByName(std::string name) const [member function]
+    cls.add_method('LookupTraceSourceByName', 
+                   'ns3::Ptr< ns3::TraceSourceAccessor const >', 
+                   [param('std::string', 'name')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::MustHideFromDocumentation() const [member function]
+    cls.add_method('MustHideFromDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::SetAttributeInitialValue(uint32_t i, ns3::Ptr<ns3::AttributeValue const> initialValue) [member function]
+    cls.add_method('SetAttributeInitialValue', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ptr< ns3::AttributeValue const >', 'initialValue')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetGroupName(std::string groupName) [member function]
+    cls.add_method('SetGroupName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'groupName')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent(ns3::TypeId tid) [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): void ns3::TypeId::SetUid(uint16_t tid) [member function]
+    cls.add_method('SetUid', 
+                   'void', 
+                   [param('uint16_t', 'tid')])
+    return
+
+def register_Ns3TypeIdAttributeInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation(ns3::TypeId::AttributeInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::AttributeInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::AttributeAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::flags [variable]
+    cls.add_instance_attribute('flags', 'uint32_t', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::initialValue [variable]
+    cls.add_instance_attribute('initialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::originalInitialValue [variable]
+    cls.add_instance_attribute('originalInitialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    return
+
+def register_Ns3TypeIdTraceSourceInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation(ns3::TypeId::TraceSourceInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::TraceSourceInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::TraceSourceAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    return
+
+def register_Ns3VendorSpecificContentManager_methods(root_module, cls):
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificContentManager::VendorSpecificContentManager(ns3::VendorSpecificContentManager const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VendorSpecificContentManager const &', 'arg0')])
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificContentManager::VendorSpecificContentManager() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificContentManager::DeregisterVscCallback(ns3::OrganizationIdentifier & oi) [member function]
+    cls.add_method('DeregisterVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier &', 'oi')])
+    ## vendor-specific-action.h (module 'wave'): ns3::VscCallback ns3::VendorSpecificContentManager::FindVscCallback(ns3::OrganizationIdentifier & oi) [member function]
+    cls.add_method('FindVscCallback', 
+                   'ns3::VscCallback', 
+                   [param('ns3::OrganizationIdentifier &', 'oi')])
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificContentManager::RegisterVscCallback(ns3::OrganizationIdentifier oi, ns3::VscCallback cb) [member function]
+    cls.add_method('RegisterVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi'), param('ns3::VscCallback', 'cb')])
+    return
+
+def register_Ns3WifiHelper_methods(root_module, cls):
+    ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper(ns3::WifiHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiHelper const &', 'arg0')])
+    ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-helper.h (module 'wifi'): int64_t ns3::WifiHelper::AssignStreams(ns3::NetDeviceContainer c, int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## wifi-helper.h (module 'wifi'): static ns3::WifiHelper ns3::WifiHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::WifiHelper', 
+                   [], 
+                   is_static=True)
+    ## wifi-helper.h (module 'wifi'): static void ns3::WifiHelper::EnableLogComponents() [member function]
+    cls.add_method('EnableLogComponents', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, ns3::NodeContainer c) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::NodeContainer', 'c')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetRemoteStationManager(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetRemoteStationManager', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
+    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('SetStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3WifiMacHelper_methods(root_module, cls):
+    ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper(ns3::WifiMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
+    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3WifiMode_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMode const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode() [constructor]
+    cls.add_constructor([])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
+    cls.add_constructor([param('std::string', 'name')])
+    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
+    cls.add_method('GetBandwidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiMode::GetUniqueName() const [member function]
+    cls.add_method('GetUniqueName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsMandatory() const [member function]
+    cls.add_method('IsMandatory', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiModeFactory_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    cls.add_method('CreateWifiMode', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   is_static=True)
+    return
+
+def register_Ns3WifiPhyHelper_methods(root_module, cls):
+    ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper(ns3::WifiPhyHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
+    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3WifiPhyListener_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener::WifiPhyListener() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener::WifiPhyListener(ns3::WifiPhyListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiPhyListener const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyMaybeCcaBusyStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyMaybeCcaBusyStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxEndError() [member function]
+    cls.add_method('NotifyRxEndError', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxEndOk() [member function]
+    cls.add_method('NotifyRxEndOk', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyRxStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifySwitchingStart(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyTxStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyTxStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3WifiRemoteStation_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_slrc [variable]
+    cls.add_instance_attribute('m_slrc', 'uint32_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_ssrc [variable]
+    cls.add_instance_attribute('m_ssrc', 'uint32_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
+    cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_tid [variable]
+    cls.add_instance_attribute('m_tid', 'uint8_t', is_const=False)
+    return
+
+def register_Ns3WifiRemoteStationInfo_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo::WifiRemoteStationInfo(ns3::WifiRemoteStationInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationInfo const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo::WifiRemoteStationInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationInfo::GetFrameErrorRate() const [member function]
+    cls.add_method('GetFrameErrorRate', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationInfo::NotifyTxFailed() [member function]
+    cls.add_method('NotifyTxFailed', 
+                   'void', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationInfo::NotifyTxSuccess(uint32_t retryCounter) [member function]
+    cls.add_method('NotifyTxSuccess', 
+                   'void', 
+                   [param('uint32_t', 'retryCounter')])
+    return
+
+def register_Ns3WifiRemoteStationState_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::WifiRemoteStationState() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::WifiRemoteStationState(ns3::WifiRemoteStationState const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
+    cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
+    cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
+    cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
+    cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
+    cls.add_instance_attribute('m_rx', 'uint32_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_shortGuardInterval [variable]
+    cls.add_instance_attribute('m_shortGuardInterval', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_stbc [variable]
+    cls.add_instance_attribute('m_stbc', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_tx [variable]
+    cls.add_instance_attribute('m_tx', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3WifiTxVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNess() const [member function]
+    cls.add_method('GetNess', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNss() const [member function]
+    cls.add_method('GetNss', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetRetries() const [member function]
+    cls.add_method('GetRetries', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetTxPowerLevel() const [member function]
+    cls.add_method('GetTxPowerLevel', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsShortGuardInterval() const [member function]
+    cls.add_method('IsShortGuardInterval', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
+    cls.add_method('IsStbc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
+    cls.add_method('SetMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNess(uint8_t ness) [member function]
+    cls.add_method('SetNess', 
+                   'void', 
+                   [param('uint8_t', 'ness')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss) [member function]
+    cls.add_method('SetNss', 
+                   'void', 
+                   [param('uint8_t', 'nss')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetRetries(uint8_t retries) [member function]
+    cls.add_method('SetRetries', 
+                   'void', 
+                   [param('uint8_t', 'retries')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetShortGuardInterval(bool guardinterval) [member function]
+    cls.add_method('SetShortGuardInterval', 
+                   'void', 
+                   [param('bool', 'guardinterval')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
+    cls.add_method('SetStbc', 
+                   'void', 
+                   [param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
+    cls.add_method('SetTxPowerLevel', 
+                   'void', 
+                   [param('uint8_t', 'powerlevel')])
+    return
+
+def register_Ns3Empty_methods(root_module, cls):
+    ## empty.h (module 'core'): ns3::empty::empty() [constructor]
+    cls.add_constructor([])
+    ## empty.h (module 'core'): ns3::empty::empty(ns3::empty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::empty const &', 'arg0')])
+    return
+
+def register_Ns3Int64x64_t_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_unary_numeric_operator('-')
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
+    cls.add_constructor([])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t hi, uint64_t lo) [constructor]
+    cls.add_constructor([param('int64_t', 'hi'), param('uint64_t', 'lo')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [copy constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): double ns3::int64x64_t::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): int64_t ns3::int64x64_t::GetHigh() const [member function]
+    cls.add_method('GetHigh', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): uint64_t ns3::int64x64_t::GetLow() const [member function]
+    cls.add_method('GetLow', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): static ns3::int64x64_t ns3::int64x64_t::Invert(uint64_t v) [member function]
+    cls.add_method('Invert', 
+                   'ns3::int64x64_t', 
+                   [param('uint64_t', 'v')], 
+                   is_static=True)
+    ## int64x64-double.h (module 'core'): void ns3::int64x64_t::MulByInvert(ns3::int64x64_t const & o) [member function]
+    cls.add_method('MulByInvert', 
+                   'void', 
+                   [param('ns3::int64x64_t const &', 'o')])
+    return
+
+def register_Ns3Chunk_methods(root_module, cls):
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
+    cls.add_constructor([])
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk(ns3::Chunk const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Chunk const &', 'arg0')])
+    ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## chunk.h (module 'network'): static ns3::TypeId ns3::Chunk::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## chunk.h (module 'network'): void ns3::Chunk::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Header_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## header.h (module 'network'): ns3::Header::Header() [constructor]
+    cls.add_constructor([])
+    ## header.h (module 'network'): ns3::Header::Header(ns3::Header const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Header const &', 'arg0')])
+    ## header.h (module 'network'): uint32_t ns3::Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## header.h (module 'network'): void ns3::Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3HigherDataTxVectorTag_methods(root_module, cls):
+    ## higher-tx-tag.h (module 'wave'): ns3::HigherDataTxVectorTag::HigherDataTxVectorTag(ns3::HigherDataTxVectorTag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::HigherDataTxVectorTag const &', 'arg0')])
+    ## higher-tx-tag.h (module 'wave'): ns3::HigherDataTxVectorTag::HigherDataTxVectorTag() [constructor]
+    cls.add_constructor([])
+    ## higher-tx-tag.h (module 'wave'): ns3::HigherDataTxVectorTag::HigherDataTxVectorTag(ns3::WifiTxVector dataTxVector, bool adapter) [constructor]
+    cls.add_constructor([param('ns3::WifiTxVector', 'dataTxVector'), param('bool', 'adapter')])
+    ## higher-tx-tag.h (module 'wave'): void ns3::HigherDataTxVectorTag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_virtual=True)
+    ## higher-tx-tag.h (module 'wave'): ns3::WifiTxVector ns3::HigherDataTxVectorTag::GetDataTxVector() const [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True)
+    ## higher-tx-tag.h (module 'wave'): ns3::TypeId ns3::HigherDataTxVectorTag::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## higher-tx-tag.h (module 'wave'): uint32_t ns3::HigherDataTxVectorTag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## higher-tx-tag.h (module 'wave'): static ns3::TypeId ns3::HigherDataTxVectorTag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## higher-tx-tag.h (module 'wave'): bool ns3::HigherDataTxVectorTag::IsAdapter() const [member function]
+    cls.add_method('IsAdapter', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## higher-tx-tag.h (module 'wave'): void ns3::HigherDataTxVectorTag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## higher-tx-tag.h (module 'wave'): void ns3::HigherDataTxVectorTag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3MgtAddBaRequestHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader::MgtAddBaRequestHeader(ns3::MgtAddBaRequestHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtAddBaRequestHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader::MgtAddBaRequestHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAddBaRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaRequestHeader::GetBufferSize() const [member function]
+    cls.add_method('GetBufferSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtAddBaRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAddBaRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaRequestHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint8_t ns3::MgtAddBaRequestHeader::GetTid() const [member function]
+    cls.add_method('GetTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaRequestHeader::GetTimeout() const [member function]
+    cls.add_method('GetTimeout', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtAddBaRequestHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtAddBaRequestHeader::IsAmsduSupported() const [member function]
+    cls.add_method('IsAmsduSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtAddBaRequestHeader::IsImmediateBlockAck() const [member function]
+    cls.add_method('IsImmediateBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetAmsduSupport(bool supported) [member function]
+    cls.add_method('SetAmsduSupport', 
+                   'void', 
+                   [param('bool', 'supported')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetBufferSize(uint16_t size) [member function]
+    cls.add_method('SetBufferSize', 
+                   'void', 
+                   [param('uint16_t', 'size')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetDelayedBlockAck() [member function]
+    cls.add_method('SetDelayedBlockAck', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetImmediateBlockAck() [member function]
+    cls.add_method('SetImmediateBlockAck', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetTid(uint8_t tid) [member function]
+    cls.add_method('SetTid', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    return
+
+def register_Ns3MgtAddBaResponseHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaResponseHeader::MgtAddBaResponseHeader(ns3::MgtAddBaResponseHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtAddBaResponseHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaResponseHeader::MgtAddBaResponseHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAddBaResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaResponseHeader::GetBufferSize() const [member function]
+    cls.add_method('GetBufferSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtAddBaResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAddBaResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::StatusCode ns3::MgtAddBaResponseHeader::GetStatusCode() const [member function]
+    cls.add_method('GetStatusCode', 
+                   'ns3::StatusCode', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint8_t ns3::MgtAddBaResponseHeader::GetTid() const [member function]
+    cls.add_method('GetTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaResponseHeader::GetTimeout() const [member function]
+    cls.add_method('GetTimeout', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtAddBaResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtAddBaResponseHeader::IsAmsduSupported() const [member function]
+    cls.add_method('IsAmsduSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtAddBaResponseHeader::IsImmediateBlockAck() const [member function]
+    cls.add_method('IsImmediateBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetAmsduSupport(bool supported) [member function]
+    cls.add_method('SetAmsduSupport', 
+                   'void', 
+                   [param('bool', 'supported')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetBufferSize(uint16_t size) [member function]
+    cls.add_method('SetBufferSize', 
+                   'void', 
+                   [param('uint16_t', 'size')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetDelayedBlockAck() [member function]
+    cls.add_method('SetDelayedBlockAck', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetImmediateBlockAck() [member function]
+    cls.add_method('SetImmediateBlockAck', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetStatusCode(ns3::StatusCode code) [member function]
+    cls.add_method('SetStatusCode', 
+                   'void', 
+                   [param('ns3::StatusCode', 'code')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetTid(uint8_t tid) [member function]
+    cls.add_method('SetTid', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    return
+
+def register_Ns3MgtAssocRequestHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocRequestHeader::MgtAssocRequestHeader(ns3::MgtAssocRequestHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtAssocRequestHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocRequestHeader::MgtAssocRequestHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::HtCapabilities ns3::MgtAssocRequestHeader::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtAssocRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAssocRequestHeader::GetListenInterval() const [member function]
+    cls.add_method('GetListenInterval', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::Ssid ns3::MgtAssocRequestHeader::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::SupportedRates ns3::MgtAssocRequestHeader::GetSupportedRates() const [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtAssocRequestHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetHtCapabilities(ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('SetHtCapabilities', 
+                   'void', 
+                   [param('ns3::HtCapabilities', 'htcapabilities')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetListenInterval(uint16_t interval) [member function]
+    cls.add_method('SetListenInterval', 
+                   'void', 
+                   [param('uint16_t', 'interval')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetSupportedRates(ns3::SupportedRates rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates', 'rates')])
+    return
+
+def register_Ns3MgtAssocResponseHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocResponseHeader::MgtAssocResponseHeader(ns3::MgtAssocResponseHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtAssocResponseHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocResponseHeader::MgtAssocResponseHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::HtCapabilities ns3::MgtAssocResponseHeader::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtAssocResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::StatusCode ns3::MgtAssocResponseHeader::GetStatusCode() [member function]
+    cls.add_method('GetStatusCode', 
+                   'ns3::StatusCode', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): ns3::SupportedRates ns3::MgtAssocResponseHeader::GetSupportedRates() [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtAssocResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetHtCapabilities(ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('SetHtCapabilities', 
+                   'void', 
+                   [param('ns3::HtCapabilities', 'htcapabilities')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetStatusCode(ns3::StatusCode code) [member function]
+    cls.add_method('SetStatusCode', 
+                   'void', 
+                   [param('ns3::StatusCode', 'code')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetSupportedRates(ns3::SupportedRates rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates', 'rates')])
+    return
+
+def register_Ns3MgtDelBaHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtDelBaHeader::MgtDelBaHeader(ns3::MgtDelBaHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtDelBaHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtDelBaHeader::MgtDelBaHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtDelBaHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtDelBaHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtDelBaHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint8_t ns3::MgtDelBaHeader::GetTid() const [member function]
+    cls.add_method('GetTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtDelBaHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtDelBaHeader::IsByOriginator() const [member function]
+    cls.add_method('IsByOriginator', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::SetByOriginator() [member function]
+    cls.add_method('SetByOriginator', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::SetByRecipient() [member function]
+    cls.add_method('SetByRecipient', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::SetTid(uint8_t arg0) [member function]
+    cls.add_method('SetTid', 
+                   'void', 
+                   [param('uint8_t', 'arg0')])
+    return
+
+def register_Ns3MgtProbeRequestHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeRequestHeader::MgtProbeRequestHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeRequestHeader::MgtProbeRequestHeader(ns3::MgtProbeRequestHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtProbeRequestHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::HtCapabilities ns3::MgtProbeRequestHeader::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtProbeRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::Ssid ns3::MgtProbeRequestHeader::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::SupportedRates ns3::MgtProbeRequestHeader::GetSupportedRates() const [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtProbeRequestHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetHtCapabilities(ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('SetHtCapabilities', 
+                   'void', 
+                   [param('ns3::HtCapabilities', 'htcapabilities')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetSupportedRates(ns3::SupportedRates rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates', 'rates')])
+    return
+
+def register_Ns3MgtProbeResponseHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeResponseHeader::MgtProbeResponseHeader(ns3::MgtProbeResponseHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtProbeResponseHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeResponseHeader::MgtProbeResponseHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint64_t ns3::MgtProbeResponseHeader::GetBeaconIntervalUs() const [member function]
+    cls.add_method('GetBeaconIntervalUs', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::HtCapabilities ns3::MgtProbeResponseHeader::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtProbeResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::Ssid ns3::MgtProbeResponseHeader::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::SupportedRates ns3::MgtProbeResponseHeader::GetSupportedRates() const [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint64_t ns3::MgtProbeResponseHeader::GetTimestamp() [member function]
+    cls.add_method('GetTimestamp', 
+                   'uint64_t', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtProbeResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetBeaconIntervalUs(uint64_t us) [member function]
+    cls.add_method('SetBeaconIntervalUs', 
+                   'void', 
+                   [param('uint64_t', 'us')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetHtCapabilities(ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('SetHtCapabilities', 
+                   'void', 
+                   [param('ns3::HtCapabilities', 'htcapabilities')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetSupportedRates(ns3::SupportedRates rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates', 'rates')])
+    return
+
+def register_Ns3NqosWifiMacHelper_methods(root_module, cls):
+    ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::NqosWifiMacHelper::NqosWifiMacHelper(ns3::NqosWifiMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NqosWifiMacHelper const &', 'arg0')])
+    ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::NqosWifiMacHelper::NqosWifiMacHelper() [constructor]
+    cls.add_constructor([])
+    ## nqos-wifi-mac-helper.h (module 'wifi'): static ns3::NqosWifiMacHelper ns3::NqosWifiMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::NqosWifiMacHelper', 
+                   [], 
+                   is_static=True)
+    ## nqos-wifi-mac-helper.h (module 'wifi'): void ns3::NqosWifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
+    ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::NqosWifiMacHelper::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3Object_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::Object() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): void ns3::Object::AggregateObject(ns3::Ptr<ns3::Object> other) [member function]
+    cls.add_method('AggregateObject', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'other')])
+    ## object.h (module 'core'): void ns3::Object::Dispose() [member function]
+    cls.add_method('Dispose', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator ns3::Object::GetAggregateIterator() const [member function]
+    cls.add_method('GetAggregateIterator', 
+                   'ns3::Object::AggregateIterator', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::TypeId ns3::Object::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object.h (module 'core'): static ns3::TypeId ns3::Object::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object.h (module 'core'): void ns3::Object::Initialize() [member function]
+    cls.add_method('Initialize', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::Object(ns3::Object const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Object const &', 'o')], 
+                        visibility='protected')
+    ## object.h (module 'core'): void ns3::Object::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectAggregateIterator_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator(ns3::Object::AggregateIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Object::AggregateIterator const &', 'arg0')])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): bool ns3::Object::AggregateIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::Ptr<ns3::Object const> ns3::Object::AggregateIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::Object const >', 
+                   [])
+    return
+
+def register_Ns3PcapFileWrapper_methods(root_module, cls):
+    ## pcap-file-wrapper.h (module 'network'): static ns3::TypeId ns3::PcapFileWrapper::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper::PcapFileWrapper() [constructor]
+    cls.add_constructor([])
+    ## pcap-file-wrapper.h (module 'network'): bool ns3::PcapFileWrapper::Fail() const [member function]
+    cls.add_method('Fail', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## pcap-file-wrapper.h (module 'network'): bool ns3::PcapFileWrapper::Eof() const [member function]
+    cls.add_method('Eof', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Open(std::string const & filename, std::_Ios_Openmode mode) [member function]
+    cls.add_method('Open', 
+                   'void', 
+                   [param('std::string const &', 'filename'), param('std::_Ios_Openmode', 'mode')])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Close() [member function]
+    cls.add_method('Close', 
+                   'void', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Init(uint32_t dataLinkType, uint32_t snapLen=std::numeric_limits<unsigned int>::max(), int32_t tzCorrection=ns3::PcapFile::ZONE_DEFAULT) [member function]
+    cls.add_method('Init', 
+                   'void', 
+                   [param('uint32_t', 'dataLinkType'), param('uint32_t', 'snapLen', default_value='std::numeric_limits<unsigned int>::max()'), param('int32_t', 'tzCorrection', default_value='ns3::PcapFile::ZONE_DEFAULT')])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Time', 't'), param('uint8_t const *', 'buffer'), param('uint32_t', 'length')])
+    ## pcap-file-wrapper.h (module 'network'): uint32_t ns3::PcapFileWrapper::GetMagic() [member function]
+    cls.add_method('GetMagic', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint16_t ns3::PcapFileWrapper::GetVersionMajor() [member function]
+    cls.add_method('GetVersionMajor', 
+                   'uint16_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint16_t ns3::PcapFileWrapper::GetVersionMinor() [member function]
+    cls.add_method('GetVersionMinor', 
+                   'uint16_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): int32_t ns3::PcapFileWrapper::GetTimeZoneOffset() [member function]
+    cls.add_method('GetTimeZoneOffset', 
+                   'int32_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint32_t ns3::PcapFileWrapper::GetSigFigs() [member function]
+    cls.add_method('GetSigFigs', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint32_t ns3::PcapFileWrapper::GetSnapLen() [member function]
+    cls.add_method('GetSnapLen', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint32_t ns3::PcapFileWrapper::GetDataLinkType() [member function]
+    cls.add_method('GetDataLinkType', 
+                   'uint32_t', 
+                   [])
+    return
+
+def register_Ns3QosWifiMacHelper_methods(root_module, cls):
+    ## qos-wifi-mac-helper.h (module 'wifi'): ns3::QosWifiMacHelper::QosWifiMacHelper(ns3::QosWifiMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::QosWifiMacHelper const &', 'arg0')])
+    ## qos-wifi-mac-helper.h (module 'wifi'): ns3::QosWifiMacHelper::QosWifiMacHelper() [constructor]
+    cls.add_constructor([])
+    ## qos-wifi-mac-helper.h (module 'wifi'): static ns3::QosWifiMacHelper ns3::QosWifiMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::QosWifiMacHelper', 
+                   [], 
+                   is_static=True)
+    ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetBlockAckInactivityTimeoutForAc(ns3::AcIndex ac, uint16_t timeout) [member function]
+    cls.add_method('SetBlockAckInactivityTimeoutForAc', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac'), param('uint16_t', 'timeout')])
+    ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetBlockAckThresholdForAc(ns3::AcIndex ac, uint8_t threshold) [member function]
+    cls.add_method('SetBlockAckThresholdForAc', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac'), param('uint8_t', 'threshold')])
+    ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetMsduAggregatorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetMsduAggregatorForAc', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()')])
+    ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
+    ## qos-wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::QosWifiMacHelper::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3Time_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Time const &', 'o')])
+    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
+    cls.add_constructor([param('std::string const &', 's')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & value) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'value')])
+    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
+    cls.add_method('Compare', 
+                   'int', 
+                   [param('ns3::Time const &', 'o')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & from, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'from'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromDouble', 
+                   'ns3::Time', 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromInteger', 
+                   'ns3::Time', 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
+    cls.add_method('GetFemtoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
+    cls.add_method('GetMicroSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
+    cls.add_method('GetMilliSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
+    cls.add_method('GetNanoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
+    cls.add_method('GetPicoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
+    cls.add_method('GetResolution', 
+                   'ns3::Time::Unit', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
+    cls.add_method('GetSeconds', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
+    cls.add_method('GetTimeStep', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
+    cls.add_method('IsNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
+    cls.add_method('IsPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
+    cls.add_method('IsStrictlyNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
+    cls.add_method('IsStrictlyPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
+    cls.add_method('IsZero', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
+    cls.add_method('Max', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
+    cls.add_method('Min', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
+    cls.add_method('SetResolution', 
+                   'void', 
+                   [param('ns3::Time::Unit', 'resolution')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
+    cls.add_method('StaticInit', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('To', 
+                   'ns3::int64x64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToDouble', 
+                   'double', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToInteger', 
+                   'int64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    return
+
+def register_Ns3TraceSourceAccessor_methods(root_module, cls):
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor() [constructor]
+    cls.add_constructor([])
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Connect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Connect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('ConnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Disconnect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Disconnect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::DisconnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Trailer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer() [constructor]
+    cls.add_constructor([])
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer(ns3::Trailer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Trailer const &', 'arg0')])
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'end')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3VendorSpecificActionHeader_methods(root_module, cls):
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificActionHeader::VendorSpecificActionHeader(ns3::VendorSpecificActionHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VendorSpecificActionHeader const &', 'arg0')])
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificActionHeader::VendorSpecificActionHeader() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): uint32_t ns3::VendorSpecificActionHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): uint8_t ns3::VendorSpecificActionHeader::GetCategory() const [member function]
+    cls.add_method('GetCategory', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): ns3::TypeId ns3::VendorSpecificActionHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier ns3::VendorSpecificActionHeader::GetOrganizationIdentifier() const [member function]
+    cls.add_method('GetOrganizationIdentifier', 
+                   'ns3::OrganizationIdentifier', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): uint32_t ns3::VendorSpecificActionHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): static ns3::TypeId ns3::VendorSpecificActionHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificActionHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificActionHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificActionHeader::SetOrganizationIdentifier(ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('SetOrganizationIdentifier', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi')])
+    return
+
+def register_Ns3Wifi80211pHelper_methods(root_module, cls):
+    ## wifi-80211p-helper.h (module 'wave'): ns3::Wifi80211pHelper::Wifi80211pHelper(ns3::Wifi80211pHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Wifi80211pHelper const &', 'arg0')])
+    ## wifi-80211p-helper.h (module 'wave'): ns3::Wifi80211pHelper::Wifi80211pHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-80211p-helper.h (module 'wave'): static ns3::Wifi80211pHelper ns3::Wifi80211pHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::Wifi80211pHelper', 
+                   [], 
+                   is_static=True)
+    ## wifi-80211p-helper.h (module 'wave'): static void ns3::Wifi80211pHelper::EnableLogComponents() [member function]
+    cls.add_method('EnableLogComponents', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## wifi-80211p-helper.h (module 'wave'): ns3::NetDeviceContainer ns3::Wifi80211pHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & macHelper, ns3::NodeContainer c) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'macHelper'), param('ns3::NodeContainer', 'c')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-80211p-helper.h (module 'wave'): void ns3::Wifi80211pHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('SetStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3WifiActionHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::WifiActionHeader(ns3::WifiActionHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiActionHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::WifiActionHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::WifiActionHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue ns3::WifiActionHeader::GetAction() [member function]
+    cls.add_method('GetAction', 
+                   'ns3::WifiActionHeader::ActionValue', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue ns3::WifiActionHeader::GetCategory() [member function]
+    cls.add_method('GetCategory', 
+                   'ns3::WifiActionHeader::CategoryValue', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::WifiActionHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::WifiActionHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::WifiActionHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::WifiActionHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::WifiActionHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::WifiActionHeader::SetAction(ns3::WifiActionHeader::CategoryValue type, ns3::WifiActionHeader::ActionValue action) [member function]
+    cls.add_method('SetAction', 
+                   'void', 
+                   [param('ns3::WifiActionHeader::CategoryValue', 'type'), param('ns3::WifiActionHeader::ActionValue', 'action')])
+    return
+
+def register_Ns3WifiActionHeaderActionValue_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::ActionValue() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::ActionValue(ns3::WifiActionHeader::ActionValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::blockAck [variable]
+    cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::interwork [variable]
+    cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkMetrtic [variable]
+    cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetricActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathSelection [variable]
+    cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSelectionActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerLink [variable]
+    cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resourceCoordination [variable]
+    cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::ResourceCoordinationActionValue', is_const=False)
+    return
+
+def register_Ns3WifiInformationElement_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
+    ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement::WifiInformationElement() [constructor]
+    cls.add_constructor([])
+    ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement::WifiInformationElement(ns3::WifiInformationElement const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiInformationElement const &', 'arg0')])
+    ## wifi-information-element.h (module 'wifi'): ns3::Buffer::Iterator ns3::WifiInformationElement::Deserialize(ns3::Buffer::Iterator i) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'i')])
+    ## wifi-information-element.h (module 'wifi'): ns3::Buffer::Iterator ns3::WifiInformationElement::DeserializeIfPresent(ns3::Buffer::Iterator i) [member function]
+    cls.add_method('DeserializeIfPresent', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'i')])
+    ## wifi-information-element.h (module 'wifi'): uint8_t ns3::WifiInformationElement::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElementId ns3::WifiInformationElement::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-information-element.h (module 'wifi'): uint8_t ns3::WifiInformationElement::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-information-element.h (module 'wifi'): uint16_t ns3::WifiInformationElement::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-information-element.h (module 'wifi'): ns3::Buffer::Iterator ns3::WifiInformationElement::Serialize(ns3::Buffer::Iterator i) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'i')], 
+                   is_const=True)
+    ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetAckTimeout() const [member function]
+    cls.add_method('GetAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetBasicBlockAckTimeout() const [member function]
+    cls.add_method('GetBasicBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetCompressedBlockAckTimeout() const [member function]
+    cls.add_method('GetCompressedBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetCtsTimeout() const [member function]
+    cls.add_method('GetCtsTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetEifsNoDifs() const [member function]
+    cls.add_method('GetEifsNoDifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetMaxPropagationDelay() const [member function]
+    cls.add_method('GetMaxPropagationDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetMsduLifetime() const [member function]
+    cls.add_method('GetMsduLifetime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetPifs() const [member function]
+    cls.add_method('GetPifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetRifs() const [member function]
+    cls.add_method('GetRifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTxDrop(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAckTimeout(ns3::Time ackTimeout) [member function]
+    cls.add_method('SetAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ackTimeout')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBasicBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetBasicBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCompressedBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetCompressedBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsTimeout(ns3::Time ctsTimeout) [member function]
+    cls.add_method('SetCtsTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ctsTimeout')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetEifsNoDifs(ns3::Time eifsNoDifs) [member function]
+    cls.add_method('SetEifsNoDifs', 
+                   'void', 
+                   [param('ns3::Time', 'eifsNoDifs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetMaxPropagationDelay(ns3::Time delay) [member function]
+    cls.add_method('SetMaxPropagationDelay', 
+                   'void', 
+                   [param('ns3::Time', 'delay')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPifs(ns3::Time pifs) [member function]
+    cls.add_method('SetPifs', 
+                   'void', 
+                   [param('ns3::Time', 'pifs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetRifs(ns3::Time rifs) [member function]
+    cls.add_method('SetRifs', 
+                   'void', 
+                   [param('ns3::Time', 'rifs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSifs(ns3::Time sifs) [member function]
+    cls.add_method('SetSifs', 
+                   'void', 
+                   [param('ns3::Time', 'sifs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSlot(ns3::Time slotTime) [member function]
+    cls.add_method('SetSlot', 
+                   'void', 
+                   [param('ns3::Time', 'slotTime')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Dcf> dcf, uint32_t cwmin, uint32_t cwmax, ns3::AcIndex ac) [member function]
+    cls.add_method('ConfigureDcf', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Dcf >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('ns3::AcIndex', 'ac')], 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('FinishConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3WifiMacHeader_methods(root_module, cls):
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr1() const [member function]
+    cls.add_method('GetAddr1', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr2() const [member function]
+    cls.add_method('GetAddr2', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr3() const [member function]
+    cls.add_method('GetAddr3', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr4() const [member function]
+    cls.add_method('GetAddr4', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Time ns3::WifiMacHeader::GetDuration() const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetFragmentNumber() const [member function]
+    cls.add_method('GetFragmentNumber', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::TypeId ns3::WifiMacHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiMacHeader::GetQosAckPolicy() const [member function]
+    cls.add_method('GetQosAckPolicy', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
+    cls.add_method('GetQosTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTxopLimit() const [member function]
+    cls.add_method('GetQosTxopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetRawDuration() const [member function]
+    cls.add_method('GetRawDuration', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetSequenceControl() const [member function]
+    cls.add_method('GetSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetSequenceNumber() const [member function]
+    cls.add_method('GetSequenceNumber', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType ns3::WifiMacHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiMacType', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): static ns3::TypeId ns3::WifiMacHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-mac-header.h (module 'wifi'): char const * ns3::WifiMacHeader::GetTypeString() const [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAck() const [member function]
+    cls.add_method('IsAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAction() const [member function]
+    cls.add_method('IsAction', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAssocReq() const [member function]
+    cls.add_method('IsAssocReq', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAssocResp() const [member function]
+    cls.add_method('IsAssocResp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAuthentication() const [member function]
+    cls.add_method('IsAuthentication', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBeacon() const [member function]
+    cls.add_method('IsBeacon', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBlockAck() const [member function]
+    cls.add_method('IsBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBlockAckReq() const [member function]
+    cls.add_method('IsBlockAckReq', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCfpoll() const [member function]
+    cls.add_method('IsCfpoll', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCtl() const [member function]
+    cls.add_method('IsCtl', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCts() const [member function]
+    cls.add_method('IsCts', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsData() const [member function]
+    cls.add_method('IsData', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsDeauthentication() const [member function]
+    cls.add_method('IsDeauthentication', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsDisassociation() const [member function]
+    cls.add_method('IsDisassociation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsFromDs() const [member function]
+    cls.add_method('IsFromDs', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMgt() const [member function]
+    cls.add_method('IsMgt', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMoreFragments() const [member function]
+    cls.add_method('IsMoreFragments', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMultihopAction() const [member function]
+    cls.add_method('IsMultihopAction', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsProbeReq() const [member function]
+    cls.add_method('IsProbeReq', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsProbeResp() const [member function]
+    cls.add_method('IsProbeResp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosAck() const [member function]
+    cls.add_method('IsQosAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosAmsdu() const [member function]
+    cls.add_method('IsQosAmsdu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosBlockAck() const [member function]
+    cls.add_method('IsQosBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosData() const [member function]
+    cls.add_method('IsQosData', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosEosp() const [member function]
+    cls.add_method('IsQosEosp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosNoAck() const [member function]
+    cls.add_method('IsQosNoAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsReassocReq() const [member function]
+    cls.add_method('IsReassocReq', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsReassocResp() const [member function]
+    cls.add_method('IsReassocResp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsRetry() const [member function]
+    cls.add_method('IsRetry', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsRts() const [member function]
+    cls.add_method('IsRts', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsToDs() const [member function]
+    cls.add_method('IsToDs', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAction() [member function]
+    cls.add_method('SetAction', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr1(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddr1', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr2(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddr2', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr3(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddr3', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr4(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddr4', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAssocReq() [member function]
+    cls.add_method('SetAssocReq', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAssocResp() [member function]
+    cls.add_method('SetAssocResp', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetBeacon() [member function]
+    cls.add_method('SetBeacon', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetBlockAck() [member function]
+    cls.add_method('SetBlockAck', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetBlockAckReq() [member function]
+    cls.add_method('SetBlockAckReq', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsFrom() [member function]
+    cls.add_method('SetDsFrom', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsNotFrom() [member function]
+    cls.add_method('SetDsNotFrom', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsNotTo() [member function]
+    cls.add_method('SetDsNotTo', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsTo() [member function]
+    cls.add_method('SetDsTo', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDuration(ns3::Time duration) [member function]
+    cls.add_method('SetDuration', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetFragmentNumber(uint8_t frag) [member function]
+    cls.add_method('SetFragmentNumber', 
+                   'void', 
+                   [param('uint8_t', 'frag')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetId(uint16_t id) [member function]
+    cls.add_method('SetId', 
+                   'void', 
+                   [param('uint16_t', 'id')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetMoreFragments() [member function]
+    cls.add_method('SetMoreFragments', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetMultihopAction() [member function]
+    cls.add_method('SetMultihopAction', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoMoreFragments() [member function]
+    cls.add_method('SetNoMoreFragments', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoOrder() [member function]
+    cls.add_method('SetNoOrder', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoRetry() [member function]
+    cls.add_method('SetNoRetry', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetOrder() [member function]
+    cls.add_method('SetOrder', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetProbeReq() [member function]
+    cls.add_method('SetProbeReq', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetProbeResp() [member function]
+    cls.add_method('SetProbeResp', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
+    cls.add_method('SetQosAmsdu', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosBlockAck() [member function]
+    cls.add_method('SetQosBlockAck', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosEosp() [member function]
+    cls.add_method('SetQosEosp', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoAck() [member function]
+    cls.add_method('SetQosNoAck', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoAmsdu() [member function]
+    cls.add_method('SetQosNoAmsdu', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoEosp() [member function]
+    cls.add_method('SetQosNoEosp', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNormalAck() [member function]
+    cls.add_method('SetQosNormalAck', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
+    cls.add_method('SetQosTid', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTxopLimit(uint8_t txop) [member function]
+    cls.add_method('SetQosTxopLimit', 
+                   'void', 
+                   [param('uint8_t', 'txop')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetRawDuration(uint16_t duration) [member function]
+    cls.add_method('SetRawDuration', 
+                   'void', 
+                   [param('uint16_t', 'duration')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetRetry() [member function]
+    cls.add_method('SetRetry', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetSequenceNumber(uint16_t seq) [member function]
+    cls.add_method('SetSequenceNumber', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetType(ns3::WifiMacType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::WifiMacType', 'type')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetTypeData() [member function]
+    cls.add_method('SetTypeData', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3WifiMacQueue_methods(root_module, cls):
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::Dequeue(ns3::WifiMacHeader * hdr) [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::DequeueByTidAndAddress(ns3::WifiMacHeader * hdr, uint8_t tid, ns3::WifiMacHeader::AddressType type, ns3::Mac48Address addr) [member function]
+    cls.add_method('DequeueByTidAndAddress', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::AddressType', 'type'), param('ns3::Mac48Address', 'addr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::DequeueFirstAvailable(ns3::WifiMacHeader * hdr, ns3::Time & tStamp, ns3::QosBlockedDestinations const * blockedPackets) [member function]
+    cls.add_method('DequeueFirstAvailable', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr'), param('ns3::Time &', 'tStamp'), param('ns3::QosBlockedDestinations const *', 'blockedPackets')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Flush() [member function]
+    cls.add_method('Flush', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Time ns3::WifiMacQueue::GetMaxDelay() const [member function]
+    cls.add_method('GetMaxDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetMaxSize() const [member function]
+    cls.add_method('GetMaxSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByTidAndAddress(uint8_t tid, ns3::WifiMacHeader::AddressType type, ns3::Mac48Address addr) [member function]
+    cls.add_method('GetNPacketsByTidAndAddress', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::AddressType', 'type'), param('ns3::Mac48Address', 'addr')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetSize() [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): static ns3::TypeId ns3::WifiMacQueue::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::IsEmpty() [member function]
+    cls.add_method('IsEmpty', 
+                   'bool', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::Peek(ns3::WifiMacHeader * hdr) [member function]
+    cls.add_method('Peek', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::PeekByTidAndAddress(ns3::WifiMacHeader * hdr, uint8_t tid, ns3::WifiMacHeader::AddressType type, ns3::Mac48Address addr) [member function]
+    cls.add_method('PeekByTidAndAddress', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::AddressType', 'type'), param('ns3::Mac48Address', 'addr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::PeekFirstAvailable(ns3::WifiMacHeader * hdr, ns3::Time & tStamp, ns3::QosBlockedDestinations const * blockedPackets) [member function]
+    cls.add_method('PeekFirstAvailable', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr'), param('ns3::Time &', 'tStamp'), param('ns3::QosBlockedDestinations const *', 'blockedPackets')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::PushFront(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('PushFront', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
+    cls.add_method('SetMaxDelay', 
+                   'void', 
+                   [param('ns3::Time', 'delay')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxSize(uint32_t maxSize) [member function]
+    cls.add_method('SetMaxSize', 
+                   'void', 
+                   [param('uint32_t', 'maxSize')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacQueue::GetAddressForPacket(ns3::WifiMacHeader::AddressType type, std::_List_iterator<ns3::WifiMacQueue::Item> it) [member function]
+    cls.add_method('GetAddressForPacket', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader::AddressType', 'type'), param('std::_List_iterator< ns3::WifiMacQueue::Item >', 'it')], 
+                   visibility='protected')
+    return
+
+def register_Ns3WifiPhy_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
+    cls.add_method('CalculateSnr', 
+                   'double', 
+                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
+    cls.add_method('GetBssMembershipSelector', 
+                   'uint32_t', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::WifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::WifiChannel >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
+    cls.add_method('GetChannelBonding', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
+    cls.add_method('GetChannelNumber', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
+    cls.add_method('GetDsssRate11Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
+    cls.add_method('GetDsssRate1Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
+    cls.add_method('GetDsssRate2Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
+    cls.add_method('GetDsssRate5_5Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
+    cls.add_method('GetErpOfdmRate12Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
+    cls.add_method('GetErpOfdmRate18Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
+    cls.add_method('GetErpOfdmRate24Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
+    cls.add_method('GetErpOfdmRate36Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
+    cls.add_method('GetErpOfdmRate48Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
+    cls.add_method('GetErpOfdmRate54Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
+    cls.add_method('GetErpOfdmRate6Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
+    cls.add_method('GetErpOfdmRate9Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetGreenfield() const [member function]
+    cls.add_method('GetGreenfield', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetMFPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
+                   'uint8_t', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
+    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
+    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
+    cls.add_method('GetOfdmRate9Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static double ns3::WifiPhy::GetPayloadDurationMicroSeconds(uint32_t size, ns3::WifiTxVector txvector) [member function]
+    cls.add_method('GetPayloadDurationMicroSeconds', 
+                   'double', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpHeaderDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpHeaderDurationMicroSeconds', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpHtSigHeaderDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpHtSigHeaderDurationMicroSeconds', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpHtTrainingSymbolDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    cls.add_method('GetPlcpHtTrainingSymbolDurationMicroSeconds', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpPreambleDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpPreambleDurationMicroSeconds', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
+    cls.add_method('GetStateDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetStbc() const [member function]
+    cls.add_method('GetStbc', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateBusy() [member function]
+    cls.add_method('IsStateBusy', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateCcaBusy() [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateIdle() [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateRx() [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSwitching() [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateTx() [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
+    cls.add_method('McsToWifiMode', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    cls.add_method('NotifyMonitorSniffRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+    cls.add_method('NotifyMonitorSniffTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRxBegin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRxEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTxBegin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
+    cls.add_method('SetChannelBonding', 
+                   'void', 
+                   [param('bool', 'channelbonding')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint16_t', 'id')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint32_t', 'freq')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGreenfield(bool greenfield) [member function]
+    cls.add_method('SetGreenfield', 
+                   'void', 
+                   [param('bool', 'greenfield')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('bool', 'guardInterval')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('bool', 'ldpc')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
+    cls.add_method('SetNumberOfReceiveAntennas', 
+                   'void', 
+                   [param('uint32_t', 'rx')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
+    cls.add_method('SetNumberOfTransmitAntennas', 
+                   'void', 
+                   [param('uint32_t', 'tx')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::Callback<void,ns3::Ptr<const ns3::Packet>,double,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetStbc(bool stbc) [member function]
+    cls.add_method('SetStbc', 
+                   'void', 
+                   [param('bool', 'stbc')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
+    cls.add_method('WifiModeToMcs', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    cls.add_method('AddBasicMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
+    cls.add_method('AddBasicMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('AddStationHtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    cls.add_method('AddSupportedMcs', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
+    cls.add_method('AddSupportedMode', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetCtsToSelfTxVector() [member function]
+    cls.add_method('DoGetCtsToSelfTxVector', 
+                   'ns3::WifiTxVector', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address address, ns3::WifiMode dataMode) [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    cls.add_method('GetBasicMcs', 
+                   'uint8_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
+    cls.add_method('GetBasicMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address address, ns3::WifiMode dataMode) [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector(ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('GetCtsToSelfTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address address, ns3::WifiMode rtsMode) [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'rtsMode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fullPacketSize) [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    cls.add_method('GetDefaultMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
+    cls.add_method('GetDefaultTxPowerLevel', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentOffset', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentSize', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
+    cls.add_method('GetFragmentationThreshold', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetGreenfieldSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
+    cls.add_method('GetInfo', 
+                   'ns3::WifiRemoteStationInfo', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetMaxSlrc() const [member function]
+    cls.add_method('GetMaxSlrc', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetMaxSsrc() const [member function]
+    cls.add_method('GetMaxSsrc', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
+    cls.add_method('GetNBasicMcs', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
+    cls.add_method('GetNBasicModes', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
+    cls.add_method('GetNonUnicastMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNumberOfTransmitAntennas() [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetRtsCtsThreshold() const [member function]
+    cls.add_method('GetRtsCtsThreshold', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('GetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasHtSupported() const [member function]
+    cls.add_method('HasHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsAssociated', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsBrandNew', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fragmentNumber) [member function]
+    cls.add_method('IsLastFragment', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsWaitAssocTxOk', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
+    cls.add_method('NeedCtsToSelf', 
+                   'bool', 
+                   [param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedDataRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NeedDataRetransmission', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NeedFragmentation', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NeedRts', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRtsRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NeedRtsRetransmission', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::PrepareForQueue(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fullPacketSize) [member function]
+    cls.add_method('PrepareForQueue', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordDisassociated', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordWaitAssocTxOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    cls.add_method('ReportDataFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr) [member function]
+    cls.add_method('ReportDataOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    cls.add_method('ReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    cls.add_method('ReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    cls.add_method('ReportRtsFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('ReportRtsOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('ReportRxOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset(ns3::Mac48Address address) [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
+    cls.add_method('SetDefaultTxPowerLevel', 
+                   'void', 
+                   [param('uint8_t', 'txPower')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetFragmentationThreshold', 
+                   'void', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetHtSupported(bool enable) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
+    cls.add_method('SetMaxSlrc', 
+                   'void', 
+                   [param('uint32_t', 'maxSlrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
+    cls.add_method('SetMaxSsrc', 
+                   'void', 
+                   [param('uint32_t', 'maxSsrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetRtsCtsThreshold', 
+                   'void', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetGreenfield', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetLongRetryCount(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetLongRetryCount', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    cls.add_method('GetMcsSupported', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNMcsSupported', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNSupported', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNumberOfReceiveAntennas(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNumberOfTransmitAntennas(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardInterval(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetShortGuardInterval', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetShortRetryCount(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetShortRetryCount', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetStbc(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetStbc', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    cls.add_method('GetSupported', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::WifiRemoteStationManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxGuardInterval', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetAckTxNess(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxNess', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetAckTxNss(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxNss', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetAckTxPowerLevel(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxPowerLevel', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxStbc(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxStbc', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxGuardInterval', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetBlockAckTxNess(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxNess', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetBlockAckTxNss(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxNss', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetBlockAckTxPowerLevel(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxPowerLevel', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxStbc(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxStbc', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxGuardInterval', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetCtsTxNess(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxNess', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetCtsTxNss(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxNss', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetCtsTxPowerLevel(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxPowerLevel', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxStbc(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxStbc', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetDataTxVector(ns3::WifiRemoteStation * station, uint32_t size) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedDataRetransmission(ns3::WifiRemoteStation * station, ns3::Ptr<ns3::Packet const> packet, bool normally) [member function]
+    cls.add_method('DoNeedDataRetransmission', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedFragmentation(ns3::WifiRemoteStation * station, ns3::Ptr<ns3::Packet const> packet, bool normally) [member function]
+    cls.add_method('DoNeedFragmentation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, ns3::Ptr<ns3::Packet const> packet, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRtsRetransmission(ns3::WifiRemoteStation * station, ns3::Ptr<ns3::Packet const> packet, bool normally) [member function]
+    cls.add_method('DoNeedRtsRetransmission', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLowLatency() const [member function]
+    cls.add_method('IsLowLatency', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3AttributeAccessor_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('CreateValidValue', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::CallbackBase', 'base')])
+    return
+
+def register_Ns3CtrlBAckRequestHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader(ns3::CtrlBAckRequestHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CtrlBAckRequestHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader() [constructor]
+    cls.add_constructor([])
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckRequestHeader::GetTidInfo() const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckRequestHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
+                   'void', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetTidInfo(uint8_t tid) [member function]
+    cls.add_method('SetTidInfo', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetType(ns3::BlockAckType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::BlockAckType', 'type')])
+    return
+
+def register_Ns3CtrlBAckResponseHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader(ns3::CtrlBAckResponseHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CtrlBAckResponseHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader() [constructor]
+    cls.add_constructor([])
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t const * ns3::CtrlBAckResponseHeader::GetBitmap() const [member function]
+    cls.add_method('GetBitmap', 
+                   'uint16_t const *', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint64_t ns3::CtrlBAckResponseHeader::GetCompressedBitmap() const [member function]
+    cls.add_method('GetCompressedBitmap', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckResponseHeader::GetTidInfo() const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsFragmentReceived(uint16_t seq, uint8_t frag) const [member function]
+    cls.add_method('IsFragmentReceived', 
+                   'bool', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsPacketReceived(uint16_t seq) const [member function]
+    cls.add_method('IsPacketReceived', 
+                   'bool', 
+                   [param('uint16_t', 'seq')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::ResetBitmap() [member function]
+    cls.add_method('ResetBitmap', 
+                   'void', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
+                   'void', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
+    cls.add_method('SetReceivedFragment', 
+                   'void', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedPacket(uint16_t seq) [member function]
+    cls.add_method('SetReceivedPacket', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequenceControl(uint16_t seqControl) [member function]
+    cls.add_method('SetStartingSequenceControl', 
+                   'void', 
+                   [param('uint16_t', 'seqControl')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetTidInfo(uint8_t tid) [member function]
+    cls.add_method('SetTidInfo', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetType(ns3::BlockAckType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::BlockAckType', 'type')])
+    return
+
+def register_Ns3Dcf_methods(root_module, cls):
+    ## dcf.h (module 'wifi'): ns3::Dcf::Dcf() [constructor]
+    cls.add_constructor([])
+    ## dcf.h (module 'wifi'): ns3::Dcf::Dcf(ns3::Dcf const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Dcf const &', 'arg0')])
+    ## dcf.h (module 'wifi'): uint32_t ns3::Dcf::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): uint32_t ns3::Dcf::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): uint32_t ns3::Dcf::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): static ns3::TypeId ns3::Dcf::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## dcf.h (module 'wifi'): void ns3::Dcf::SetAifsn(uint32_t aifsn) [member function]
+    cls.add_method('SetAifsn', 
+                   'void', 
+                   [param('uint32_t', 'aifsn')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): void ns3::Dcf::SetMaxCw(uint32_t maxCw) [member function]
+    cls.add_method('SetMaxCw', 
+                   'void', 
+                   [param('uint32_t', 'maxCw')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): void ns3::Dcf::SetMinCw(uint32_t minCw) [member function]
+    cls.add_method('SetMinCw', 
+                   'void', 
+                   [param('uint32_t', 'minCw')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3EdcaTxopN_methods(root_module, cls):
+    ## edca-txop-n.h (module 'wifi'): static ns3::TypeId ns3::EdcaTxopN::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## edca-txop-n.h (module 'wifi'): ns3::EdcaTxopN::EdcaTxopN() [constructor]
+    cls.add_constructor([])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetLow(ns3::Ptr<ns3::MacLow> low) [member function]
+    cls.add_method('SetLow', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacLow >', 'low')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetTxMiddle(ns3::MacTxMiddle * txMiddle) [member function]
+    cls.add_method('SetTxMiddle', 
+                   'void', 
+                   [param('ns3::MacTxMiddle *', 'txMiddle')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetManager(ns3::DcfManager * manager) [member function]
+    cls.add_method('SetManager', 
+                   'void', 
+                   [param('ns3::DcfManager *', 'manager')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetTxOkCallback(ns3::Callback<void, ns3::WifiMacHeader const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetTxOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetTxFailedCallback(ns3::Callback<void, ns3::WifiMacHeader const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetTxFailedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> remoteManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'remoteManager')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## edca-txop-n.h (module 'wifi'): ns3::TypeOfStation ns3::EdcaTxopN::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::EdcaTxopN::GetQueue() const [member function]
+    cls.add_method('GetQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetMinCw(uint32_t minCw) [member function]
+    cls.add_method('SetMinCw', 
+                   'void', 
+                   [param('uint32_t', 'minCw')], 
+                   is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetMaxCw(uint32_t maxCw) [member function]
+    cls.add_method('SetMaxCw', 
+                   'void', 
+                   [param('uint32_t', 'maxCw')], 
+                   is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetAifsn(uint32_t aifsn) [member function]
+    cls.add_method('SetAifsn', 
+                   'void', 
+                   [param('uint32_t', 'aifsn')], 
+                   is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): ns3::Ptr<ns3::MacLow> ns3::EdcaTxopN::Low() [member function]
+    cls.add_method('Low', 
+                   'ns3::Ptr< ns3::MacLow >', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::EdcaTxopN::GetMsduAggregator() const [member function]
+    cls.add_method('GetMsduAggregator', 
+                   'ns3::Ptr< ns3::MsduAggregator >', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedsAccess() const [member function]
+    cls.add_method('NeedsAccess', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NotifyAccessGranted() [member function]
+    cls.add_method('NotifyAccessGranted', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NotifyInternalCollision() [member function]
+    cls.add_method('NotifyInternalCollision', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NotifyCollision() [member function]
+    cls.add_method('NotifyCollision', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotCts(double snr, ns3::WifiMode txMode) [member function]
+    cls.add_method('GotCts', 
+                   'void', 
+                   [param('double', 'snr'), param('ns3::WifiMode', 'txMode')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::MissedCts() [member function]
+    cls.add_method('MissedCts', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotAck(double snr, ns3::WifiMode txMode) [member function]
+    cls.add_method('GotAck', 
+                   'void', 
+                   [param('double', 'snr'), param('ns3::WifiMode', 'txMode')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotBlockAck', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::MissedBlockAck() [member function]
+    cls.add_method('MissedBlockAck', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotAddBaResponse', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotDelBaFrame(ns3::MgtDelBaHeader const * delBaHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotDelBaFrame', 
+                   'void', 
+                   [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::MissedAck() [member function]
+    cls.add_method('MissedAck', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::StartNext() [member function]
+    cls.add_method('StartNext', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::EndTxNoAck() [member function]
+    cls.add_method('EndTxNoAck', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::RestartAccessIfNeeded() [member function]
+    cls.add_method('RestartAccessIfNeeded', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::StartAccessIfNeeded() [member function]
+    cls.add_method('StartAccessIfNeeded', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedRts() [member function]
+    cls.add_method('NeedRts', 
+                   'bool', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedRtsRetransmission() [member function]
+    cls.add_method('NeedRtsRetransmission', 
+                   'bool', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedDataRetransmission() [member function]
+    cls.add_method('NeedDataRetransmission', 
+                   'bool', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedFragmentation() const [member function]
+    cls.add_method('NeedFragmentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetNextFragmentSize() [member function]
+    cls.add_method('GetNextFragmentSize', 
+                   'uint32_t', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetFragmentSize() [member function]
+    cls.add_method('GetFragmentSize', 
+                   'uint32_t', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetFragmentOffset() [member function]
+    cls.add_method('GetFragmentOffset', 
+                   'uint32_t', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::IsLastFragment() const [member function]
+    cls.add_method('IsLastFragment', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NextFragment() [member function]
+    cls.add_method('NextFragment', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::EdcaTxopN::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
+    cls.add_method('GetFragmentPacket', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('ns3::WifiMacHeader *', 'hdr')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetAccessCategory(ns3::AcIndex ac) [member function]
+    cls.add_method('SetAccessCategory', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::Queue(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('Queue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetMsduAggregator(ns3::Ptr<ns3::MsduAggregator> aggr) [member function]
+    cls.add_method('SetMsduAggregator', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MsduAggregator >', 'aggr')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::PushFront(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('PushFront', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::CompleteConfig() [member function]
+    cls.add_method('CompleteConfig', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetBlockAckThreshold(uint8_t threshold) [member function]
+    cls.add_method('SetBlockAckThreshold', 
+                   'void', 
+                   [param('uint8_t', 'threshold')])
+    ## edca-txop-n.h (module 'wifi'): uint8_t ns3::EdcaTxopN::GetBlockAckThreshold() const [member function]
+    cls.add_method('GetBlockAckThreshold', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetBlockAckInactivityTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetBlockAckInactivityTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
+    cls.add_method('SendDelbaFrame', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
+    ## edca-txop-n.h (module 'wifi'): int64_t ns3::EdcaTxopN::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EmptyAttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EventImpl_methods(root_module, cls):
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
+    cls.add_constructor([])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ExtendedSupportedRatesIE_methods(root_module, cls):
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::ExtendedSupportedRatesIE const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ExtendedSupportedRatesIE const &', 'arg0')])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE() [constructor]
+    cls.add_constructor([])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::SupportedRates * rates) [constructor]
+    cls.add_constructor([param('ns3::SupportedRates *', 'rates')])
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedSupportedRatesIE::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint16_t ns3::ExtendedSupportedRatesIE::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedSupportedRatesIE::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3HtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities(ns3::HtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::HtCapabilities const &', 'arg0')])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAmpduParameters() const [member function]
+    cls.add_method('GetAmpduParameters', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
+    cls.add_method('GetGreenfield', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
+    cls.add_method('GetHtCapabilitiesInfo', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
+    cls.add_method('GetRxMcsBitmask', 
+                   'uint8_t *', 
+                   [])
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
+    cls.add_method('GetShortGuardInterval20', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
+    cls.add_method('GetSupportedChannelWidth', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet1() const [member function]
+    cls.add_method('GetSupportedMcsSet1', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet2() const [member function]
+    cls.add_method('GetSupportedMcsSet2', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')])
+    ## ht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAmpduParameters(uint8_t ctrl) [member function]
+    cls.add_method('SetAmpduParameters', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
+    cls.add_method('SetGreenfield', 
+                   'void', 
+                   [param('uint8_t', 'greenfield')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
+    cls.add_method('SetHtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtSupported(uint8_t htsupported) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
+    cls.add_method('SetRxMcsBitmask', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval20(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval20', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
+    cls.add_method('SetSupportedChannelWidth', 
+                   'void', 
+                   [param('uint8_t', 'supportedchannelwidth')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
+    cls.add_method('SetSupportedMcsSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    return
+
+def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesChecker::HtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesChecker::HtCapabilitiesChecker(ns3::HtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::HtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3HtCapabilitiesValue_methods(root_module, cls):
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesValue::HtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesValue::HtCapabilitiesValue(ns3::HtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::HtCapabilitiesValue const &', 'arg0')])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesValue::HtCapabilitiesValue(ns3::HtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::HtCapabilities const &', 'value')])
+    ## ht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::HtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities ns3::HtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): std::string ns3::HtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilitiesValue::Set(ns3::HtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::HtCapabilities const &', 'value')])
+    return
+
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
+    return
+
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
+def register_Ns3MacLow_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow(ns3::MacLow const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLow const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateTransmissionTime(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & parameters) const [member function]
+    cls.add_method('CalculateTransmissionTime', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'parameters')], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::CreateBlockAckAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address originator, uint16_t startingSeq) [member function]
+    cls.add_method('CreateBlockAckAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
+    cls.add_method('DestroyBlockAckAgreement', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')])
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetAckTimeout() const [member function]
+    cls.add_method('GetAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetBasicBlockAckTimeout() const [member function]
+    cls.add_method('GetBasicBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetCompressedBlockAckTimeout() const [member function]
+    cls.add_method('GetCompressedBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetCtsTimeout() const [member function]
+    cls.add_method('GetCtsTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::GetCtsToSelfSupported() const [member function]
+    cls.add_method('GetCtsToSelfSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetPifs() const [member function]
+    cls.add_method('GetPifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetRifs() const [member function]
+    cls.add_method('GetRifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSlotTime() const [member function]
+    cls.add_method('GetSlotTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
+    cls.add_method('IsPromisc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveError(ns3::Ptr<ns3::Packet const> packet, double rxSnr) [member function]
+    cls.add_method('ReceiveError', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'rxSnr')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('ReceiveOk', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowBlockAckEventListener * listener) [member function]
+    cls.add_method('RegisterBlockAckListenerForAc', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowBlockAckEventListener *', 'listener')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterDcfListener(ns3::MacLowDcfListener * listener) [member function]
+    cls.add_method('RegisterDcfListener', 
+                   'void', 
+                   [param('ns3::MacLowDcfListener *', 'listener')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetAckTimeout(ns3::Time ackTimeout) [member function]
+    cls.add_method('SetAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ackTimeout')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetAddress(ns3::Mac48Address ad) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'ad')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBasicBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetBasicBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBssid(ns3::Mac48Address ad) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'ad')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCompressedBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetCompressedBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCtsTimeout(ns3::Time ctsTimeout) [member function]
+    cls.add_method('SetCtsTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ctsTimeout')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPifs(ns3::Time pifs) [member function]
+    cls.add_method('SetPifs', 
+                   'void', 
+                   [param('ns3::Time', 'pifs')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetRifs(ns3::Time rifs) [member function]
+    cls.add_method('SetRifs', 
+                   'void', 
+                   [param('ns3::Time', 'rifs')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetRxCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::WifiMacHeader const*, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetRxCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::WifiMacHeader const *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetSifs(ns3::Time sifs) [member function]
+    cls.add_method('SetSifs', 
+                   'void', 
+                   [param('ns3::Time', 'sifs')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetSlotTime(ns3::Time slotTime) [member function]
+    cls.add_method('SetSlotTime', 
+                   'void', 
+                   [param('ns3::Time', 'slotTime')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> manager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'manager')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::StartTransmission(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters parameters, ns3::MacLowTransmissionListener * listener) [member function]
+    cls.add_method('StartTransmission', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::MacLowTransmissionListener *', 'listener')])
+    ## mac-low.h (module 'wifi'): ns3::WifiTxVector ns3::MacLow::GetDataTxVector(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr) const [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   is_const=True, visibility='protected', is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3MgtBeaconHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    return
+
+def register_Ns3NetDevice_methods(root_module, cls):
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
+    cls.add_constructor([])
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::Callback<bool,ns3::Ptr<ns3::NetDevice>,ns3::Ptr<const ns3::Packet>,short unsigned int,const ns3::Address&,const ns3::Address&,ns3::NetDevice::PacketType,ns3::empty,ns3::empty,ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, short unsigned int, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::Callback<bool,ns3::Ptr<ns3::NetDevice>,ns3::Ptr<const ns3::Packet>,short unsigned int,const ns3::Address&,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, short unsigned int, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NixVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+    cls.add_constructor([])
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [copy constructor]
+    cls.add_constructor([param('ns3::NixVector const &', 'o')])
+    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
+    cls.add_method('AddNeighborIndex', 
+                   'void', 
+                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
+    cls.add_method('BitCount', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfNeighbors')], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
+    cls.add_method('ExtractNeighborIndex', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    cls.add_method('GetRemainingBits', 
+                   'uint32_t', 
+                   [])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3Node_methods(root_module, cls):
+    ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Node const &', 'arg0')])
+    ## node.h (module 'network'): ns3::Node::Node() [constructor]
+    cls.add_constructor([])
+    ## node.h (module 'network'): ns3::Node::Node(uint32_t systemId) [constructor]
+    cls.add_constructor([param('uint32_t', 'systemId')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddApplication(ns3::Ptr<ns3::Application> application) [member function]
+    cls.add_method('AddApplication', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddDevice', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## node.h (module 'network'): static bool ns3::Node::ChecksumEnabled() [member function]
+    cls.add_method('ChecksumEnabled', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::Application> ns3::Node::GetApplication(uint32_t index) const [member function]
+    cls.add_method('GetApplication', 
+                   'ns3::Ptr< ns3::Application >', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Node::GetDevice(uint32_t index) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNApplications() const [member function]
+    cls.add_method('GetNApplications', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetSystemId() const [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): static ns3::TypeId ns3::Node::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): void ns3::Node::RegisterDeviceAdditionListener(ns3::Callback<void,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> listener) [member function]
+    cls.add_method('RegisterDeviceAdditionListener', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::RegisterProtocolHandler(ns3::Callback<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> handler, uint16_t protocolType, ns3::Ptr<ns3::NetDevice> device, bool promiscuous=false) [member function]
+    cls.add_method('RegisterProtocolHandler', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler'), param('uint16_t', 'protocolType'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'promiscuous', default_value='false')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterDeviceAdditionListener(ns3::Callback<void,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> listener) [member function]
+    cls.add_method('UnregisterDeviceAdditionListener', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterProtocolHandler(ns3::Callback<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> handler) [member function]
+    cls.add_method('UnregisterProtocolHandler', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
+    ## node.h (module 'network'): void ns3::Node::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## node.h (module 'network'): void ns3::Node::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NqosWaveMacHelper_methods(root_module, cls):
+    ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper::NqosWaveMacHelper(ns3::NqosWaveMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NqosWaveMacHelper const &', 'arg0')])
+    ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper::NqosWaveMacHelper() [constructor]
+    cls.add_constructor([])
+    ## wave-mac-helper.h (module 'wave'): static ns3::NqosWaveMacHelper ns3::NqosWaveMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::NqosWaveMacHelper', 
+                   [], 
+                   is_static=True)
+    ## wave-mac-helper.h (module 'wave'): void ns3::NqosWaveMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    return
+
+def register_Ns3ObjectFactoryValue_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ObjectFactory', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ObjectFactory const &', 'value')])
+    return
+
+def register_Ns3OrganizationIdentifierChecker_methods(root_module, cls):
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker::OrganizationIdentifierChecker() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker::OrganizationIdentifierChecker(ns3::OrganizationIdentifierChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OrganizationIdentifierChecker const &', 'arg0')])
+    return
+
+def register_Ns3OrganizationIdentifierValue_methods(root_module, cls):
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue::OrganizationIdentifierValue() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue::OrganizationIdentifierValue(ns3::OrganizationIdentifierValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OrganizationIdentifierValue const &', 'arg0')])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue::OrganizationIdentifierValue(ns3::OrganizationIdentifier const & value) [constructor]
+    cls.add_constructor([param('ns3::OrganizationIdentifier const &', 'value')])
+    ## vendor-specific-action.h (module 'wave'): ns3::Ptr<ns3::AttributeValue> ns3::OrganizationIdentifierValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): bool ns3::OrganizationIdentifierValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier ns3::OrganizationIdentifierValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::OrganizationIdentifier', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): std::string ns3::OrganizationIdentifierValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::OrganizationIdentifierValue::Set(ns3::OrganizationIdentifier const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier const &', 'value')])
+    return
+
+def register_Ns3OutputStreamWrapper_methods(root_module, cls):
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(ns3::OutputStreamWrapper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OutputStreamWrapper const &', 'arg0')])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::string filename, std::_Ios_Openmode filemode) [constructor]
+    cls.add_constructor([param('std::string', 'filename'), param('std::_Ios_Openmode', 'filemode')])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::ostream * os) [constructor]
+    cls.add_constructor([param('std::ostream *', 'os')])
+    ## output-stream-wrapper.h (module 'network'): std::ostream * ns3::OutputStreamWrapper::GetStream() [member function]
+    cls.add_method('GetStream', 
+                   'std::ostream *', 
+                   [])
+    return
+
+def register_Ns3Packet_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    cls.add_constructor([])
+    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Packet const &', 'o')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
+    cls.add_constructor([param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header')])
+    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddPacketTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer')])
+    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
+    cls.add_method('EnablePrinting', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
+    cls.add_method('FindFirstMatchingByteTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
+    cls.add_method('GetByteTagIterator', 
+                   'ns3::ByteTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
+    cls.add_method('GetNixVector', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
+    cls.add_method('GetPacketTagIterator', 
+                   'ns3::PacketTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint8_t const * ns3::Packet::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   deprecated=True, is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')], 
+                   is_const=True)
+    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
+    cls.add_method('PeekPacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('PeekTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
+    cls.add_method('PrintByteTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
+    cls.add_method('PrintPacketTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
+    cls.add_method('RemoveAllByteTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
+    cls.add_method('RemoveAllPacketTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')])
+    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('RemovePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> arg0) [member function]
+    cls.add_method('SetNixVector', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NixVector >', 'arg0')])
+    return
+
+def register_Ns3PointerChecker_methods(root_module, cls):
+    ## pointer.h (module 'core'): ns3::PointerChecker::PointerChecker() [constructor]
+    cls.add_constructor([])
+    ## pointer.h (module 'core'): ns3::PointerChecker::PointerChecker(ns3::PointerChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PointerChecker const &', 'arg0')])
+    ## pointer.h (module 'core'): ns3::TypeId ns3::PointerChecker::GetPointeeTypeId() const [member function]
+    cls.add_method('GetPointeeTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3PointerValue_methods(root_module, cls):
+    ## pointer.h (module 'core'): ns3::PointerValue::PointerValue(ns3::PointerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PointerValue const &', 'arg0')])
+    ## pointer.h (module 'core'): ns3::PointerValue::PointerValue() [constructor]
+    cls.add_constructor([])
+    ## pointer.h (module 'core'): ns3::PointerValue::PointerValue(ns3::Ptr<ns3::Object> object) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Object >', 'object')])
+    ## pointer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::PointerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## pointer.h (module 'core'): bool ns3::PointerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## pointer.h (module 'core'): ns3::Ptr<ns3::Object> ns3::PointerValue::GetObject() const [member function]
+    cls.add_method('GetObject', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
+    ## pointer.h (module 'core'): std::string ns3::PointerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## pointer.h (module 'core'): void ns3::PointerValue::SetObject(ns3::Ptr<ns3::Object> object) [member function]
+    cls.add_method('SetObject', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'object')])
+    return
+
+def register_Ns3QosWaveMacHelper_methods(root_module, cls):
+    ## wave-mac-helper.h (module 'wave'): ns3::QosWaveMacHelper::QosWaveMacHelper(ns3::QosWaveMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::QosWaveMacHelper const &', 'arg0')])
+    ## wave-mac-helper.h (module 'wave'): ns3::QosWaveMacHelper::QosWaveMacHelper() [constructor]
+    cls.add_constructor([])
+    ## wave-mac-helper.h (module 'wave'): static ns3::QosWaveMacHelper ns3::QosWaveMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::QosWaveMacHelper', 
+                   [], 
+                   is_static=True)
+    ## wave-mac-helper.h (module 'wave'): void ns3::QosWaveMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3RegularWifiMac_methods(root_module, cls):
+    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
+    cls.add_constructor([])
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSlot(ns3::Time slotTime) [member function]
+    cls.add_method('SetSlot', 
+                   'void', 
+                   [param('ns3::Time', 'slotTime')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSifs(ns3::Time sifs) [member function]
+    cls.add_method('SetSifs', 
+                   'void', 
+                   [param('ns3::Time', 'sifs')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetEifsNoDifs(ns3::Time eifsNoDifs) [member function]
+    cls.add_method('SetEifsNoDifs', 
+                   'void', 
+                   [param('ns3::Time', 'eifsNoDifs')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPifs(ns3::Time pifs) [member function]
+    cls.add_method('SetPifs', 
+                   'void', 
+                   [param('ns3::Time', 'pifs')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetRifs(ns3::Time rifs) [member function]
+    cls.add_method('SetRifs', 
+                   'void', 
+                   [param('ns3::Time', 'rifs')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsTimeout(ns3::Time ctsTimeout) [member function]
+    cls.add_method('SetCtsTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ctsTimeout')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAckTimeout(ns3::Time ackTimeout) [member function]
+    cls.add_method('SetAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ackTimeout')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetRifs() const [member function]
+    cls.add_method('GetRifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetPifs() const [member function]
+    cls.add_method('GetPifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetEifsNoDifs() const [member function]
+    cls.add_method('GetEifsNoDifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetCtsTimeout() const [member function]
+    cls.add_method('GetCtsTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetAckTimeout() const [member function]
+    cls.add_method('GetAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetCtsToSelfSupported() const [member function]
+    cls.add_method('GetCtsToSelfSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
+    cls.add_method('GetWifiPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBasicBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetBasicBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetBasicBlockAckTimeout() const [member function]
+    cls.add_method('GetBasicBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCompressedBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetCompressedBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetCompressedBlockAckTimeout() const [member function]
+    cls.add_method('GetCompressedBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::DcaTxop> ns3::RegularWifiMac::GetDcaTxop() const [member function]
+    cls.add_method('GetDcaTxop', 
+                   'ns3::Ptr< ns3::DcaTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('FinishConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('TxOk', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('TxFailed', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::Packet> aggregatedPacket, ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
+    cls.add_method('SendAddBaResponse', 
+                   'void', 
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetHtSupported(bool enable) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    return
+
+def register_Ns3Ssid_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(std::string s) [constructor]
+    cls.add_constructor([param('std::string', 's')])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(char const * ssid, uint8_t length) [constructor]
+    cls.add_constructor([param('char const *', 'ssid'), param('uint8_t', 'length')])
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::WifiInformationElementId ns3::Ssid::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsEqual(ns3::Ssid const & o) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ssid const &', 'o')], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): char * ns3::Ssid::PeekString() const [member function]
+    cls.add_method('PeekString', 
+                   'char *', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): void ns3::Ssid::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3SsidChecker_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker(ns3::SsidChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SsidChecker const &', 'arg0')])
+    return
+
+def register_Ns3SsidValue_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::SsidValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SsidValue const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::Ssid const & value) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'value')])
+    ## ssid.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::SsidValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::SsidValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::Ssid ns3::SsidValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): std::string ns3::SsidValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): void ns3::SsidValue::Set(ns3::Ssid const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ssid const &', 'value')])
+    return
+
+def register_Ns3SupportedRates_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SupportedRates const &', 'arg0')])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
+    cls.add_constructor([])
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddSupportedRate(uint32_t bs) [member function]
+    cls.add_method('AddSupportedRate', 
+                   'void', 
+                   [param('uint32_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::SupportedRates::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetNRates() const [member function]
+    cls.add_method('GetNRates', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): uint32_t ns3::SupportedRates::GetRate(uint8_t i) const [member function]
+    cls.add_method('GetRate', 
+                   'uint32_t', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBasicRate(uint32_t bs) const [member function]
+    cls.add_method('IsBasicRate', 
+                   'bool', 
+                   [param('uint32_t', 'bs')], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsSupportedRate(uint32_t bs) const [member function]
+    cls.add_method('IsSupportedRate', 
+                   'bool', 
+                   [param('uint32_t', 'bs')], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SetBasicRate(uint32_t bs) [member function]
+    cls.add_method('SetBasicRate', 
+                   'void', 
+                   [param('uint32_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::extended [variable]
+    cls.add_instance_attribute('extended', 'ns3::ExtendedSupportedRatesIE', is_const=False)
+    return
+
+def register_Ns3TimeValue_methods(root_module, cls):
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'value')])
+    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Time const &', 'value')])
+    return
+
+def register_Ns3TypeIdChecker_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    return
+
+def register_Ns3TypeIdValue_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'value')])
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::TypeId const &', 'value')])
+    return
+
+def register_Ns3UintegerValue_methods(root_module, cls):
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+    cls.add_constructor([])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
+    cls.add_constructor([param('uint64_t const &', 'value')])
+    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint64_t const &', 'value')])
+    return
+
+def register_Ns3WaveMacLow_methods(root_module, cls):
+    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow(ns3::WaveMacLow const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WaveMacLow const &', 'arg0')])
+    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow() [constructor]
+    cls.add_constructor([])
+    ## wave-mac-low.h (module 'wave'): static ns3::TypeId ns3::WaveMacLow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wave-mac-low.h (module 'wave'): ns3::WifiTxVector ns3::WaveMacLow::GetDataTxVector(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr) const [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3WifiModeChecker_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
+    cls.add_constructor([])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker(ns3::WifiModeChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiModeChecker const &', 'arg0')])
+    return
+
+def register_Ns3WifiModeValue_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue() [constructor]
+    cls.add_constructor([])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiModeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiModeValue const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiMode const & value) [constructor]
+    cls.add_constructor([param('ns3::WifiMode const &', 'value')])
+    ## wifi-mode.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::WifiModeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiModeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode ns3::WifiModeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiModeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mode.h (module 'wifi'): void ns3::WifiModeValue::Set(ns3::WifiMode const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::WifiMode const &', 'value')])
+    return
+
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
+def register_Ns3DcaTxop_methods(root_module, cls):
+    ## dca-txop.h (module 'wifi'): static ns3::TypeId ns3::DcaTxop::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## dca-txop.h (module 'wifi'): ns3::DcaTxop::DcaTxop() [constructor]
+    cls.add_constructor([])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetLow(ns3::Ptr<ns3::MacLow> low) [member function]
+    cls.add_method('SetLow', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacLow >', 'low')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetManager(ns3::DcfManager * manager) [member function]
+    cls.add_method('SetManager', 
+                   'void', 
+                   [param('ns3::DcfManager *', 'manager')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> remoteManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'remoteManager')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetTxOkCallback(ns3::Callback<void, ns3::WifiMacHeader const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetTxOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetTxFailedCallback(ns3::Callback<void, ns3::WifiMacHeader const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetTxFailedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## dca-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::DcaTxop::GetQueue() const [member function]
+    cls.add_method('GetQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [], 
+                   is_const=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetMinCw(uint32_t minCw) [member function]
+    cls.add_method('SetMinCw', 
+                   'void', 
+                   [param('uint32_t', 'minCw')], 
+                   is_virtual=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetMaxCw(uint32_t maxCw) [member function]
+    cls.add_method('SetMaxCw', 
+                   'void', 
+                   [param('uint32_t', 'maxCw')], 
+                   is_virtual=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetAifsn(uint32_t aifsn) [member function]
+    cls.add_method('SetAifsn', 
+                   'void', 
+                   [param('uint32_t', 'aifsn')], 
+                   is_virtual=True)
+    ## dca-txop.h (module 'wifi'): uint32_t ns3::DcaTxop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dca-txop.h (module 'wifi'): uint32_t ns3::DcaTxop::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dca-txop.h (module 'wifi'): uint32_t ns3::DcaTxop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::Queue(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('Queue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## dca-txop.h (module 'wifi'): int64_t ns3::DcaTxop::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3OcbWifiMac_methods(root_module, cls):
+    ## ocb-wifi-mac.h (module 'wave'): static ns3::TypeId ns3::OcbWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac::OcbWifiMac() [constructor]
+    cls.add_constructor([])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SendVsc(ns3::Ptr<ns3::Packet> vsc, ns3::Mac48Address peer, ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('SendVsc', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'vsc'), param('ns3::Mac48Address', 'peer'), param('ns3::OrganizationIdentifier', 'oi')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::AddReceiveVscCallback(ns3::OrganizationIdentifier oi, ns3::VscCallback cb) [member function]
+    cls.add_method('AddReceiveVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi'), param('ns3::VscCallback', 'cb')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::RemoveReceiveVscCallback(ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('RemoveReceiveVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi')])
+    ## ocb-wifi-mac.h (module 'wave'): ns3::Ssid ns3::OcbWifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): ns3::Mac48Address ns3::OcbWifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureEdca(uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, ns3::AcIndex ac) [member function]
+    cls.add_method('ConfigureEdca', 
+                   'void', 
+                   [param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('uint32_t', 'aifsn'), param('ns3::AcIndex', 'ac')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('FinishConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   visibility='protected', is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Receive(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3HashImplementation_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation() [constructor]
+    cls.add_constructor([])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Implementation::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Implementation::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Implementation::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3HashFunctionFnv1a_methods(root_module, cls):
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a(ns3::Hash::Function::Fnv1a const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Fnv1a const &', 'arg0')])
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a() [constructor]
+    cls.add_constructor([])
+    ## hash-fnv.h (module 'core'): uint32_t ns3::Hash::Function::Fnv1a::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): uint64_t ns3::Hash::Function::Fnv1a::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): void ns3::Hash::Function::Fnv1a::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash32_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Function::Hash32 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash32 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Hash32Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash32Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash32::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash32::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash64_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Function::Hash64 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash64 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Hash64Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash64Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash64::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Function::Hash64::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash64::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionMurmur3_methods(root_module, cls):
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3(ns3::Hash::Function::Murmur3 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Murmur3 const &', 'arg0')])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3() [constructor]
+    cls.add_constructor([])
+    ## hash-murmur3.h (module 'core'): uint32_t ns3::Hash::Function::Murmur3::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): uint64_t ns3::Hash::Function::Murmur3::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): void ns3::Hash::Function::Murmur3::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_functions(root_module):
+    module = root_module
+    ## vendor-specific-action.h (module 'wave'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::MakeOrganizationIdentifierChecker() [free function]
+    module.add_function('MakeOrganizationIdentifierChecker', 
+                        'ns3::Ptr< ns3::AttributeChecker const >', 
+                        [])
+    register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
+    register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_internal(module.get_submodule('internal'), root_module)
+    return
+
+def register_functions_ns3_FatalImpl(module, root_module):
+    return
+
+def register_functions_ns3_Hash(module, root_module):
+    register_functions_ns3_Hash_Function(module.get_submodule('Function'), root_module)
+    return
+
+def register_functions_ns3_Hash_Function(module, root_module):
+    return
+
+def register_functions_ns3_internal(module, root_module):
+    return
+
+def main():
+    out = FileCodeSink(sys.stdout)
+    root_module = module_init()
+    register_types(root_module)
+    register_methods(root_module)
+    register_functions(root_module)
+    root_module.generate(out)
+
+if __name__ == '__main__':
+    main()
+
diff -Naur ns-3.18.1/src/wave/bindings/modulegen__gcc_LP64.py ns-3.19/src/wave/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/wave/bindings/modulegen__gcc_LP64.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,9928 @@
+from pybindgen import Module, FileCodeSink, param, retval, cppclass, typehandlers
+
+
+import pybindgen.settings
+import warnings
+
+class ErrorHandler(pybindgen.settings.ErrorHandler):
+    def handle_error(self, wrapper, exception, traceback_):
+        warnings.warn("exception %r in wrapper %s" % (exception, wrapper))
+        return True
+pybindgen.settings.error_handler = ErrorHandler()
+
+
+import sys
+
+def module_init():
+    root_module = Module('ns.wave', cpp_namespace='::ns3')
+    return root_module
+
+def register_types(module):
+    root_module = module.get_root()
+    
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType [enumeration]
+    module.add_enum('WifiMacType', ['WIFI_MAC_CTL_RTS', 'WIFI_MAC_CTL_CTS', 'WIFI_MAC_CTL_ACK', 'WIFI_MAC_CTL_BACKREQ', 'WIFI_MAC_CTL_BACKRESP', 'WIFI_MAC_CTL_CTLWRAPPER', 'WIFI_MAC_MGT_BEACON', 'WIFI_MAC_MGT_ASSOCIATION_REQUEST', 'WIFI_MAC_MGT_ASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_DISASSOCIATION', 'WIFI_MAC_MGT_REASSOCIATION_REQUEST', 'WIFI_MAC_MGT_REASSOCIATION_RESPONSE', 'WIFI_MAC_MGT_PROBE_REQUEST', 'WIFI_MAC_MGT_PROBE_RESPONSE', 'WIFI_MAC_MGT_AUTHENTICATION', 'WIFI_MAC_MGT_DEAUTHENTICATION', 'WIFI_MAC_MGT_ACTION', 'WIFI_MAC_MGT_ACTION_NO_ACK', 'WIFI_MAC_MGT_MULTIHOP_ACTION', 'WIFI_MAC_DATA', 'WIFI_MAC_DATA_CFACK', 'WIFI_MAC_DATA_CFPOLL', 'WIFI_MAC_DATA_CFACK_CFPOLL', 'WIFI_MAC_DATA_NULL', 'WIFI_MAC_DATA_NULL_CFACK', 'WIFI_MAC_DATA_NULL_CFPOLL', 'WIFI_MAC_DATA_NULL_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA', 'WIFI_MAC_QOSDATA_CFACK', 'WIFI_MAC_QOSDATA_CFPOLL', 'WIFI_MAC_QOSDATA_CFACK_CFPOLL', 'WIFI_MAC_QOSDATA_NULL', 'WIFI_MAC_QOSDATA_NULL_CFPOLL', 'WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL'], import_from_module='ns.wifi')
+    ## wifi-preamble.h (module 'wifi'): ns3::WifiPreamble [enumeration]
+    module.add_enum('WifiPreamble', ['WIFI_PREAMBLE_LONG', 'WIFI_PREAMBLE_SHORT', 'WIFI_PREAMBLE_HT_MF', 'WIFI_PREAMBLE_HT_GF'], import_from_module='ns.wifi')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass [enumeration]
+    module.add_enum('WifiModulationClass', ['WIFI_MOD_CLASS_UNKNOWN', 'WIFI_MOD_CLASS_IR', 'WIFI_MOD_CLASS_FHSS', 'WIFI_MOD_CLASS_DSSS', 'WIFI_MOD_CLASS_ERP_PBCC', 'WIFI_MOD_CLASS_DSSS_OFDM', 'WIFI_MOD_CLASS_ERP_OFDM', 'WIFI_MOD_CLASS_OFDM', 'WIFI_MOD_CLASS_HT'], import_from_module='ns.wifi')
+    ## wifi-phy-standard.h (module 'wifi'): ns3::WifiPhyStandard [enumeration]
+    module.add_enum('WifiPhyStandard', ['WIFI_PHY_STANDARD_80211a', 'WIFI_PHY_STANDARD_80211b', 'WIFI_PHY_STANDARD_80211g', 'WIFI_PHY_STANDARD_80211_10MHZ', 'WIFI_PHY_STANDARD_80211_5MHZ', 'WIFI_PHY_STANDARD_holland', 'WIFI_PHY_STANDARD_80211n_2_4GHZ', 'WIFI_PHY_STANDARD_80211n_5GHZ'], import_from_module='ns.wifi')
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_UNDEF'], import_from_module='ns.wifi')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
+    module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'], import_from_module='ns.wifi')
+    ## edca-txop-n.h (module 'wifi'): ns3::TypeOfStation [enumeration]
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'], import_from_module='ns.wifi')
+    ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType [enumeration]
+    module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'], import_from_module='ns.wifi')
+    ## address.h (module 'network'): ns3::Address [class]
+    module.add_class('Address', import_from_module='ns.network')
+    ## address.h (module 'network'): ns3::Address::MaxSize_e [enumeration]
+    module.add_enum('MaxSize_e', ['MAX_SIZE'], outer_class=root_module['ns3::Address'], import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelper [class]
+    module.add_class('AsciiTraceHelper', import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelperForDevice [class]
+    module.add_class('AsciiTraceHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList [class]
+    module.add_class('AttributeConstructionList', import_from_module='ns.core')
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item [struct]
+    module.add_class('Item', import_from_module='ns.core', outer_class=root_module['ns3::AttributeConstructionList'])
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar [struct]
+    module.add_class('Bar', import_from_module='ns.wifi')
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement [class]
+    module.add_class('BlockAckAgreement', import_from_module='ns.wifi')
+    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache [class]
+    module.add_class('BlockAckCache', import_from_module='ns.wifi')
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager [class]
+    module.add_class('BlockAckManager', import_from_module='ns.wifi')
+    ## buffer.h (module 'network'): ns3::Buffer [class]
+    module.add_class('Buffer', import_from_module='ns.network')
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::Buffer'])
+    ## packet.h (module 'network'): ns3::ByteTagIterator [class]
+    module.add_class('ByteTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagIterator'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList [class]
+    module.add_class('ByteTagList', import_from_module='ns.network')
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator [class]
+    module.add_class('Iterator', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList'])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::ByteTagList::Iterator'])
+    ## callback.h (module 'core'): ns3::CallbackBase [class]
+    module.add_class('CallbackBase', import_from_module='ns.core')
+    ## capability-information.h (module 'wifi'): ns3::CapabilityInformation [class]
+    module.add_class('CapabilityInformation', import_from_module='ns.wifi')
+    ## event-id.h (module 'core'): ns3::EventId [class]
+    module.add_class('EventId', import_from_module='ns.core')
+    ## hash.h (module 'core'): ns3::Hasher [class]
+    module.add_class('Hasher', import_from_module='ns.core')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    module.add_class('Ipv4Address', import_from_module='ns.network')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
+    root_module['ns3::Ipv4Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask [class]
+    module.add_class('Ipv4Mask', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    module.add_class('Ipv6Address', import_from_module='ns.network')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address [class]
+    root_module['ns3::Ipv6Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix [class]
+    module.add_class('Ipv6Prefix', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    module.add_class('Mac48Address', import_from_module='ns.network')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address [class]
+    root_module['ns3::Mac48Address'].implicitly_converts_to(root_module['ns3::Address'])
+    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener [class]
+    module.add_class('MacLowBlockAckEventListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener [class]
+    module.add_class('MacLowDcfListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener [class]
+    module.add_class('MacLowTransmissionListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionParameters [class]
+    module.add_class('MacLowTransmissionParameters', import_from_module='ns.wifi')
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer [class]
+    module.add_class('NetDeviceContainer', import_from_module='ns.network')
+    ## node-container.h (module 'network'): ns3::NodeContainer [class]
+    module.add_class('NodeContainer', import_from_module='ns.network')
+    ## object-base.h (module 'core'): ns3::ObjectBase [class]
+    module.add_class('ObjectBase', allow_subclassing=True, import_from_module='ns.core')
+    ## object.h (module 'core'): ns3::ObjectDeleter [struct]
+    module.add_class('ObjectDeleter', import_from_module='ns.core')
+    ## object-factory.h (module 'core'): ns3::ObjectFactory [class]
+    module.add_class('ObjectFactory', import_from_module='ns.core')
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier [class]
+    module.add_class('OrganizationIdentifier')
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifierType [enumeration]
+    module.add_enum('OrganizationIdentifierType', ['OUI24', 'OUI36', 'Unknown'], outer_class=root_module['ns3::OrganizationIdentifier'])
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement [class]
+    module.add_class('OriginatorBlockAckAgreement', import_from_module='ns.wifi', parent=root_module['ns3::BlockAckAgreement'])
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::State [enumeration]
+    module.add_enum('State', ['PENDING', 'ESTABLISHED', 'INACTIVE', 'UNSUCCESSFUL'], outer_class=root_module['ns3::OriginatorBlockAckAgreement'], import_from_module='ns.wifi')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata [class]
+    module.add_class('PacketMetadata', import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [struct]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item [enumeration]
+    module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item'], import_from_module='ns.network')
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator [class]
+    module.add_class('ItemIterator', import_from_module='ns.network', outer_class=root_module['ns3::PacketMetadata'])
+    ## packet.h (module 'network'): ns3::PacketTagIterator [class]
+    module.add_class('PacketTagIterator', import_from_module='ns.network')
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item [class]
+    module.add_class('Item', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagIterator'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList [class]
+    module.add_class('PacketTagList', import_from_module='ns.network')
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData [struct]
+    module.add_class('TagData', import_from_module='ns.network', outer_class=root_module['ns3::PacketTagList'])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData_e [enumeration]
+    module.add_enum('TagData_e', ['MAX_SIZE'], outer_class=root_module['ns3::PacketTagList::TagData'], import_from_module='ns.network')
+    ## pcap-file.h (module 'network'): ns3::PcapFile [class]
+    module.add_class('PcapFile', import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::PcapHelper [class]
+    module.add_class('PcapHelper', import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::PcapHelper [enumeration]
+    module.add_enum('', ['DLT_NULL', 'DLT_EN10MB', 'DLT_PPP', 'DLT_RAW', 'DLT_IEEE802_11', 'DLT_PRISM_HEADER', 'DLT_IEEE802_11_RADIO'], outer_class=root_module['ns3::PcapHelper'], import_from_module='ns.network')
+    ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice [class]
+    module.add_class('PcapHelperForDevice', allow_subclassing=True, import_from_module='ns.network')
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Object', 'ns3::ObjectBase', 'ns3::ObjectDeleter'], parent=root_module['ns3::ObjectBase'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simulator.h (module 'core'): ns3::Simulator [class]
+    module.add_class('Simulator', destructor_visibility='private', import_from_module='ns.core')
+    ## status-code.h (module 'wifi'): ns3::StatusCode [class]
+    module.add_class('StatusCode', import_from_module='ns.wifi')
+    ## tag.h (module 'network'): ns3::Tag [class]
+    module.add_class('Tag', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer [class]
+    module.add_class('TagBuffer', import_from_module='ns.network')
+    ## type-id.h (module 'core'): ns3::TypeId [class]
+    module.add_class('TypeId', import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeFlag [enumeration]
+    module.add_enum('AttributeFlag', ['ATTR_GET', 'ATTR_SET', 'ATTR_CONSTRUCT', 'ATTR_SGC'], outer_class=root_module['ns3::TypeId'], import_from_module='ns.core')
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation [struct]
+    module.add_class('AttributeInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation [struct]
+    module.add_class('TraceSourceInformation', import_from_module='ns.core', outer_class=root_module['ns3::TypeId'])
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificContentManager [class]
+    module.add_class('VendorSpecificContentManager')
+    ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
+    module.add_class('WifiHelper', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper [class]
+    module.add_class('WifiMacHelper', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
+    module.add_class('WifiMode', import_from_module='ns.wifi')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory [class]
+    module.add_class('WifiModeFactory', import_from_module='ns.wifi')
+    ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper [class]
+    module.add_class('WifiPhyHelper', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener [class]
+    module.add_class('WifiPhyListener', allow_subclassing=True, import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation [struct]
+    module.add_class('WifiRemoteStation', import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo [class]
+    module.add_class('WifiRemoteStationInfo', import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [struct]
+    module.add_class('WifiRemoteStationState', import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState [enumeration]
+    module.add_enum('', ['BRAND_NEW', 'DISASSOC', 'WAIT_ASSOC_TX_OK', 'GOT_ASSOC_TX_OK'], outer_class=root_module['ns3::WifiRemoteStationState'], import_from_module='ns.wifi')
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector [class]
+    module.add_class('WifiTxVector', import_from_module='ns.wifi')
+    ## empty.h (module 'core'): ns3::empty [class]
+    module.add_class('empty', import_from_module='ns.core')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t [class]
+    module.add_class('int64x64_t', import_from_module='ns.core')
+    ## chunk.h (module 'network'): ns3::Chunk [class]
+    module.add_class('Chunk', import_from_module='ns.network', parent=root_module['ns3::ObjectBase'])
+    ## header.h (module 'network'): ns3::Header [class]
+    module.add_class('Header', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## higher-tx-tag.h (module 'wave'): ns3::HigherDataTxVectorTag [class]
+    module.add_class('HigherDataTxVectorTag', parent=root_module['ns3::Tag'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader [class]
+    module.add_class('MgtAddBaRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaResponseHeader [class]
+    module.add_class('MgtAddBaResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocRequestHeader [class]
+    module.add_class('MgtAssocRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocResponseHeader [class]
+    module.add_class('MgtAssocResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtDelBaHeader [class]
+    module.add_class('MgtDelBaHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeRequestHeader [class]
+    module.add_class('MgtProbeRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeResponseHeader [class]
+    module.add_class('MgtProbeResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::NqosWifiMacHelper [class]
+    module.add_class('NqosWifiMacHelper', import_from_module='ns.wifi', parent=root_module['ns3::WifiMacHelper'])
+    ## object.h (module 'core'): ns3::Object [class]
+    module.add_class('Object', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator [class]
+    module.add_class('AggregateIterator', import_from_module='ns.core', outer_class=root_module['ns3::Object'])
+    ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper [class]
+    module.add_class('PcapFileWrapper', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## qos-wifi-mac-helper.h (module 'wifi'): ns3::QosWifiMacHelper [class]
+    module.add_class('QosWifiMacHelper', import_from_module='ns.wifi', parent=root_module['ns3::WifiMacHelper'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeChecker', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeChecker>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::AttributeValue', 'ns3::empty', 'ns3::DefaultDeleter<ns3::AttributeValue>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::CallbackImplBase', 'ns3::empty', 'ns3::DefaultDeleter<ns3::CallbackImplBase>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::EventImpl', 'ns3::empty', 'ns3::DefaultDeleter<ns3::EventImpl>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Hash::Implementation', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Hash::Implementation>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::NixVector', 'ns3::empty', 'ns3::DefaultDeleter<ns3::NixVector>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::OutputStreamWrapper', 'ns3::empty', 'ns3::DefaultDeleter<ns3::OutputStreamWrapper>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::Packet', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Packet>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::TraceSourceAccessor', 'ns3::empty', 'ns3::DefaultDeleter<ns3::TraceSourceAccessor>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > [class]
+    module.add_class('SimpleRefCount', automatic_type_narrowing=True, import_from_module='ns.core', template_parameters=['ns3::WifiInformationElement', 'ns3::empty', 'ns3::DefaultDeleter<ns3::WifiInformationElement>'], parent=root_module['ns3::empty'], memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount'))
+    ## nstime.h (module 'core'): ns3::Time [class]
+    module.add_class('Time', import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    ## nstime.h (module 'core'): ns3::Time [class]
+    root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
+    module.add_class('TraceSourceAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    ## trailer.h (module 'network'): ns3::Trailer [class]
+    module.add_class('Trailer', import_from_module='ns.network', parent=root_module['ns3::Chunk'])
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificActionHeader [class]
+    module.add_class('VendorSpecificActionHeader', parent=root_module['ns3::Header'])
+    ## wifi-80211p-helper.h (module 'wave'): ns3::Wifi80211pHelper [class]
+    module.add_class('Wifi80211pHelper', parent=root_module['ns3::WifiHelper'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
+    module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
+    module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
+    module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METRIC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActionValue [enumeration]
+    module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionValue [enumeration]
+    module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinationActionValue [enumeration]
+    module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValue [enumeration]
+    module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_ACK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union]
+    module.add_class('ActionValue', import_from_module='ns.wifi', outer_class=root_module['ns3::WifiActionHeader'])
+    ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement [class]
+    module.add_class('WifiInformationElement', import_from_module='ns.wifi', parent=root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMac [class]
+    module.add_class('WifiMac', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader [class]
+    module.add_class('WifiMacHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy [enumeration]
+    module.add_enum('QosAckPolicy', ['NORMAL_ACK', 'NO_ACK', 'NO_EXPLICIT_ACK', 'BLOCK_ACK'], outer_class=root_module['ns3::WifiMacHeader'], import_from_module='ns.wifi')
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::AddressType [enumeration]
+    module.add_enum('AddressType', ['ADDR1', 'ADDR2', 'ADDR3', 'ADDR4'], outer_class=root_module['ns3::WifiMacHeader'], import_from_module='ns.wifi')
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue [class]
+    module.add_class('WifiMacQueue', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy [class]
+    module.add_class('WifiPhy', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::State [enumeration]
+    module.add_enum('State', ['IDLE', 'CCA_BUSY', 'TX', 'RX', 'SWITCHING'], outer_class=root_module['ns3::WifiPhy'], import_from_module='ns.wifi')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager [class]
+    module.add_class('WifiRemoteStationManager', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor [class]
+    module.add_class('AttributeAccessor', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    ## attribute.h (module 'core'): ns3::AttributeChecker [class]
+    module.add_class('AttributeChecker', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    ## attribute.h (module 'core'): ns3::AttributeValue [class]
+    module.add_class('AttributeValue', allow_subclassing=False, automatic_type_narrowing=True, import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    ## callback.h (module 'core'): ns3::CallbackChecker [class]
+    module.add_class('CallbackChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## callback.h (module 'core'): ns3::CallbackImplBase [class]
+    module.add_class('CallbackImplBase', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    ## callback.h (module 'core'): ns3::CallbackValue [class]
+    module.add_class('CallbackValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader [class]
+    module.add_class('CtrlBAckRequestHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader [class]
+    module.add_class('CtrlBAckResponseHeader', import_from_module='ns.wifi', parent=root_module['ns3::Header'])
+    ## dcf.h (module 'wifi'): ns3::Dcf [class]
+    module.add_class('Dcf', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## edca-txop-n.h (module 'wifi'): ns3::EdcaTxopN [class]
+    module.add_class('EdcaTxopN', import_from_module='ns.wifi', parent=root_module['ns3::Dcf'])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue [class]
+    module.add_class('EmptyAttributeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## event-impl.h (module 'core'): ns3::EventImpl [class]
+    module.add_class('EventImpl', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE [class]
+    module.add_class('ExtendedSupportedRatesIE', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities [class]
+    module.add_class('HtCapabilities', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesChecker [class]
+    module.add_class('HtCapabilitiesChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesValue [class]
+    module.add_class('HtCapabilitiesValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker [class]
+    module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
+    module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
+    module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
+    module.add_class('Ipv4MaskValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker [class]
+    module.add_class('Ipv6AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue [class]
+    module.add_class('Ipv6AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker [class]
+    module.add_class('Ipv6PrefixChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue [class]
+    module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker [class]
+    module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
+    module.add_class('Mac48AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## mac-low.h (module 'wifi'): ns3::MacLow [class]
+    module.add_class('MacLow', import_from_module='ns.wifi', parent=root_module['ns3::Object'])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader [class]
+    module.add_class('MgtBeaconHeader', import_from_module='ns.wifi', parent=root_module['ns3::MgtProbeResponseHeader'])
+    ## net-device.h (module 'network'): ns3::NetDevice [class]
+    module.add_class('NetDevice', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## net-device.h (module 'network'): ns3::NetDevice::PacketType [enumeration]
+    module.add_enum('PacketType', ['PACKET_HOST', 'NS3_PACKET_HOST', 'PACKET_BROADCAST', 'NS3_PACKET_BROADCAST', 'PACKET_MULTICAST', 'NS3_PACKET_MULTICAST', 'PACKET_OTHERHOST', 'NS3_PACKET_OTHERHOST'], outer_class=root_module['ns3::NetDevice'], import_from_module='ns.network')
+    ## nix-vector.h (module 'network'): ns3::NixVector [class]
+    module.add_class('NixVector', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    ## node.h (module 'network'): ns3::Node [class]
+    module.add_class('Node', import_from_module='ns.network', parent=root_module['ns3::Object'])
+    ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper [class]
+    module.add_class('NqosWaveMacHelper', parent=root_module['ns3::NqosWifiMacHelper'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker [class]
+    module.add_class('ObjectFactoryChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue [class]
+    module.add_class('ObjectFactoryValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker [class]
+    module.add_class('OrganizationIdentifierChecker', parent=root_module['ns3::AttributeChecker'])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue [class]
+    module.add_class('OrganizationIdentifierValue', parent=root_module['ns3::AttributeValue'])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper [class]
+    module.add_class('OutputStreamWrapper', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
+    ## packet.h (module 'network'): ns3::Packet [class]
+    module.add_class('Packet', import_from_module='ns.network', parent=root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    ## pointer.h (module 'core'): ns3::PointerChecker [class]
+    module.add_class('PointerChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## pointer.h (module 'core'): ns3::PointerValue [class]
+    module.add_class('PointerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## wave-mac-helper.h (module 'wave'): ns3::QosWaveMacHelper [class]
+    module.add_class('QosWaveMacHelper', parent=root_module['ns3::QosWifiMacHelper'])
+    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac [class]
+    module.add_class('RegularWifiMac', import_from_module='ns.wifi', parent=root_module['ns3::WifiMac'])
+    ## ssid.h (module 'wifi'): ns3::Ssid [class]
+    module.add_class('Ssid', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker [class]
+    module.add_class('SsidChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## ssid.h (module 'wifi'): ns3::SsidValue [class]
+    module.add_class('SsidValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates [class]
+    module.add_class('SupportedRates', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
+    ## nstime.h (module 'core'): ns3::TimeValue [class]
+    module.add_class('TimeValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker [class]
+    module.add_class('TypeIdChecker', import_from_module='ns.core', parent=root_module['ns3::AttributeChecker'])
+    ## type-id.h (module 'core'): ns3::TypeIdValue [class]
+    module.add_class('TypeIdValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## uinteger.h (module 'core'): ns3::UintegerValue [class]
+    module.add_class('UintegerValue', import_from_module='ns.core', parent=root_module['ns3::AttributeValue'])
+    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow [class]
+    module.add_class('WaveMacLow', parent=root_module['ns3::MacLow'])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker [class]
+    module.add_class('WifiModeChecker', import_from_module='ns.wifi', parent=root_module['ns3::AttributeChecker'])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue [class]
+    module.add_class('WifiModeValue', import_from_module='ns.wifi', parent=root_module['ns3::AttributeValue'])
+    ## address.h (module 'network'): ns3::AddressChecker [class]
+    module.add_class('AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
+    ## address.h (module 'network'): ns3::AddressValue [class]
+    module.add_class('AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## dca-txop.h (module 'wifi'): ns3::DcaTxop [class]
+    module.add_class('DcaTxop', import_from_module='ns.wifi', parent=root_module['ns3::Dcf'])
+    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac [class]
+    module.add_class('OcbWifiMac', parent=root_module['ns3::RegularWifiMac'])
+    module.add_container('ns3::WifiModeList', 'ns3::WifiMode', container_type='vector')
+    module.add_container('ns3::WifiMcsList', 'unsigned char', container_type='vector')
+    typehandlers.add_type_alias('std::vector< unsigned char, std::allocator< unsigned char > >', 'ns3::WifiMcsList')
+    typehandlers.add_type_alias('std::vector< unsigned char, std::allocator< unsigned char > >*', 'ns3::WifiMcsList*')
+    typehandlers.add_type_alias('std::vector< unsigned char, std::allocator< unsigned char > >&', 'ns3::WifiMcsList&')
+    typehandlers.add_type_alias('uint8_t', 'ns3::WifiInformationElementId')
+    typehandlers.add_type_alias('uint8_t*', 'ns3::WifiInformationElementId*')
+    typehandlers.add_type_alias('uint8_t&', 'ns3::WifiInformationElementId&')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::VscCallback')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::VscCallback*')
+    typehandlers.add_type_alias('ns3::Callback< bool, ns3::Ptr< ns3::WifiMac >, ns3::OrganizationIdentifier const &, ns3::Ptr< ns3::Packet const >, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::VscCallback&')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >', 'ns3::WifiModeListIterator')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >*', 'ns3::WifiModeListIterator*')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< ns3::WifiMode const *, std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > > >&', 'ns3::WifiModeListIterator&')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >', 'ns3::WifiModeList')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >*', 'ns3::WifiModeList*')
+    typehandlers.add_type_alias('std::vector< ns3::WifiMode, std::allocator< ns3::WifiMode > >&', 'ns3::WifiModeList&')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >', 'ns3::WifiMcsListIterator')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >*', 'ns3::WifiMcsListIterator*')
+    typehandlers.add_type_alias('__gnu_cxx::__normal_iterator< unsigned char const *, std::vector< unsigned char, std::allocator< unsigned char > > >&', 'ns3::WifiMcsListIterator&')
+    
+    ## Register a nested module for the namespace FatalImpl
+    
+    nested_module = module.add_cpp_namespace('FatalImpl')
+    register_types_ns3_FatalImpl(nested_module)
+    
+    
+    ## Register a nested module for the namespace Hash
+    
+    nested_module = module.add_cpp_namespace('Hash')
+    register_types_ns3_Hash(nested_module)
+    
+    
+    ## Register a nested module for the namespace internal
+    
+    nested_module = module.add_cpp_namespace('internal')
+    register_types_ns3_internal(nested_module)
+    
+
+def register_types_ns3_FatalImpl(module):
+    root_module = module.get_root()
+    
+
+def register_types_ns3_Hash(module):
+    root_module = module.get_root()
+    
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation [class]
+    module.add_class('Implementation', import_from_module='ns.core', parent=root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash64Function_ptr')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash64Function_ptr*')
+    typehandlers.add_type_alias('uint64_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash64Function_ptr&')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *', 'ns3::Hash::Hash32Function_ptr')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) **', 'ns3::Hash::Hash32Function_ptr*')
+    typehandlers.add_type_alias('uint32_t ( * ) ( char const *, size_t ) *&', 'ns3::Hash::Hash32Function_ptr&')
+    
+    ## Register a nested module for the namespace Function
+    
+    nested_module = module.add_cpp_namespace('Function')
+    register_types_ns3_Hash_Function(nested_module)
+    
+
+def register_types_ns3_Hash_Function(module):
+    root_module = module.get_root()
+    
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a [class]
+    module.add_class('Fnv1a', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32 [class]
+    module.add_class('Hash32', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64 [class]
+    module.add_class('Hash64', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3 [class]
+    module.add_class('Murmur3', import_from_module='ns.core', parent=root_module['ns3::Hash::Implementation'])
+
+def register_types_ns3_internal(module):
+    root_module = module.get_root()
+    
+
+def register_methods(root_module):
+    register_Ns3Address_methods(root_module, root_module['ns3::Address'])
+    register_Ns3AsciiTraceHelper_methods(root_module, root_module['ns3::AsciiTraceHelper'])
+    register_Ns3AsciiTraceHelperForDevice_methods(root_module, root_module['ns3::AsciiTraceHelperForDevice'])
+    register_Ns3AttributeConstructionList_methods(root_module, root_module['ns3::AttributeConstructionList'])
+    register_Ns3AttributeConstructionListItem_methods(root_module, root_module['ns3::AttributeConstructionList::Item'])
+    register_Ns3Bar_methods(root_module, root_module['ns3::Bar'])
+    register_Ns3BlockAckAgreement_methods(root_module, root_module['ns3::BlockAckAgreement'])
+    register_Ns3BlockAckCache_methods(root_module, root_module['ns3::BlockAckCache'])
+    register_Ns3BlockAckManager_methods(root_module, root_module['ns3::BlockAckManager'])
+    register_Ns3Buffer_methods(root_module, root_module['ns3::Buffer'])
+    register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator'])
+    register_Ns3ByteTagIterator_methods(root_module, root_module['ns3::ByteTagIterator'])
+    register_Ns3ByteTagIteratorItem_methods(root_module, root_module['ns3::ByteTagIterator::Item'])
+    register_Ns3ByteTagList_methods(root_module, root_module['ns3::ByteTagList'])
+    register_Ns3ByteTagListIterator_methods(root_module, root_module['ns3::ByteTagList::Iterator'])
+    register_Ns3ByteTagListIteratorItem_methods(root_module, root_module['ns3::ByteTagList::Iterator::Item'])
+    register_Ns3CallbackBase_methods(root_module, root_module['ns3::CallbackBase'])
+    register_Ns3CapabilityInformation_methods(root_module, root_module['ns3::CapabilityInformation'])
+    register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
+    register_Ns3Hasher_methods(root_module, root_module['ns3::Hasher'])
+    register_Ns3Ipv4Address_methods(root_module, root_module['ns3::Ipv4Address'])
+    register_Ns3Ipv4Mask_methods(root_module, root_module['ns3::Ipv4Mask'])
+    register_Ns3Ipv6Address_methods(root_module, root_module['ns3::Ipv6Address'])
+    register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Mac48Address_methods(root_module, root_module['ns3::Mac48Address'])
+    register_Ns3MacLowBlockAckEventListener_methods(root_module, root_module['ns3::MacLowBlockAckEventListener'])
+    register_Ns3MacLowDcfListener_methods(root_module, root_module['ns3::MacLowDcfListener'])
+    register_Ns3MacLowTransmissionListener_methods(root_module, root_module['ns3::MacLowTransmissionListener'])
+    register_Ns3MacLowTransmissionParameters_methods(root_module, root_module['ns3::MacLowTransmissionParameters'])
+    register_Ns3NetDeviceContainer_methods(root_module, root_module['ns3::NetDeviceContainer'])
+    register_Ns3NodeContainer_methods(root_module, root_module['ns3::NodeContainer'])
+    register_Ns3ObjectBase_methods(root_module, root_module['ns3::ObjectBase'])
+    register_Ns3ObjectDeleter_methods(root_module, root_module['ns3::ObjectDeleter'])
+    register_Ns3ObjectFactory_methods(root_module, root_module['ns3::ObjectFactory'])
+    register_Ns3OrganizationIdentifier_methods(root_module, root_module['ns3::OrganizationIdentifier'])
+    register_Ns3OriginatorBlockAckAgreement_methods(root_module, root_module['ns3::OriginatorBlockAckAgreement'])
+    register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata'])
+    register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item'])
+    register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator'])
+    register_Ns3PacketTagIterator_methods(root_module, root_module['ns3::PacketTagIterator'])
+    register_Ns3PacketTagIteratorItem_methods(root_module, root_module['ns3::PacketTagIterator::Item'])
+    register_Ns3PacketTagList_methods(root_module, root_module['ns3::PacketTagList'])
+    register_Ns3PacketTagListTagData_methods(root_module, root_module['ns3::PacketTagList::TagData'])
+    register_Ns3PcapFile_methods(root_module, root_module['ns3::PcapFile'])
+    register_Ns3PcapHelper_methods(root_module, root_module['ns3::PcapHelper'])
+    register_Ns3PcapHelperForDevice_methods(root_module, root_module['ns3::PcapHelperForDevice'])
+    register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, root_module['ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter >'])
+    register_Ns3Simulator_methods(root_module, root_module['ns3::Simulator'])
+    register_Ns3StatusCode_methods(root_module, root_module['ns3::StatusCode'])
+    register_Ns3Tag_methods(root_module, root_module['ns3::Tag'])
+    register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer'])
+    register_Ns3TypeId_methods(root_module, root_module['ns3::TypeId'])
+    register_Ns3TypeIdAttributeInformation_methods(root_module, root_module['ns3::TypeId::AttributeInformation'])
+    register_Ns3TypeIdTraceSourceInformation_methods(root_module, root_module['ns3::TypeId::TraceSourceInformation'])
+    register_Ns3VendorSpecificContentManager_methods(root_module, root_module['ns3::VendorSpecificContentManager'])
+    register_Ns3WifiHelper_methods(root_module, root_module['ns3::WifiHelper'])
+    register_Ns3WifiMacHelper_methods(root_module, root_module['ns3::WifiMacHelper'])
+    register_Ns3WifiMode_methods(root_module, root_module['ns3::WifiMode'])
+    register_Ns3WifiModeFactory_methods(root_module, root_module['ns3::WifiModeFactory'])
+    register_Ns3WifiPhyHelper_methods(root_module, root_module['ns3::WifiPhyHelper'])
+    register_Ns3WifiPhyListener_methods(root_module, root_module['ns3::WifiPhyListener'])
+    register_Ns3WifiRemoteStation_methods(root_module, root_module['ns3::WifiRemoteStation'])
+    register_Ns3WifiRemoteStationInfo_methods(root_module, root_module['ns3::WifiRemoteStationInfo'])
+    register_Ns3WifiRemoteStationState_methods(root_module, root_module['ns3::WifiRemoteStationState'])
+    register_Ns3WifiTxVector_methods(root_module, root_module['ns3::WifiTxVector'])
+    register_Ns3Empty_methods(root_module, root_module['ns3::empty'])
+    register_Ns3Int64x64_t_methods(root_module, root_module['ns3::int64x64_t'])
+    register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
+    register_Ns3Header_methods(root_module, root_module['ns3::Header'])
+    register_Ns3HigherDataTxVectorTag_methods(root_module, root_module['ns3::HigherDataTxVectorTag'])
+    register_Ns3MgtAddBaRequestHeader_methods(root_module, root_module['ns3::MgtAddBaRequestHeader'])
+    register_Ns3MgtAddBaResponseHeader_methods(root_module, root_module['ns3::MgtAddBaResponseHeader'])
+    register_Ns3MgtAssocRequestHeader_methods(root_module, root_module['ns3::MgtAssocRequestHeader'])
+    register_Ns3MgtAssocResponseHeader_methods(root_module, root_module['ns3::MgtAssocResponseHeader'])
+    register_Ns3MgtDelBaHeader_methods(root_module, root_module['ns3::MgtDelBaHeader'])
+    register_Ns3MgtProbeRequestHeader_methods(root_module, root_module['ns3::MgtProbeRequestHeader'])
+    register_Ns3MgtProbeResponseHeader_methods(root_module, root_module['ns3::MgtProbeResponseHeader'])
+    register_Ns3NqosWifiMacHelper_methods(root_module, root_module['ns3::NqosWifiMacHelper'])
+    register_Ns3Object_methods(root_module, root_module['ns3::Object'])
+    register_Ns3ObjectAggregateIterator_methods(root_module, root_module['ns3::Object::AggregateIterator'])
+    register_Ns3PcapFileWrapper_methods(root_module, root_module['ns3::PcapFileWrapper'])
+    register_Ns3QosWifiMacHelper_methods(root_module, root_module['ns3::QosWifiMacHelper'])
+    register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >'])
+    register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >'])
+    register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >'])
+    register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >'])
+    register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >'])
+    register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >'])
+    register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >'])
+    register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >'])
+    register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >'])
+    register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >'])
+    register_Ns3Time_methods(root_module, root_module['ns3::Time'])
+    register_Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::TraceSourceAccessor'])
+    register_Ns3Trailer_methods(root_module, root_module['ns3::Trailer'])
+    register_Ns3VendorSpecificActionHeader_methods(root_module, root_module['ns3::VendorSpecificActionHeader'])
+    register_Ns3Wifi80211pHelper_methods(root_module, root_module['ns3::Wifi80211pHelper'])
+    register_Ns3WifiActionHeader_methods(root_module, root_module['ns3::WifiActionHeader'])
+    register_Ns3WifiActionHeaderActionValue_methods(root_module, root_module['ns3::WifiActionHeader::ActionValue'])
+    register_Ns3WifiInformationElement_methods(root_module, root_module['ns3::WifiInformationElement'])
+    register_Ns3WifiMac_methods(root_module, root_module['ns3::WifiMac'])
+    register_Ns3WifiMacHeader_methods(root_module, root_module['ns3::WifiMacHeader'])
+    register_Ns3WifiMacQueue_methods(root_module, root_module['ns3::WifiMacQueue'])
+    register_Ns3WifiPhy_methods(root_module, root_module['ns3::WifiPhy'])
+    register_Ns3WifiRemoteStationManager_methods(root_module, root_module['ns3::WifiRemoteStationManager'])
+    register_Ns3AttributeAccessor_methods(root_module, root_module['ns3::AttributeAccessor'])
+    register_Ns3AttributeChecker_methods(root_module, root_module['ns3::AttributeChecker'])
+    register_Ns3AttributeValue_methods(root_module, root_module['ns3::AttributeValue'])
+    register_Ns3CallbackChecker_methods(root_module, root_module['ns3::CallbackChecker'])
+    register_Ns3CallbackImplBase_methods(root_module, root_module['ns3::CallbackImplBase'])
+    register_Ns3CallbackValue_methods(root_module, root_module['ns3::CallbackValue'])
+    register_Ns3CtrlBAckRequestHeader_methods(root_module, root_module['ns3::CtrlBAckRequestHeader'])
+    register_Ns3CtrlBAckResponseHeader_methods(root_module, root_module['ns3::CtrlBAckResponseHeader'])
+    register_Ns3Dcf_methods(root_module, root_module['ns3::Dcf'])
+    register_Ns3EdcaTxopN_methods(root_module, root_module['ns3::EdcaTxopN'])
+    register_Ns3EmptyAttributeValue_methods(root_module, root_module['ns3::EmptyAttributeValue'])
+    register_Ns3EventImpl_methods(root_module, root_module['ns3::EventImpl'])
+    register_Ns3ExtendedSupportedRatesIE_methods(root_module, root_module['ns3::ExtendedSupportedRatesIE'])
+    register_Ns3HtCapabilities_methods(root_module, root_module['ns3::HtCapabilities'])
+    register_Ns3HtCapabilitiesChecker_methods(root_module, root_module['ns3::HtCapabilitiesChecker'])
+    register_Ns3HtCapabilitiesValue_methods(root_module, root_module['ns3::HtCapabilitiesValue'])
+    register_Ns3Ipv4AddressChecker_methods(root_module, root_module['ns3::Ipv4AddressChecker'])
+    register_Ns3Ipv4AddressValue_methods(root_module, root_module['ns3::Ipv4AddressValue'])
+    register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
+    register_Ns3Ipv4MaskValue_methods(root_module, root_module['ns3::Ipv4MaskValue'])
+    register_Ns3Ipv6AddressChecker_methods(root_module, root_module['ns3::Ipv6AddressChecker'])
+    register_Ns3Ipv6AddressValue_methods(root_module, root_module['ns3::Ipv6AddressValue'])
+    register_Ns3Ipv6PrefixChecker_methods(root_module, root_module['ns3::Ipv6PrefixChecker'])
+    register_Ns3Ipv6PrefixValue_methods(root_module, root_module['ns3::Ipv6PrefixValue'])
+    register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
+    register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
+    register_Ns3MacLow_methods(root_module, root_module['ns3::MacLow'])
+    register_Ns3MgtBeaconHeader_methods(root_module, root_module['ns3::MgtBeaconHeader'])
+    register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
+    register_Ns3NixVector_methods(root_module, root_module['ns3::NixVector'])
+    register_Ns3Node_methods(root_module, root_module['ns3::Node'])
+    register_Ns3NqosWaveMacHelper_methods(root_module, root_module['ns3::NqosWaveMacHelper'])
+    register_Ns3ObjectFactoryChecker_methods(root_module, root_module['ns3::ObjectFactoryChecker'])
+    register_Ns3ObjectFactoryValue_methods(root_module, root_module['ns3::ObjectFactoryValue'])
+    register_Ns3OrganizationIdentifierChecker_methods(root_module, root_module['ns3::OrganizationIdentifierChecker'])
+    register_Ns3OrganizationIdentifierValue_methods(root_module, root_module['ns3::OrganizationIdentifierValue'])
+    register_Ns3OutputStreamWrapper_methods(root_module, root_module['ns3::OutputStreamWrapper'])
+    register_Ns3Packet_methods(root_module, root_module['ns3::Packet'])
+    register_Ns3PointerChecker_methods(root_module, root_module['ns3::PointerChecker'])
+    register_Ns3PointerValue_methods(root_module, root_module['ns3::PointerValue'])
+    register_Ns3QosWaveMacHelper_methods(root_module, root_module['ns3::QosWaveMacHelper'])
+    register_Ns3RegularWifiMac_methods(root_module, root_module['ns3::RegularWifiMac'])
+    register_Ns3Ssid_methods(root_module, root_module['ns3::Ssid'])
+    register_Ns3SsidChecker_methods(root_module, root_module['ns3::SsidChecker'])
+    register_Ns3SsidValue_methods(root_module, root_module['ns3::SsidValue'])
+    register_Ns3SupportedRates_methods(root_module, root_module['ns3::SupportedRates'])
+    register_Ns3TimeValue_methods(root_module, root_module['ns3::TimeValue'])
+    register_Ns3TypeIdChecker_methods(root_module, root_module['ns3::TypeIdChecker'])
+    register_Ns3TypeIdValue_methods(root_module, root_module['ns3::TypeIdValue'])
+    register_Ns3UintegerValue_methods(root_module, root_module['ns3::UintegerValue'])
+    register_Ns3WaveMacLow_methods(root_module, root_module['ns3::WaveMacLow'])
+    register_Ns3WifiModeChecker_methods(root_module, root_module['ns3::WifiModeChecker'])
+    register_Ns3WifiModeValue_methods(root_module, root_module['ns3::WifiModeValue'])
+    register_Ns3AddressChecker_methods(root_module, root_module['ns3::AddressChecker'])
+    register_Ns3AddressValue_methods(root_module, root_module['ns3::AddressValue'])
+    register_Ns3DcaTxop_methods(root_module, root_module['ns3::DcaTxop'])
+    register_Ns3OcbWifiMac_methods(root_module, root_module['ns3::OcbWifiMac'])
+    register_Ns3HashImplementation_methods(root_module, root_module['ns3::Hash::Implementation'])
+    register_Ns3HashFunctionFnv1a_methods(root_module, root_module['ns3::Hash::Function::Fnv1a'])
+    register_Ns3HashFunctionHash32_methods(root_module, root_module['ns3::Hash::Function::Hash32'])
+    register_Ns3HashFunctionHash64_methods(root_module, root_module['ns3::Hash::Function::Hash64'])
+    register_Ns3HashFunctionMurmur3_methods(root_module, root_module['ns3::Hash::Function::Murmur3'])
+    return
+
+def register_Ns3Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## address.h (module 'network'): ns3::Address::Address() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::Address::Address(uint8_t type, uint8_t const * buffer, uint8_t len) [constructor]
+    cls.add_constructor([param('uint8_t', 'type'), param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): ns3::Address::Address(ns3::Address const & address) [copy constructor]
+    cls.add_constructor([param('ns3::Address const &', 'address')])
+    ## address.h (module 'network'): bool ns3::Address::CheckCompatible(uint8_t type, uint8_t len) const [member function]
+    cls.add_method('CheckCompatible', 
+                   'bool', 
+                   [param('uint8_t', 'type'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyAllFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyAllTo(uint8_t * buffer, uint8_t len) const [member function]
+    cls.add_method('CopyAllTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint8_t', 'len')], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyFrom(uint8_t const * buffer, uint8_t len) [member function]
+    cls.add_method('CopyFrom', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint8_t', 'len')])
+    ## address.h (module 'network'): uint32_t ns3::Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## address.h (module 'network'): void ns3::Address::Deserialize(ns3::TagBuffer buffer) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')])
+    ## address.h (module 'network'): uint8_t ns3::Address::GetLength() const [member function]
+    cls.add_method('GetLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): uint32_t ns3::Address::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsInvalid() const [member function]
+    cls.add_method('IsInvalid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): bool ns3::Address::IsMatchingType(uint8_t type) const [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('uint8_t', 'type')], 
+                   is_const=True)
+    ## address.h (module 'network'): static uint8_t ns3::Address::Register() [member function]
+    cls.add_method('Register', 
+                   'uint8_t', 
+                   [], 
+                   is_static=True)
+    ## address.h (module 'network'): void ns3::Address::Serialize(ns3::TagBuffer buffer) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'buffer')], 
+                   is_const=True)
+    return
+
+def register_Ns3AsciiTraceHelper_methods(root_module, cls):
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelper::AsciiTraceHelper(ns3::AsciiTraceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AsciiTraceHelper const &', 'arg0')])
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelper::AsciiTraceHelper() [constructor]
+    cls.add_constructor([])
+    ## trace-helper.h (module 'network'): ns3::Ptr<ns3::OutputStreamWrapper> ns3::AsciiTraceHelper::CreateFileStream(std::string filename, std::_Ios_Openmode filemode=std::ios_base::out) [member function]
+    cls.add_method('CreateFileStream', 
+                   'ns3::Ptr< ns3::OutputStreamWrapper >', 
+                   [param('std::string', 'filename'), param('std::_Ios_Openmode', 'filemode', default_value='std::ios_base::out')])
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultDequeueSinkWithContext(ns3::Ptr<ns3::OutputStreamWrapper> file, std::string context, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultDequeueSinkWithContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultDequeueSinkWithoutContext(ns3::Ptr<ns3::OutputStreamWrapper> file, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultDequeueSinkWithoutContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultDropSinkWithContext(ns3::Ptr<ns3::OutputStreamWrapper> file, std::string context, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultDropSinkWithContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultDropSinkWithoutContext(ns3::Ptr<ns3::OutputStreamWrapper> file, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultDropSinkWithoutContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultEnqueueSinkWithContext(ns3::Ptr<ns3::OutputStreamWrapper> file, std::string context, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultEnqueueSinkWithContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultEnqueueSinkWithoutContext(ns3::Ptr<ns3::OutputStreamWrapper> file, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultEnqueueSinkWithoutContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultReceiveSinkWithContext(ns3::Ptr<ns3::OutputStreamWrapper> file, std::string context, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultReceiveSinkWithContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('std::string', 'context'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): static void ns3::AsciiTraceHelper::DefaultReceiveSinkWithoutContext(ns3::Ptr<ns3::OutputStreamWrapper> file, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('DefaultReceiveSinkWithoutContext', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'file'), param('ns3::Ptr< ns3::Packet const >', 'p')], 
+                   is_static=True)
+    ## trace-helper.h (module 'network'): std::string ns3::AsciiTraceHelper::GetFilenameFromDevice(std::string prefix, ns3::Ptr<ns3::NetDevice> device, bool useObjectNames=true) [member function]
+    cls.add_method('GetFilenameFromDevice', 
+                   'std::string', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'useObjectNames', default_value='true')])
+    ## trace-helper.h (module 'network'): std::string ns3::AsciiTraceHelper::GetFilenameFromInterfacePair(std::string prefix, ns3::Ptr<ns3::Object> object, uint32_t interface, bool useObjectNames=true) [member function]
+    cls.add_method('GetFilenameFromInterfacePair', 
+                   'std::string', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::Object >', 'object'), param('uint32_t', 'interface'), param('bool', 'useObjectNames', default_value='true')])
+    return
+
+def register_Ns3AsciiTraceHelperForDevice_methods(root_module, cls):
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelperForDevice::AsciiTraceHelperForDevice(ns3::AsciiTraceHelperForDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AsciiTraceHelperForDevice const &', 'arg0')])
+    ## trace-helper.h (module 'network'): ns3::AsciiTraceHelperForDevice::AsciiTraceHelperForDevice() [constructor]
+    cls.add_constructor([])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool explicitFilename=false) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'explicitFilename', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Ptr<ns3::NetDevice> nd) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Ptr< ns3::NetDevice >', 'nd')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, std::string ndName, bool explicitFilename=false) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('std::string', 'ndName'), param('bool', 'explicitFilename', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string ndName) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('std::string', 'ndName')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, ns3::NetDeviceContainer d) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::NetDeviceContainer', 'd')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::NetDeviceContainer d) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::NetDeviceContainer', 'd')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, ns3::NodeContainer n) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::NodeContainer', 'n')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::NodeContainer n) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::NodeContainer', 'n')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(std::string prefix, uint32_t nodeid, uint32_t deviceid, bool explicitFilename) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('uint32_t', 'nodeid'), param('uint32_t', 'deviceid'), param('bool', 'explicitFilename')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAscii(ns3::Ptr<ns3::OutputStreamWrapper> stream, uint32_t nodeid, uint32_t deviceid) [member function]
+    cls.add_method('EnableAscii', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('uint32_t', 'nodeid'), param('uint32_t', 'deviceid')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAsciiAll(std::string prefix) [member function]
+    cls.add_method('EnableAsciiAll', 
+                   'void', 
+                   [param('std::string', 'prefix')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAsciiAll(ns3::Ptr<ns3::OutputStreamWrapper> stream) [member function]
+    cls.add_method('EnableAsciiAll', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream')])
+    ## trace-helper.h (module 'network'): void ns3::AsciiTraceHelperForDevice::EnableAsciiInternal(ns3::Ptr<ns3::OutputStreamWrapper> stream, std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool explicitFilename) [member function]
+    cls.add_method('EnableAsciiInternal', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'explicitFilename')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeConstructionList_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList(ns3::AttributeConstructionList const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::AttributeConstructionList() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): void ns3::AttributeConstructionList::Add(std::string name, ns3::Ptr<ns3::AttributeChecker const> checker, ns3::Ptr<ns3::AttributeValue> value) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker'), param('ns3::Ptr< ns3::AttributeValue >', 'value')])
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): std::_List_const_iterator<ns3::AttributeConstructionList::Item> ns3::AttributeConstructionList::End() const [member function]
+    cls.add_method('End', 
+                   'std::_List_const_iterator< ns3::AttributeConstructionList::Item >', 
+                   [], 
+                   is_const=True)
+    ## attribute-construction-list.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeConstructionList::Find(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('Find', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True)
+    return
+
+def register_Ns3AttributeConstructionListItem_methods(root_module, cls):
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::Item(ns3::AttributeConstructionList::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeConstructionList::Item const &', 'arg0')])
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## attribute-construction-list.h (module 'core'): ns3::AttributeConstructionList::Item::value [variable]
+    cls.add_instance_attribute('value', 'ns3::Ptr< ns3::AttributeValue >', is_const=False)
+    return
+
+def register_Ns3Bar_methods(root_module, cls):
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar(ns3::Bar const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Bar const &', 'arg0')])
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar() [constructor]
+    cls.add_constructor([])
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::Bar(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address recipient, uint8_t tid, bool immediate) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('bool', 'immediate')])
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::bar [variable]
+    cls.add_instance_attribute('bar', 'ns3::Ptr< ns3::Packet const >', is_const=False)
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::immediate [variable]
+    cls.add_instance_attribute('immediate', 'bool', is_const=False)
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::recipient [variable]
+    cls.add_instance_attribute('recipient', 'ns3::Mac48Address', is_const=False)
+    ## block-ack-manager.h (module 'wifi'): ns3::Bar::tid [variable]
+    cls.add_instance_attribute('tid', 'uint8_t', is_const=False)
+    return
+
+def register_Ns3BlockAckAgreement_methods(root_module, cls):
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::BlockAckAgreement const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BlockAckAgreement const &', 'arg0')])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement() [constructor]
+    cls.add_constructor([])
+    ## block-ack-agreement.h (module 'wifi'): ns3::BlockAckAgreement::BlockAckAgreement(ns3::Mac48Address peer, uint8_t tid) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address', 'peer'), param('uint8_t', 'tid')])
+    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetBufferSize() const [member function]
+    cls.add_method('GetBufferSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): ns3::Mac48Address ns3::BlockAckAgreement::GetPeer() const [member function]
+    cls.add_method('GetPeer', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): uint8_t ns3::BlockAckAgreement::GetTid() const [member function]
+    cls.add_method('GetTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): uint16_t ns3::BlockAckAgreement::GetTimeout() const [member function]
+    cls.add_method('GetTimeout', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsAmsduSupported() const [member function]
+    cls.add_method('IsAmsduSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): bool ns3::BlockAckAgreement::IsImmediateBlockAck() const [member function]
+    cls.add_method('IsImmediateBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetAmsduSupport(bool supported) [member function]
+    cls.add_method('SetAmsduSupport', 
+                   'void', 
+                   [param('bool', 'supported')])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetBufferSize(uint16_t bufferSize) [member function]
+    cls.add_method('SetBufferSize', 
+                   'void', 
+                   [param('uint16_t', 'bufferSize')])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetDelayedBlockAck() [member function]
+    cls.add_method('SetDelayedBlockAck', 
+                   'void', 
+                   [])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetImmediateBlockAck() [member function]
+    cls.add_method('SetImmediateBlockAck', 
+                   'void', 
+                   [])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## block-ack-agreement.h (module 'wifi'): void ns3::BlockAckAgreement::SetTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    return
+
+def register_Ns3BlockAckCache_methods(root_module, cls):
+    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache() [constructor]
+    cls.add_constructor([])
+    ## block-ack-cache.h (module 'wifi'): ns3::BlockAckCache::BlockAckCache(ns3::BlockAckCache const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::BlockAckCache const &', 'arg0')])
+    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::FillBlockAckBitmap(ns3::CtrlBAckResponseHeader * blockAckHeader) [member function]
+    cls.add_method('FillBlockAckBitmap', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader *', 'blockAckHeader')])
+    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::Init(uint16_t winStart, uint16_t winSize) [member function]
+    cls.add_method('Init', 
+                   'void', 
+                   [param('uint16_t', 'winStart'), param('uint16_t', 'winSize')])
+    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithBlockAckReq(uint16_t startingSeq) [member function]
+    cls.add_method('UpdateWithBlockAckReq', 
+                   'void', 
+                   [param('uint16_t', 'startingSeq')])
+    ## block-ack-cache.h (module 'wifi'): void ns3::BlockAckCache::UpdateWithMpdu(ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('UpdateWithMpdu', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const *', 'hdr')])
+    return
+
+def register_Ns3BlockAckManager_methods(root_module, cls):
+    ## block-ack-manager.h (module 'wifi'): ns3::BlockAckManager::BlockAckManager() [constructor]
+    cls.add_constructor([])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('CreateAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('DestroyAgreement', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreement(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('ExistsAgreement', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::ExistsAgreementInState(ns3::Mac48Address recipient, uint8_t tid, ns3::OriginatorBlockAckAgreement::State state) const [member function]
+    cls.add_method('ExistsAgreementInState', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('ns3::OriginatorBlockAckAgreement::State', 'state')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNBufferedPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetNBufferedPackets', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNRetryNeededPackets(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetNRetryNeededPackets', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::BlockAckManager::GetNextPacket(ns3::WifiMacHeader & hdr) [member function]
+    cls.add_method('GetNextPacket', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader &', 'hdr')])
+    ## block-ack-manager.h (module 'wifi'): uint32_t ns3::BlockAckManager::GetNextPacketSize() const [member function]
+    cls.add_method('GetNextPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): uint16_t ns3::BlockAckManager::GetSeqNumOfNextRetryPacket(ns3::Mac48Address recipient, uint8_t tid) const [member function]
+    cls.add_method('GetSeqNumOfNextRetryPacket', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasBar(ns3::Bar & bar) [member function]
+    cls.add_method('HasBar', 
+                   'bool', 
+                   [param('ns3::Bar &', 'bar')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasOtherFragments(uint16_t sequenceNumber) const [member function]
+    cls.add_method('HasOtherFragments', 
+                   'bool', 
+                   [param('uint16_t', 'sequenceNumber')], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::HasPackets() const [member function]
+    cls.add_method('HasPackets', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementEstablished(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
+    cls.add_method('NotifyAgreementEstablished', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyAgreementUnsuccessful(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('NotifyAgreementUnsuccessful', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient) [member function]
+    cls.add_method('NotifyGotBlockAck', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyMpduTransmission(ns3::Mac48Address recipient, uint8_t tid, uint16_t nextSeqNumber) [member function]
+    cls.add_method('NotifyMpduTransmission', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'nextSeqNumber')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckInactivityCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetBlockAckInactivityCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, bool, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckThreshold(uint8_t nPackets) [member function]
+    cls.add_method('SetBlockAckThreshold', 
+                   'void', 
+                   [param('uint8_t', 'nPackets')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockAckType(ns3::BlockAckType bAckType) [member function]
+    cls.add_method('SetBlockAckType', 
+                   'void', 
+                   [param('ns3::BlockAckType', 'bAckType')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetBlockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetBlockDestinationCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetMaxPacketDelay(ns3::Time maxDelay) [member function]
+    cls.add_method('SetMaxPacketDelay', 
+                   'void', 
+                   [param('ns3::Time', 'maxDelay')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetQueue(ns3::Ptr<ns3::WifiMacQueue> queue) [member function]
+    cls.add_method('SetQueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetTxMiddle(ns3::MacTxMiddle * txMiddle) [member function]
+    cls.add_method('SetTxMiddle', 
+                   'void', 
+                   [param('ns3::MacTxMiddle *', 'txMiddle')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::SetUnblockDestinationCallback(ns3::Callback<void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetUnblockDestinationCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Mac48Address, unsigned char, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::StorePacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr, ns3::Time tStamp) [member function]
+    cls.add_method('StorePacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr'), param('ns3::Time', 'tStamp')])
+    ## block-ack-manager.h (module 'wifi'): bool ns3::BlockAckManager::SwitchToBlockAckIfNeeded(ns3::Mac48Address recipient, uint8_t tid, uint16_t startingSeq) [member function]
+    cls.add_method('SwitchToBlockAckIfNeeded', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid'), param('uint16_t', 'startingSeq')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::TearDownBlockAck(ns3::Mac48Address recipient, uint8_t tid) [member function]
+    cls.add_method('TearDownBlockAck', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::UpdateAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('UpdateAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+    return
+
+def register_Ns3Buffer_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(uint32_t dataSize, bool initialize) [constructor]
+    cls.add_constructor([param('uint32_t', 'dataSize'), param('bool', 'initialize')])
+    ## buffer.h (module 'network'): ns3::Buffer::Buffer(ns3::Buffer const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtEnd(uint32_t end) [member function]
+    cls.add_method('AddAtEnd', 
+                   'bool', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::AddAtEnd(ns3::Buffer const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Buffer const &', 'o')])
+    ## buffer.h (module 'network'): bool ns3::Buffer::AddAtStart(uint32_t start) [member function]
+    cls.add_method('AddAtStart', 
+                   'bool', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Buffer', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): ns3::Buffer ns3::Buffer::CreateFullCopy() const [member function]
+    cls.add_method('CreateFullCopy', 
+                   'ns3::Buffer', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator ns3::Buffer::End() const [member function]
+    cls.add_method('End', 
+                   'ns3::Buffer::Iterator', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentEndOffset() const [member function]
+    cls.add_method('GetCurrentEndOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): int32_t ns3::Buffer::GetCurrentStartOffset() const [member function]
+    cls.add_method('GetCurrentStartOffset', 
+                   'int32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint8_t const * ns3::Buffer::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3BufferIterator_methods(root_module, cls):
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator(ns3::Buffer::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Buffer::Iterator const &', 'arg0')])
+    ## buffer.h (module 'network'): ns3::Buffer::Iterator::Iterator() [constructor]
+    cls.add_constructor([])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::CalculateIpChecksum(uint16_t size, uint32_t initialChecksum) [member function]
+    cls.add_method('CalculateIpChecksum', 
+                   'uint16_t', 
+                   [param('uint16_t', 'size'), param('uint32_t', 'initialChecksum')])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetDistanceFrom(ns3::Buffer::Iterator const & o) const [member function]
+    cls.add_method('GetDistanceFrom', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator const &', 'o')], 
+                   is_const=True)
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsEnd() const [member function]
+    cls.add_method('IsEnd', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): bool ns3::Buffer::Iterator::IsStart() const [member function]
+    cls.add_method('IsStart', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Next(uint32_t delta) [member function]
+    cls.add_method('Next', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev() [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Prev(uint32_t delta) [member function]
+    cls.add_method('Prev', 
+                   'void', 
+                   [param('uint32_t', 'delta')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadLsbtohU16() [member function]
+    cls.add_method('ReadLsbtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadLsbtohU32() [member function]
+    cls.add_method('ReadLsbtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadLsbtohU64() [member function]
+    cls.add_method('ReadLsbtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadNtohU16() [member function]
+    cls.add_method('ReadNtohU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadNtohU32() [member function]
+    cls.add_method('ReadNtohU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadNtohU64() [member function]
+    cls.add_method('ReadNtohU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint16_t ns3::Buffer::Iterator::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## buffer.h (module 'network'): uint32_t ns3::Buffer::Iterator::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## buffer.h (module 'network'): uint64_t ns3::Buffer::Iterator::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## buffer.h (module 'network'): uint8_t ns3::Buffer::Iterator::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::Write(ns3::Buffer::Iterator start, ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('ns3::Buffer::Iterator', 'end')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU16(uint16_t data) [member function]
+    cls.add_method('WriteHtolsbU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU32(uint32_t data) [member function]
+    cls.add_method('WriteHtolsbU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtolsbU64(uint64_t data) [member function]
+    cls.add_method('WriteHtolsbU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU16(uint16_t data) [member function]
+    cls.add_method('WriteHtonU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU32(uint32_t data) [member function]
+    cls.add_method('WriteHtonU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteHtonU64(uint64_t data) [member function]
+    cls.add_method('WriteHtonU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU64(uint64_t data) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data')])
+    ## buffer.h (module 'network'): void ns3::Buffer::Iterator::WriteU8(uint8_t data, uint32_t len) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'data'), param('uint32_t', 'len')])
+    return
+
+def register_Ns3ByteTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::ByteTagIterator(ns3::ByteTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::ByteTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item ns3::ByteTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::ByteTagIterator::Item::Item(ns3::ByteTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetEnd() const [member function]
+    cls.add_method('GetEnd', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::ByteTagIterator::Item::GetStart() const [member function]
+    cls.add_method('GetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::ByteTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::ByteTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ByteTagList_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList() [constructor]
+    cls.add_constructor([])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::ByteTagList(ns3::ByteTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): ns3::TagBuffer ns3::ByteTagList::Add(ns3::TypeId tid, uint32_t bufferSize, int32_t start, int32_t end) [member function]
+    cls.add_method('Add', 
+                   'ns3::TagBuffer', 
+                   [param('ns3::TypeId', 'tid'), param('uint32_t', 'bufferSize'), param('int32_t', 'start'), param('int32_t', 'end')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::Add(ns3::ByteTagList const & o) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::ByteTagList const &', 'o')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtEnd(int32_t adjustment, int32_t appendOffset) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'appendOffset')])
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::AddAtStart(int32_t adjustment, int32_t prependOffset) [member function]
+    cls.add_method('AddAtStart', 
+                   'void', 
+                   [param('int32_t', 'adjustment'), param('int32_t', 'prependOffset')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator ns3::ByteTagList::Begin(int32_t offsetStart, int32_t offsetEnd) const [member function]
+    cls.add_method('Begin', 
+                   'ns3::ByteTagList::Iterator', 
+                   [param('int32_t', 'offsetStart'), param('int32_t', 'offsetEnd')], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): void ns3::ByteTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIterator_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Iterator(ns3::ByteTagList::Iterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): uint32_t ns3::ByteTagList::Iterator::GetOffsetStart() const [member function]
+    cls.add_method('GetOffsetStart', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): bool ns3::ByteTagList::Iterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item ns3::ByteTagList::Iterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::ByteTagList::Iterator::Item', 
+                   [])
+    return
+
+def register_Ns3ByteTagListIteratorItem_methods(root_module, cls):
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::ByteTagList::Iterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ByteTagList::Iterator::Item const &', 'arg0')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::Item(ns3::TagBuffer buf) [constructor]
+    cls.add_constructor([param('ns3::TagBuffer', 'buf')])
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::buf [variable]
+    cls.add_instance_attribute('buf', 'ns3::TagBuffer', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::end [variable]
+    cls.add_instance_attribute('end', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::size [variable]
+    cls.add_instance_attribute('size', 'uint32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::start [variable]
+    cls.add_instance_attribute('start', 'int32_t', is_const=False)
+    ## byte-tag-list.h (module 'network'): ns3::ByteTagList::Iterator::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3CallbackBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::CallbackBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::CallbackImplBase> ns3::CallbackBase::GetImpl() const [member function]
+    cls.add_method('GetImpl', 
+                   'ns3::Ptr< ns3::CallbackImplBase >', 
+                   [], 
+                   is_const=True)
+    ## callback.h (module 'core'): ns3::CallbackBase::CallbackBase(ns3::Ptr<ns3::CallbackImplBase> impl) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::CallbackImplBase >', 'impl')], 
+                        visibility='protected')
+    ## callback.h (module 'core'): static std::string ns3::CallbackBase::Demangle(std::string const & mangled) [member function]
+    cls.add_method('Demangle', 
+                   'std::string', 
+                   [param('std::string const &', 'mangled')], 
+                   is_static=True, visibility='protected')
+    return
+
+def register_Ns3CapabilityInformation_methods(root_module, cls):
+    ## capability-information.h (module 'wifi'): ns3::CapabilityInformation::CapabilityInformation(ns3::CapabilityInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CapabilityInformation const &', 'arg0')])
+    ## capability-information.h (module 'wifi'): ns3::CapabilityInformation::CapabilityInformation() [constructor]
+    cls.add_constructor([])
+    ## capability-information.h (module 'wifi'): ns3::Buffer::Iterator ns3::CapabilityInformation::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## capability-information.h (module 'wifi'): uint32_t ns3::CapabilityInformation::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## capability-information.h (module 'wifi'): bool ns3::CapabilityInformation::IsEss() const [member function]
+    cls.add_method('IsEss', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## capability-information.h (module 'wifi'): bool ns3::CapabilityInformation::IsIbss() const [member function]
+    cls.add_method('IsIbss', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## capability-information.h (module 'wifi'): ns3::Buffer::Iterator ns3::CapabilityInformation::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## capability-information.h (module 'wifi'): void ns3::CapabilityInformation::SetEss() [member function]
+    cls.add_method('SetEss', 
+                   'void', 
+                   [])
+    ## capability-information.h (module 'wifi'): void ns3::CapabilityInformation::SetIbss() [member function]
+    cls.add_method('SetIbss', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3EventId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('==')
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::EventId const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventId const &', 'arg0')])
+    ## event-id.h (module 'core'): ns3::EventId::EventId() [constructor]
+    cls.add_constructor([])
+    ## event-id.h (module 'core'): ns3::EventId::EventId(ns3::Ptr<ns3::EventImpl> const & impl, uint64_t ts, uint32_t context, uint32_t uid) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::EventImpl > const &', 'impl'), param('uint64_t', 'ts'), param('uint32_t', 'context'), param('uint32_t', 'uid')])
+    ## event-id.h (module 'core'): void ns3::EventId::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetContext() const [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint64_t ns3::EventId::GetTs() const [member function]
+    cls.add_method('GetTs', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): uint32_t ns3::EventId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsExpired() const [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): bool ns3::EventId::IsRunning() const [member function]
+    cls.add_method('IsRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## event-id.h (module 'core'): ns3::EventImpl * ns3::EventId::PeekEventImpl() const [member function]
+    cls.add_method('PeekEventImpl', 
+                   'ns3::EventImpl *', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3Hasher_methods(root_module, cls):
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Hasher const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hasher const &', 'arg0')])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher() [constructor]
+    cls.add_constructor([])
+    ## hash.h (module 'core'): ns3::Hasher::Hasher(ns3::Ptr<ns3::Hash::Implementation> hp) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Hash::Implementation >', 'hp')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint32_t ns3::Hasher::GetHash32(std::string const s) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')])
+    ## hash.h (module 'core'): uint64_t ns3::Hasher::GetHash64(std::string const s) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('std::string const', 's')])
+    ## hash.h (module 'core'): ns3::Hasher & ns3::Hasher::clear() [member function]
+    cls.add_method('clear', 
+                   'ns3::Hasher &', 
+                   [])
+    return
+
+def register_Ns3Ipv4Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(ns3::Ipv4Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(uint32_t address) [constructor]
+    cls.add_constructor([param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address::Ipv4Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::CombineMask(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('CombineMask', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv4Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Address::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4Address::GetSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('GetSubnetDirectedBroadcast', 
+                   'ns3::Ipv4Address', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Address ns3::Ipv4Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const &', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsLocalMulticast() const [member function]
+    cls.add_method('IsLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static bool ns3::Ipv4Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsSubnetDirectedBroadcast(ns3::Ipv4Mask const & mask) const [member function]
+    cls.add_method('IsSubnetDirectedBroadcast', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask const &', 'mask')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(uint32_t address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'address')])
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    return
+
+def register_Ns3Ipv4Mask_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(ns3::Ipv4Mask const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(uint32_t mask) [constructor]
+    cls.add_constructor([param('uint32_t', 'mask')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask::Ipv4Mask(char const * mask) [constructor]
+    cls.add_constructor([param('char const *', 'mask')])
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): uint32_t ns3::Ipv4Mask::GetInverse() const [member function]
+    cls.add_method('GetInverse', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): uint16_t ns3::Ipv4Mask::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): static ns3::Ipv4Mask ns3::Ipv4Mask::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_static=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv4Mask', 'other')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsMatch(ns3::Ipv4Address a, ns3::Ipv4Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'a'), param('ns3::Ipv4Address', 'b')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4Mask::Set(uint32_t mask) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint32_t', 'mask')])
+    return
+
+def register_Ns3Ipv6Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(char const * address) [constructor]
+    cls.add_constructor([param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(uint8_t * address) [constructor]
+    cls.add_constructor([param('uint8_t *', 'address')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const & addr) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address::Ipv6Address(ns3::Ipv6Address const * addr) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const *', 'addr')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6Address::CombinePrefix(ns3::Ipv6Prefix const & prefix) [member function]
+    cls.add_method('CombinePrefix', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::Deserialize(uint8_t const * buf) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Ipv6Address', 
+                   [param('uint8_t const *', 'buf')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllHostsMulticast() [member function]
+    cls.add_method('GetAllHostsMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllNodesMulticast() [member function]
+    cls.add_method('GetAllNodesMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAllRoutersMulticast() [member function]
+    cls.add_method('GetAllRoutersMulticast', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetAny() [member function]
+    cls.add_method('GetAny', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv6Address::GetIpv4MappedAddress() const [member function]
+    cls.add_method('GetIpv4MappedAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllHostsMulticast() const [member function]
+    cls.add_method('IsAllHostsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllNodesMulticast() const [member function]
+    cls.add_method('IsAllNodesMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAllRoutersMulticast() const [member function]
+    cls.add_method('IsAllRoutersMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsAny() const [member function]
+    cls.add_method('IsAny', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsDocumentation() const [member function]
+    cls.add_method('IsDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Address const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
+    cls.add_method('IsIpv4MappedAddress', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
+    cls.add_method('IsLinkLocal', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocalMulticast() const [member function]
+    cls.add_method('IsLinkLocalMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLocalhost() const [member function]
+    cls.add_method('IsLocalhost', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static bool ns3::Ipv6Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsSolicitedMulticast() const [member function]
+    cls.add_method('IsSolicitedMulticast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac16Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac48Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredAddress(ns3::Mac64Address addr, ns3::Ipv6Address prefix) [member function]
+    cls.add_method('MakeAutoconfiguredAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'addr'), param('ns3::Ipv6Address', 'prefix')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac16Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac16Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac48Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac48Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeAutoconfiguredLinkLocalAddress(ns3::Mac64Address mac) [member function]
+    cls.add_method('MakeAutoconfiguredLinkLocalAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Mac64Address', 'mac')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeIpv4MappedAddress(ns3::Ipv4Address addr) [member function]
+    cls.add_method('MakeIpv4MappedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Address ns3::Ipv6Address::MakeSolicitedAddress(ns3::Ipv6Address addr) [member function]
+    cls.add_method('MakeSolicitedAddress', 
+                   'ns3::Ipv6Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Serialize(uint8_t * buf) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(char const * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('char const *', 'address')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Address::Set(uint8_t * address) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint8_t *', 'address')])
+    return
+
+def register_Ns3Ipv6Prefix_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t * prefix) [constructor]
+    cls.add_constructor([param('uint8_t *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(char const * prefix) [constructor]
+    cls.add_constructor([param('char const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(uint8_t prefix) [constructor]
+    cls.add_constructor([param('uint8_t', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const & prefix) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'prefix')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix::Ipv6Prefix(ns3::Ipv6Prefix const * prefix) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const *', 'prefix')])
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::GetBytes(uint8_t * buf) const [member function]
+    cls.add_method('GetBytes', 
+                   'void', 
+                   [param('uint8_t *', 'buf')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetLoopback() [member function]
+    cls.add_method('GetLoopback', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetOnes() [member function]
+    cls.add_method('GetOnes', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): uint8_t ns3::Ipv6Prefix::GetPrefixLength() const [member function]
+    cls.add_method('GetPrefixLength', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): static ns3::Ipv6Prefix ns3::Ipv6Prefix::GetZero() [member function]
+    cls.add_method('GetZero', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_static=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ipv6Prefix const &', 'other')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsMatch(ns3::Ipv6Address a, ns3::Ipv6Address b) const [member function]
+    cls.add_method('IsMatch', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'a'), param('ns3::Ipv6Address', 'b')], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6Prefix::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    return
+
+def register_Ns3Mac48Address_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(ns3::Mac48Address const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48Address::Mac48Address(char const * str) [constructor]
+    cls.add_constructor([param('char const *', 'str')])
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::Allocate() [member function]
+    cls.add_method('Allocate', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::ConvertFrom(ns3::Address const & address) [member function]
+    cls.add_method('ConvertFrom', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyFrom(uint8_t const * buffer) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer')])
+    ## mac48-address.h (module 'network'): void ns3::Mac48Address::CopyTo(uint8_t * buffer) const [member function]
+    cls.add_method('CopyTo', 
+                   'void', 
+                   [param('uint8_t *', 'buffer')], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetBroadcast() [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv4Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv4Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast(ns3::Ipv6Address address) [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticast6Prefix() [member function]
+    cls.add_method('GetMulticast6Prefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): static ns3::Mac48Address ns3::Mac48Address::GetMulticastPrefix() [member function]
+    cls.add_method('GetMulticastPrefix', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_static=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48Address::IsGroup() const [member function]
+    cls.add_method('IsGroup', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): static bool ns3::Mac48Address::IsMatchingType(ns3::Address const & address) [member function]
+    cls.add_method('IsMatchingType', 
+                   'bool', 
+                   [param('ns3::Address const &', 'address')], 
+                   is_static=True)
+    return
+
+def register_Ns3MacLowBlockAckEventListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener(ns3::MacLowBlockAckEventListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowBlockAckEventListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowBlockAckEventListener::MacLowBlockAckEventListener() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowBlockAckEventListener::BlockAckInactivityTimeout(ns3::Mac48Address originator, uint8_t tid) [member function]
+    cls.add_method('BlockAckInactivityTimeout', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3MacLowDcfListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener::MacLowDcfListener(ns3::MacLowDcfListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowDcfListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowDcfListener::MacLowDcfListener() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::AckTimeoutReset() [member function]
+    cls.add_method('AckTimeoutReset', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::AckTimeoutStart(ns3::Time duration) [member function]
+    cls.add_method('AckTimeoutStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::CtsTimeoutReset() [member function]
+    cls.add_method('CtsTimeoutReset', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::CtsTimeoutStart(ns3::Time duration) [member function]
+    cls.add_method('CtsTimeoutStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::NavReset(ns3::Time duration) [member function]
+    cls.add_method('NavReset', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowDcfListener::NavStart(ns3::Time duration) [member function]
+    cls.add_method('NavStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3MacLowTransmissionListener_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener::MacLowTransmissionListener(ns3::MacLowTransmissionListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowTransmissionListener const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionListener::MacLowTransmissionListener() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::EndTxNoAck() [member function]
+    cls.add_method('EndTxNoAck', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::GotAck(double snr, ns3::WifiMode txMode) [member function]
+    cls.add_method('GotAck', 
+                   'void', 
+                   [param('double', 'snr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address source) [member function]
+    cls.add_method('GotBlockAck', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'source')], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::GotCts(double snr, ns3::WifiMode txMode) [member function]
+    cls.add_method('GotCts', 
+                   'void', 
+                   [param('double', 'snr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::MissedAck() [member function]
+    cls.add_method('MissedAck', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::MissedBlockAck() [member function]
+    cls.add_method('MissedBlockAck', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::MissedCts() [member function]
+    cls.add_method('MissedCts', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionListener::StartNext() [member function]
+    cls.add_method('StartNext', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3MacLowTransmissionParameters_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters(ns3::MacLowTransmissionParameters const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLowTransmissionParameters const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLowTransmissionParameters::MacLowTransmissionParameters() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableAck() [member function]
+    cls.add_method('DisableAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableNextData() [member function]
+    cls.add_method('DisableNextData', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableOverrideDurationId() [member function]
+    cls.add_method('DisableOverrideDurationId', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::DisableRts() [member function]
+    cls.add_method('DisableRts', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableAck() [member function]
+    cls.add_method('EnableAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableBasicBlockAck() [member function]
+    cls.add_method('EnableBasicBlockAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableCompressedBlockAck() [member function]
+    cls.add_method('EnableCompressedBlockAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableFastAck() [member function]
+    cls.add_method('EnableFastAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableMultiTidBlockAck() [member function]
+    cls.add_method('EnableMultiTidBlockAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableNextData(uint32_t size) [member function]
+    cls.add_method('EnableNextData', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableOverrideDurationId(ns3::Time durationId) [member function]
+    cls.add_method('EnableOverrideDurationId', 
+                   'void', 
+                   [param('ns3::Time', 'durationId')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableRts() [member function]
+    cls.add_method('EnableRts', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLowTransmissionParameters::EnableSuperFastAck() [member function]
+    cls.add_method('EnableSuperFastAck', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLowTransmissionParameters::GetDurationId() const [member function]
+    cls.add_method('GetDurationId', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): uint32_t ns3::MacLowTransmissionParameters::GetNextPacketSize() const [member function]
+    cls.add_method('GetNextPacketSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasDurationId() const [member function]
+    cls.add_method('HasDurationId', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::HasNextPacket() const [member function]
+    cls.add_method('HasNextPacket', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustSendRts() const [member function]
+    cls.add_method('MustSendRts', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitAck() const [member function]
+    cls.add_method('MustWaitAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitBasicBlockAck() const [member function]
+    cls.add_method('MustWaitBasicBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitCompressedBlockAck() const [member function]
+    cls.add_method('MustWaitCompressedBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitFastAck() const [member function]
+    cls.add_method('MustWaitFastAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitMultiTidBlockAck() const [member function]
+    cls.add_method('MustWaitMultiTidBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitNormalAck() const [member function]
+    cls.add_method('MustWaitNormalAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLowTransmissionParameters::MustWaitSuperFastAck() const [member function]
+    cls.add_method('MustWaitSuperFastAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NetDeviceContainer_methods(root_module, cls):
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'arg0')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer() [constructor]
+    cls.add_constructor([])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::Ptr<ns3::NetDevice> dev) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::NetDevice >', 'dev')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(std::string devName) [constructor]
+    cls.add_constructor([param('std::string', 'devName')])
+    ## net-device-container.h (module 'network'): ns3::NetDeviceContainer::NetDeviceContainer(ns3::NetDeviceContainer const & a, ns3::NetDeviceContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NetDeviceContainer const &', 'a'), param('ns3::NetDeviceContainer const &', 'b')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::NetDeviceContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NetDeviceContainer', 'other')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## net-device-container.h (module 'network'): void ns3::NetDeviceContainer::Add(std::string deviceName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'deviceName')])
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::NetDevice>*,std::vector<ns3::Ptr<ns3::NetDevice>, std::allocator<ns3::Ptr<ns3::NetDevice> > > > ns3::NetDeviceContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::NetDevice > const, std::vector< ns3::Ptr< ns3::NetDevice > > >', 
+                   [], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::NetDeviceContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## net-device-container.h (module 'network'): uint32_t ns3::NetDeviceContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3NodeContainer_methods(root_module, cls):
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'arg0')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer() [constructor]
+    cls.add_constructor([])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::Ptr<ns3::Node> node) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(std::string nodeName) [constructor]
+    cls.add_constructor([param('std::string', 'nodeName')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c, ns3::NodeContainer const & d) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c'), param('ns3::NodeContainer const &', 'd')])
+    ## node-container.h (module 'network'): ns3::NodeContainer::NodeContainer(ns3::NodeContainer const & a, ns3::NodeContainer const & b, ns3::NodeContainer const & c, ns3::NodeContainer const & d, ns3::NodeContainer const & e) [constructor]
+    cls.add_constructor([param('ns3::NodeContainer const &', 'a'), param('ns3::NodeContainer const &', 'b'), param('ns3::NodeContainer const &', 'c'), param('ns3::NodeContainer const &', 'd'), param('ns3::NodeContainer const &', 'e')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(ns3::NodeContainer other) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::NodeContainer', 'other')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Add(std::string nodeName) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('std::string', 'nodeName')])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::Begin() const [member function]
+    cls.add_method('Begin', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Create(uint32_t n) [member function]
+    cls.add_method('Create', 
+                   'void', 
+                   [param('uint32_t', 'n')])
+    ## node-container.h (module 'network'): void ns3::NodeContainer::Create(uint32_t n, uint32_t systemId) [member function]
+    cls.add_method('Create', 
+                   'void', 
+                   [param('uint32_t', 'n'), param('uint32_t', 'systemId')])
+    ## node-container.h (module 'network'): __gnu_cxx::__normal_iterator<const ns3::Ptr<ns3::Node>*,std::vector<ns3::Ptr<ns3::Node>, std::allocator<ns3::Ptr<ns3::Node> > > > ns3::NodeContainer::End() const [member function]
+    cls.add_method('End', 
+                   '__gnu_cxx::__normal_iterator< ns3::Ptr< ns3::Node > const, std::vector< ns3::Ptr< ns3::Node > > >', 
+                   [], 
+                   is_const=True)
+    ## node-container.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NodeContainer::Get(uint32_t i) const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## node-container.h (module 'network'): static ns3::NodeContainer ns3::NodeContainer::GetGlobal() [member function]
+    cls.add_method('GetGlobal', 
+                   'ns3::NodeContainer', 
+                   [], 
+                   is_static=True)
+    ## node-container.h (module 'network'): uint32_t ns3::NodeContainer::GetN() const [member function]
+    cls.add_method('GetN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3ObjectBase_methods(root_module, cls):
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase() [constructor]
+    cls.add_constructor([])
+    ## object-base.h (module 'core'): ns3::ObjectBase::ObjectBase(ns3::ObjectBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectBase const &', 'arg0')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::GetAttribute(std::string name, ns3::AttributeValue & value) const [member function]
+    cls.add_method('GetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'value')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::GetAttributeFailSafe(std::string name, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('GetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_const=True)
+    ## object-base.h (module 'core'): ns3::TypeId ns3::ObjectBase::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## object-base.h (module 'core'): static ns3::TypeId ns3::ObjectBase::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object-base.h (module 'core'): void ns3::ObjectBase::SetAttribute(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttribute', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::SetAttributeFailSafe(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('SetAttributeFailSafe', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceConnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceConnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnect(std::string name, std::string context, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnect', 
+                   'bool', 
+                   [param('std::string', 'name'), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): bool ns3::ObjectBase::TraceDisconnectWithoutContext(std::string name, ns3::CallbackBase const & cb) [member function]
+    cls.add_method('TraceDisconnectWithoutContext', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::CallbackBase const &', 'cb')])
+    ## object-base.h (module 'core'): void ns3::ObjectBase::ConstructSelf(ns3::AttributeConstructionList const & attributes) [member function]
+    cls.add_method('ConstructSelf', 
+                   'void', 
+                   [param('ns3::AttributeConstructionList const &', 'attributes')], 
+                   visibility='protected')
+    ## object-base.h (module 'core'): void ns3::ObjectBase::NotifyConstructionCompleted() [member function]
+    cls.add_method('NotifyConstructionCompleted', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectDeleter_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): ns3::ObjectDeleter::ObjectDeleter(ns3::ObjectDeleter const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectDeleter const &', 'arg0')])
+    ## object.h (module 'core'): static void ns3::ObjectDeleter::Delete(ns3::Object * object) [member function]
+    cls.add_method('Delete', 
+                   'void', 
+                   [param('ns3::Object *', 'object')], 
+                   is_static=True)
+    return
+
+def register_Ns3ObjectFactory_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(ns3::ObjectFactory const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactory::ObjectFactory(std::string typeId) [constructor]
+    cls.add_constructor([param('std::string', 'typeId')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): ns3::TypeId ns3::ObjectFactory::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::Set(std::string name, ns3::AttributeValue const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('std::string', 'name'), param('ns3::AttributeValue const &', 'value')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(ns3::TypeId tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('ns3::TypeId', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(char const * tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('char const *', 'tid')])
+    ## object-factory.h (module 'core'): void ns3::ObjectFactory::SetTypeId(std::string tid) [member function]
+    cls.add_method('SetTypeId', 
+                   'void', 
+                   [param('std::string', 'tid')])
+    return
+
+def register_Ns3OrganizationIdentifier_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifier(ns3::OrganizationIdentifier const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OrganizationIdentifier const &', 'arg0')])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifier() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifier(uint8_t const * str, uint32_t length) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'str'), param('uint32_t', 'length')])
+    ## vendor-specific-action.h (module 'wave'): uint32_t ns3::OrganizationIdentifier::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## vendor-specific-action.h (module 'wave'): uint8_t ns3::OrganizationIdentifier::GetManagementId() const [member function]
+    cls.add_method('GetManagementId', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): uint32_t ns3::OrganizationIdentifier::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier::OrganizationIdentifierType ns3::OrganizationIdentifier::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::OrganizationIdentifier::OrganizationIdentifierType', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): bool ns3::OrganizationIdentifier::IsNull() const [member function]
+    cls.add_method('IsNull', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::OrganizationIdentifier::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::OrganizationIdentifier::SetType(ns3::OrganizationIdentifier::OrganizationIdentifierType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier::OrganizationIdentifierType', 'type')])
+    return
+
+def register_Ns3OriginatorBlockAckAgreement_methods(root_module, cls):
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement(ns3::OriginatorBlockAckAgreement const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OriginatorBlockAckAgreement const &', 'arg0')])
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement() [constructor]
+    cls.add_constructor([])
+    ## originator-block-ack-agreement.h (module 'wifi'): ns3::OriginatorBlockAckAgreement::OriginatorBlockAckAgreement(ns3::Mac48Address recipient, uint8_t tid) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address', 'recipient'), param('uint8_t', 'tid')])
+    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::CompleteExchange() [member function]
+    cls.add_method('CompleteExchange', 
+                   'void', 
+                   [])
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsBlockAckRequestNeeded() const [member function]
+    cls.add_method('IsBlockAckRequestNeeded', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsEstablished() const [member function]
+    cls.add_method('IsEstablished', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsInactive() const [member function]
+    cls.add_method('IsInactive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsPending() const [member function]
+    cls.add_method('IsPending', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): bool ns3::OriginatorBlockAckAgreement::IsUnsuccessful() const [member function]
+    cls.add_method('IsUnsuccessful', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::NotifyMpduTransmission(uint16_t nextSeqNumber) [member function]
+    cls.add_method('NotifyMpduTransmission', 
+                   'void', 
+                   [param('uint16_t', 'nextSeqNumber')])
+    ## originator-block-ack-agreement.h (module 'wifi'): void ns3::OriginatorBlockAckAgreement::SetState(ns3::OriginatorBlockAckAgreement::State state) [member function]
+    cls.add_method('SetState', 
+                   'void', 
+                   [param('ns3::OriginatorBlockAckAgreement::State', 'state')])
+    return
+
+def register_Ns3PacketMetadata_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(uint64_t uid, uint32_t size) [constructor]
+    cls.add_constructor([param('uint64_t', 'uid'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::PacketMetadata const &', 'o')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [param('ns3::Buffer', 'buffer')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::PacketMetadata', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'end')], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Deserialize(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::Enable() [member function]
+    cls.add_method('Enable', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): static void ns3::PacketMetadata::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): uint64_t ns3::PacketMetadata::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'end')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'start')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function]
+    cls.add_method('RemoveHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')])
+    ## packet-metadata.h (module 'network'): uint32_t ns3::PacketMetadata::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketMetadataItem_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item() [constructor]
+    cls.add_constructor([])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::current [variable]
+    cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentSize [variable]
+    cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromEnd [variable]
+    cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::currentTrimedFromStart [variable]
+    cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::isFragment [variable]
+    cls.add_instance_attribute('isFragment', 'bool', is_const=False)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3PacketMetadataItemIterator_methods(root_module, cls):
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')])
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor]
+    cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')])
+    ## packet-metadata.h (module 'network'): bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet-metadata.h (module 'network'): ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketMetadata::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIterator_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::PacketTagIterator(ns3::PacketTagIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator const &', 'arg0')])
+    ## packet.h (module 'network'): bool ns3::PacketTagIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item ns3::PacketTagIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::PacketTagIterator::Item', 
+                   [])
+    return
+
+def register_Ns3PacketTagIteratorItem_methods(root_module, cls):
+    ## packet.h (module 'network'): ns3::PacketTagIterator::Item::Item(ns3::PacketTagIterator::Item const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagIterator::Item const &', 'arg0')])
+    ## packet.h (module 'network'): void ns3::PacketTagIterator::Item::GetTag(ns3::Tag & tag) const [member function]
+    cls.add_method('GetTag', 
+                   'void', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::TypeId ns3::PacketTagIterator::Item::GetTypeId() const [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3PacketTagList_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::PacketTagList(ns3::PacketTagList const & o) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList const &', 'o')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::Add(ns3::Tag const & tag) const [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData const * ns3::PacketTagList::Head() const [member function]
+    cls.add_method('Head', 
+                   'ns3::PacketTagList::TagData const *', 
+                   [], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Peek(ns3::Tag & tag) const [member function]
+    cls.add_method('Peek', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Remove(ns3::Tag & tag) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet-tag-list.h (module 'network'): void ns3::PacketTagList::RemoveAll() [member function]
+    cls.add_method('RemoveAll', 
+                   'void', 
+                   [])
+    ## packet-tag-list.h (module 'network'): bool ns3::PacketTagList::Replace(ns3::Tag & tag) [member function]
+    cls.add_method('Replace', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    return
+
+def register_Ns3PacketTagListTagData_methods(root_module, cls):
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData() [constructor]
+    cls.add_constructor([])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::TagData(ns3::PacketTagList::TagData const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PacketTagList::TagData const &', 'arg0')])
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::count [variable]
+    cls.add_instance_attribute('count', 'uint32_t', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::data [variable]
+    cls.add_instance_attribute('data', 'uint8_t [ 20 ]', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::next [variable]
+    cls.add_instance_attribute('next', 'ns3::PacketTagList::TagData *', is_const=False)
+    ## packet-tag-list.h (module 'network'): ns3::PacketTagList::TagData::tid [variable]
+    cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False)
+    return
+
+def register_Ns3PcapFile_methods(root_module, cls):
+    ## pcap-file.h (module 'network'): ns3::PcapFile::PcapFile() [constructor]
+    cls.add_constructor([])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Close() [member function]
+    cls.add_method('Close', 
+                   'void', 
+                   [])
+    ## pcap-file.h (module 'network'): static bool ns3::PcapFile::Diff(std::string const & f1, std::string const & f2, uint32_t & sec, uint32_t & usec, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT) [member function]
+    cls.add_method('Diff', 
+                   'bool', 
+                   [param('std::string const &', 'f1'), param('std::string const &', 'f2'), param('uint32_t &', 'sec'), param('uint32_t &', 'usec'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT')], 
+                   is_static=True)
+    ## pcap-file.h (module 'network'): bool ns3::PcapFile::Eof() const [member function]
+    cls.add_method('Eof', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## pcap-file.h (module 'network'): bool ns3::PcapFile::Fail() const [member function]
+    cls.add_method('Fail', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## pcap-file.h (module 'network'): uint32_t ns3::PcapFile::GetDataLinkType() [member function]
+    cls.add_method('GetDataLinkType', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint32_t ns3::PcapFile::GetMagic() [member function]
+    cls.add_method('GetMagic', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint32_t ns3::PcapFile::GetSigFigs() [member function]
+    cls.add_method('GetSigFigs', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint32_t ns3::PcapFile::GetSnapLen() [member function]
+    cls.add_method('GetSnapLen', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): bool ns3::PcapFile::GetSwapMode() [member function]
+    cls.add_method('GetSwapMode', 
+                   'bool', 
+                   [])
+    ## pcap-file.h (module 'network'): int32_t ns3::PcapFile::GetTimeZoneOffset() [member function]
+    cls.add_method('GetTimeZoneOffset', 
+                   'int32_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint16_t ns3::PcapFile::GetVersionMajor() [member function]
+    cls.add_method('GetVersionMajor', 
+                   'uint16_t', 
+                   [])
+    ## pcap-file.h (module 'network'): uint16_t ns3::PcapFile::GetVersionMinor() [member function]
+    cls.add_method('GetVersionMinor', 
+                   'uint16_t', 
+                   [])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Init(uint32_t dataLinkType, uint32_t snapLen=ns3::PcapFile::SNAPLEN_DEFAULT, int32_t timeZoneCorrection=ns3::PcapFile::ZONE_DEFAULT, bool swapMode=false) [member function]
+    cls.add_method('Init', 
+                   'void', 
+                   [param('uint32_t', 'dataLinkType'), param('uint32_t', 'snapLen', default_value='ns3::PcapFile::SNAPLEN_DEFAULT'), param('int32_t', 'timeZoneCorrection', default_value='ns3::PcapFile::ZONE_DEFAULT'), param('bool', 'swapMode', default_value='false')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Open(std::string const & filename, std::_Ios_Openmode mode) [member function]
+    cls.add_method('Open', 
+                   'void', 
+                   [param('std::string const &', 'filename'), param('std::_Ios_Openmode', 'mode')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Read(uint8_t * const data, uint32_t maxBytes, uint32_t & tsSec, uint32_t & tsUsec, uint32_t & inclLen, uint32_t & origLen, uint32_t & readLen) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t * const', 'data'), param('uint32_t', 'maxBytes'), param('uint32_t &', 'tsSec'), param('uint32_t &', 'tsUsec'), param('uint32_t &', 'inclLen'), param('uint32_t &', 'origLen'), param('uint32_t &', 'readLen')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, uint8_t const * const data, uint32_t totalLen) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('uint8_t const * const', 'data'), param('uint32_t', 'totalLen')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## pcap-file.h (module 'network'): void ns3::PcapFile::Write(uint32_t tsSec, uint32_t tsUsec, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint32_t', 'tsSec'), param('uint32_t', 'tsUsec'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## pcap-file.h (module 'network'): ns3::PcapFile::SNAPLEN_DEFAULT [variable]
+    cls.add_static_attribute('SNAPLEN_DEFAULT', 'uint32_t const', is_const=True)
+    ## pcap-file.h (module 'network'): ns3::PcapFile::ZONE_DEFAULT [variable]
+    cls.add_static_attribute('ZONE_DEFAULT', 'int32_t const', is_const=True)
+    return
+
+def register_Ns3PcapHelper_methods(root_module, cls):
+    ## trace-helper.h (module 'network'): ns3::PcapHelper::PcapHelper(ns3::PcapHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PcapHelper const &', 'arg0')])
+    ## trace-helper.h (module 'network'): ns3::PcapHelper::PcapHelper() [constructor]
+    cls.add_constructor([])
+    ## trace-helper.h (module 'network'): ns3::Ptr<ns3::PcapFileWrapper> ns3::PcapHelper::CreateFile(std::string filename, std::_Ios_Openmode filemode, uint32_t dataLinkType, uint32_t snapLen=65535, int32_t tzCorrection=0) [member function]
+    cls.add_method('CreateFile', 
+                   'ns3::Ptr< ns3::PcapFileWrapper >', 
+                   [param('std::string', 'filename'), param('std::_Ios_Openmode', 'filemode'), param('uint32_t', 'dataLinkType'), param('uint32_t', 'snapLen', default_value='65535'), param('int32_t', 'tzCorrection', default_value='0')])
+    ## trace-helper.h (module 'network'): std::string ns3::PcapHelper::GetFilenameFromDevice(std::string prefix, ns3::Ptr<ns3::NetDevice> device, bool useObjectNames=true) [member function]
+    cls.add_method('GetFilenameFromDevice', 
+                   'std::string', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'useObjectNames', default_value='true')])
+    ## trace-helper.h (module 'network'): std::string ns3::PcapHelper::GetFilenameFromInterfacePair(std::string prefix, ns3::Ptr<ns3::Object> object, uint32_t interface, bool useObjectNames=true) [member function]
+    cls.add_method('GetFilenameFromInterfacePair', 
+                   'std::string', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::Object >', 'object'), param('uint32_t', 'interface'), param('bool', 'useObjectNames', default_value='true')])
+    return
+
+def register_Ns3PcapHelperForDevice_methods(root_module, cls):
+    ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice::PcapHelperForDevice(ns3::PcapHelperForDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PcapHelperForDevice const &', 'arg0')])
+    ## trace-helper.h (module 'network'): ns3::PcapHelperForDevice::PcapHelperForDevice() [constructor]
+    cls.add_constructor([])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool promiscuous=false, bool explicitFilename=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'promiscuous', default_value='false'), param('bool', 'explicitFilename', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, std::string ndName, bool promiscuous=false, bool explicitFilename=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('std::string', 'ndName'), param('bool', 'promiscuous', default_value='false'), param('bool', 'explicitFilename', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, ns3::NetDeviceContainer d, bool promiscuous=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::NetDeviceContainer', 'd'), param('bool', 'promiscuous', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, ns3::NodeContainer n, bool promiscuous=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::NodeContainer', 'n'), param('bool', 'promiscuous', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcap(std::string prefix, uint32_t nodeid, uint32_t deviceid, bool promiscuous=false) [member function]
+    cls.add_method('EnablePcap', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('uint32_t', 'nodeid'), param('uint32_t', 'deviceid'), param('bool', 'promiscuous', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcapAll(std::string prefix, bool promiscuous=false) [member function]
+    cls.add_method('EnablePcapAll', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('bool', 'promiscuous', default_value='false')])
+    ## trace-helper.h (module 'network'): void ns3::PcapHelperForDevice::EnablePcapInternal(std::string prefix, ns3::Ptr<ns3::NetDevice> nd, bool promiscuous, bool explicitFilename) [member function]
+    cls.add_method('EnablePcapInternal', 
+                   'void', 
+                   [param('std::string', 'prefix'), param('ns3::Ptr< ns3::NetDevice >', 'nd'), param('bool', 'promiscuous'), param('bool', 'explicitFilename')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Object_Ns3ObjectBase_Ns3ObjectDeleter_methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::SimpleRefCount(ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter> const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Object, ns3::ObjectBase, ns3::ObjectDeleter>::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3Simulator_methods(root_module, cls):
+    ## simulator.h (module 'core'): ns3::Simulator::Simulator(ns3::Simulator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Simulator const &', 'arg0')])
+    ## simulator.h (module 'core'): static void ns3::Simulator::Cancel(ns3::EventId const & id) [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Destroy() [member function]
+    cls.add_method('Destroy', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static uint32_t ns3::Simulator::GetContext() [member function]
+    cls.add_method('GetContext', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::GetDelayLeft(ns3::EventId const & id) [member function]
+    cls.add_method('GetDelayLeft', 
+                   'ns3::Time', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Ptr<ns3::SimulatorImpl> ns3::Simulator::GetImplementation() [member function]
+    cls.add_method('GetImplementation', 
+                   'ns3::Ptr< ns3::SimulatorImpl >', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::GetMaximumSimulationTime() [member function]
+    cls.add_method('GetMaximumSimulationTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static uint32_t ns3::Simulator::GetSystemId() [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static bool ns3::Simulator::IsExpired(ns3::EventId const & id) [member function]
+    cls.add_method('IsExpired', 
+                   'bool', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static bool ns3::Simulator::IsFinished() [member function]
+    cls.add_method('IsFinished', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static ns3::Time ns3::Simulator::Now() [member function]
+    cls.add_method('Now', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Remove(ns3::EventId const & id) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::EventId const &', 'id')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::SetImplementation(ns3::Ptr<ns3::SimulatorImpl> impl) [member function]
+    cls.add_method('SetImplementation', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::SimulatorImpl >', 'impl')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::SetScheduler(ns3::ObjectFactory schedulerFactory) [member function]
+    cls.add_method('SetScheduler', 
+                   'void', 
+                   [param('ns3::ObjectFactory', 'schedulerFactory')], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop() [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## simulator.h (module 'core'): static void ns3::Simulator::Stop(ns3::Time const & time) [member function]
+    cls.add_method('Stop', 
+                   'void', 
+                   [param('ns3::Time const &', 'time')], 
+                   is_static=True)
+    return
+
+def register_Ns3StatusCode_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## status-code.h (module 'wifi'): ns3::StatusCode::StatusCode(ns3::StatusCode const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::StatusCode const &', 'arg0')])
+    ## status-code.h (module 'wifi'): ns3::StatusCode::StatusCode() [constructor]
+    cls.add_constructor([])
+    ## status-code.h (module 'wifi'): ns3::Buffer::Iterator ns3::StatusCode::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')])
+    ## status-code.h (module 'wifi'): uint32_t ns3::StatusCode::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## status-code.h (module 'wifi'): bool ns3::StatusCode::IsSuccess() const [member function]
+    cls.add_method('IsSuccess', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## status-code.h (module 'wifi'): ns3::Buffer::Iterator ns3::StatusCode::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## status-code.h (module 'wifi'): void ns3::StatusCode::SetFailure() [member function]
+    cls.add_method('SetFailure', 
+                   'void', 
+                   [])
+    ## status-code.h (module 'wifi'): void ns3::StatusCode::SetSuccess() [member function]
+    cls.add_method('SetSuccess', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3Tag_methods(root_module, cls):
+    ## tag.h (module 'network'): ns3::Tag::Tag() [constructor]
+    cls.add_constructor([])
+    ## tag.h (module 'network'): ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Tag const &', 'arg0')])
+    ## tag.h (module 'network'): void ns3::Tag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## tag.h (module 'network'): uint32_t ns3::Tag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): static ns3::TypeId ns3::Tag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## tag.h (module 'network'): void ns3::Tag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## tag.h (module 'network'): void ns3::Tag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3TagBuffer_methods(root_module, cls):
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(ns3::TagBuffer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TagBuffer const &', 'arg0')])
+    ## tag-buffer.h (module 'network'): ns3::TagBuffer::TagBuffer(uint8_t * start, uint8_t * end) [constructor]
+    cls.add_constructor([param('uint8_t *', 'start'), param('uint8_t *', 'end')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::CopyFrom(ns3::TagBuffer o) [member function]
+    cls.add_method('CopyFrom', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'o')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Read(uint8_t * buffer, uint32_t size) [member function]
+    cls.add_method('Read', 
+                   'void', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): double ns3::TagBuffer::ReadDouble() [member function]
+    cls.add_method('ReadDouble', 
+                   'double', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint16_t ns3::TagBuffer::ReadU16() [member function]
+    cls.add_method('ReadU16', 
+                   'uint16_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint32_t ns3::TagBuffer::ReadU32() [member function]
+    cls.add_method('ReadU32', 
+                   'uint32_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint64_t ns3::TagBuffer::ReadU64() [member function]
+    cls.add_method('ReadU64', 
+                   'uint64_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): uint8_t ns3::TagBuffer::ReadU8() [member function]
+    cls.add_method('ReadU8', 
+                   'uint8_t', 
+                   [])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::TrimAtEnd(uint32_t trim) [member function]
+    cls.add_method('TrimAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'trim')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::Write(uint8_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteDouble(double v) [member function]
+    cls.add_method('WriteDouble', 
+                   'void', 
+                   [param('double', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU16(uint16_t data) [member function]
+    cls.add_method('WriteU16', 
+                   'void', 
+                   [param('uint16_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU32(uint32_t data) [member function]
+    cls.add_method('WriteU32', 
+                   'void', 
+                   [param('uint32_t', 'data')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU64(uint64_t v) [member function]
+    cls.add_method('WriteU64', 
+                   'void', 
+                   [param('uint64_t', 'v')])
+    ## tag-buffer.h (module 'network'): void ns3::TagBuffer::WriteU8(uint8_t v) [member function]
+    cls.add_method('WriteU8', 
+                   'void', 
+                   [param('uint8_t', 'v')])
+    return
+
+def register_Ns3TypeId_methods(root_module, cls):
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_comparison_operator('<')
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(char const * name) [constructor]
+    cls.add_constructor([param('char const *', 'name')])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TypeId(ns3::TypeId const & o) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'o')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddAttribute(std::string name, std::string help, uint32_t flags, ns3::AttributeValue const & initialValue, ns3::Ptr<ns3::AttributeAccessor const> accessor, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('AddAttribute', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('uint32_t', 'flags'), param('ns3::AttributeValue const &', 'initialValue'), param('ns3::Ptr< ns3::AttributeAccessor const >', 'accessor'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::AddTraceSource(std::string name, std::string help, ns3::Ptr<ns3::TraceSourceAccessor const> accessor) [member function]
+    cls.add_method('AddTraceSource', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name'), param('std::string', 'help'), param('ns3::Ptr< ns3::TraceSourceAccessor const >', 'accessor')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation ns3::TypeId::GetAttribute(uint32_t i) const [member function]
+    cls.add_method('GetAttribute', 
+                   'ns3::TypeId::AttributeInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetAttributeFullName(uint32_t i) const [member function]
+    cls.add_method('GetAttributeFullName', 
+                   'std::string', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetAttributeN() const [member function]
+    cls.add_method('GetAttributeN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::Callback<ns3::ObjectBase*,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> ns3::TypeId::GetConstructor() const [member function]
+    cls.add_method('GetConstructor', 
+                   'ns3::Callback< ns3::ObjectBase *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetGroupName() const [member function]
+    cls.add_method('GetGroupName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetHash() const [member function]
+    cls.add_method('GetHash', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeId::GetName() const [member function]
+    cls.add_method('GetName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::GetParent() const [member function]
+    cls.add_method('GetParent', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::GetRegistered(uint32_t i) [member function]
+    cls.add_method('GetRegistered', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'i')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static uint32_t ns3::TypeId::GetRegisteredN() [member function]
+    cls.add_method('GetRegisteredN', 
+                   'uint32_t', 
+                   [], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation ns3::TypeId::GetTraceSource(uint32_t i) const [member function]
+    cls.add_method('GetTraceSource', 
+                   'ns3::TypeId::TraceSourceInformation', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint32_t ns3::TypeId::GetTraceSourceN() const [member function]
+    cls.add_method('GetTraceSourceN', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): uint16_t ns3::TypeId::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasConstructor() const [member function]
+    cls.add_method('HasConstructor', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::HasParent() const [member function]
+    cls.add_method('HasParent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::HideFromDocumentation() [member function]
+    cls.add_method('HideFromDocumentation', 
+                   'ns3::TypeId', 
+                   [])
+    ## type-id.h (module 'core'): bool ns3::TypeId::IsChildOf(ns3::TypeId other) const [member function]
+    cls.add_method('IsChildOf', 
+                   'bool', 
+                   [param('ns3::TypeId', 'other')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::LookupAttributeByName(std::string name, ns3::TypeId::AttributeInformation * info) const [member function]
+    cls.add_method('LookupAttributeByName', 
+                   'bool', 
+                   [param('std::string', 'name'), param('ns3::TypeId::AttributeInformation *', 'info', transfer_ownership=False)], 
+                   is_const=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByHash(uint32_t hash) [member function]
+    cls.add_method('LookupByHash', 
+                   'ns3::TypeId', 
+                   [param('uint32_t', 'hash')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static bool ns3::TypeId::LookupByHashFailSafe(uint32_t hash, ns3::TypeId * tid) [member function]
+    cls.add_method('LookupByHashFailSafe', 
+                   'bool', 
+                   [param('uint32_t', 'hash'), param('ns3::TypeId *', 'tid')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): static ns3::TypeId ns3::TypeId::LookupByName(std::string name) [member function]
+    cls.add_method('LookupByName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'name')], 
+                   is_static=True)
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::TraceSourceAccessor const> ns3::TypeId::LookupTraceSourceByName(std::string name) const [member function]
+    cls.add_method('LookupTraceSourceByName', 
+                   'ns3::Ptr< ns3::TraceSourceAccessor const >', 
+                   [param('std::string', 'name')], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::MustHideFromDocumentation() const [member function]
+    cls.add_method('MustHideFromDocumentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): bool ns3::TypeId::SetAttributeInitialValue(uint32_t i, ns3::Ptr<ns3::AttributeValue const> initialValue) [member function]
+    cls.add_method('SetAttributeInitialValue', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ptr< ns3::AttributeValue const >', 'initialValue')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetGroupName(std::string groupName) [member function]
+    cls.add_method('SetGroupName', 
+                   'ns3::TypeId', 
+                   [param('std::string', 'groupName')])
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeId::SetParent(ns3::TypeId tid) [member function]
+    cls.add_method('SetParent', 
+                   'ns3::TypeId', 
+                   [param('ns3::TypeId', 'tid')])
+    ## type-id.h (module 'core'): void ns3::TypeId::SetUid(uint16_t tid) [member function]
+    cls.add_method('SetUid', 
+                   'void', 
+                   [param('uint16_t', 'tid')])
+    return
+
+def register_Ns3TypeIdAttributeInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::AttributeInformation(ns3::TypeId::AttributeInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::AttributeInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::AttributeAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::checker [variable]
+    cls.add_instance_attribute('checker', 'ns3::Ptr< ns3::AttributeChecker const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::flags [variable]
+    cls.add_instance_attribute('flags', 'uint32_t', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::initialValue [variable]
+    cls.add_instance_attribute('initialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::AttributeInformation::originalInitialValue [variable]
+    cls.add_instance_attribute('originalInitialValue', 'ns3::Ptr< ns3::AttributeValue const >', is_const=False)
+    return
+
+def register_Ns3TypeIdTraceSourceInformation_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::TraceSourceInformation(ns3::TypeId::TraceSourceInformation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeId::TraceSourceInformation const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::accessor [variable]
+    cls.add_instance_attribute('accessor', 'ns3::Ptr< ns3::TraceSourceAccessor const >', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::help [variable]
+    cls.add_instance_attribute('help', 'std::string', is_const=False)
+    ## type-id.h (module 'core'): ns3::TypeId::TraceSourceInformation::name [variable]
+    cls.add_instance_attribute('name', 'std::string', is_const=False)
+    return
+
+def register_Ns3VendorSpecificContentManager_methods(root_module, cls):
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificContentManager::VendorSpecificContentManager(ns3::VendorSpecificContentManager const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VendorSpecificContentManager const &', 'arg0')])
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificContentManager::VendorSpecificContentManager() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificContentManager::DeregisterVscCallback(ns3::OrganizationIdentifier & oi) [member function]
+    cls.add_method('DeregisterVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier &', 'oi')])
+    ## vendor-specific-action.h (module 'wave'): ns3::VscCallback ns3::VendorSpecificContentManager::FindVscCallback(ns3::OrganizationIdentifier & oi) [member function]
+    cls.add_method('FindVscCallback', 
+                   'ns3::VscCallback', 
+                   [param('ns3::OrganizationIdentifier &', 'oi')])
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificContentManager::RegisterVscCallback(ns3::OrganizationIdentifier oi, ns3::VscCallback cb) [member function]
+    cls.add_method('RegisterVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi'), param('ns3::VscCallback', 'cb')])
+    return
+
+def register_Ns3WifiHelper_methods(root_module, cls):
+    ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper(ns3::WifiHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiHelper const &', 'arg0')])
+    ## wifi-helper.h (module 'wifi'): ns3::WifiHelper::WifiHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-helper.h (module 'wifi'): int64_t ns3::WifiHelper::AssignStreams(ns3::NetDeviceContainer c, int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('ns3::NetDeviceContainer', 'c'), param('int64_t', 'stream')])
+    ## wifi-helper.h (module 'wifi'): static ns3::WifiHelper ns3::WifiHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::WifiHelper', 
+                   [], 
+                   is_static=True)
+    ## wifi-helper.h (module 'wifi'): static void ns3::WifiHelper::EnableLogComponents() [member function]
+    cls.add_method('EnableLogComponents', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, ns3::NodeContainer c) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::NodeContainer', 'c')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, std::string nodeName) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetRemoteStationManager(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetRemoteStationManager', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
+    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('SetStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3WifiMacHelper_methods(root_module, cls):
+    ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper::WifiMacHelper(ns3::WifiMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMacHelper const &', 'arg0')])
+    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::WifiMacHelper::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3WifiMode_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(ns3::WifiMode const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMode const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode() [constructor]
+    cls.add_constructor([])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode::WifiMode(std::string name) [constructor]
+    cls.add_constructor([param('std::string', 'name')])
+    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetBandwidth() const [member function]
+    cls.add_method('GetBandwidth', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate ns3::WifiMode::GetCodeRate() const [member function]
+    cls.add_method('GetCodeRate', 
+                   'ns3::WifiCodeRate', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint8_t ns3::WifiMode::GetConstellationSize() const [member function]
+    cls.add_method('GetConstellationSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetDataRate() const [member function]
+    cls.add_method('GetDataRate', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModulationClass ns3::WifiMode::GetModulationClass() const [member function]
+    cls.add_method('GetModulationClass', 
+                   'ns3::WifiModulationClass', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint64_t ns3::WifiMode::GetPhyRate() const [member function]
+    cls.add_method('GetPhyRate', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): uint32_t ns3::WifiMode::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiMode::GetUniqueName() const [member function]
+    cls.add_method('GetUniqueName', 
+                   'std::string', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiMode::IsMandatory() const [member function]
+    cls.add_method('IsMandatory', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    return
+
+def register_Ns3WifiModeFactory_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeFactory::WifiModeFactory(ns3::WifiModeFactory const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiModeFactory const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): static ns3::WifiMode ns3::WifiModeFactory::CreateWifiMode(std::string uniqueName, ns3::WifiModulationClass modClass, bool isMandatory, uint32_t bandwidth, uint32_t dataRate, ns3::WifiCodeRate codingRate, uint8_t constellationSize) [member function]
+    cls.add_method('CreateWifiMode', 
+                   'ns3::WifiMode', 
+                   [param('std::string', 'uniqueName'), param('ns3::WifiModulationClass', 'modClass'), param('bool', 'isMandatory'), param('uint32_t', 'bandwidth'), param('uint32_t', 'dataRate'), param('ns3::WifiCodeRate', 'codingRate'), param('uint8_t', 'constellationSize')], 
+                   is_static=True)
+    return
+
+def register_Ns3WifiPhyHelper_methods(root_module, cls):
+    ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-helper.h (module 'wifi'): ns3::WifiPhyHelper::WifiPhyHelper(ns3::WifiPhyHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiPhyHelper const &', 'arg0')])
+    ## wifi-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::WifiPhyHelper::Create(ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::WifiNetDevice> device) const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::WifiNetDevice >', 'device')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3WifiPhyListener_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener::WifiPhyListener() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhyListener::WifiPhyListener(ns3::WifiPhyListener const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiPhyListener const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyMaybeCcaBusyStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyMaybeCcaBusyStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxEndError() [member function]
+    cls.add_method('NotifyRxEndError', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxEndOk() [member function]
+    cls.add_method('NotifyRxEndOk', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyRxStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyRxStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifySwitchingStart(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhyListener::NotifyTxStart(ns3::Time duration) [member function]
+    cls.add_method('NotifyTxStart', 
+                   'void', 
+                   [param('ns3::Time', 'duration')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3WifiRemoteStation_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::WifiRemoteStation(ns3::WifiRemoteStation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStation const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_slrc [variable]
+    cls.add_instance_attribute('m_slrc', 'uint32_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_ssrc [variable]
+    cls.add_instance_attribute('m_ssrc', 'uint32_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_state [variable]
+    cls.add_instance_attribute('m_state', 'ns3::WifiRemoteStationState *', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation::m_tid [variable]
+    cls.add_instance_attribute('m_tid', 'uint8_t', is_const=False)
+    return
+
+def register_Ns3WifiRemoteStationInfo_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo::WifiRemoteStationInfo(ns3::WifiRemoteStationInfo const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationInfo const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo::WifiRemoteStationInfo() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): double ns3::WifiRemoteStationInfo::GetFrameErrorRate() const [member function]
+    cls.add_method('GetFrameErrorRate', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationInfo::NotifyTxFailed() [member function]
+    cls.add_method('NotifyTxFailed', 
+                   'void', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationInfo::NotifyTxSuccess(uint32_t retryCounter) [member function]
+    cls.add_method('NotifyTxSuccess', 
+                   'void', 
+                   [param('uint32_t', 'retryCounter')])
+    return
+
+def register_Ns3WifiRemoteStationState_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::WifiRemoteStationState() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::WifiRemoteStationState(ns3::WifiRemoteStationState const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationState const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_address [variable]
+    cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_greenfield [variable]
+    cls.add_instance_attribute('m_greenfield', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_info [variable]
+    cls.add_instance_attribute('m_info', 'ns3::WifiRemoteStationInfo', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalMcsSet [variable]
+    cls.add_instance_attribute('m_operationalMcsSet', 'ns3::WifiMcsList', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_operationalRateSet [variable]
+    cls.add_instance_attribute('m_operationalRateSet', 'ns3::WifiModeList', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_rx [variable]
+    cls.add_instance_attribute('m_rx', 'uint32_t', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_shortGuardInterval [variable]
+    cls.add_instance_attribute('m_shortGuardInterval', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_stbc [variable]
+    cls.add_instance_attribute('m_stbc', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_tx [variable]
+    cls.add_instance_attribute('m_tx', 'uint32_t', is_const=False)
+    return
+
+def register_Ns3WifiTxVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiTxVector const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
+    cls.add_constructor([])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNess() const [member function]
+    cls.add_method('GetNess', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetNss() const [member function]
+    cls.add_method('GetNss', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetRetries() const [member function]
+    cls.add_method('GetRetries', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): uint8_t ns3::WifiTxVector::GetTxPowerLevel() const [member function]
+    cls.add_method('GetTxPowerLevel', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsShortGuardInterval() const [member function]
+    cls.add_method('IsShortGuardInterval', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): bool ns3::WifiTxVector::IsStbc() const [member function]
+    cls.add_method('IsStbc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetMode(ns3::WifiMode mode) [member function]
+    cls.add_method('SetMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNess(uint8_t ness) [member function]
+    cls.add_method('SetNess', 
+                   'void', 
+                   [param('uint8_t', 'ness')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetNss(uint8_t nss) [member function]
+    cls.add_method('SetNss', 
+                   'void', 
+                   [param('uint8_t', 'nss')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetRetries(uint8_t retries) [member function]
+    cls.add_method('SetRetries', 
+                   'void', 
+                   [param('uint8_t', 'retries')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetShortGuardInterval(bool guardinterval) [member function]
+    cls.add_method('SetShortGuardInterval', 
+                   'void', 
+                   [param('bool', 'guardinterval')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
+    cls.add_method('SetStbc', 
+                   'void', 
+                   [param('bool', 'stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
+    cls.add_method('SetTxPowerLevel', 
+                   'void', 
+                   [param('uint8_t', 'powerlevel')])
+    return
+
+def register_Ns3Empty_methods(root_module, cls):
+    ## empty.h (module 'core'): ns3::empty::empty() [constructor]
+    cls.add_constructor([])
+    ## empty.h (module 'core'): ns3::empty::empty(ns3::empty const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::empty const &', 'arg0')])
+    return
+
+def register_Ns3Int64x64_t_methods(root_module, cls):
+    cls.add_inplace_numeric_operator('+=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('*', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('+', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_unary_numeric_operator('-')
+    cls.add_binary_numeric_operator('-', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short unsigned int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('unsigned char const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long long int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('long int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('short int const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('signed char const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('double const', 'right'))
+    cls.add_binary_numeric_operator('/', root_module['ns3::int64x64_t'], root_module['ns3::int64x64_t'], param('ns3::int64x64_t const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_inplace_numeric_operator('*=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('-=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_inplace_numeric_operator('/=', param('ns3::int64x64_t const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t() [constructor]
+    cls.add_constructor([])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(int64_t hi, uint64_t lo) [constructor]
+    cls.add_constructor([param('int64_t', 'hi'), param('uint64_t', 'lo')])
+    ## int64x64-double.h (module 'core'): ns3::int64x64_t::int64x64_t(ns3::int64x64_t const & o) [copy constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'o')])
+    ## int64x64-double.h (module 'core'): double ns3::int64x64_t::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): int64_t ns3::int64x64_t::GetHigh() const [member function]
+    cls.add_method('GetHigh', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): uint64_t ns3::int64x64_t::GetLow() const [member function]
+    cls.add_method('GetLow', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## int64x64-double.h (module 'core'): static ns3::int64x64_t ns3::int64x64_t::Invert(uint64_t v) [member function]
+    cls.add_method('Invert', 
+                   'ns3::int64x64_t', 
+                   [param('uint64_t', 'v')], 
+                   is_static=True)
+    ## int64x64-double.h (module 'core'): void ns3::int64x64_t::MulByInvert(ns3::int64x64_t const & o) [member function]
+    cls.add_method('MulByInvert', 
+                   'void', 
+                   [param('ns3::int64x64_t const &', 'o')])
+    return
+
+def register_Ns3Chunk_methods(root_module, cls):
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk() [constructor]
+    cls.add_constructor([])
+    ## chunk.h (module 'network'): ns3::Chunk::Chunk(ns3::Chunk const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Chunk const &', 'arg0')])
+    ## chunk.h (module 'network'): uint32_t ns3::Chunk::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## chunk.h (module 'network'): static ns3::TypeId ns3::Chunk::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## chunk.h (module 'network'): void ns3::Chunk::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Header_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## header.h (module 'network'): ns3::Header::Header() [constructor]
+    cls.add_constructor([])
+    ## header.h (module 'network'): ns3::Header::Header(ns3::Header const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Header const &', 'arg0')])
+    ## header.h (module 'network'): uint32_t ns3::Header::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## header.h (module 'network'): uint32_t ns3::Header::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): static ns3::TypeId ns3::Header::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## header.h (module 'network'): void ns3::Header::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## header.h (module 'network'): void ns3::Header::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3HigherDataTxVectorTag_methods(root_module, cls):
+    ## higher-tx-tag.h (module 'wave'): ns3::HigherDataTxVectorTag::HigherDataTxVectorTag(ns3::HigherDataTxVectorTag const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::HigherDataTxVectorTag const &', 'arg0')])
+    ## higher-tx-tag.h (module 'wave'): ns3::HigherDataTxVectorTag::HigherDataTxVectorTag() [constructor]
+    cls.add_constructor([])
+    ## higher-tx-tag.h (module 'wave'): ns3::HigherDataTxVectorTag::HigherDataTxVectorTag(ns3::WifiTxVector dataTxVector, bool adapter) [constructor]
+    cls.add_constructor([param('ns3::WifiTxVector', 'dataTxVector'), param('bool', 'adapter')])
+    ## higher-tx-tag.h (module 'wave'): void ns3::HigherDataTxVectorTag::Deserialize(ns3::TagBuffer i) [member function]
+    cls.add_method('Deserialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_virtual=True)
+    ## higher-tx-tag.h (module 'wave'): ns3::WifiTxVector ns3::HigherDataTxVectorTag::GetDataTxVector() const [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [], 
+                   is_const=True)
+    ## higher-tx-tag.h (module 'wave'): ns3::TypeId ns3::HigherDataTxVectorTag::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## higher-tx-tag.h (module 'wave'): uint32_t ns3::HigherDataTxVectorTag::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## higher-tx-tag.h (module 'wave'): static ns3::TypeId ns3::HigherDataTxVectorTag::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## higher-tx-tag.h (module 'wave'): bool ns3::HigherDataTxVectorTag::IsAdapter() const [member function]
+    cls.add_method('IsAdapter', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## higher-tx-tag.h (module 'wave'): void ns3::HigherDataTxVectorTag::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## higher-tx-tag.h (module 'wave'): void ns3::HigherDataTxVectorTag::Serialize(ns3::TagBuffer i) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::TagBuffer', 'i')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3MgtAddBaRequestHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader::MgtAddBaRequestHeader(ns3::MgtAddBaRequestHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtAddBaRequestHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaRequestHeader::MgtAddBaRequestHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAddBaRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaRequestHeader::GetBufferSize() const [member function]
+    cls.add_method('GetBufferSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtAddBaRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAddBaRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaRequestHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint8_t ns3::MgtAddBaRequestHeader::GetTid() const [member function]
+    cls.add_method('GetTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaRequestHeader::GetTimeout() const [member function]
+    cls.add_method('GetTimeout', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtAddBaRequestHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtAddBaRequestHeader::IsAmsduSupported() const [member function]
+    cls.add_method('IsAmsduSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtAddBaRequestHeader::IsImmediateBlockAck() const [member function]
+    cls.add_method('IsImmediateBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetAmsduSupport(bool supported) [member function]
+    cls.add_method('SetAmsduSupport', 
+                   'void', 
+                   [param('bool', 'supported')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetBufferSize(uint16_t size) [member function]
+    cls.add_method('SetBufferSize', 
+                   'void', 
+                   [param('uint16_t', 'size')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetDelayedBlockAck() [member function]
+    cls.add_method('SetDelayedBlockAck', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetImmediateBlockAck() [member function]
+    cls.add_method('SetImmediateBlockAck', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetTid(uint8_t tid) [member function]
+    cls.add_method('SetTid', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaRequestHeader::SetTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    return
+
+def register_Ns3MgtAddBaResponseHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaResponseHeader::MgtAddBaResponseHeader(ns3::MgtAddBaResponseHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtAddBaResponseHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAddBaResponseHeader::MgtAddBaResponseHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAddBaResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaResponseHeader::GetBufferSize() const [member function]
+    cls.add_method('GetBufferSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtAddBaResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAddBaResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::StatusCode ns3::MgtAddBaResponseHeader::GetStatusCode() const [member function]
+    cls.add_method('GetStatusCode', 
+                   'ns3::StatusCode', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint8_t ns3::MgtAddBaResponseHeader::GetTid() const [member function]
+    cls.add_method('GetTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAddBaResponseHeader::GetTimeout() const [member function]
+    cls.add_method('GetTimeout', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtAddBaResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtAddBaResponseHeader::IsAmsduSupported() const [member function]
+    cls.add_method('IsAmsduSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtAddBaResponseHeader::IsImmediateBlockAck() const [member function]
+    cls.add_method('IsImmediateBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetAmsduSupport(bool supported) [member function]
+    cls.add_method('SetAmsduSupport', 
+                   'void', 
+                   [param('bool', 'supported')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetBufferSize(uint16_t size) [member function]
+    cls.add_method('SetBufferSize', 
+                   'void', 
+                   [param('uint16_t', 'size')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetDelayedBlockAck() [member function]
+    cls.add_method('SetDelayedBlockAck', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetImmediateBlockAck() [member function]
+    cls.add_method('SetImmediateBlockAck', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetStatusCode(ns3::StatusCode code) [member function]
+    cls.add_method('SetStatusCode', 
+                   'void', 
+                   [param('ns3::StatusCode', 'code')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetTid(uint8_t tid) [member function]
+    cls.add_method('SetTid', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAddBaResponseHeader::SetTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    return
+
+def register_Ns3MgtAssocRequestHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocRequestHeader::MgtAssocRequestHeader(ns3::MgtAssocRequestHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtAssocRequestHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocRequestHeader::MgtAssocRequestHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::HtCapabilities ns3::MgtAssocRequestHeader::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtAssocRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint16_t ns3::MgtAssocRequestHeader::GetListenInterval() const [member function]
+    cls.add_method('GetListenInterval', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::Ssid ns3::MgtAssocRequestHeader::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::SupportedRates ns3::MgtAssocRequestHeader::GetSupportedRates() const [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtAssocRequestHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetHtCapabilities(ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('SetHtCapabilities', 
+                   'void', 
+                   [param('ns3::HtCapabilities', 'htcapabilities')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetListenInterval(uint16_t interval) [member function]
+    cls.add_method('SetListenInterval', 
+                   'void', 
+                   [param('uint16_t', 'interval')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocRequestHeader::SetSupportedRates(ns3::SupportedRates rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates', 'rates')])
+    return
+
+def register_Ns3MgtAssocResponseHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocResponseHeader::MgtAssocResponseHeader(ns3::MgtAssocResponseHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtAssocResponseHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtAssocResponseHeader::MgtAssocResponseHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::HtCapabilities ns3::MgtAssocResponseHeader::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtAssocResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::StatusCode ns3::MgtAssocResponseHeader::GetStatusCode() [member function]
+    cls.add_method('GetStatusCode', 
+                   'ns3::StatusCode', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): ns3::SupportedRates ns3::MgtAssocResponseHeader::GetSupportedRates() [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtAssocResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetHtCapabilities(ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('SetHtCapabilities', 
+                   'void', 
+                   [param('ns3::HtCapabilities', 'htcapabilities')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetStatusCode(ns3::StatusCode code) [member function]
+    cls.add_method('SetStatusCode', 
+                   'void', 
+                   [param('ns3::StatusCode', 'code')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetSupportedRates(ns3::SupportedRates rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates', 'rates')])
+    return
+
+def register_Ns3MgtDelBaHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtDelBaHeader::MgtDelBaHeader(ns3::MgtDelBaHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtDelBaHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtDelBaHeader::MgtDelBaHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtDelBaHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtDelBaHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtDelBaHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint8_t ns3::MgtDelBaHeader::GetTid() const [member function]
+    cls.add_method('GetTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtDelBaHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): bool ns3::MgtDelBaHeader::IsByOriginator() const [member function]
+    cls.add_method('IsByOriginator', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::SetByOriginator() [member function]
+    cls.add_method('SetByOriginator', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::SetByRecipient() [member function]
+    cls.add_method('SetByRecipient', 
+                   'void', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtDelBaHeader::SetTid(uint8_t arg0) [member function]
+    cls.add_method('SetTid', 
+                   'void', 
+                   [param('uint8_t', 'arg0')])
+    return
+
+def register_Ns3MgtProbeRequestHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeRequestHeader::MgtProbeRequestHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeRequestHeader::MgtProbeRequestHeader(ns3::MgtProbeRequestHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtProbeRequestHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::HtCapabilities ns3::MgtProbeRequestHeader::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtProbeRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::Ssid ns3::MgtProbeRequestHeader::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::SupportedRates ns3::MgtProbeRequestHeader::GetSupportedRates() const [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtProbeRequestHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetHtCapabilities(ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('SetHtCapabilities', 
+                   'void', 
+                   [param('ns3::HtCapabilities', 'htcapabilities')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeRequestHeader::SetSupportedRates(ns3::SupportedRates rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates', 'rates')])
+    return
+
+def register_Ns3MgtProbeResponseHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeResponseHeader::MgtProbeResponseHeader(ns3::MgtProbeResponseHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtProbeResponseHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtProbeResponseHeader::MgtProbeResponseHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint64_t ns3::MgtProbeResponseHeader::GetBeaconIntervalUs() const [member function]
+    cls.add_method('GetBeaconIntervalUs', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::HtCapabilities ns3::MgtProbeResponseHeader::GetHtCapabilities() const [member function]
+    cls.add_method('GetHtCapabilities', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::MgtProbeResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::Ssid ns3::MgtProbeResponseHeader::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): ns3::SupportedRates ns3::MgtProbeResponseHeader::GetSupportedRates() const [member function]
+    cls.add_method('GetSupportedRates', 
+                   'ns3::SupportedRates', 
+                   [], 
+                   is_const=True)
+    ## mgt-headers.h (module 'wifi'): uint64_t ns3::MgtProbeResponseHeader::GetTimestamp() [member function]
+    cls.add_method('GetTimestamp', 
+                   'uint64_t', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::MgtProbeResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetBeaconIntervalUs(uint64_t us) [member function]
+    cls.add_method('SetBeaconIntervalUs', 
+                   'void', 
+                   [param('uint64_t', 'us')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetHtCapabilities(ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('SetHtCapabilities', 
+                   'void', 
+                   [param('ns3::HtCapabilities', 'htcapabilities')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetSupportedRates(ns3::SupportedRates rates) [member function]
+    cls.add_method('SetSupportedRates', 
+                   'void', 
+                   [param('ns3::SupportedRates', 'rates')])
+    return
+
+def register_Ns3NqosWifiMacHelper_methods(root_module, cls):
+    ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::NqosWifiMacHelper::NqosWifiMacHelper(ns3::NqosWifiMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NqosWifiMacHelper const &', 'arg0')])
+    ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::NqosWifiMacHelper::NqosWifiMacHelper() [constructor]
+    cls.add_constructor([])
+    ## nqos-wifi-mac-helper.h (module 'wifi'): static ns3::NqosWifiMacHelper ns3::NqosWifiMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::NqosWifiMacHelper', 
+                   [], 
+                   is_static=True)
+    ## nqos-wifi-mac-helper.h (module 'wifi'): void ns3::NqosWifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
+    ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::NqosWifiMacHelper::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3Object_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::Object() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): void ns3::Object::AggregateObject(ns3::Ptr<ns3::Object> other) [member function]
+    cls.add_method('AggregateObject', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'other')])
+    ## object.h (module 'core'): void ns3::Object::Dispose() [member function]
+    cls.add_method('Dispose', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator ns3::Object::GetAggregateIterator() const [member function]
+    cls.add_method('GetAggregateIterator', 
+                   'ns3::Object::AggregateIterator', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::TypeId ns3::Object::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object.h (module 'core'): static ns3::TypeId ns3::Object::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## object.h (module 'core'): void ns3::Object::Initialize() [member function]
+    cls.add_method('Initialize', 
+                   'void', 
+                   [])
+    ## object.h (module 'core'): ns3::Object::Object(ns3::Object const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Object const &', 'o')], 
+                        visibility='protected')
+    ## object.h (module 'core'): void ns3::Object::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## object.h (module 'core'): void ns3::Object::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ObjectAggregateIterator_methods(root_module, cls):
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator(ns3::Object::AggregateIterator const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Object::AggregateIterator const &', 'arg0')])
+    ## object.h (module 'core'): ns3::Object::AggregateIterator::AggregateIterator() [constructor]
+    cls.add_constructor([])
+    ## object.h (module 'core'): bool ns3::Object::AggregateIterator::HasNext() const [member function]
+    cls.add_method('HasNext', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## object.h (module 'core'): ns3::Ptr<ns3::Object const> ns3::Object::AggregateIterator::Next() [member function]
+    cls.add_method('Next', 
+                   'ns3::Ptr< ns3::Object const >', 
+                   [])
+    return
+
+def register_Ns3PcapFileWrapper_methods(root_module, cls):
+    ## pcap-file-wrapper.h (module 'network'): static ns3::TypeId ns3::PcapFileWrapper::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## pcap-file-wrapper.h (module 'network'): ns3::PcapFileWrapper::PcapFileWrapper() [constructor]
+    cls.add_constructor([])
+    ## pcap-file-wrapper.h (module 'network'): bool ns3::PcapFileWrapper::Fail() const [member function]
+    cls.add_method('Fail', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## pcap-file-wrapper.h (module 'network'): bool ns3::PcapFileWrapper::Eof() const [member function]
+    cls.add_method('Eof', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Clear() [member function]
+    cls.add_method('Clear', 
+                   'void', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Open(std::string const & filename, std::_Ios_Openmode mode) [member function]
+    cls.add_method('Open', 
+                   'void', 
+                   [param('std::string const &', 'filename'), param('std::_Ios_Openmode', 'mode')])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Close() [member function]
+    cls.add_method('Close', 
+                   'void', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Init(uint32_t dataLinkType, uint32_t snapLen=std::numeric_limits<unsigned int>::max(), int32_t tzCorrection=ns3::PcapFile::ZONE_DEFAULT) [member function]
+    cls.add_method('Init', 
+                   'void', 
+                   [param('uint32_t', 'dataLinkType'), param('uint32_t', 'snapLen', default_value='std::numeric_limits<unsigned int>::max()'), param('int32_t', 'tzCorrection', default_value='ns3::PcapFile::ZONE_DEFAULT')])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Time', 't'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, ns3::Header & header, ns3::Ptr<ns3::Packet const> p) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Time', 't'), param('ns3::Header &', 'header'), param('ns3::Ptr< ns3::Packet const >', 'p')])
+    ## pcap-file-wrapper.h (module 'network'): void ns3::PcapFileWrapper::Write(ns3::Time t, uint8_t const * buffer, uint32_t length) [member function]
+    cls.add_method('Write', 
+                   'void', 
+                   [param('ns3::Time', 't'), param('uint8_t const *', 'buffer'), param('uint32_t', 'length')])
+    ## pcap-file-wrapper.h (module 'network'): uint32_t ns3::PcapFileWrapper::GetMagic() [member function]
+    cls.add_method('GetMagic', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint16_t ns3::PcapFileWrapper::GetVersionMajor() [member function]
+    cls.add_method('GetVersionMajor', 
+                   'uint16_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint16_t ns3::PcapFileWrapper::GetVersionMinor() [member function]
+    cls.add_method('GetVersionMinor', 
+                   'uint16_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): int32_t ns3::PcapFileWrapper::GetTimeZoneOffset() [member function]
+    cls.add_method('GetTimeZoneOffset', 
+                   'int32_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint32_t ns3::PcapFileWrapper::GetSigFigs() [member function]
+    cls.add_method('GetSigFigs', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint32_t ns3::PcapFileWrapper::GetSnapLen() [member function]
+    cls.add_method('GetSnapLen', 
+                   'uint32_t', 
+                   [])
+    ## pcap-file-wrapper.h (module 'network'): uint32_t ns3::PcapFileWrapper::GetDataLinkType() [member function]
+    cls.add_method('GetDataLinkType', 
+                   'uint32_t', 
+                   [])
+    return
+
+def register_Ns3QosWifiMacHelper_methods(root_module, cls):
+    ## qos-wifi-mac-helper.h (module 'wifi'): ns3::QosWifiMacHelper::QosWifiMacHelper(ns3::QosWifiMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::QosWifiMacHelper const &', 'arg0')])
+    ## qos-wifi-mac-helper.h (module 'wifi'): ns3::QosWifiMacHelper::QosWifiMacHelper() [constructor]
+    cls.add_constructor([])
+    ## qos-wifi-mac-helper.h (module 'wifi'): static ns3::QosWifiMacHelper ns3::QosWifiMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::QosWifiMacHelper', 
+                   [], 
+                   is_static=True)
+    ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetBlockAckInactivityTimeoutForAc(ns3::AcIndex ac, uint16_t timeout) [member function]
+    cls.add_method('SetBlockAckInactivityTimeoutForAc', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac'), param('uint16_t', 'timeout')])
+    ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetBlockAckThresholdForAc(ns3::AcIndex ac, uint8_t threshold) [member function]
+    cls.add_method('SetBlockAckThresholdForAc', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac'), param('uint8_t', 'threshold')])
+    ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetMsduAggregatorForAc(ns3::AcIndex ac, std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetMsduAggregatorForAc', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()')])
+    ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
+    ## qos-wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::QosWifiMacHelper::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::WifiMac >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter< ns3::AttributeAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeChecker_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeChecker__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter< ns3::AttributeChecker > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeChecker, ns3::empty, ns3::DefaultDeleter<ns3::AttributeChecker> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3AttributeValue_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeValue__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::SimpleRefCount(ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter< ns3::AttributeValue > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::AttributeValue, ns3::empty, ns3::DefaultDeleter<ns3::AttributeValue> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3CallbackImplBase_Ns3Empty_Ns3DefaultDeleter__lt__ns3CallbackImplBase__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::SimpleRefCount(ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter< ns3::CallbackImplBase > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::CallbackImplBase, ns3::empty, ns3::DefaultDeleter<ns3::CallbackImplBase> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3EventImpl_Ns3Empty_Ns3DefaultDeleter__lt__ns3EventImpl__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::SimpleRefCount(ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::EventImpl, ns3::empty, ns3::DefaultDeleter< ns3::EventImpl > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::EventImpl, ns3::empty, ns3::DefaultDeleter<ns3::EventImpl> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3HashImplementation_Ns3Empty_Ns3DefaultDeleter__lt__ns3HashImplementation__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter< ns3::Hash::Implementation > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Hash::Implementation, ns3::empty, ns3::DefaultDeleter<ns3::Hash::Implementation> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3NixVector_Ns3Empty_Ns3DefaultDeleter__lt__ns3NixVector__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::SimpleRefCount(ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::NixVector, ns3::empty, ns3::DefaultDeleter< ns3::NixVector > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::NixVector, ns3::empty, ns3::DefaultDeleter<ns3::NixVector> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3OutputStreamWrapper_Ns3Empty_Ns3DefaultDeleter__lt__ns3OutputStreamWrapper__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::SimpleRefCount(ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter< ns3::OutputStreamWrapper > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::OutputStreamWrapper, ns3::empty, ns3::DefaultDeleter<ns3::OutputStreamWrapper> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3Packet_Ns3Empty_Ns3DefaultDeleter__lt__ns3Packet__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Packet, ns3::empty, ns3::DefaultDeleter< ns3::Packet > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::Packet, ns3::empty, ns3::DefaultDeleter<ns3::Packet> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3TraceSourceAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3TraceSourceAccessor__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::SimpleRefCount(ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter< ns3::TraceSourceAccessor > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::TraceSourceAccessor, ns3::empty, ns3::DefaultDeleter<ns3::TraceSourceAccessor> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3SimpleRefCount__Ns3WifiInformationElement_Ns3Empty_Ns3DefaultDeleter__lt__ns3WifiInformationElement__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::SimpleRefCount(ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> > const & o) [copy constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter< ns3::WifiInformationElement > > const &', 'o')])
+    ## simple-ref-count.h (module 'core'): static void ns3::SimpleRefCount<ns3::WifiInformationElement, ns3::empty, ns3::DefaultDeleter<ns3::WifiInformationElement> >::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    return
+
+def register_Ns3Time_methods(root_module, cls):
+    cls.add_inplace_numeric_operator('+=', param('ns3::Time const &', 'right'))
+    cls.add_binary_comparison_operator('<=')
+    cls.add_binary_comparison_operator('!=')
+    cls.add_binary_numeric_operator('+', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_numeric_operator('-', root_module['ns3::Time'], root_module['ns3::Time'], param('ns3::Time const &', 'right'))
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('>')
+    cls.add_inplace_numeric_operator('-=', param('ns3::Time const &', 'right'))
+    cls.add_output_stream_operator()
+    cls.add_binary_comparison_operator('==')
+    cls.add_binary_comparison_operator('>=')
+    ## nstime.h (module 'core'): ns3::Time::Time() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::Time const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Time const &', 'o')])
+    ## nstime.h (module 'core'): ns3::Time::Time(double v) [constructor]
+    cls.add_constructor([param('double', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(int v) [constructor]
+    cls.add_constructor([param('int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long int v) [constructor]
+    cls.add_constructor([param('long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long int v) [constructor]
+    cls.add_constructor([param('long long int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(unsigned int v) [constructor]
+    cls.add_constructor([param('unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long unsigned int v) [constructor]
+    cls.add_constructor([param('long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(long long unsigned int v) [constructor]
+    cls.add_constructor([param('long long unsigned int', 'v')])
+    ## nstime.h (module 'core'): ns3::Time::Time(std::string const & s) [constructor]
+    cls.add_constructor([param('std::string const &', 's')])
+    ## nstime.h (module 'core'): ns3::Time::Time(ns3::int64x64_t const & value) [constructor]
+    cls.add_constructor([param('ns3::int64x64_t const &', 'value')])
+    ## nstime.h (module 'core'): int ns3::Time::Compare(ns3::Time const & o) const [member function]
+    cls.add_method('Compare', 
+                   'int', 
+                   [param('ns3::Time const &', 'o')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & from, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'from'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::From(ns3::int64x64_t const & value) [member function]
+    cls.add_method('From', 
+                   'ns3::Time', 
+                   [param('ns3::int64x64_t const &', 'value')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromDouble(double value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromDouble', 
+                   'ns3::Time', 
+                   [param('double', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::FromInteger(uint64_t value, ns3::Time::Unit timeUnit) [member function]
+    cls.add_method('FromInteger', 
+                   'ns3::Time', 
+                   [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
+    cls.add_method('GetDouble', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetFemtoSeconds() const [member function]
+    cls.add_method('GetFemtoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
+    cls.add_method('GetInteger', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMicroSeconds() const [member function]
+    cls.add_method('GetMicroSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetMilliSeconds() const [member function]
+    cls.add_method('GetMilliSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
+    cls.add_method('GetNanoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetPicoSeconds() const [member function]
+    cls.add_method('GetPicoSeconds', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time::Unit ns3::Time::GetResolution() [member function]
+    cls.add_method('GetResolution', 
+                   'ns3::Time::Unit', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetSeconds() const [member function]
+    cls.add_method('GetSeconds', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::GetTimeStep() const [member function]
+    cls.add_method('GetTimeStep', 
+                   'int64_t', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
+    cls.add_method('IsNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsPositive() const [member function]
+    cls.add_method('IsPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyNegative() const [member function]
+    cls.add_method('IsStrictlyNegative', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsStrictlyPositive() const [member function]
+    cls.add_method('IsStrictlyPositive', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): bool ns3::Time::IsZero() const [member function]
+    cls.add_method('IsZero', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Max() [member function]
+    cls.add_method('Max', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static ns3::Time ns3::Time::Min() [member function]
+    cls.add_method('Min', 
+                   'ns3::Time', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static void ns3::Time::SetResolution(ns3::Time::Unit resolution) [member function]
+    cls.add_method('SetResolution', 
+                   'void', 
+                   [param('ns3::Time::Unit', 'resolution')], 
+                   is_static=True)
+    ## nstime.h (module 'core'): static bool ns3::Time::StaticInit() [member function]
+    cls.add_method('StaticInit', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## nstime.h (module 'core'): ns3::int64x64_t ns3::Time::To(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('To', 
+                   'ns3::int64x64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::ToDouble(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToDouble', 
+                   'double', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    ## nstime.h (module 'core'): int64_t ns3::Time::ToInteger(ns3::Time::Unit timeUnit) const [member function]
+    cls.add_method('ToInteger', 
+                   'int64_t', 
+                   [param('ns3::Time::Unit', 'timeUnit')], 
+                   is_const=True)
+    return
+
+def register_Ns3TraceSourceAccessor_methods(root_module, cls):
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor(ns3::TraceSourceAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TraceSourceAccessor const &', 'arg0')])
+    ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor::TraceSourceAccessor() [constructor]
+    cls.add_constructor([])
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Connect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Connect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('ConnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::Disconnect(ns3::ObjectBase * obj, std::string context, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('Disconnect', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('std::string', 'context'), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trace-source-accessor.h (module 'core'): bool ns3::TraceSourceAccessor::DisconnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]
+    cls.add_method('DisconnectWithoutContext', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'obj', transfer_ownership=False), param('ns3::CallbackBase const &', 'cb')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3Trailer_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer() [constructor]
+    cls.add_constructor([])
+    ## trailer.h (module 'network'): ns3::Trailer::Trailer(ns3::Trailer const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Trailer const &', 'arg0')])
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::Deserialize(ns3::Buffer::Iterator end) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'end')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## trailer.h (module 'network'): uint32_t ns3::Trailer::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): static ns3::TypeId ns3::Trailer::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## trailer.h (module 'network'): void ns3::Trailer::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3VendorSpecificActionHeader_methods(root_module, cls):
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificActionHeader::VendorSpecificActionHeader(ns3::VendorSpecificActionHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::VendorSpecificActionHeader const &', 'arg0')])
+    ## vendor-specific-action.h (module 'wave'): ns3::VendorSpecificActionHeader::VendorSpecificActionHeader() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): uint32_t ns3::VendorSpecificActionHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): uint8_t ns3::VendorSpecificActionHeader::GetCategory() const [member function]
+    cls.add_method('GetCategory', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): ns3::TypeId ns3::VendorSpecificActionHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier ns3::VendorSpecificActionHeader::GetOrganizationIdentifier() const [member function]
+    cls.add_method('GetOrganizationIdentifier', 
+                   'ns3::OrganizationIdentifier', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): uint32_t ns3::VendorSpecificActionHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): static ns3::TypeId ns3::VendorSpecificActionHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificActionHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificActionHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::VendorSpecificActionHeader::SetOrganizationIdentifier(ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('SetOrganizationIdentifier', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi')])
+    return
+
+def register_Ns3Wifi80211pHelper_methods(root_module, cls):
+    ## wifi-80211p-helper.h (module 'wave'): ns3::Wifi80211pHelper::Wifi80211pHelper(ns3::Wifi80211pHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Wifi80211pHelper const &', 'arg0')])
+    ## wifi-80211p-helper.h (module 'wave'): ns3::Wifi80211pHelper::Wifi80211pHelper() [constructor]
+    cls.add_constructor([])
+    ## wifi-80211p-helper.h (module 'wave'): static ns3::Wifi80211pHelper ns3::Wifi80211pHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::Wifi80211pHelper', 
+                   [], 
+                   is_static=True)
+    ## wifi-80211p-helper.h (module 'wave'): static void ns3::Wifi80211pHelper::EnableLogComponents() [member function]
+    cls.add_method('EnableLogComponents', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## wifi-80211p-helper.h (module 'wave'): ns3::NetDeviceContainer ns3::Wifi80211pHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & macHelper, ns3::NodeContainer c) const [member function]
+    cls.add_method('Install', 
+                   'ns3::NetDeviceContainer', 
+                   [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'macHelper'), param('ns3::NodeContainer', 'c')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-80211p-helper.h (module 'wave'): void ns3::Wifi80211pHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('SetStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3WifiActionHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::WifiActionHeader(ns3::WifiActionHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiActionHeader const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::WifiActionHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::WifiActionHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue ns3::WifiActionHeader::GetAction() [member function]
+    cls.add_method('GetAction', 
+                   'ns3::WifiActionHeader::ActionValue', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue ns3::WifiActionHeader::GetCategory() [member function]
+    cls.add_method('GetCategory', 
+                   'ns3::WifiActionHeader::CategoryValue', 
+                   [])
+    ## mgt-headers.h (module 'wifi'): ns3::TypeId ns3::WifiActionHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): uint32_t ns3::WifiActionHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): static ns3::TypeId ns3::WifiActionHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::WifiActionHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::WifiActionHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): void ns3::WifiActionHeader::SetAction(ns3::WifiActionHeader::CategoryValue type, ns3::WifiActionHeader::ActionValue action) [member function]
+    cls.add_method('SetAction', 
+                   'void', 
+                   [param('ns3::WifiActionHeader::CategoryValue', 'type'), param('ns3::WifiActionHeader::ActionValue', 'action')])
+    return
+
+def register_Ns3WifiActionHeaderActionValue_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::ActionValue() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::ActionValue(ns3::WifiActionHeader::ActionValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'arg0')])
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::blockAck [variable]
+    cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::interwork [variable]
+    cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkMetrtic [variable]
+    cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetricActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathSelection [variable]
+    cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSelectionActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerLink [variable]
+    cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtActionValue', is_const=False)
+    ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resourceCoordination [variable]
+    cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::ResourceCoordinationActionValue', is_const=False)
+    return
+
+def register_Ns3WifiInformationElement_methods(root_module, cls):
+    cls.add_binary_comparison_operator('<')
+    cls.add_binary_comparison_operator('==')
+    ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement::WifiInformationElement() [constructor]
+    cls.add_constructor([])
+    ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElement::WifiInformationElement(ns3::WifiInformationElement const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiInformationElement const &', 'arg0')])
+    ## wifi-information-element.h (module 'wifi'): ns3::Buffer::Iterator ns3::WifiInformationElement::Deserialize(ns3::Buffer::Iterator i) [member function]
+    cls.add_method('Deserialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'i')])
+    ## wifi-information-element.h (module 'wifi'): ns3::Buffer::Iterator ns3::WifiInformationElement::DeserializeIfPresent(ns3::Buffer::Iterator i) [member function]
+    cls.add_method('DeserializeIfPresent', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'i')])
+    ## wifi-information-element.h (module 'wifi'): uint8_t ns3::WifiInformationElement::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-information-element.h (module 'wifi'): ns3::WifiInformationElementId ns3::WifiInformationElement::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-information-element.h (module 'wifi'): uint8_t ns3::WifiInformationElement::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-information-element.h (module 'wifi'): uint16_t ns3::WifiInformationElement::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-information-element.h (module 'wifi'): ns3::Buffer::Iterator ns3::WifiInformationElement::Serialize(ns3::Buffer::Iterator i) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'i')], 
+                   is_const=True)
+    ## wifi-information-element.h (module 'wifi'): void ns3::WifiInformationElement::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3WifiMac_methods(root_module, cls):
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac.h (module 'wifi'): ns3::WifiMac::WifiMac(ns3::WifiMac const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMac const &', 'arg0')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetAckTimeout() const [member function]
+    cls.add_method('GetAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetBasicBlockAckTimeout() const [member function]
+    cls.add_method('GetBasicBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::WifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetCompressedBlockAckTimeout() const [member function]
+    cls.add_method('GetCompressedBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetCtsTimeout() const [member function]
+    cls.add_method('GetCtsTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetEifsNoDifs() const [member function]
+    cls.add_method('GetEifsNoDifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetMaxPropagationDelay() const [member function]
+    cls.add_method('GetMaxPropagationDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetMsduLifetime() const [member function]
+    cls.add_method('GetMsduLifetime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetPifs() const [member function]
+    cls.add_method('GetPifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetRifs() const [member function]
+    cls.add_method('GetRifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Time ns3::WifiMac::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): ns3::Ssid ns3::WifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::WifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyPromiscRx(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyPromiscRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRx(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyRxDrop(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTx(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::NotifyTxDrop(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAckTimeout(ns3::Time ackTimeout) [member function]
+    cls.add_method('SetAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ackTimeout')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetBasicBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetBasicBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCompressedBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetCompressedBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')], 
+                   is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetCtsTimeout(ns3::Time ctsTimeout) [member function]
+    cls.add_method('SetCtsTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ctsTimeout')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetEifsNoDifs(ns3::Time eifsNoDifs) [member function]
+    cls.add_method('SetEifsNoDifs', 
+                   'void', 
+                   [param('ns3::Time', 'eifsNoDifs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetMaxPropagationDelay(ns3::Time delay) [member function]
+    cls.add_method('SetMaxPropagationDelay', 
+                   'void', 
+                   [param('ns3::Time', 'delay')])
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPifs(ns3::Time pifs) [member function]
+    cls.add_method('SetPifs', 
+                   'void', 
+                   [param('ns3::Time', 'pifs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetRifs(ns3::Time rifs) [member function]
+    cls.add_method('SetRifs', 
+                   'void', 
+                   [param('ns3::Time', 'rifs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSifs(ns3::Time sifs) [member function]
+    cls.add_method('SetSifs', 
+                   'void', 
+                   [param('ns3::Time', 'sifs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSlot(ns3::Time slotTime) [member function]
+    cls.add_method('SetSlot', 
+                   'void', 
+                   [param('ns3::Time', 'slotTime')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): bool ns3::WifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::ConfigureDcf(ns3::Ptr<ns3::Dcf> dcf, uint32_t cwmin, uint32_t cwmax, ns3::AcIndex ac) [member function]
+    cls.add_method('ConfigureDcf', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Dcf >', 'dcf'), param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('ns3::AcIndex', 'ac')], 
+                   visibility='protected')
+    ## wifi-mac.h (module 'wifi'): void ns3::WifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('FinishConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3WifiMacHeader_methods(root_module, cls):
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader(ns3::WifiMacHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMacHeader const &', 'arg0')])
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::WifiMacHeader() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr1() const [member function]
+    cls.add_method('GetAddr1', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr2() const [member function]
+    cls.add_method('GetAddr2', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr3() const [member function]
+    cls.add_method('GetAddr3', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacHeader::GetAddr4() const [member function]
+    cls.add_method('GetAddr4', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::Time ns3::WifiMacHeader::GetDuration() const [member function]
+    cls.add_method('GetDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetFragmentNumber() const [member function]
+    cls.add_method('GetFragmentNumber', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::TypeId ns3::WifiMacHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacHeader::QosAckPolicy ns3::WifiMacHeader::GetQosAckPolicy() const [member function]
+    cls.add_method('GetQosAckPolicy', 
+                   'ns3::WifiMacHeader::QosAckPolicy', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTid() const [member function]
+    cls.add_method('GetQosTid', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint8_t ns3::WifiMacHeader::GetQosTxopLimit() const [member function]
+    cls.add_method('GetQosTxopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetRawDuration() const [member function]
+    cls.add_method('GetRawDuration', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetSequenceControl() const [member function]
+    cls.add_method('GetSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint16_t ns3::WifiMacHeader::GetSequenceNumber() const [member function]
+    cls.add_method('GetSequenceNumber', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): uint32_t ns3::WifiMacHeader::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): ns3::WifiMacType ns3::WifiMacHeader::GetType() const [member function]
+    cls.add_method('GetType', 
+                   'ns3::WifiMacType', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): static ns3::TypeId ns3::WifiMacHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-mac-header.h (module 'wifi'): char const * ns3::WifiMacHeader::GetTypeString() const [member function]
+    cls.add_method('GetTypeString', 
+                   'char const *', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAck() const [member function]
+    cls.add_method('IsAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAction() const [member function]
+    cls.add_method('IsAction', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAssocReq() const [member function]
+    cls.add_method('IsAssocReq', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAssocResp() const [member function]
+    cls.add_method('IsAssocResp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsAuthentication() const [member function]
+    cls.add_method('IsAuthentication', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBeacon() const [member function]
+    cls.add_method('IsBeacon', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBlockAck() const [member function]
+    cls.add_method('IsBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsBlockAckReq() const [member function]
+    cls.add_method('IsBlockAckReq', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCfpoll() const [member function]
+    cls.add_method('IsCfpoll', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCtl() const [member function]
+    cls.add_method('IsCtl', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsCts() const [member function]
+    cls.add_method('IsCts', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsData() const [member function]
+    cls.add_method('IsData', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsDeauthentication() const [member function]
+    cls.add_method('IsDeauthentication', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsDisassociation() const [member function]
+    cls.add_method('IsDisassociation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsFromDs() const [member function]
+    cls.add_method('IsFromDs', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMgt() const [member function]
+    cls.add_method('IsMgt', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMoreFragments() const [member function]
+    cls.add_method('IsMoreFragments', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsMultihopAction() const [member function]
+    cls.add_method('IsMultihopAction', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsProbeReq() const [member function]
+    cls.add_method('IsProbeReq', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsProbeResp() const [member function]
+    cls.add_method('IsProbeResp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosAck() const [member function]
+    cls.add_method('IsQosAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosAmsdu() const [member function]
+    cls.add_method('IsQosAmsdu', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosBlockAck() const [member function]
+    cls.add_method('IsQosBlockAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosData() const [member function]
+    cls.add_method('IsQosData', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosEosp() const [member function]
+    cls.add_method('IsQosEosp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsQosNoAck() const [member function]
+    cls.add_method('IsQosNoAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsReassocReq() const [member function]
+    cls.add_method('IsReassocReq', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsReassocResp() const [member function]
+    cls.add_method('IsReassocResp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsRetry() const [member function]
+    cls.add_method('IsRetry', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsRts() const [member function]
+    cls.add_method('IsRts', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): bool ns3::WifiMacHeader::IsToDs() const [member function]
+    cls.add_method('IsToDs', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAction() [member function]
+    cls.add_method('SetAction', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr1(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddr1', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr2(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddr2', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr3(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddr3', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAddr4(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddr4', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAssocReq() [member function]
+    cls.add_method('SetAssocReq', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetAssocResp() [member function]
+    cls.add_method('SetAssocResp', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetBeacon() [member function]
+    cls.add_method('SetBeacon', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetBlockAck() [member function]
+    cls.add_method('SetBlockAck', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetBlockAckReq() [member function]
+    cls.add_method('SetBlockAckReq', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsFrom() [member function]
+    cls.add_method('SetDsFrom', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsNotFrom() [member function]
+    cls.add_method('SetDsNotFrom', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsNotTo() [member function]
+    cls.add_method('SetDsNotTo', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDsTo() [member function]
+    cls.add_method('SetDsTo', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetDuration(ns3::Time duration) [member function]
+    cls.add_method('SetDuration', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetFragmentNumber(uint8_t frag) [member function]
+    cls.add_method('SetFragmentNumber', 
+                   'void', 
+                   [param('uint8_t', 'frag')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetId(uint16_t id) [member function]
+    cls.add_method('SetId', 
+                   'void', 
+                   [param('uint16_t', 'id')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetMoreFragments() [member function]
+    cls.add_method('SetMoreFragments', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetMultihopAction() [member function]
+    cls.add_method('SetMultihopAction', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoMoreFragments() [member function]
+    cls.add_method('SetNoMoreFragments', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoOrder() [member function]
+    cls.add_method('SetNoOrder', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetNoRetry() [member function]
+    cls.add_method('SetNoRetry', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetOrder() [member function]
+    cls.add_method('SetOrder', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetProbeReq() [member function]
+    cls.add_method('SetProbeReq', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetProbeResp() [member function]
+    cls.add_method('SetProbeResp', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
+    cls.add_method('SetQosAckPolicy', 
+                   'void', 
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
+    cls.add_method('SetQosAmsdu', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosBlockAck() [member function]
+    cls.add_method('SetQosBlockAck', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosEosp() [member function]
+    cls.add_method('SetQosEosp', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoAck() [member function]
+    cls.add_method('SetQosNoAck', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoAmsdu() [member function]
+    cls.add_method('SetQosNoAmsdu', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNoEosp() [member function]
+    cls.add_method('SetQosNoEosp', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosNormalAck() [member function]
+    cls.add_method('SetQosNormalAck', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTid(uint8_t tid) [member function]
+    cls.add_method('SetQosTid', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosTxopLimit(uint8_t txop) [member function]
+    cls.add_method('SetQosTxopLimit', 
+                   'void', 
+                   [param('uint8_t', 'txop')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetRawDuration(uint16_t duration) [member function]
+    cls.add_method('SetRawDuration', 
+                   'void', 
+                   [param('uint16_t', 'duration')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetRetry() [member function]
+    cls.add_method('SetRetry', 
+                   'void', 
+                   [])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetSequenceNumber(uint16_t seq) [member function]
+    cls.add_method('SetSequenceNumber', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetType(ns3::WifiMacType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::WifiMacType', 'type')])
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetTypeData() [member function]
+    cls.add_method('SetTypeData', 
+                   'void', 
+                   [])
+    return
+
+def register_Ns3WifiMacQueue_methods(root_module, cls):
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::WifiMacQueue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiMacQueue const &', 'arg0')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
+    cls.add_constructor([])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::Dequeue(ns3::WifiMacHeader * hdr) [member function]
+    cls.add_method('Dequeue', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::DequeueByTidAndAddress(ns3::WifiMacHeader * hdr, uint8_t tid, ns3::WifiMacHeader::AddressType type, ns3::Mac48Address addr) [member function]
+    cls.add_method('DequeueByTidAndAddress', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::AddressType', 'type'), param('ns3::Mac48Address', 'addr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::DequeueFirstAvailable(ns3::WifiMacHeader * hdr, ns3::Time & tStamp, ns3::QosBlockedDestinations const * blockedPackets) [member function]
+    cls.add_method('DequeueFirstAvailable', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr'), param('ns3::Time &', 'tStamp'), param('ns3::QosBlockedDestinations const *', 'blockedPackets')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Flush() [member function]
+    cls.add_method('Flush', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Time ns3::WifiMacQueue::GetMaxDelay() const [member function]
+    cls.add_method('GetMaxDelay', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetMaxSize() const [member function]
+    cls.add_method('GetMaxSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetNPacketsByTidAndAddress(uint8_t tid, ns3::WifiMacHeader::AddressType type, ns3::Mac48Address addr) [member function]
+    cls.add_method('GetNPacketsByTidAndAddress', 
+                   'uint32_t', 
+                   [param('uint8_t', 'tid'), param('ns3::WifiMacHeader::AddressType', 'type'), param('ns3::Mac48Address', 'addr')])
+    ## wifi-mac-queue.h (module 'wifi'): uint32_t ns3::WifiMacQueue::GetSize() [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): static ns3::TypeId ns3::WifiMacQueue::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::IsEmpty() [member function]
+    cls.add_method('IsEmpty', 
+                   'bool', 
+                   [])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::Peek(ns3::WifiMacHeader * hdr) [member function]
+    cls.add_method('Peek', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::PeekByTidAndAddress(ns3::WifiMacHeader * hdr, uint8_t tid, ns3::WifiMacHeader::AddressType type, ns3::Mac48Address addr) [member function]
+    cls.add_method('PeekByTidAndAddress', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr'), param('uint8_t', 'tid'), param('ns3::WifiMacHeader::AddressType', 'type'), param('ns3::Mac48Address', 'addr')])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Ptr<ns3::Packet const> ns3::WifiMacQueue::PeekFirstAvailable(ns3::WifiMacHeader * hdr, ns3::Time & tStamp, ns3::QosBlockedDestinations const * blockedPackets) [member function]
+    cls.add_method('PeekFirstAvailable', 
+                   'ns3::Ptr< ns3::Packet const >', 
+                   [param('ns3::WifiMacHeader *', 'hdr'), param('ns3::Time &', 'tStamp'), param('ns3::QosBlockedDestinations const *', 'blockedPackets')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::PushFront(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('PushFront', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::Remove(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('Remove', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
+    cls.add_method('SetMaxDelay', 
+                   'void', 
+                   [param('ns3::Time', 'delay')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxSize(uint32_t maxSize) [member function]
+    cls.add_method('SetMaxSize', 
+                   'void', 
+                   [param('uint32_t', 'maxSize')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacQueue::GetAddressForPacket(ns3::WifiMacHeader::AddressType type, std::_List_iterator<ns3::WifiMacQueue::Item> it) [member function]
+    cls.add_method('GetAddressForPacket', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader::AddressType', 'type'), param('std::_List_iterator< ns3::WifiMacQueue::Item >', 'it')], 
+                   visibility='protected')
+    return
+
+def register_Ns3WifiPhy_methods(root_module, cls):
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy(ns3::WifiPhy const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiPhy const &', 'arg0')])
+    ## wifi-phy.h (module 'wifi'): ns3::WifiPhy::WifiPhy() [constructor]
+    cls.add_constructor([])
+    ## wifi-phy.h (module 'wifi'): int64_t ns3::WifiPhy::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
+    cls.add_method('CalculateSnr', 
+                   'double', 
+                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('CalculateTxDuration', 
+                   'ns3::Time', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
+    cls.add_method('GetBssMembershipSelector', 
+                   'uint32_t', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::WifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::WifiChannel >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetChannelBonding() const [member function]
+    cls.add_method('GetChannelBonding', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint16_t ns3::WifiPhy::GetChannelNumber() const [member function]
+    cls.add_method('GetChannelNumber', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetDelayUntilIdle() [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate11Mbps() [member function]
+    cls.add_method('GetDsssRate11Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate1Mbps() [member function]
+    cls.add_method('GetDsssRate1Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate2Mbps() [member function]
+    cls.add_method('GetDsssRate2Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetDsssRate5_5Mbps() [member function]
+    cls.add_method('GetDsssRate5_5Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate12Mbps() [member function]
+    cls.add_method('GetErpOfdmRate12Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate18Mbps() [member function]
+    cls.add_method('GetErpOfdmRate18Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate24Mbps() [member function]
+    cls.add_method('GetErpOfdmRate24Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate36Mbps() [member function]
+    cls.add_method('GetErpOfdmRate36Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate48Mbps() [member function]
+    cls.add_method('GetErpOfdmRate48Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate54Mbps() [member function]
+    cls.add_method('GetErpOfdmRate54Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate6Mbps() [member function]
+    cls.add_method('GetErpOfdmRate6Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetErpOfdmRate9Mbps() [member function]
+    cls.add_method('GetErpOfdmRate9Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetGreenfield() const [member function]
+    cls.add_method('GetGreenfield', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetMFPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetMFPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
+                   'uint8_t', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::WifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint8_t ns3::WifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNTxPower() const [member function]
+    cls.add_method('GetNTxPower', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate108MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate108MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate120MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate120MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate121_5MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate121_5MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12Mbps() [member function]
+    cls.add_method('GetOfdmRate12Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate12MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate12MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate135MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate135MbpsBW40MHzShGi() [member function]
+    cls.add_method('GetOfdmRate135MbpsBW40MHzShGi', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate13MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate13_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate13_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate14_4MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate14_4MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate150MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate150MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate15MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate15MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18Mbps() [member function]
+    cls.add_method('GetOfdmRate18Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate18MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate18MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate19_5MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate19_5MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate1_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate1_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate21_7MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate21_7MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24Mbps() [member function]
+    cls.add_method('GetOfdmRate24Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate24MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate24MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate26MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate26MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate27MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate27MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate28_9MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate28_9MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate2_25MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate2_25MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate30MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate30MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate36Mbps() [member function]
+    cls.add_method('GetOfdmRate36Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate39MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate39MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate3MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate3MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate40_5MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate40_5MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate43_3MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate43_3MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate45MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate45MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate48Mbps() [member function]
+    cls.add_method('GetOfdmRate48Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate4_5MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate4_5MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate52MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate52MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54Mbps() [member function]
+    cls.add_method('GetOfdmRate54Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate54MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate54MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate57_8MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate57_8MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate58_5MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate58_5MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate60MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate60MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate65MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate65MbpsBW20MHzShGi() [member function]
+    cls.add_method('GetOfdmRate65MbpsBW20MHzShGi', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6Mbps() [member function]
+    cls.add_method('GetOfdmRate6Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate6MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate6_5MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate6_5MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate72_2MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate72_2MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate7_2MbpsBW20MHz() [member function]
+    cls.add_method('GetOfdmRate7_2MbpsBW20MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate81MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate81MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate90MbpsBW40MHz() [member function]
+    cls.add_method('GetOfdmRate90MbpsBW40MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9Mbps() [member function]
+    cls.add_method('GetOfdmRate9Mbps', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW10MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW10MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetOfdmRate9MbpsBW5MHz() [member function]
+    cls.add_method('GetOfdmRate9MbpsBW5MHz', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static double ns3::WifiPhy::GetPayloadDurationMicroSeconds(uint32_t size, ns3::WifiTxVector txvector) [member function]
+    cls.add_method('GetPayloadDurationMicroSeconds', 
+                   'double', 
+                   [param('uint32_t', 'size'), param('ns3::WifiTxVector', 'txvector')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpHeaderDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpHeaderDurationMicroSeconds', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpHeaderMode', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpHtSigHeaderDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpHtSigHeaderDurationMicroSeconds', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpHtTrainingSymbolDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    cls.add_method('GetPlcpHtTrainingSymbolDurationMicroSeconds', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpPreambleDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('GetPlcpPreambleDurationMicroSeconds', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function]
+    cls.add_method('GetStateDuration', 
+                   'ns3::Time', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::GetStbc() const [member function]
+    cls.add_method('GetStbc', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::WifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateBusy() [member function]
+    cls.add_method('IsStateBusy', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateCcaBusy() [member function]
+    cls.add_method('IsStateCcaBusy', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateIdle() [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateRx() [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateSwitching() [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): bool ns3::WifiPhy::IsStateTx() [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::WifiPhy::McsToWifiMode(uint8_t mcs) [member function]
+    cls.add_method('McsToWifiMode', 
+                   'ns3::WifiMode', 
+                   [param('uint8_t', 'mcs')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffRx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, double signalDbm, double noiseDbm) [member function]
+    cls.add_method('NotifyMonitorSniffRx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('double', 'signalDbm'), param('double', 'noiseDbm')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyMonitorSniffTx(ns3::Ptr<ns3::Packet const> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower) [member function]
+    cls.add_method('NotifyMonitorSniffTx', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint16_t', 'channelFreqMhz'), param('uint16_t', 'channelNumber'), param('uint32_t', 'rate'), param('bool', 'isShortPreamble'), param('uint8_t', 'txPower')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRxBegin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxDrop(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyRxEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxBegin(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTxBegin', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxDrop(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTxDrop', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyTxEnd(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NotifyTxEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
+                   'void', 
+                   [param('ns3::WifiPhyListener *', 'listener')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelBonding(bool channelbonding) [member function]
+    cls.add_method('SetChannelBonding', 
+                   'void', 
+                   [param('bool', 'channelbonding')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetChannelNumber(uint16_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint16_t', 'id')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetFrequency(uint32_t freq) [member function]
+    cls.add_method('SetFrequency', 
+                   'void', 
+                   [param('uint32_t', 'freq')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGreenfield(bool greenfield) [member function]
+    cls.add_method('SetGreenfield', 
+                   'void', 
+                   [param('bool', 'greenfield')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('bool', 'guardInterval')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('bool', 'ldpc')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
+    cls.add_method('SetNumberOfReceiveAntennas', 
+                   'void', 
+                   [param('uint32_t', 'rx')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
+    cls.add_method('SetNumberOfTransmitAntennas', 
+                   'void', 
+                   [param('uint32_t', 'tx')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveErrorCallback(ns3::Callback<void,ns3::Ptr<const ns3::Packet>,double,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3::Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiMode,ns3::WifiPreamble,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetStbc(bool stbc) [member function]
+    cls.add_method('SetStbc', 
+                   'void', 
+                   [param('bool', 'stbc')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## wifi-phy.h (module 'wifi'): uint32_t ns3::WifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
+    cls.add_method('WifiModeToMcs', 
+                   'uint32_t', 
+                   [param('ns3::WifiMode', 'mode')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3WifiRemoteStationManager_methods(root_module, cls):
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager(ns3::WifiRemoteStationManager const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiRemoteStationManager const &', 'arg0')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::WifiRemoteStationManager() [constructor]
+    cls.add_constructor([])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(uint8_t mcs) [member function]
+    cls.add_method('AddBasicMcs', 
+                   'void', 
+                   [param('uint8_t', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMode(ns3::WifiMode mode) [member function]
+    cls.add_method('AddBasicMode', 
+                   'void', 
+                   [param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddStationHtCapabilities(ns3::Mac48Address from, ns3::HtCapabilities htcapabilities) [member function]
+    cls.add_method('AddStationHtCapabilities', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'from'), param('ns3::HtCapabilities', 'htcapabilities')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMcs(ns3::Mac48Address address, uint8_t mcs) [member function]
+    cls.add_method('AddSupportedMcs', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('uint8_t', 'mcs')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddSupportedMode(ns3::Mac48Address address, ns3::WifiMode mode) [member function]
+    cls.add_method('AddSupportedMode', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'mode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetCtsToSelfTxVector() [member function]
+    cls.add_method('DoGetCtsToSelfTxVector', 
+                   'ns3::WifiTxVector', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetAckTxVector(ns3::Mac48Address address, ns3::WifiMode dataMode) [member function]
+    cls.add_method('GetAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetBasicMcs(uint32_t i) const [member function]
+    cls.add_method('GetBasicMcs', 
+                   'uint8_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetBasicMode(uint32_t i) const [member function]
+    cls.add_method('GetBasicMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetBlockAckTxVector(ns3::Mac48Address address, ns3::WifiMode dataMode) [member function]
+    cls.add_method('GetBlockAckTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'dataMode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsToSelfTxVector(ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('GetCtsToSelfTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetCtsTxVector(ns3::Mac48Address address, ns3::WifiMode rtsMode) [member function]
+    cls.add_method('GetCtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'rtsMode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetDataTxVector(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fullPacketSize) [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultMcs() const [member function]
+    cls.add_method('GetDefaultMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetDefaultMode() const [member function]
+    cls.add_method('GetDefaultMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetDefaultTxPowerLevel() const [member function]
+    cls.add_method('GetDefaultTxPowerLevel', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentOffset(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentOffset', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentSize(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fragmentNumber) [member function]
+    cls.add_method('GetFragmentSize', 
+                   'uint32_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetFragmentationThreshold() const [member function]
+    cls.add_method('GetFragmentationThreshold', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfieldSupported(ns3::Mac48Address address) const [member function]
+    cls.add_method('GetGreenfieldSupported', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationInfo ns3::WifiRemoteStationManager::GetInfo(ns3::Mac48Address address) [member function]
+    cls.add_method('GetInfo', 
+                   'ns3::WifiRemoteStationInfo', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetMaxSlrc() const [member function]
+    cls.add_method('GetMaxSlrc', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetMaxSsrc() const [member function]
+    cls.add_method('GetMaxSsrc', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNBasicMcs() const [member function]
+    cls.add_method('GetNBasicMcs', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNBasicModes() const [member function]
+    cls.add_method('GetNBasicModes', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetNonUnicastMode() const [member function]
+    cls.add_method('GetNonUnicastMode', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNumberOfTransmitAntennas() [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetRtsCtsThreshold() const [member function]
+    cls.add_method('GetRtsCtsThreshold', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::GetRtsTxVector(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('GetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): static ns3::TypeId ns3::WifiRemoteStationManager::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::HasHtSupported() const [member function]
+    cls.add_method('HasHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsAssociated(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsAssociated', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsBrandNew(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsBrandNew', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLastFragment(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fragmentNumber) [member function]
+    cls.add_method('IsLastFragment', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fragmentNumber')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsWaitAssocTxOk(ns3::Mac48Address address) const [member function]
+    cls.add_method('IsWaitAssocTxOk', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedCtsToSelf(ns3::WifiTxVector txVector) [member function]
+    cls.add_method('NeedCtsToSelf', 
+                   'bool', 
+                   [param('ns3::WifiTxVector', 'txVector')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedDataRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NeedDataRetransmission', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedFragmentation(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NeedFragmentation', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRts(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NeedRts', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::NeedRtsRetransmission(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('NeedRtsRetransmission', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::PrepareForQueue(ns3::Mac48Address address, ns3::WifiMacHeader const * header, ns3::Ptr<ns3::Packet const> packet, uint32_t fullPacketSize) [member function]
+    cls.add_method('PrepareForQueue', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('uint32_t', 'fullPacketSize')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordDisassociated(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordDisassociated', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxFailed(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordGotAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordGotAssocTxOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::RecordWaitAssocTxOk(ns3::Mac48Address address) [member function]
+    cls.add_method('RecordWaitAssocTxOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    cls.add_method('ReportDataFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportDataOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ackSnr, ns3::WifiMode ackMode, double dataSnr) [member function]
+    cls.add_method('ReportDataOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalDataFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    cls.add_method('ReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportFinalRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    cls.add_method('ReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsFailed(ns3::Mac48Address address, ns3::WifiMacHeader const * header) [member function]
+    cls.add_method('ReportRtsFailed', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRtsOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('ReportRtsOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::ReportRxOk(ns3::Mac48Address address, ns3::WifiMacHeader const * header, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('ReportRxOk', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMacHeader const *', 'header'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset() [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::Reset(ns3::Mac48Address address) [member function]
+    cls.add_method('Reset', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
+    cls.add_method('SetDefaultTxPowerLevel', 
+                   'void', 
+                   [param('uint8_t', 'txPower')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetFragmentationThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetFragmentationThreshold', 
+                   'void', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetHtSupported(bool enable) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSlrc(uint32_t maxSlrc) [member function]
+    cls.add_method('SetMaxSlrc', 
+                   'void', 
+                   [param('uint32_t', 'maxSlrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetMaxSsrc(uint32_t maxSsrc) [member function]
+    cls.add_method('SetMaxSsrc', 
+                   'void', 
+                   [param('uint32_t', 'maxSsrc')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetRtsCtsThreshold(uint32_t threshold) [member function]
+    cls.add_method('SetRtsCtsThreshold', 
+                   'void', 
+                   [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetupPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetupPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetGreenfield(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetGreenfield', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetLongRetryCount(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetLongRetryCount', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::GetMcsSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    cls.add_method('GetMcsSupported', 
+                   'uint8_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNMcsSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNMcsSupported', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNSupported(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNSupported', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNumberOfReceiveAntennas(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetNumberOfTransmitAntennas(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetShortGuardInterval(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetShortGuardInterval', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): uint32_t ns3::WifiRemoteStationManager::GetShortRetryCount(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetShortRetryCount', 
+                   'uint32_t', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::GetStbc(ns3::WifiRemoteStation const * station) const [member function]
+    cls.add_method('GetStbc', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation const *', 'station')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiMode ns3::WifiRemoteStationManager::GetSupported(ns3::WifiRemoteStation const * station, uint32_t i) const [member function]
+    cls.add_method('GetSupported', 
+                   'ns3::WifiMode', 
+                   [param('ns3::WifiRemoteStation const *', 'station'), param('uint32_t', 'i')], 
+                   is_const=True, visibility='protected')
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStation * ns3::WifiRemoteStationManager::DoCreateStation() const [member function]
+    cls.add_method('DoCreateStation', 
+                   'ns3::WifiRemoteStation *', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxGuardInterval', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetAckTxNess(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxNess', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetAckTxNss(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxNss', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetAckTxPowerLevel(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxPowerLevel', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetAckTxStbc(ns3::Mac48Address address, ns3::WifiMode ackMode) [member function]
+    cls.add_method('DoGetAckTxStbc', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ackMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxGuardInterval', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetBlockAckTxNess(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxNess', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetBlockAckTxNss(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxNss', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetBlockAckTxPowerLevel(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxPowerLevel', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetBlockAckTxStbc(ns3::Mac48Address address, ns3::WifiMode blockAckMode) [member function]
+    cls.add_method('DoGetBlockAckTxStbc', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'blockAckMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxGuardInterval(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxGuardInterval', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetCtsTxNess(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxNess', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetCtsTxNss(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxNss', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint8_t ns3::WifiRemoteStationManager::DoGetCtsTxPowerLevel(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxPowerLevel', 
+                   'uint8_t', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoGetCtsTxStbc(ns3::Mac48Address address, ns3::WifiMode ctsMode) [member function]
+    cls.add_method('DoGetCtsTxStbc', 
+                   'bool', 
+                   [param('ns3::Mac48Address', 'address'), param('ns3::WifiMode', 'ctsMode')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetDataTxVector(ns3::WifiRemoteStation * station, uint32_t size) [member function]
+    cls.add_method('DoGetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('uint32_t', 'size')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiTxVector ns3::WifiRemoteStationManager::DoGetRtsTxVector(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoGetRtsTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedDataRetransmission(ns3::WifiRemoteStation * station, ns3::Ptr<ns3::Packet const> packet, bool normally) [member function]
+    cls.add_method('DoNeedDataRetransmission', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedFragmentation(ns3::WifiRemoteStation * station, ns3::Ptr<ns3::Packet const> packet, bool normally) [member function]
+    cls.add_method('DoNeedFragmentation', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRts(ns3::WifiRemoteStation * station, ns3::Ptr<ns3::Packet const> packet, bool normally) [member function]
+    cls.add_method('DoNeedRts', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::DoNeedRtsRetransmission(ns3::WifiRemoteStation * station, ns3::Ptr<ns3::Packet const> packet, bool normally) [member function]
+    cls.add_method('DoNeedRtsRetransmission', 
+                   'bool', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('bool', 'normally')], 
+                   visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportDataOk(ns3::WifiRemoteStation * station, double ackSnr, ns3::WifiMode ackMode, double dataSnr) [member function]
+    cls.add_method('DoReportDataOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ackSnr'), param('ns3::WifiMode', 'ackMode'), param('double', 'dataSnr')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalDataFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalDataFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportFinalRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportFinalRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsFailed(ns3::WifiRemoteStation * station) [member function]
+    cls.add_method('DoReportRtsFailed', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRtsOk(ns3::WifiRemoteStation * station, double ctsSnr, ns3::WifiMode ctsMode, double rtsSnr) [member function]
+    cls.add_method('DoReportRtsOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'ctsSnr'), param('ns3::WifiMode', 'ctsMode'), param('double', 'rtsSnr')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::DoReportRxOk(ns3::WifiRemoteStation * station, double rxSnr, ns3::WifiMode txMode) [member function]
+    cls.add_method('DoReportRxOk', 
+                   'void', 
+                   [param('ns3::WifiRemoteStation *', 'station'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode')], 
+                   is_pure_virtual=True, visibility='private', is_virtual=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): bool ns3::WifiRemoteStationManager::IsLowLatency() const [member function]
+    cls.add_method('IsLowLatency', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3AttributeAccessor_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor(ns3::AttributeAccessor const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeAccessor const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeAccessor::AttributeAccessor() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Get(ns3::ObjectBase const * object, ns3::AttributeValue & attribute) const [member function]
+    cls.add_method('Get', 
+                   'bool', 
+                   [param('ns3::ObjectBase const *', 'object'), param('ns3::AttributeValue &', 'attribute')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasGetter() const [member function]
+    cls.add_method('HasGetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::HasSetter() const [member function]
+    cls.add_method('HasSetter', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeAccessor::Set(ns3::ObjectBase * object, ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Set', 
+                   'bool', 
+                   [param('ns3::ObjectBase *', 'object', transfer_ownership=False), param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeChecker_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker(ns3::AttributeChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeChecker const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeChecker::AttributeChecker() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Check(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('Check', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::Copy(ns3::AttributeValue const & source, ns3::AttributeValue & destination) const [member function]
+    cls.add_method('Copy', 
+                   'bool', 
+                   [param('ns3::AttributeValue const &', 'source'), param('ns3::AttributeValue &', 'destination')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::Create() const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeChecker::CreateValidValue(ns3::AttributeValue const & value) const [member function]
+    cls.add_method('CreateValidValue', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [param('ns3::AttributeValue const &', 'value')], 
+                   is_const=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetUnderlyingTypeInformation() const [member function]
+    cls.add_method('GetUnderlyingTypeInformation', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeChecker::GetValueTypeName() const [member function]
+    cls.add_method('GetValueTypeName', 
+                   'std::string', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeChecker::HasUnderlyingTypeInformation() const [member function]
+    cls.add_method('HasUnderlyingTypeInformation', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3AttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue(ns3::AttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::AttributeValue::AttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::AttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::AttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::AttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackChecker_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackChecker::CallbackChecker(ns3::CallbackChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackChecker const &', 'arg0')])
+    return
+
+def register_Ns3CallbackImplBase_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackImplBase::CallbackImplBase(ns3::CallbackImplBase const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackImplBase const &', 'arg0')])
+    ## callback.h (module 'core'): bool ns3::CallbackImplBase::IsEqual(ns3::Ptr<ns3::CallbackImplBase const> other) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::CallbackImplBase const >', 'other')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3CallbackValue_methods(root_module, cls):
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CallbackValue const &', 'arg0')])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue() [constructor]
+    cls.add_constructor([])
+    ## callback.h (module 'core'): ns3::CallbackValue::CallbackValue(ns3::CallbackBase const & base) [constructor]
+    cls.add_constructor([param('ns3::CallbackBase const &', 'base')])
+    ## callback.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::CallbackValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): bool ns3::CallbackValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## callback.h (module 'core'): std::string ns3::CallbackValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## callback.h (module 'core'): void ns3::CallbackValue::Set(ns3::CallbackBase base) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::CallbackBase', 'base')])
+    return
+
+def register_Ns3CtrlBAckRequestHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader(ns3::CtrlBAckRequestHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CtrlBAckRequestHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckRequestHeader::CtrlBAckRequestHeader() [constructor]
+    cls.add_constructor([])
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckRequestHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckRequestHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckRequestHeader::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckRequestHeader::GetTidInfo() const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckRequestHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckRequestHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
+                   'void', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetTidInfo(uint8_t tid) [member function]
+    cls.add_method('SetTidInfo', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckRequestHeader::SetType(ns3::BlockAckType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::BlockAckType', 'type')])
+    return
+
+def register_Ns3CtrlBAckResponseHeader_methods(root_module, cls):
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader(ns3::CtrlBAckResponseHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::CtrlBAckResponseHeader const &', 'arg0')])
+    ## ctrl-headers.h (module 'wifi'): ns3::CtrlBAckResponseHeader::CtrlBAckResponseHeader() [constructor]
+    cls.add_constructor([])
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::Deserialize(ns3::Buffer::Iterator start) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t const * ns3::CtrlBAckResponseHeader::GetBitmap() const [member function]
+    cls.add_method('GetBitmap', 
+                   'uint16_t const *', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint64_t ns3::CtrlBAckResponseHeader::GetCompressedBitmap() const [member function]
+    cls.add_method('GetCompressedBitmap', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): ns3::TypeId ns3::CtrlBAckResponseHeader::GetInstanceTypeId() const [member function]
+    cls.add_method('GetInstanceTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint32_t ns3::CtrlBAckResponseHeader::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequence() const [member function]
+    cls.add_method('GetStartingSequence', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint16_t ns3::CtrlBAckResponseHeader::GetStartingSequenceControl() const [member function]
+    cls.add_method('GetStartingSequenceControl', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): uint8_t ns3::CtrlBAckResponseHeader::GetTidInfo() const [member function]
+    cls.add_method('GetTidInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): static ns3::TypeId ns3::CtrlBAckResponseHeader::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsBasic() const [member function]
+    cls.add_method('IsBasic', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsCompressed() const [member function]
+    cls.add_method('IsCompressed', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsFragmentReceived(uint16_t seq, uint8_t frag) const [member function]
+    cls.add_method('IsFragmentReceived', 
+                   'bool', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsMultiTid() const [member function]
+    cls.add_method('IsMultiTid', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::IsPacketReceived(uint16_t seq) const [member function]
+    cls.add_method('IsPacketReceived', 
+                   'bool', 
+                   [param('uint16_t', 'seq')], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): bool ns3::CtrlBAckResponseHeader::MustSendHtImmediateAck() const [member function]
+    cls.add_method('MustSendHtImmediateAck', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::ResetBitmap() [member function]
+    cls.add_method('ResetBitmap', 
+                   'void', 
+                   [])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
+    cls.add_method('SetHtImmediateAck', 
+                   'void', 
+                   [param('bool', 'immediateAck')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
+    cls.add_method('SetReceivedFragment', 
+                   'void', 
+                   [param('uint16_t', 'seq'), param('uint8_t', 'frag')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedPacket(uint16_t seq) [member function]
+    cls.add_method('SetReceivedPacket', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequence(uint16_t seq) [member function]
+    cls.add_method('SetStartingSequence', 
+                   'void', 
+                   [param('uint16_t', 'seq')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetStartingSequenceControl(uint16_t seqControl) [member function]
+    cls.add_method('SetStartingSequenceControl', 
+                   'void', 
+                   [param('uint16_t', 'seqControl')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetTidInfo(uint8_t tid) [member function]
+    cls.add_method('SetTidInfo', 
+                   'void', 
+                   [param('uint8_t', 'tid')])
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetType(ns3::BlockAckType type) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('ns3::BlockAckType', 'type')])
+    return
+
+def register_Ns3Dcf_methods(root_module, cls):
+    ## dcf.h (module 'wifi'): ns3::Dcf::Dcf() [constructor]
+    cls.add_constructor([])
+    ## dcf.h (module 'wifi'): ns3::Dcf::Dcf(ns3::Dcf const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Dcf const &', 'arg0')])
+    ## dcf.h (module 'wifi'): uint32_t ns3::Dcf::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): uint32_t ns3::Dcf::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): uint32_t ns3::Dcf::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): static ns3::TypeId ns3::Dcf::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## dcf.h (module 'wifi'): void ns3::Dcf::SetAifsn(uint32_t aifsn) [member function]
+    cls.add_method('SetAifsn', 
+                   'void', 
+                   [param('uint32_t', 'aifsn')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): void ns3::Dcf::SetMaxCw(uint32_t maxCw) [member function]
+    cls.add_method('SetMaxCw', 
+                   'void', 
+                   [param('uint32_t', 'maxCw')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## dcf.h (module 'wifi'): void ns3::Dcf::SetMinCw(uint32_t minCw) [member function]
+    cls.add_method('SetMinCw', 
+                   'void', 
+                   [param('uint32_t', 'minCw')], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3EdcaTxopN_methods(root_module, cls):
+    ## edca-txop-n.h (module 'wifi'): static ns3::TypeId ns3::EdcaTxopN::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## edca-txop-n.h (module 'wifi'): ns3::EdcaTxopN::EdcaTxopN() [constructor]
+    cls.add_constructor([])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetLow(ns3::Ptr<ns3::MacLow> low) [member function]
+    cls.add_method('SetLow', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacLow >', 'low')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetTxMiddle(ns3::MacTxMiddle * txMiddle) [member function]
+    cls.add_method('SetTxMiddle', 
+                   'void', 
+                   [param('ns3::MacTxMiddle *', 'txMiddle')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetManager(ns3::DcfManager * manager) [member function]
+    cls.add_method('SetManager', 
+                   'void', 
+                   [param('ns3::DcfManager *', 'manager')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetTxOkCallback(ns3::Callback<void, ns3::WifiMacHeader const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetTxOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetTxFailedCallback(ns3::Callback<void, ns3::WifiMacHeader const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetTxFailedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> remoteManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'remoteManager')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')])
+    ## edca-txop-n.h (module 'wifi'): ns3::TypeOfStation ns3::EdcaTxopN::GetTypeOfStation() const [member function]
+    cls.add_method('GetTypeOfStation', 
+                   'ns3::TypeOfStation', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::EdcaTxopN::GetQueue() const [member function]
+    cls.add_method('GetQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetMinCw(uint32_t minCw) [member function]
+    cls.add_method('SetMinCw', 
+                   'void', 
+                   [param('uint32_t', 'minCw')], 
+                   is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetMaxCw(uint32_t maxCw) [member function]
+    cls.add_method('SetMaxCw', 
+                   'void', 
+                   [param('uint32_t', 'maxCw')], 
+                   is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetAifsn(uint32_t aifsn) [member function]
+    cls.add_method('SetAifsn', 
+                   'void', 
+                   [param('uint32_t', 'aifsn')], 
+                   is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## edca-txop-n.h (module 'wifi'): ns3::Ptr<ns3::MacLow> ns3::EdcaTxopN::Low() [member function]
+    cls.add_method('Low', 
+                   'ns3::Ptr< ns3::MacLow >', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): ns3::Ptr<ns3::MsduAggregator> ns3::EdcaTxopN::GetMsduAggregator() const [member function]
+    cls.add_method('GetMsduAggregator', 
+                   'ns3::Ptr< ns3::MsduAggregator >', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedsAccess() const [member function]
+    cls.add_method('NeedsAccess', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NotifyAccessGranted() [member function]
+    cls.add_method('NotifyAccessGranted', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NotifyInternalCollision() [member function]
+    cls.add_method('NotifyInternalCollision', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NotifyCollision() [member function]
+    cls.add_method('NotifyCollision', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NotifyChannelSwitching() [member function]
+    cls.add_method('NotifyChannelSwitching', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotCts(double snr, ns3::WifiMode txMode) [member function]
+    cls.add_method('GotCts', 
+                   'void', 
+                   [param('double', 'snr'), param('ns3::WifiMode', 'txMode')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::MissedCts() [member function]
+    cls.add_method('MissedCts', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotAck(double snr, ns3::WifiMode txMode) [member function]
+    cls.add_method('GotAck', 
+                   'void', 
+                   [param('double', 'snr'), param('ns3::WifiMode', 'txMode')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotBlockAck(ns3::CtrlBAckResponseHeader const * blockAck, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotBlockAck', 
+                   'void', 
+                   [param('ns3::CtrlBAckResponseHeader const *', 'blockAck'), param('ns3::Mac48Address', 'recipient')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::MissedBlockAck() [member function]
+    cls.add_method('MissedBlockAck', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotAddBaResponse(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotAddBaResponse', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::GotDelBaFrame(ns3::MgtDelBaHeader const * delBaHdr, ns3::Mac48Address recipient) [member function]
+    cls.add_method('GotDelBaFrame', 
+                   'void', 
+                   [param('ns3::MgtDelBaHeader const *', 'delBaHdr'), param('ns3::Mac48Address', 'recipient')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::MissedAck() [member function]
+    cls.add_method('MissedAck', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::StartNext() [member function]
+    cls.add_method('StartNext', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::EndTxNoAck() [member function]
+    cls.add_method('EndTxNoAck', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::RestartAccessIfNeeded() [member function]
+    cls.add_method('RestartAccessIfNeeded', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::StartAccessIfNeeded() [member function]
+    cls.add_method('StartAccessIfNeeded', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedRts() [member function]
+    cls.add_method('NeedRts', 
+                   'bool', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedRtsRetransmission() [member function]
+    cls.add_method('NeedRtsRetransmission', 
+                   'bool', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedDataRetransmission() [member function]
+    cls.add_method('NeedDataRetransmission', 
+                   'bool', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::NeedFragmentation() const [member function]
+    cls.add_method('NeedFragmentation', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetNextFragmentSize() [member function]
+    cls.add_method('GetNextFragmentSize', 
+                   'uint32_t', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetFragmentSize() [member function]
+    cls.add_method('GetFragmentSize', 
+                   'uint32_t', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): uint32_t ns3::EdcaTxopN::GetFragmentOffset() [member function]
+    cls.add_method('GetFragmentOffset', 
+                   'uint32_t', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): bool ns3::EdcaTxopN::IsLastFragment() const [member function]
+    cls.add_method('IsLastFragment', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::NextFragment() [member function]
+    cls.add_method('NextFragment', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): ns3::Ptr<ns3::Packet> ns3::EdcaTxopN::GetFragmentPacket(ns3::WifiMacHeader * hdr) [member function]
+    cls.add_method('GetFragmentPacket', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('ns3::WifiMacHeader *', 'hdr')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetAccessCategory(ns3::AcIndex ac) [member function]
+    cls.add_method('SetAccessCategory', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::Queue(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('Queue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetMsduAggregator(ns3::Ptr<ns3::MsduAggregator> aggr) [member function]
+    cls.add_method('SetMsduAggregator', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MsduAggregator >', 'aggr')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::PushFront(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('PushFront', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::CompleteConfig() [member function]
+    cls.add_method('CompleteConfig', 
+                   'void', 
+                   [])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetBlockAckThreshold(uint8_t threshold) [member function]
+    cls.add_method('SetBlockAckThreshold', 
+                   'void', 
+                   [param('uint8_t', 'threshold')])
+    ## edca-txop-n.h (module 'wifi'): uint8_t ns3::EdcaTxopN::GetBlockAckThreshold() const [member function]
+    cls.add_method('GetBlockAckThreshold', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SetBlockAckInactivityTimeout(uint16_t timeout) [member function]
+    cls.add_method('SetBlockAckInactivityTimeout', 
+                   'void', 
+                   [param('uint16_t', 'timeout')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::SendDelbaFrame(ns3::Mac48Address addr, uint8_t tid, bool byOriginator) [member function]
+    cls.add_method('SendDelbaFrame', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'addr'), param('uint8_t', 'tid'), param('bool', 'byOriginator')])
+    ## edca-txop-n.h (module 'wifi'): int64_t ns3::EdcaTxopN::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## edca-txop-n.h (module 'wifi'): void ns3::EdcaTxopN::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EmptyAttributeValue_methods(root_module, cls):
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue(ns3::EmptyAttributeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EmptyAttributeValue const &', 'arg0')])
+    ## attribute.h (module 'core'): ns3::EmptyAttributeValue::EmptyAttributeValue() [constructor]
+    cls.add_constructor([])
+    ## attribute.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::EmptyAttributeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): bool ns3::EmptyAttributeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   visibility='private', is_virtual=True)
+    ## attribute.h (module 'core'): std::string ns3::EmptyAttributeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3EventImpl_methods(root_module, cls):
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl(ns3::EventImpl const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::EventImpl const &', 'arg0')])
+    ## event-impl.h (module 'core'): ns3::EventImpl::EventImpl() [constructor]
+    cls.add_constructor([])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Cancel() [member function]
+    cls.add_method('Cancel', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Invoke() [member function]
+    cls.add_method('Invoke', 
+                   'void', 
+                   [])
+    ## event-impl.h (module 'core'): bool ns3::EventImpl::IsCancelled() [member function]
+    cls.add_method('IsCancelled', 
+                   'bool', 
+                   [])
+    ## event-impl.h (module 'core'): void ns3::EventImpl::Notify() [member function]
+    cls.add_method('Notify', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3ExtendedSupportedRatesIE_methods(root_module, cls):
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::ExtendedSupportedRatesIE const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ExtendedSupportedRatesIE const &', 'arg0')])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE() [constructor]
+    cls.add_constructor([])
+    ## supported-rates.h (module 'wifi'): ns3::ExtendedSupportedRatesIE::ExtendedSupportedRatesIE(ns3::SupportedRates * rates) [constructor]
+    cls.add_constructor([param('ns3::SupportedRates *', 'rates')])
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::ExtendedSupportedRatesIE::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::ExtendedSupportedRatesIE::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint16_t ns3::ExtendedSupportedRatesIE::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): ns3::Buffer::Iterator ns3::ExtendedSupportedRatesIE::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): void ns3::ExtendedSupportedRatesIE::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3HtCapabilities_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities(ns3::HtCapabilities const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::HtCapabilities const &', 'arg0')])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities::HtCapabilities() [constructor]
+    cls.add_constructor([])
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): ns3::WifiInformationElementId ns3::HtCapabilities::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetAmpduParameters() const [member function]
+    cls.add_method('GetAmpduParameters', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetGreenfield() const [member function]
+    cls.add_method('GetGreenfield', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetHtCapabilitiesInfo() const [member function]
+    cls.add_method('GetHtCapabilitiesInfo', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t * ns3::HtCapabilities::GetRxMcsBitmask() [member function]
+    cls.add_method('GetRxMcsBitmask', 
+                   'uint8_t *', 
+                   [])
+    ## ht-capabilities.h (module 'wifi'): uint16_t ns3::HtCapabilities::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetShortGuardInterval20() const [member function]
+    cls.add_method('GetShortGuardInterval20', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint8_t ns3::HtCapabilities::GetSupportedChannelWidth() const [member function]
+    cls.add_method('GetSupportedChannelWidth', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet1() const [member function]
+    cls.add_method('GetSupportedMcsSet1', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): uint64_t ns3::HtCapabilities::GetSupportedMcsSet2() const [member function]
+    cls.add_method('GetSupportedMcsSet2', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilities::IsSupportedMcs(uint8_t mcs) [member function]
+    cls.add_method('IsSupportedMcs', 
+                   'bool', 
+                   [param('uint8_t', 'mcs')])
+    ## ht-capabilities.h (module 'wifi'): ns3::Buffer::Iterator ns3::HtCapabilities::Serialize(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('Serialize', 
+                   'ns3::Buffer::Iterator', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetAmpduParameters(uint8_t ctrl) [member function]
+    cls.add_method('SetAmpduParameters', 
+                   'void', 
+                   [param('uint8_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetGreenfield(uint8_t greenfield) [member function]
+    cls.add_method('SetGreenfield', 
+                   'void', 
+                   [param('uint8_t', 'greenfield')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtCapabilitiesInfo(uint16_t ctrl) [member function]
+    cls.add_method('SetHtCapabilitiesInfo', 
+                   'void', 
+                   [param('uint16_t', 'ctrl')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetHtSupported(uint8_t htsupported) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('uint8_t', 'htsupported')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetLdpc(uint8_t ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('uint8_t', 'ldpc')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetRxMcsBitmask(uint8_t index) [member function]
+    cls.add_method('SetRxMcsBitmask', 
+                   'void', 
+                   [param('uint8_t', 'index')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetShortGuardInterval20(uint8_t shortguardinterval) [member function]
+    cls.add_method('SetShortGuardInterval20', 
+                   'void', 
+                   [param('uint8_t', 'shortguardinterval')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedChannelWidth(uint8_t supportedchannelwidth) [member function]
+    cls.add_method('SetSupportedChannelWidth', 
+                   'void', 
+                   [param('uint8_t', 'supportedchannelwidth')])
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilities::SetSupportedMcsSet(uint64_t ctrl1, uint64_t ctrl2) [member function]
+    cls.add_method('SetSupportedMcsSet', 
+                   'void', 
+                   [param('uint64_t', 'ctrl1'), param('uint64_t', 'ctrl2')])
+    return
+
+def register_Ns3HtCapabilitiesChecker_methods(root_module, cls):
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesChecker::HtCapabilitiesChecker() [constructor]
+    cls.add_constructor([])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesChecker::HtCapabilitiesChecker(ns3::HtCapabilitiesChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::HtCapabilitiesChecker const &', 'arg0')])
+    return
+
+def register_Ns3HtCapabilitiesValue_methods(root_module, cls):
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesValue::HtCapabilitiesValue() [constructor]
+    cls.add_constructor([])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesValue::HtCapabilitiesValue(ns3::HtCapabilitiesValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::HtCapabilitiesValue const &', 'arg0')])
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilitiesValue::HtCapabilitiesValue(ns3::HtCapabilities const & value) [constructor]
+    cls.add_constructor([param('ns3::HtCapabilities const &', 'value')])
+    ## ht-capabilities.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::HtCapabilitiesValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): bool ns3::HtCapabilitiesValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): ns3::HtCapabilities ns3::HtCapabilitiesValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::HtCapabilities', 
+                   [], 
+                   is_const=True)
+    ## ht-capabilities.h (module 'wifi'): std::string ns3::HtCapabilitiesValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ht-capabilities.h (module 'wifi'): void ns3::HtCapabilitiesValue::Set(ns3::HtCapabilities const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::HtCapabilities const &', 'value')])
+    return
+
+def register_Ns3Ipv4AddressChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressChecker::Ipv4AddressChecker(ns3::Ipv4AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4AddressValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4AddressValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue::Ipv4AddressValue(ns3::Ipv4Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Address const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Address ns3::Ipv4AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4AddressValue::Set(ns3::Ipv4Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Address const &', 'value')])
+    return
+
+def register_Ns3Ipv4MaskChecker_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker::Ipv4MaskChecker(ns3::Ipv4MaskChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv4MaskValue_methods(root_module, cls):
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue() [constructor]
+    cls.add_constructor([])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4MaskValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv4MaskValue const &', 'arg0')])
+    ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue::Ipv4MaskValue(ns3::Ipv4Mask const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv4Mask const &', 'value')])
+    ## ipv4-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv4MaskValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): bool ns3::Ipv4MaskValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv4-address.h (module 'network'): ns3::Ipv4Mask ns3::Ipv4MaskValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv4Mask', 
+                   [], 
+                   is_const=True)
+    ## ipv4-address.h (module 'network'): std::string ns3::Ipv4MaskValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-address.h (module 'network'): void ns3::Ipv4MaskValue::Set(ns3::Ipv4Mask const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv4Mask const &', 'value')])
+    return
+
+def register_Ns3Ipv6AddressChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressChecker::Ipv6AddressChecker(ns3::Ipv6AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6AddressValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6AddressValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6AddressValue::Ipv6AddressValue(ns3::Ipv6Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Address const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Address ns3::Ipv6AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6AddressValue::Set(ns3::Ipv6Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6PrefixChecker_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixChecker::Ipv6PrefixChecker(ns3::Ipv6PrefixChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixChecker const &', 'arg0')])
+    return
+
+def register_Ns3Ipv6PrefixValue_methods(root_module, cls):
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue() [constructor]
+    cls.add_constructor([])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6PrefixValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ipv6PrefixValue const &', 'arg0')])
+    ## ipv6-address.h (module 'network'): ns3::Ipv6PrefixValue::Ipv6PrefixValue(ns3::Ipv6Prefix const & value) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Prefix const &', 'value')])
+    ## ipv6-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Ipv6PrefixValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6PrefixValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ipv6-address.h (module 'network'): ns3::Ipv6Prefix ns3::Ipv6PrefixValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ipv6Prefix', 
+                   [], 
+                   is_const=True)
+    ## ipv6-address.h (module 'network'): std::string ns3::Ipv6PrefixValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-address.h (module 'network'): void ns3::Ipv6PrefixValue::Set(ns3::Ipv6Prefix const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ipv6Prefix const &', 'value')])
+    return
+
+def register_Ns3Mac48AddressChecker_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker(ns3::Mac48AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3Mac48AddressValue_methods(root_module, cls):
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue() [constructor]
+    cls.add_constructor([])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Mac48AddressValue const &', 'arg0')])
+    ## mac48-address.h (module 'network'): ns3::Mac48AddressValue::Mac48AddressValue(ns3::Mac48Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Mac48Address const &', 'value')])
+    ## mac48-address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::Mac48AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): bool ns3::Mac48AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## mac48-address.h (module 'network'): ns3::Mac48Address ns3::Mac48AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac48-address.h (module 'network'): std::string ns3::Mac48AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## mac48-address.h (module 'network'): void ns3::Mac48AddressValue::Set(ns3::Mac48Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Mac48Address const &', 'value')])
+    return
+
+def register_Ns3MacLow_methods(root_module, cls):
+    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow(ns3::MacLow const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MacLow const &', 'arg0')])
+    ## mac-low.h (module 'wifi'): ns3::MacLow::MacLow() [constructor]
+    cls.add_constructor([])
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::CalculateTransmissionTime(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters const & parameters) const [member function]
+    cls.add_method('CalculateTransmissionTime', 
+                   'ns3::Time', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters const &', 'parameters')], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::CreateBlockAckAgreement(ns3::MgtAddBaResponseHeader const * respHdr, ns3::Mac48Address originator, uint16_t startingSeq) [member function]
+    cls.add_method('CreateBlockAckAgreement', 
+                   'void', 
+                   [param('ns3::MgtAddBaResponseHeader const *', 'respHdr'), param('ns3::Mac48Address', 'originator'), param('uint16_t', 'startingSeq')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::DestroyBlockAckAgreement(ns3::Mac48Address originator, uint8_t tid) [member function]
+    cls.add_method('DestroyBlockAckAgreement', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'originator'), param('uint8_t', 'tid')])
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetAckTimeout() const [member function]
+    cls.add_method('GetAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetBasicBlockAckTimeout() const [member function]
+    cls.add_method('GetBasicBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Mac48Address ns3::MacLow::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetCompressedBlockAckTimeout() const [member function]
+    cls.add_method('GetCompressedBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetCtsTimeout() const [member function]
+    cls.add_method('GetCtsTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::GetCtsToSelfSupported() const [member function]
+    cls.add_method('GetCtsToSelfSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetPifs() const [member function]
+    cls.add_method('GetPifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetRifs() const [member function]
+    cls.add_method('GetRifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): ns3::Time ns3::MacLow::GetSlotTime() const [member function]
+    cls.add_method('GetSlotTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
+    cls.add_method('IsPromisc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySwitchingStartNow(ns3::Time duration) [member function]
+    cls.add_method('NotifySwitchingStartNow', 
+                   'void', 
+                   [param('ns3::Time', 'duration')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveError(ns3::Ptr<ns3::Packet const> packet, double rxSnr) [member function]
+    cls.add_method('ReceiveError', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'rxSnr')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::ReceiveOk(ns3::Ptr<ns3::Packet> packet, double rxSnr, ns3::WifiMode txMode, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('ReceiveOk', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxSnr'), param('ns3::WifiMode', 'txMode'), param('ns3::WifiPreamble', 'preamble')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterBlockAckListenerForAc(ns3::AcIndex ac, ns3::MacLowBlockAckEventListener * listener) [member function]
+    cls.add_method('RegisterBlockAckListenerForAc', 
+                   'void', 
+                   [param('ns3::AcIndex', 'ac'), param('ns3::MacLowBlockAckEventListener *', 'listener')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::RegisterDcfListener(ns3::MacLowDcfListener * listener) [member function]
+    cls.add_method('RegisterDcfListener', 
+                   'void', 
+                   [param('ns3::MacLowDcfListener *', 'listener')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetAckTimeout(ns3::Time ackTimeout) [member function]
+    cls.add_method('SetAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ackTimeout')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetAddress(ns3::Mac48Address ad) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'ad')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBasicBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetBasicBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetBssid(ns3::Mac48Address ad) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'ad')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCompressedBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetCompressedBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCtsTimeout(ns3::Time ctsTimeout) [member function]
+    cls.add_method('SetCtsTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ctsTimeout')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPifs(ns3::Time pifs) [member function]
+    cls.add_method('SetPifs', 
+                   'void', 
+                   [param('ns3::Time', 'pifs')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetRifs(ns3::Time rifs) [member function]
+    cls.add_method('SetRifs', 
+                   'void', 
+                   [param('ns3::Time', 'rifs')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetRxCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::WifiMacHeader const*, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetRxCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::WifiMacHeader const *, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetSifs(ns3::Time sifs) [member function]
+    cls.add_method('SetSifs', 
+                   'void', 
+                   [param('ns3::Time', 'sifs')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetSlotTime(ns3::Time slotTime) [member function]
+    cls.add_method('SetSlotTime', 
+                   'void', 
+                   [param('ns3::Time', 'slotTime')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> manager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'manager')])
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::StartTransmission(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr, ns3::MacLowTransmissionParameters parameters, ns3::MacLowTransmissionListener * listener) [member function]
+    cls.add_method('StartTransmission', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::MacLowTransmissionListener *', 'listener')])
+    ## mac-low.h (module 'wifi'): ns3::WifiTxVector ns3::MacLow::GetDataTxVector(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr) const [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   is_const=True, visibility='protected', is_virtual=True)
+    ## mac-low.h (module 'wifi'): void ns3::MacLow::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3MgtBeaconHeader_methods(root_module, cls):
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader() [constructor]
+    cls.add_constructor([])
+    ## mgt-headers.h (module 'wifi'): ns3::MgtBeaconHeader::MgtBeaconHeader(ns3::MgtBeaconHeader const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::MgtBeaconHeader const &', 'arg0')])
+    return
+
+def register_Ns3NetDevice_methods(root_module, cls):
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
+    cls.add_constructor([])
+    ## net-device.h (module 'network'): ns3::NetDevice::NetDevice(ns3::NetDevice const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NetDevice const &', 'arg0')])
+    ## net-device.h (module 'network'): void ns3::NetDevice::AddLinkChangeCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('AddLinkChangeCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetBroadcast() const [member function]
+    cls.add_method('GetBroadcast', 
+                   'ns3::Address', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Channel> ns3::NetDevice::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::Channel >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint32_t ns3::NetDevice::GetIfIndex() const [member function]
+    cls.add_method('GetIfIndex', 
+                   'uint32_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): uint16_t ns3::NetDevice::GetMtu() const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv4Address multicastGroup) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv4Address', 'multicastGroup')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Address ns3::NetDevice::GetMulticast(ns3::Ipv6Address addr) const [member function]
+    cls.add_method('GetMulticast', 
+                   'ns3::Address', 
+                   [param('ns3::Ipv6Address', 'addr')], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): ns3::Ptr<ns3::Node> ns3::NetDevice::GetNode() const [member function]
+    cls.add_method('GetNode', 
+                   'ns3::Ptr< ns3::Node >', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): static ns3::TypeId ns3::NetDevice::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBridge() const [member function]
+    cls.add_method('IsBridge', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsLinkUp() const [member function]
+    cls.add_method('IsLinkUp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsMulticast() const [member function]
+    cls.add_method('IsMulticast', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::IsPointToPoint() const [member function]
+    cls.add_method('IsPointToPoint', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::NeedsArp() const [member function]
+    cls.add_method('NeedsArp', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::Send(ns3::Ptr<ns3::Packet> packet, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('Send', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SendFrom(ns3::Ptr<ns3::Packet> packet, ns3::Address const & source, ns3::Address const & dest, uint16_t protocolNumber) [member function]
+    cls.add_method('SendFrom', 
+                   'bool', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Address const &', 'source'), param('ns3::Address const &', 'dest'), param('uint16_t', 'protocolNumber')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetAddress(ns3::Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Address', 'address')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetIfIndex(uint32_t const index) [member function]
+    cls.add_method('SetIfIndex', 
+                   'void', 
+                   [param('uint32_t const', 'index')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SetMtu(uint16_t const mtu) [member function]
+    cls.add_method('SetMtu', 
+                   'bool', 
+                   [param('uint16_t const', 'mtu')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetPromiscReceiveCallback(ns3::Callback<bool,ns3::Ptr<ns3::NetDevice>,ns3::Ptr<const ns3::Packet>,short unsigned int,const ns3::Address&,const ns3::Address&,ns3::NetDevice::PacketType,ns3::empty,ns3::empty,ns3::empty> cb) [member function]
+    cls.add_method('SetPromiscReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, short unsigned int, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): void ns3::NetDevice::SetReceiveCallback(ns3::Callback<bool,ns3::Ptr<ns3::NetDevice>,ns3::Ptr<const ns3::Packet>,short unsigned int,const ns3::Address&,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> cb) [member function]
+    cls.add_method('SetReceiveCallback', 
+                   'void', 
+                   [param('ns3::Callback< bool, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, short unsigned int, ns3::Address const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'cb')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## net-device.h (module 'network'): bool ns3::NetDevice::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3NixVector_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector() [constructor]
+    cls.add_constructor([])
+    ## nix-vector.h (module 'network'): ns3::NixVector::NixVector(ns3::NixVector const & o) [copy constructor]
+    cls.add_constructor([param('ns3::NixVector const &', 'o')])
+    ## nix-vector.h (module 'network'): void ns3::NixVector::AddNeighborIndex(uint32_t newBits, uint32_t numberOfBits) [member function]
+    cls.add_method('AddNeighborIndex', 
+                   'void', 
+                   [param('uint32_t', 'newBits'), param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::BitCount(uint32_t numberOfNeighbors) const [member function]
+    cls.add_method('BitCount', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfNeighbors')], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::NixVector::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Deserialize(uint32_t const * buffer, uint32_t size) [member function]
+    cls.add_method('Deserialize', 
+                   'uint32_t', 
+                   [param('uint32_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::ExtractNeighborIndex(uint32_t numberOfBits) [member function]
+    cls.add_method('ExtractNeighborIndex', 
+                   'uint32_t', 
+                   [param('uint32_t', 'numberOfBits')])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetRemainingBits() [member function]
+    cls.add_method('GetRemainingBits', 
+                   'uint32_t', 
+                   [])
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## nix-vector.h (module 'network'): uint32_t ns3::NixVector::Serialize(uint32_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint32_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    return
+
+def register_Ns3Node_methods(root_module, cls):
+    ## node.h (module 'network'): ns3::Node::Node(ns3::Node const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Node const &', 'arg0')])
+    ## node.h (module 'network'): ns3::Node::Node() [constructor]
+    cls.add_constructor([])
+    ## node.h (module 'network'): ns3::Node::Node(uint32_t systemId) [constructor]
+    cls.add_constructor([param('uint32_t', 'systemId')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddApplication(ns3::Ptr<ns3::Application> application) [member function]
+    cls.add_method('AddApplication', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::Application >', 'application')])
+    ## node.h (module 'network'): uint32_t ns3::Node::AddDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddDevice', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## node.h (module 'network'): static bool ns3::Node::ChecksumEnabled() [member function]
+    cls.add_method('ChecksumEnabled', 
+                   'bool', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::Application> ns3::Node::GetApplication(uint32_t index) const [member function]
+    cls.add_method('GetApplication', 
+                   'ns3::Ptr< ns3::Application >', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## node.h (module 'network'): ns3::Ptr<ns3::NetDevice> ns3::Node::GetDevice(uint32_t index) const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetId() const [member function]
+    cls.add_method('GetId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNApplications() const [member function]
+    cls.add_method('GetNApplications', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): uint32_t ns3::Node::GetSystemId() const [member function]
+    cls.add_method('GetSystemId', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## node.h (module 'network'): static ns3::TypeId ns3::Node::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## node.h (module 'network'): void ns3::Node::RegisterDeviceAdditionListener(ns3::Callback<void,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> listener) [member function]
+    cls.add_method('RegisterDeviceAdditionListener', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::RegisterProtocolHandler(ns3::Callback<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> handler, uint16_t protocolType, ns3::Ptr<ns3::NetDevice> device, bool promiscuous=false) [member function]
+    cls.add_method('RegisterProtocolHandler', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler'), param('uint16_t', 'protocolType'), param('ns3::Ptr< ns3::NetDevice >', 'device'), param('bool', 'promiscuous', default_value='false')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterDeviceAdditionListener(ns3::Callback<void,ns3::Ptr<ns3::NetDevice>,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> listener) [member function]
+    cls.add_method('UnregisterDeviceAdditionListener', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'listener')])
+    ## node.h (module 'network'): void ns3::Node::UnregisterProtocolHandler(ns3::Callback<void, ns3::Ptr<ns3::NetDevice>, ns3::Ptr<ns3::Packet const>, unsigned short, ns3::Address const&, ns3::Address const&, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty> handler) [member function]
+    cls.add_method('UnregisterProtocolHandler', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice >, ns3::Ptr< ns3::Packet const >, unsigned short, ns3::Address const &, ns3::Address const &, ns3::NetDevice::PacketType, ns3::empty, ns3::empty, ns3::empty >', 'handler')])
+    ## node.h (module 'network'): void ns3::Node::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## node.h (module 'network'): void ns3::Node::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    return
+
+def register_Ns3NqosWaveMacHelper_methods(root_module, cls):
+    ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper::NqosWaveMacHelper(ns3::NqosWaveMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::NqosWaveMacHelper const &', 'arg0')])
+    ## wave-mac-helper.h (module 'wave'): ns3::NqosWaveMacHelper::NqosWaveMacHelper() [constructor]
+    cls.add_constructor([])
+    ## wave-mac-helper.h (module 'wave'): static ns3::NqosWaveMacHelper ns3::NqosWaveMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::NqosWaveMacHelper', 
+                   [], 
+                   is_static=True)
+    ## wave-mac-helper.h (module 'wave'): void ns3::NqosWaveMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3ObjectFactoryChecker_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryChecker::ObjectFactoryChecker(ns3::ObjectFactoryChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryChecker const &', 'arg0')])
+    return
+
+def register_Ns3ObjectFactoryValue_methods(root_module, cls):
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue() [constructor]
+    cls.add_constructor([])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactoryValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::ObjectFactoryValue const &', 'arg0')])
+    ## object-factory.h (module 'core'): ns3::ObjectFactoryValue::ObjectFactoryValue(ns3::ObjectFactory const & value) [constructor]
+    cls.add_constructor([param('ns3::ObjectFactory const &', 'value')])
+    ## object-factory.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::ObjectFactoryValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): bool ns3::ObjectFactoryValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## object-factory.h (module 'core'): ns3::ObjectFactory ns3::ObjectFactoryValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::ObjectFactory', 
+                   [], 
+                   is_const=True)
+    ## object-factory.h (module 'core'): std::string ns3::ObjectFactoryValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## object-factory.h (module 'core'): void ns3::ObjectFactoryValue::Set(ns3::ObjectFactory const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::ObjectFactory const &', 'value')])
+    return
+
+def register_Ns3OrganizationIdentifierChecker_methods(root_module, cls):
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker::OrganizationIdentifierChecker() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierChecker::OrganizationIdentifierChecker(ns3::OrganizationIdentifierChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OrganizationIdentifierChecker const &', 'arg0')])
+    return
+
+def register_Ns3OrganizationIdentifierValue_methods(root_module, cls):
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue::OrganizationIdentifierValue() [constructor]
+    cls.add_constructor([])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue::OrganizationIdentifierValue(ns3::OrganizationIdentifierValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OrganizationIdentifierValue const &', 'arg0')])
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifierValue::OrganizationIdentifierValue(ns3::OrganizationIdentifier const & value) [constructor]
+    cls.add_constructor([param('ns3::OrganizationIdentifier const &', 'value')])
+    ## vendor-specific-action.h (module 'wave'): ns3::Ptr<ns3::AttributeValue> ns3::OrganizationIdentifierValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): bool ns3::OrganizationIdentifierValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): ns3::OrganizationIdentifier ns3::OrganizationIdentifierValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::OrganizationIdentifier', 
+                   [], 
+                   is_const=True)
+    ## vendor-specific-action.h (module 'wave'): std::string ns3::OrganizationIdentifierValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## vendor-specific-action.h (module 'wave'): void ns3::OrganizationIdentifierValue::Set(ns3::OrganizationIdentifier const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier const &', 'value')])
+    return
+
+def register_Ns3OutputStreamWrapper_methods(root_module, cls):
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(ns3::OutputStreamWrapper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::OutputStreamWrapper const &', 'arg0')])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::string filename, std::_Ios_Openmode filemode) [constructor]
+    cls.add_constructor([param('std::string', 'filename'), param('std::_Ios_Openmode', 'filemode')])
+    ## output-stream-wrapper.h (module 'network'): ns3::OutputStreamWrapper::OutputStreamWrapper(std::ostream * os) [constructor]
+    cls.add_constructor([param('std::ostream *', 'os')])
+    ## output-stream-wrapper.h (module 'network'): std::ostream * ns3::OutputStreamWrapper::GetStream() [member function]
+    cls.add_method('GetStream', 
+                   'std::ostream *', 
+                   [])
+    return
+
+def register_Ns3Packet_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## packet.h (module 'network'): ns3::Packet::Packet() [constructor]
+    cls.add_constructor([])
+    ## packet.h (module 'network'): ns3::Packet::Packet(ns3::Packet const & o) [copy constructor]
+    cls.add_constructor([param('ns3::Packet const &', 'o')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint32_t size) [constructor]
+    cls.add_constructor([param('uint32_t', 'size')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size, bool magic) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size'), param('bool', 'magic')])
+    ## packet.h (module 'network'): ns3::Packet::Packet(uint8_t const * buffer, uint32_t size) [constructor]
+    cls.add_constructor([param('uint8_t const *', 'buffer'), param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddAtEnd(ns3::Ptr<ns3::Packet const> packet) [member function]
+    cls.add_method('AddAtEnd', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet')])
+    ## packet.h (module 'network'): void ns3::Packet::AddByteTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddByteTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddHeader(ns3::Header const & header) [member function]
+    cls.add_method('AddHeader', 
+                   'void', 
+                   [param('ns3::Header const &', 'header')])
+    ## packet.h (module 'network'): void ns3::Packet::AddPacketTag(ns3::Tag const & tag) const [member function]
+    cls.add_method('AddPacketTag', 
+                   'void', 
+                   [param('ns3::Tag const &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::AddPaddingAtEnd(uint32_t size) [member function]
+    cls.add_method('AddPaddingAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::AddTrailer(ns3::Trailer const & trailer) [member function]
+    cls.add_method('AddTrailer', 
+                   'void', 
+                   [param('ns3::Trailer const &', 'trailer')])
+    ## packet.h (module 'network'): ns3::PacketMetadata::ItemIterator ns3::Packet::BeginItem() const [member function]
+    cls.add_method('BeginItem', 
+                   'ns3::PacketMetadata::ItemIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::CopyData(uint8_t * buffer, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::CopyData(std::ostream * os, uint32_t size) const [member function]
+    cls.add_method('CopyData', 
+                   'void', 
+                   [param('std::ostream *', 'os'), param('uint32_t', 'size')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::Packet> ns3::Packet::CreateFragment(uint32_t start, uint32_t length) const [member function]
+    cls.add_method('CreateFragment', 
+                   'ns3::Ptr< ns3::Packet >', 
+                   [param('uint32_t', 'start'), param('uint32_t', 'length')], 
+                   is_const=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnableChecking() [member function]
+    cls.add_method('EnableChecking', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): static void ns3::Packet::EnablePrinting() [member function]
+    cls.add_method('EnablePrinting', 
+                   'void', 
+                   [], 
+                   is_static=True)
+    ## packet.h (module 'network'): bool ns3::Packet::FindFirstMatchingByteTag(ns3::Tag & tag) const [member function]
+    cls.add_method('FindFirstMatchingByteTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::ByteTagIterator ns3::Packet::GetByteTagIterator() const [member function]
+    cls.add_method('GetByteTagIterator', 
+                   'ns3::ByteTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::Ptr<ns3::NixVector> ns3::Packet::GetNixVector() const [member function]
+    cls.add_method('GetNixVector', 
+                   'ns3::Ptr< ns3::NixVector >', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): ns3::PacketTagIterator ns3::Packet::GetPacketTagIterator() const [member function]
+    cls.add_method('GetPacketTagIterator', 
+                   'ns3::PacketTagIterator', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::GetSize() const [member function]
+    cls.add_method('GetSize', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint64_t ns3::Packet::GetUid() const [member function]
+    cls.add_method('GetUid', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint8_t const * ns3::Packet::PeekData() const [member function]
+    cls.add_method('PeekData', 
+                   'uint8_t const *', 
+                   [], 
+                   deprecated=True, is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekHeader(ns3::Header & header) const [member function]
+    cls.add_method('PeekHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')], 
+                   is_const=True)
+    ## packet.h (module 'network'): bool ns3::Packet::PeekPacketTag(ns3::Tag & tag) const [member function]
+    cls.add_method('PeekPacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')], 
+                   is_const=True)
+    ## packet.h (module 'network'): uint32_t ns3::Packet::PeekTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('PeekTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): void ns3::Packet::Print(std::ostream & os) const [member function]
+    cls.add_method('Print', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintByteTags(std::ostream & os) const [member function]
+    cls.add_method('PrintByteTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::PrintPacketTags(std::ostream & os) const [member function]
+    cls.add_method('PrintPacketTags', 
+                   'void', 
+                   [param('std::ostream &', 'os')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllByteTags() [member function]
+    cls.add_method('RemoveAllByteTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAllPacketTags() [member function]
+    cls.add_method('RemoveAllPacketTags', 
+                   'void', 
+                   [])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtEnd(uint32_t size) [member function]
+    cls.add_method('RemoveAtEnd', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): void ns3::Packet::RemoveAtStart(uint32_t size) [member function]
+    cls.add_method('RemoveAtStart', 
+                   'void', 
+                   [param('uint32_t', 'size')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveHeader(ns3::Header & header) [member function]
+    cls.add_method('RemoveHeader', 
+                   'uint32_t', 
+                   [param('ns3::Header &', 'header')])
+    ## packet.h (module 'network'): bool ns3::Packet::RemovePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('RemovePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::RemoveTrailer(ns3::Trailer & trailer) [member function]
+    cls.add_method('RemoveTrailer', 
+                   'uint32_t', 
+                   [param('ns3::Trailer &', 'trailer')])
+    ## packet.h (module 'network'): bool ns3::Packet::ReplacePacketTag(ns3::Tag & tag) [member function]
+    cls.add_method('ReplacePacketTag', 
+                   'bool', 
+                   [param('ns3::Tag &', 'tag')])
+    ## packet.h (module 'network'): uint32_t ns3::Packet::Serialize(uint8_t * buffer, uint32_t maxSize) const [member function]
+    cls.add_method('Serialize', 
+                   'uint32_t', 
+                   [param('uint8_t *', 'buffer'), param('uint32_t', 'maxSize')], 
+                   is_const=True)
+    ## packet.h (module 'network'): void ns3::Packet::SetNixVector(ns3::Ptr<ns3::NixVector> arg0) [member function]
+    cls.add_method('SetNixVector', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NixVector >', 'arg0')])
+    return
+
+def register_Ns3PointerChecker_methods(root_module, cls):
+    ## pointer.h (module 'core'): ns3::PointerChecker::PointerChecker() [constructor]
+    cls.add_constructor([])
+    ## pointer.h (module 'core'): ns3::PointerChecker::PointerChecker(ns3::PointerChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PointerChecker const &', 'arg0')])
+    ## pointer.h (module 'core'): ns3::TypeId ns3::PointerChecker::GetPointeeTypeId() const [member function]
+    cls.add_method('GetPointeeTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_pure_virtual=True, is_const=True, is_virtual=True)
+    return
+
+def register_Ns3PointerValue_methods(root_module, cls):
+    ## pointer.h (module 'core'): ns3::PointerValue::PointerValue(ns3::PointerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::PointerValue const &', 'arg0')])
+    ## pointer.h (module 'core'): ns3::PointerValue::PointerValue() [constructor]
+    cls.add_constructor([])
+    ## pointer.h (module 'core'): ns3::PointerValue::PointerValue(ns3::Ptr<ns3::Object> object) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::Object >', 'object')])
+    ## pointer.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::PointerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## pointer.h (module 'core'): bool ns3::PointerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## pointer.h (module 'core'): ns3::Ptr<ns3::Object> ns3::PointerValue::GetObject() const [member function]
+    cls.add_method('GetObject', 
+                   'ns3::Ptr< ns3::Object >', 
+                   [], 
+                   is_const=True)
+    ## pointer.h (module 'core'): std::string ns3::PointerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## pointer.h (module 'core'): void ns3::PointerValue::SetObject(ns3::Ptr<ns3::Object> object) [member function]
+    cls.add_method('SetObject', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'object')])
+    return
+
+def register_Ns3QosWaveMacHelper_methods(root_module, cls):
+    ## wave-mac-helper.h (module 'wave'): ns3::QosWaveMacHelper::QosWaveMacHelper(ns3::QosWaveMacHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::QosWaveMacHelper const &', 'arg0')])
+    ## wave-mac-helper.h (module 'wave'): ns3::QosWaveMacHelper::QosWaveMacHelper() [constructor]
+    cls.add_constructor([])
+    ## wave-mac-helper.h (module 'wave'): static ns3::QosWaveMacHelper ns3::QosWaveMacHelper::Default() [member function]
+    cls.add_method('Default', 
+                   'ns3::QosWaveMacHelper', 
+                   [], 
+                   is_static=True)
+    ## wave-mac-helper.h (module 'wave'): void ns3::QosWaveMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
+    cls.add_method('SetType', 
+                   'void', 
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
+    return
+
+def register_Ns3RegularWifiMac_methods(root_module, cls):
+    ## regular-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::RegularWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::RegularWifiMac::RegularWifiMac() [constructor]
+    cls.add_constructor([])
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSlot(ns3::Time slotTime) [member function]
+    cls.add_method('SetSlot', 
+                   'void', 
+                   [param('ns3::Time', 'slotTime')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSifs(ns3::Time sifs) [member function]
+    cls.add_method('SetSifs', 
+                   'void', 
+                   [param('ns3::Time', 'sifs')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetEifsNoDifs(ns3::Time eifsNoDifs) [member function]
+    cls.add_method('SetEifsNoDifs', 
+                   'void', 
+                   [param('ns3::Time', 'eifsNoDifs')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPifs(ns3::Time pifs) [member function]
+    cls.add_method('SetPifs', 
+                   'void', 
+                   [param('ns3::Time', 'pifs')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetRifs(ns3::Time rifs) [member function]
+    cls.add_method('SetRifs', 
+                   'void', 
+                   [param('ns3::Time', 'rifs')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsTimeout(ns3::Time ctsTimeout) [member function]
+    cls.add_method('SetCtsTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ctsTimeout')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAckTimeout(ns3::Time ackTimeout) [member function]
+    cls.add_method('SetAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'ackTimeout')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetRifs() const [member function]
+    cls.add_method('GetRifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetPifs() const [member function]
+    cls.add_method('GetPifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetSifs() const [member function]
+    cls.add_method('GetSifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetSlot() const [member function]
+    cls.add_method('GetSlot', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetEifsNoDifs() const [member function]
+    cls.add_method('GetEifsNoDifs', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetCtsTimeout() const [member function]
+    cls.add_method('GetCtsTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetAckTimeout() const [member function]
+    cls.add_method('GetAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCtsToSelfSupported(bool enable) [member function]
+    cls.add_method('SetCtsToSelfSupported', 
+                   'void', 
+                   [param('bool', 'enable')])
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetCtsToSelfSupported() const [member function]
+    cls.add_method('GetCtsToSelfSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ssid ns3::RegularWifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetAddress(ns3::Mac48Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'address')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Mac48Address ns3::RegularWifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetPromisc() [member function]
+    cls.add_method('SetPromisc', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to, ns3::Mac48Address from) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::SupportsSendFrom() const [member function]
+    cls.add_method('SupportsSendFrom', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiPhy(ns3::Ptr<ns3::WifiPhy> phy) [member function]
+    cls.add_method('SetWifiPhy', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiPhy >', 'phy')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiPhy> ns3::RegularWifiMac::GetWifiPhy() const [member function]
+    cls.add_method('GetWifiPhy', 
+                   'ns3::Ptr< ns3::WifiPhy >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> stationManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiRemoteStationManager> ns3::RegularWifiMac::GetWifiRemoteStationManager() const [member function]
+    cls.add_method('GetWifiRemoteStationManager', 
+                   'ns3::Ptr< ns3::WifiRemoteStationManager >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetForwardUpCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function]
+    cls.add_method('SetForwardUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetBasicBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetBasicBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetBasicBlockAckTimeout() const [member function]
+    cls.add_method('GetBasicBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetCompressedBlockAckTimeout(ns3::Time blockAckTimeout) [member function]
+    cls.add_method('SetCompressedBlockAckTimeout', 
+                   'void', 
+                   [param('ns3::Time', 'blockAckTimeout')], 
+                   is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Time ns3::RegularWifiMac::GetCompressedBlockAckTimeout() const [member function]
+    cls.add_method('GetCompressedBlockAckTimeout', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::DcaTxop> ns3::RegularWifiMac::GetDcaTxop() const [member function]
+    cls.add_method('GetDcaTxop', 
+                   'ns3::Ptr< ns3::DcaTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('FinishConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetTypeOfStation(ns3::TypeOfStation type) [member function]
+    cls.add_method('SetTypeOfStation', 
+                   'void', 
+                   [param('ns3::TypeOfStation', 'type')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::Receive(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxOk(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('TxOk', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::TxFailed(ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('TxFailed', 
+                   'void', 
+                   [param('ns3::WifiMacHeader const &', 'hdr')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::ForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DeaggregateAmsduAndForward(ns3::Ptr<ns3::Packet> aggregatedPacket, ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('DeaggregateAmsduAndForward', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'aggregatedPacket'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SendAddBaResponse(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address originator) [member function]
+    cls.add_method('SendAddBaResponse', 
+                   'void', 
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'originator')], 
+                   visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetQosSupported(bool enable) [member function]
+    cls.add_method('SetQosSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::SetHtSupported(bool enable) [member function]
+    cls.add_method('SetHtSupported', 
+                   'void', 
+                   [param('bool', 'enable')], 
+                   visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True, visibility='protected')
+    return
+
+def register_Ns3Ssid_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(ns3::Ssid const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(std::string s) [constructor]
+    cls.add_constructor([param('std::string', 's')])
+    ## ssid.h (module 'wifi'): ns3::Ssid::Ssid(char const * ssid, uint8_t length) [constructor]
+    cls.add_constructor([param('char const *', 'ssid'), param('uint8_t', 'length')])
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::WifiInformationElementId ns3::Ssid::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): uint8_t ns3::Ssid::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsBroadcast() const [member function]
+    cls.add_method('IsBroadcast', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): bool ns3::Ssid::IsEqual(ns3::Ssid const & o) const [member function]
+    cls.add_method('IsEqual', 
+                   'bool', 
+                   [param('ns3::Ssid const &', 'o')], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): char * ns3::Ssid::PeekString() const [member function]
+    cls.add_method('PeekString', 
+                   'char *', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): void ns3::Ssid::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    return
+
+def register_Ns3SsidChecker_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::SsidChecker::SsidChecker(ns3::SsidChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SsidChecker const &', 'arg0')])
+    return
+
+def register_Ns3SsidValue_methods(root_module, cls):
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue() [constructor]
+    cls.add_constructor([])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::SsidValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SsidValue const &', 'arg0')])
+    ## ssid.h (module 'wifi'): ns3::SsidValue::SsidValue(ns3::Ssid const & value) [constructor]
+    cls.add_constructor([param('ns3::Ssid const &', 'value')])
+    ## ssid.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::SsidValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): bool ns3::SsidValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## ssid.h (module 'wifi'): ns3::Ssid ns3::SsidValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True)
+    ## ssid.h (module 'wifi'): std::string ns3::SsidValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## ssid.h (module 'wifi'): void ns3::SsidValue::Set(ns3::Ssid const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Ssid const &', 'value')])
+    return
+
+def register_Ns3SupportedRates_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates(ns3::SupportedRates const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::SupportedRates const &', 'arg0')])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::SupportedRates() [constructor]
+    cls.add_constructor([])
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::AddSupportedRate(uint32_t bs) [member function]
+    cls.add_method('AddSupportedRate', 
+                   'void', 
+                   [param('uint32_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::DeserializeInformationField(ns3::Buffer::Iterator start, uint8_t length) [member function]
+    cls.add_method('DeserializeInformationField', 
+                   'uint8_t', 
+                   [param('ns3::Buffer::Iterator', 'start'), param('uint8_t', 'length')], 
+                   is_virtual=True)
+    ## supported-rates.h (module 'wifi'): ns3::WifiInformationElementId ns3::SupportedRates::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): uint8_t ns3::SupportedRates::GetNRates() const [member function]
+    cls.add_method('GetNRates', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): uint32_t ns3::SupportedRates::GetRate(uint8_t i) const [member function]
+    cls.add_method('GetRate', 
+                   'uint32_t', 
+                   [param('uint8_t', 'i')], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsBasicRate(uint32_t bs) const [member function]
+    cls.add_method('IsBasicRate', 
+                   'bool', 
+                   [param('uint32_t', 'bs')], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): bool ns3::SupportedRates::IsSupportedRate(uint32_t bs) const [member function]
+    cls.add_method('IsSupportedRate', 
+                   'bool', 
+                   [param('uint32_t', 'bs')], 
+                   is_const=True)
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## supported-rates.h (module 'wifi'): void ns3::SupportedRates::SetBasicRate(uint32_t bs) [member function]
+    cls.add_method('SetBasicRate', 
+                   'void', 
+                   [param('uint32_t', 'bs')])
+    ## supported-rates.h (module 'wifi'): ns3::SupportedRates::extended [variable]
+    cls.add_instance_attribute('extended', 'ns3::ExtendedSupportedRatesIE', is_const=False)
+    return
+
+def register_Ns3TimeValue_methods(root_module, cls):
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue() [constructor]
+    cls.add_constructor([])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::TimeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TimeValue const &', 'arg0')])
+    ## nstime.h (module 'core'): ns3::TimeValue::TimeValue(ns3::Time const & value) [constructor]
+    cls.add_constructor([param('ns3::Time const &', 'value')])
+    ## nstime.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TimeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): bool ns3::TimeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## nstime.h (module 'core'): ns3::Time ns3::TimeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True)
+    ## nstime.h (module 'core'): std::string ns3::TimeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## nstime.h (module 'core'): void ns3::TimeValue::Set(ns3::Time const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Time const &', 'value')])
+    return
+
+def register_Ns3TypeIdChecker_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdChecker::TypeIdChecker(ns3::TypeIdChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdChecker const &', 'arg0')])
+    return
+
+def register_Ns3TypeIdValue_methods(root_module, cls):
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue() [constructor]
+    cls.add_constructor([])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeIdValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::TypeIdValue const &', 'arg0')])
+    ## type-id.h (module 'core'): ns3::TypeIdValue::TypeIdValue(ns3::TypeId const & value) [constructor]
+    cls.add_constructor([param('ns3::TypeId const &', 'value')])
+    ## type-id.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::TypeIdValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): bool ns3::TypeIdValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## type-id.h (module 'core'): ns3::TypeId ns3::TypeIdValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_const=True)
+    ## type-id.h (module 'core'): std::string ns3::TypeIdValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## type-id.h (module 'core'): void ns3::TypeIdValue::Set(ns3::TypeId const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::TypeId const &', 'value')])
+    return
+
+def register_Ns3UintegerValue_methods(root_module, cls):
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue() [constructor]
+    cls.add_constructor([])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(ns3::UintegerValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::UintegerValue const &', 'arg0')])
+    ## uinteger.h (module 'core'): ns3::UintegerValue::UintegerValue(uint64_t const & value) [constructor]
+    cls.add_constructor([param('uint64_t const &', 'value')])
+    ## uinteger.h (module 'core'): ns3::Ptr<ns3::AttributeValue> ns3::UintegerValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): bool ns3::UintegerValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## uinteger.h (module 'core'): uint64_t ns3::UintegerValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'uint64_t', 
+                   [], 
+                   is_const=True)
+    ## uinteger.h (module 'core'): std::string ns3::UintegerValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## uinteger.h (module 'core'): void ns3::UintegerValue::Set(uint64_t const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('uint64_t const &', 'value')])
+    return
+
+def register_Ns3WaveMacLow_methods(root_module, cls):
+    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow(ns3::WaveMacLow const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WaveMacLow const &', 'arg0')])
+    ## wave-mac-low.h (module 'wave'): ns3::WaveMacLow::WaveMacLow() [constructor]
+    cls.add_constructor([])
+    ## wave-mac-low.h (module 'wave'): static ns3::TypeId ns3::WaveMacLow::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## wave-mac-low.h (module 'wave'): ns3::WifiTxVector ns3::WaveMacLow::GetDataTxVector(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr) const [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   is_const=True, visibility='private', is_virtual=True)
+    return
+
+def register_Ns3WifiModeChecker_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker() [constructor]
+    cls.add_constructor([])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeChecker::WifiModeChecker(ns3::WifiModeChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiModeChecker const &', 'arg0')])
+    return
+
+def register_Ns3WifiModeValue_methods(root_module, cls):
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue() [constructor]
+    cls.add_constructor([])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiModeValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::WifiModeValue const &', 'arg0')])
+    ## wifi-mode.h (module 'wifi'): ns3::WifiModeValue::WifiModeValue(ns3::WifiMode const & value) [constructor]
+    cls.add_constructor([param('ns3::WifiMode const &', 'value')])
+    ## wifi-mode.h (module 'wifi'): ns3::Ptr<ns3::AttributeValue> ns3::WifiModeValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mode.h (module 'wifi'): bool ns3::WifiModeValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## wifi-mode.h (module 'wifi'): ns3::WifiMode ns3::WifiModeValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::WifiMode', 
+                   [], 
+                   is_const=True)
+    ## wifi-mode.h (module 'wifi'): std::string ns3::WifiModeValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## wifi-mode.h (module 'wifi'): void ns3::WifiModeValue::Set(ns3::WifiMode const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::WifiMode const &', 'value')])
+    return
+
+def register_Ns3AddressChecker_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressChecker::AddressChecker(ns3::AddressChecker const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressChecker const &', 'arg0')])
+    return
+
+def register_Ns3AddressValue_methods(root_module, cls):
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue() [constructor]
+    cls.add_constructor([])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::AddressValue const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::AddressValue const &', 'arg0')])
+    ## address.h (module 'network'): ns3::AddressValue::AddressValue(ns3::Address const & value) [constructor]
+    cls.add_constructor([param('ns3::Address const &', 'value')])
+    ## address.h (module 'network'): ns3::Ptr<ns3::AttributeValue> ns3::AddressValue::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ptr< ns3::AttributeValue >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): bool ns3::AddressValue::DeserializeFromString(std::string value, ns3::Ptr<ns3::AttributeChecker const> checker) [member function]
+    cls.add_method('DeserializeFromString', 
+                   'bool', 
+                   [param('std::string', 'value'), param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_virtual=True)
+    ## address.h (module 'network'): ns3::Address ns3::AddressValue::Get() const [member function]
+    cls.add_method('Get', 
+                   'ns3::Address', 
+                   [], 
+                   is_const=True)
+    ## address.h (module 'network'): std::string ns3::AddressValue::SerializeToString(ns3::Ptr<ns3::AttributeChecker const> checker) const [member function]
+    cls.add_method('SerializeToString', 
+                   'std::string', 
+                   [param('ns3::Ptr< ns3::AttributeChecker const >', 'checker')], 
+                   is_const=True, is_virtual=True)
+    ## address.h (module 'network'): void ns3::AddressValue::Set(ns3::Address const & value) [member function]
+    cls.add_method('Set', 
+                   'void', 
+                   [param('ns3::Address const &', 'value')])
+    return
+
+def register_Ns3DcaTxop_methods(root_module, cls):
+    ## dca-txop.h (module 'wifi'): static ns3::TypeId ns3::DcaTxop::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## dca-txop.h (module 'wifi'): ns3::DcaTxop::DcaTxop() [constructor]
+    cls.add_constructor([])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetLow(ns3::Ptr<ns3::MacLow> low) [member function]
+    cls.add_method('SetLow', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MacLow >', 'low')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetManager(ns3::DcfManager * manager) [member function]
+    cls.add_method('SetManager', 
+                   'void', 
+                   [param('ns3::DcfManager *', 'manager')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> remoteManager) [member function]
+    cls.add_method('SetWifiRemoteStationManager', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'remoteManager')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetTxOkCallback(ns3::Callback<void, ns3::WifiMacHeader const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetTxOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetTxFailedCallback(ns3::Callback<void, ns3::WifiMacHeader const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetTxFailedCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::WifiMacHeader const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')])
+    ## dca-txop.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::DcaTxop::GetQueue() const [member function]
+    cls.add_method('GetQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [], 
+                   is_const=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetMinCw(uint32_t minCw) [member function]
+    cls.add_method('SetMinCw', 
+                   'void', 
+                   [param('uint32_t', 'minCw')], 
+                   is_virtual=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetMaxCw(uint32_t maxCw) [member function]
+    cls.add_method('SetMaxCw', 
+                   'void', 
+                   [param('uint32_t', 'maxCw')], 
+                   is_virtual=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::SetAifsn(uint32_t aifsn) [member function]
+    cls.add_method('SetAifsn', 
+                   'void', 
+                   [param('uint32_t', 'aifsn')], 
+                   is_virtual=True)
+    ## dca-txop.h (module 'wifi'): uint32_t ns3::DcaTxop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dca-txop.h (module 'wifi'): uint32_t ns3::DcaTxop::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dca-txop.h (module 'wifi'): uint32_t ns3::DcaTxop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::Queue(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const & hdr) [member function]
+    cls.add_method('Queue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const &', 'hdr')])
+    ## dca-txop.h (module 'wifi'): int64_t ns3::DcaTxop::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    ## dca-txop.h (module 'wifi'): void ns3::DcaTxop::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3OcbWifiMac_methods(root_module, cls):
+    ## ocb-wifi-mac.h (module 'wave'): static ns3::TypeId ns3::OcbWifiMac::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ocb-wifi-mac.h (module 'wave'): ns3::OcbWifiMac::OcbWifiMac() [constructor]
+    cls.add_constructor([])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SendVsc(ns3::Ptr<ns3::Packet> vsc, ns3::Mac48Address peer, ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('SendVsc', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'vsc'), param('ns3::Mac48Address', 'peer'), param('ns3::OrganizationIdentifier', 'oi')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::AddReceiveVscCallback(ns3::OrganizationIdentifier oi, ns3::VscCallback cb) [member function]
+    cls.add_method('AddReceiveVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi'), param('ns3::VscCallback', 'cb')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::RemoveReceiveVscCallback(ns3::OrganizationIdentifier oi) [member function]
+    cls.add_method('RemoveReceiveVscCallback', 
+                   'void', 
+                   [param('ns3::OrganizationIdentifier', 'oi')])
+    ## ocb-wifi-mac.h (module 'wave'): ns3::Ssid ns3::OcbWifiMac::GetSsid() const [member function]
+    cls.add_method('GetSsid', 
+                   'ns3::Ssid', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetSsid(ns3::Ssid ssid) [member function]
+    cls.add_method('SetSsid', 
+                   'void', 
+                   [param('ns3::Ssid', 'ssid')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetBssid(ns3::Mac48Address bssid) [member function]
+    cls.add_method('SetBssid', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'bssid')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): ns3::Mac48Address ns3::OcbWifiMac::GetBssid() const [member function]
+    cls.add_method('GetBssid', 
+                   'ns3::Mac48Address', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkUpCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkUp) [member function]
+    cls.add_method('SetLinkUpCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkUp')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::SetLinkDownCallback(ns3::Callback<void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> linkDown) [member function]
+    cls.add_method('SetLinkDownCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'linkDown')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Enqueue(ns3::Ptr<ns3::Packet const> packet, ns3::Mac48Address to) [member function]
+    cls.add_method('Enqueue', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::Mac48Address', 'to')], 
+                   is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::ConfigureEdca(uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, ns3::AcIndex ac) [member function]
+    cls.add_method('ConfigureEdca', 
+                   'void', 
+                   [param('uint32_t', 'cwmin'), param('uint32_t', 'cwmax'), param('uint32_t', 'aifsn'), param('ns3::AcIndex', 'ac')])
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('FinishConfigureStandard', 
+                   'void', 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   visibility='protected', is_virtual=True)
+    ## ocb-wifi-mac.h (module 'wave'): void ns3::OcbWifiMac::Receive(ns3::Ptr<ns3::Packet> packet, ns3::WifiMacHeader const * hdr) [member function]
+    cls.add_method('Receive', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   visibility='private', is_virtual=True)
+    return
+
+def register_Ns3HashImplementation_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation(ns3::Hash::Implementation const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Implementation const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Implementation::Implementation() [constructor]
+    cls.add_constructor([])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Implementation::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Implementation::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Implementation::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_pure_virtual=True, is_virtual=True)
+    return
+
+def register_Ns3HashFunctionFnv1a_methods(root_module, cls):
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a(ns3::Hash::Function::Fnv1a const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Fnv1a const &', 'arg0')])
+    ## hash-fnv.h (module 'core'): ns3::Hash::Function::Fnv1a::Fnv1a() [constructor]
+    cls.add_constructor([])
+    ## hash-fnv.h (module 'core'): uint32_t ns3::Hash::Function::Fnv1a::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): uint64_t ns3::Hash::Function::Fnv1a::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-fnv.h (module 'core'): void ns3::Hash::Function::Fnv1a::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash32_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Function::Hash32 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash32 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash32::Hash32(ns3::Hash::Hash32Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash32Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash32::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash32::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionHash64_methods(root_module, cls):
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Function::Hash64 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Hash64 const &', 'arg0')])
+    ## hash-function.h (module 'core'): ns3::Hash::Function::Hash64::Hash64(ns3::Hash::Hash64Function_ptr hp) [constructor]
+    cls.add_constructor([param('ns3::Hash::Hash64Function_ptr', 'hp')])
+    ## hash-function.h (module 'core'): uint32_t ns3::Hash::Function::Hash64::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): uint64_t ns3::Hash::Function::Hash64::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-function.h (module 'core'): void ns3::Hash::Function::Hash64::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_Ns3HashFunctionMurmur3_methods(root_module, cls):
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3(ns3::Hash::Function::Murmur3 const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::Hash::Function::Murmur3 const &', 'arg0')])
+    ## hash-murmur3.h (module 'core'): ns3::Hash::Function::Murmur3::Murmur3() [constructor]
+    cls.add_constructor([])
+    ## hash-murmur3.h (module 'core'): uint32_t ns3::Hash::Function::Murmur3::GetHash32(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash32', 
+                   'uint32_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): uint64_t ns3::Hash::Function::Murmur3::GetHash64(char const * buffer, size_t const size) [member function]
+    cls.add_method('GetHash64', 
+                   'uint64_t', 
+                   [param('char const *', 'buffer'), param('size_t const', 'size')], 
+                   is_virtual=True)
+    ## hash-murmur3.h (module 'core'): void ns3::Hash::Function::Murmur3::clear() [member function]
+    cls.add_method('clear', 
+                   'void', 
+                   [], 
+                   is_virtual=True)
+    return
+
+def register_functions(root_module):
+    module = root_module
+    ## vendor-specific-action.h (module 'wave'): extern ns3::Ptr<ns3::AttributeChecker const> ns3::MakeOrganizationIdentifierChecker() [free function]
+    module.add_function('MakeOrganizationIdentifierChecker', 
+                        'ns3::Ptr< ns3::AttributeChecker const >', 
+                        [])
+    register_functions_ns3_FatalImpl(module.get_submodule('FatalImpl'), root_module)
+    register_functions_ns3_Hash(module.get_submodule('Hash'), root_module)
+    register_functions_ns3_internal(module.get_submodule('internal'), root_module)
+    return
+
+def register_functions_ns3_FatalImpl(module, root_module):
+    return
+
+def register_functions_ns3_Hash(module, root_module):
+    register_functions_ns3_Hash_Function(module.get_submodule('Function'), root_module)
+    return
+
+def register_functions_ns3_Hash_Function(module, root_module):
+    return
+
+def register_functions_ns3_internal(module, root_module):
+    return
+
+def main():
+    out = FileCodeSink(sys.stdout)
+    root_module = module_init()
+    register_types(root_module)
+    register_methods(root_module)
+    register_functions(root_module)
+    root_module.generate(out)
+
+if __name__ == '__main__':
+    main()
+
diff -Naur ns-3.18.1/src/wave/doc/wave.rst ns-3.19/src/wave/doc/wave.rst
--- ns-3.18.1/src/wave/doc/wave.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/doc/wave.rst	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,311 @@
+WAVE models
+-----------
+WAVE is a system architecture for wireless-based vehicular communications, 
+specified by the IEEE.  This chapter documents available models for WAVE
+within |ns3|.  The focus is on the MAC layer and MAC extension layer
+defined by [ieee80211p]_.
+
+.. include:: replace.txt
+
+.. heading hierarchy:
+   ------------- Chapter
+   ************* Section (#.#)
+   ============= Subsection (#.#.#)
+   ############# Paragraph (no number)
+
+Model Description
+*****************
+
+WAVE is an overall system architecture for vehicular communications.
+The standards for specifying WAVE include a set of extensions to the IEEE
+802.11 standard, found in IEEE Std 802.11p-2010 [ieee80211p]_, and
+the IEEE 1609 standard set, consisting of four documents:  
+resource manager:  IEEE 1609.1 [ieee1609dot1]_,
+security services:  IEEE 1609.2 [ieee1609dot2]_,
+network and transport layer services:  IEEE 1609.3 [ieee1609dot3]_,
+and multi-channel coordination:  IEEE 1609.4 [ieee1609dot4]_.
+
+In |ns3|, the focus of the ``wave`` module is on the MAC layer.
+The key design aspect of WAVE-compilant MACs is that they allow
+communications outside the context of a basic service set (BSS).
+The literature uses the acronym OCB to denote "outside the context
+of a BSS", and the class ``ns3::OcbWifiMac`` models this in |ns3|. 
+Many management frames will not be used, but when used, the BSSID field 
+needs to be set to a wildcard BSSID value. 
+Management information is transmitted by what is called a vendor specific 
+action frame. 
+
+With these changes, the packet transmissions (for a moving vehicle) can
+be fast with small delay.  At the physical layer, the biggest difference is 
+to use the 5.9 GHz band with a channel bandwidth of 10 MHz.  These physical
+layer changes can make the wireless signal relatively more stable,
+without degrading throughput too much (ranging from 3 Mbps to 27 Mbps), 
+although 20 MHz channel bandwidth is still supported.
+
+The source code for the WAVE MAC models lives in the directory
+``src/wave``.
+
+The current code represents an interim capability to realize an
+802.11p-compliant device, but without the WAVE extensions (which
+are planned for a later patch).  In vehicular communications using
+WAVE, radios have the capability of switching between control and
+service channels, or using multiple radios.  These aspects are not
+yet modelled.  The WaveNetDevice modelled herein enforces that
+a WAVE-compliant physical layer (at 5.9 GHz) is selected, and 
+does not require any association between devices (similar to an 
+adhoc WiFi MAC), but is otherwise similar (at this time) to a
+WifiNetDevice.
+
+Design
+======
+
+In |ns3|, support for 802.11p involves the MAC and PHY layers.
+To use an 802.11p NetDevice, ``ns3::Wifi80211pHelper`` is suggested.
+
+MAC layer
+#########
+
+The classes used to model the MAC layer are ``ns3::OrganizationIdentifier``,
+``ns3::VendorSpecificActionHeader``, ``ns3::HigherDataTxVectorTag``,
+``ns3::WaveMacLow``, and ``ns3::OcbWifiMac``.
+
+The OrganizationIdentifier and VendorSpecificActionHeader are used to support 
+the sending of a Vendor Specific Action frame. The HigherDataTxVectorTag 
+and WaveMacLow are used to support higher control transmission parameters. 
+These classes are all used in OcbWifiMac.
+
+OcbWifiMac is very similar to AdhocWifiMac, with some modifications. 
+(|ns3| AdhocWifiMac class is implemented very close to the 802.11p OCB 
+mode rather than a real 802.11 ad-hoc mode. The AdhocWifiMac has no BSS 
+context that is defined in 802.11 standard, so it will not take time to 
+send beacon and authenticate.)
+
+1. SetBssid, GetBssid, SetSsid, GetSsid
+   these methods are related to 802.11 BSS context which is unused in OCB context.
+2. SetLinkUpCallback, SetLinkDownCallback
+   WAVE device can send packets directly, so the WiFi link is never down.
+3. SendVsc, AddReceiveVscCallback
+   WAVE management information shall be sent by vendor specific action frame, 
+   and it will be called by upper layer 1609.4 standard to send WSA
+   (WAVE Service Advertisement) packets or other vendor specific information.
+4. SendTimingAdvertisement (not implemented)
+   Although Timing Advertisement is very important and specifically defined in 
+   802.11p standard, it is not useful in a simulation environment. 
+   Every node in |ns3| vehicular simulation is assumed to be already time 
+   synchronized (perhaps by GPS).
+5. ConfigureEdca
+   This method will allow the user to set EDCA parameters of WAVE channeles 
+   including CCH ans SCHs. And the OcbWifiMac itself also uses this method 
+   to configure default 802.11p EDCA parameters.
+6. WILDCARD BSSID
+   The WILDCARD BSSID is set to "ff:ff:ff:ff:ff:ff".
+   As defined in 802.11-2007, a wildcard BSSID shall not be used in the
+   BSSID field except for management frames of subtype probe request. But Adhoc 
+   mode of |ns3| simplifies this mechanism:  when stations receive packets, 
+   packets regardless of BSSID will be forwarded up to the higher layer. 
+   This process is very close 
+   to OCB mode as defined in 802.11p-2010, in which stations use the wildcard 
+   BSSID to allow the higher layer of other stations to hear directly.
+7. Enqueue, Receive
+   The most important methods are send and receive methods. According to the 
+   standard, we should filter the frames that are not permitted. However here we 
+   just identify the frames we care about; the other frames will be discarded.
+
+PHY layer
+#########
+Actually, no modification or extension happens in the |ns3| PHY layer
+corresponding to this model.
+In the 802.11p standard, the PHY layer wireless technology is still 80211a OFDM with 10MHz channel width,
+so Wifi80211pHelper will only allow the user to set the standard 
+to WIFI_PHY_STANDARD_80211_10MHZ or WIFI_PHY_STANDARD_80211_20MHZ
+(WIFI_PHY_STANDARD_80211a with 20MHz is supported, but not recommended.)
+The maximum station transmit power and maximum permitted EIRP defined in 
+802.11p is larger 
+than that of WiFi, so transmit range can normally become longer than 
+usual WiFi.  However, this feature will 
+not be implemented. Users who want to obtain longer range should configure 
+attributes "TxPowerStart", 
+"TxPowerEnd" and "TxPowerLevels" of the YansWifiPhy class.
+
+Scope and Limitations
+=====================
+
+1. Does the model involve vehicular mobility of some sort?
+
+Vehicular networks involve not only communication protocols, but also 
+a communication environment 
+including vehicular mobility and propagation models. Because of specific 
+features of the latter, the protocols need to change. The MAC layer model 
+in this 
+project just adapts MAC changes to vehicular environment. However this model 
+does not involve any
+vehicular mobility with time limit. Users can use any mobility model in |ns3|, 
+but should understand that vehicular mobility is out of scope for the
+current WAVE module.
+
+2. Is this model going to use different propagation models?
+
+Referring to the first issue, some more realistic propagation models 
+for vehicualr environment
+are suggested and welcome. And some existing propagation models in |ns3| are 
+also suitable. 
+Normally, users can use Friis, Two-Ray Ground, and Nakagami models. 
+
+3. Are there any vehicular application models to drive the code?
+
+About vehicular application models, SAE J2375 depends on WAVE architecture and
+is an application message set in US; CAM and DENM in Europe between network 
+and application layer, but is very close to application model. The BSM in 
+J2375 and CAM send alert messages that every 
+vehicle node will sent periodicity about its status information to 
+cooperate with others. 
+Fow now, a vehicular application model is not within scope.
+
+References
+==========
+
+.. [ieee80211p] IEEE Std 802.11p-2010 "IEEE Standard for Information technology-- Local and metropolitan area networks-- Specific requirements-- Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) Specifications Amendment 6: Wireless Access in Vehicular Environments"
+
+.. [ieee1609dot1] IEEE Std 1609.1-2010 "IEEE Standard for Wireless Access in Vehicular Environments (WAVE) - Resource Manager, 2010"
+
+.. [ieee1609dot2] IEEE Std 1609.2-2010 "IEEE Standard for Wireless Access in Vehicular Environments (WAVE) - Security Services for Applications and Management Messages, 2010"
+
+.. [ieee1609dot3] IEEE Std 1609.3-2010 "IEEE Standard for Wireless Access in Vehicular Environments (WAVE) - Networking Services, 2010"
+
+.. [ieee1609dot4] IEEE Std 1609.4-2010 "IEEE Standard for Wireless Access in Vehicular Environments (WAVE) - Multi-Channel Operation, 2010"
+
+Usage
+*****
+
+Helpers
+=======
+The helpers include ``ns3::NqosWaveMacHelper``, ``ns3::QosWaveMacHelper``, 
+``ns3::Wifi80211pHelper`` and ``ns3::WaveHelper``. Wifi80211pHelper is used 
+to create 
+802.11p devices that follow the 802.11p-2010 standard. WaveHelper is 
+used to create WAVE devices that follow the 802.11p-2010 and 1609.4-2010 
+standards which are the MAC and PHY layers of the WAVE architecture. 
+The relation of them is described as below:
+
+::
+
+    WifiHelper ----------use---------->  WifiMacHelper
+        ^                             ^       ^
+        |                             |       |
+        |                          inherit  inherit
+        |                             |       |
+        |                 QosWifiMacHelper  NqosWifiMacHelper
+        |                             ^       ^
+        |                             |       |
+      inherit                     inherit  inherit
+        |                             |       |
+      Wifi80211pHelper     QosWaveMacHelper  NqosWaveHelper
+
+Although Wifi80211Helper can use any subclasses inheriting from 
+WifiMacHelper, we force users to use subclasses inheriting from 
+QosWaveMacHelper or NqosWaveHelper.
+
+Although the functions of WiFi 802.11p device can be achieved by 
+WaveNetDevice's ContinuousAccess assignment, Wifi80211pHelper is recommeneded
+if there is no need for multiple channel operation.
+Usage is as follows:
+
+::
+
+    NodeContainer nodes;
+    NetDeviceContainer devices;
+    nodes.Create (2);
+    YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
+    YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
+    wifiPhy.SetChannel (wifiChannel.Create ());
+    NqosWave80211pMacHelper wifi80211pMac = NqosWaveMacHelper::Default();
+    Wifi80211pHelper 80211pHelper = Wifi80211pHelper::Default ();
+    devices = 80211pHelper.Install (wifiPhy, wifi80211pMac, nodes);
+
+APIs
+====
+
+The 802.11p device can allow the upper layer to send different information
+over Vendor Specific Action management frames by using different
+OrganizationIdentifier fields to identify differences.
+
+1. already create a Node object and WifiNetDevice object
+2. define an OrganizationIdentifier
+
+::
+
+   uint8_t oi_bytes[5] = {0x00, 0x50, 0xC2, 0x4A, 0x40};
+   OrganizationIdentifier oi(oi_bytes,5);
+
+3. define a Callback for the defined OrganizationIdentifier
+
+::
+
+   VscCallback vsccall = MakeCallback (&VsaExample::GetWsaAndOi, this);
+
+4. OcbWifiMac of 802.11p device registers this identifier and function
+
+::
+
+      Ptr<WifiNetDevice> device1 = DynamicCast<WifiNetDevice>(nodes.Get (i)->GetDevice (0));
+      Ptr<OcbWifiMac> ocb1 = DynamicCast<OcbWifiMac>(device->GetMac ());
+      ocb1->AddReceiveVscCallback (oi, vsccall);
+
+5. now one can send management packets over VSA frames
+
+::
+
+      Ptr<Packet> vsc = Create<Packet> ();
+      ocb2->SendVsc (vsc, Mac48Address::GetBroadcast (), m_16093oi);
+
+6. then registered callbacks in other devices will be called.
+
+Attributes
+==========
+
+The current classes do not provide any additional attributes beyond those
+in the WiFi module.
+
+Output
+======
+
+The current classes provide output of the same type as WiFi devices;
+namely, ASCII and pcap traces, and logging output.  The WAVE logging
+components can be enabled globally via the call to
+
+::
+  
+  Wifi80211pHelper::EnableLogComponents ();
+
+
+Advanced Usage
+==============
+
+To be defined.
+
+Examples
+========
+
+A basic example exists called ``wave-simple-80211p.cc``.
+This example shows basic construction of an 802.11p node.  Two nodes
+are constructed with 802.11p devices, and by default, one node sends a single
+packet to another node (the number of packets and interval between
+them can be configured by command-line arguments).  The example shows
+typical usage of the helper classes for this mode of WiFi.
+
+Troubleshooting
+===============
+
+To be defined.
+
+Validation
+**********
+
+A single test suite named ``wifi-80211p-ocb`` is defined.  This test
+case consists of a stationary node and a mobile node.  The mobile
+node moves towards the stationary mode, and time points are checked
+at which time the physical layer starts to receive packets (and
+whether the MAC becomes associated, if applicable).  The same physical
+experiment is repeated for normal WiFi NetDevices in AP/STA mode, in
+Adhoc mode, and the new OCB mode.
+
diff -Naur ns-3.18.1/src/wave/examples/wave-simple-80211p.cc ns-3.19/src/wave/examples/wave-simple-80211p.cc
--- ns-3.18.1/src/wave/examples/wave-simple-80211p.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/examples/wave-simple-80211p.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,174 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006,2007 INRIA
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ * Author: Junling Bu <linlinjavaer@gmail.com>
+ *
+ */
+/**
+ * This example shows basic construction of an 802.11p node.  Two nodes
+ * are constructed with 802.11p devices, and by default, one node sends a single
+ * packet to another node (the number of packets and interval between
+ * them can be configured by command-line arguments).  The example shows
+ * typical usage of the helper classes for this mode of WiFi (where "OCB" refers
+ * to "Outside the Context of a BSS")."
+ */
+
+#include "ns3/vector.h"
+#include "ns3/string.h"
+#include "ns3/socket.h"
+#include "ns3/double.h"
+#include "ns3/config.h"
+#include "ns3/log.h"
+#include "ns3/command-line.h"
+#include "ns3/mobility-model.h"
+#include "ns3/yans-wifi-helper.h"
+#include "ns3/position-allocator.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-interface-container.h"
+#include <iostream>
+
+#include "ns3/ocb-wifi-mac.h"
+#include "ns3/wifi-80211p-helper.h"
+#include "ns3/wave-mac-helper.h"
+
+NS_LOG_COMPONENT_DEFINE ("WifiSimpleOcb");
+using namespace ns3;
+
+/*
+ * In WAVE module, there is no net device class named like "Wifi80211pNetDevice",
+ * instead, we need to use Wifi80211pHelper to create an object of
+ * WifiNetDevice class.
+ *
+ * usage:
+ *  NodeContainer nodes;
+ *  NetDeviceContainer devices;
+ *  nodes.Create (2);
+ *  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
+ *  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
+ *  wifiPhy.SetChannel (wifiChannel.Create ());
+ *  NqosWaveMacHelper wifi80211pMac = NqosWave80211pMacHelper::Default();
+ *  Wifi80211pHelper wifi80211p = Wifi80211pHelper::Default ();
+ *  devices = wifi80211p.Install (wifiPhy, wifi80211pMac, nodes);
+ *
+ * The reason of not providing a 802.11p class is that most of modeling
+ * 802.11p standard has been done in wifi module, so we only need a high
+ * MAC class that enables OCB mode.
+ */
+
+void ReceivePacket (Ptr<Socket> socket)
+{
+  NS_LOG_UNCOND ("Received one packet!");
+}
+
+static void GenerateTraffic (Ptr<Socket> socket, uint32_t pktSize,
+                             uint32_t pktCount, Time pktInterval )
+{
+  if (pktCount > 0)
+    {
+      socket->Send (Create<Packet> (pktSize));
+      Simulator::Schedule (pktInterval, &GenerateTraffic,
+                           socket, pktSize,pktCount - 1, pktInterval);
+    }
+  else
+    {
+      socket->Close ();
+    }
+}
+
+int main (int argc, char *argv[])
+{
+  std::string phyMode ("OfdmRate6MbpsBW10MHz");
+  uint32_t packetSize = 1000; // bytes
+  uint32_t numPackets = 1;
+  double interval = 1.0; // seconds
+  bool verbose = false;
+
+  CommandLine cmd;
+
+  cmd.AddValue ("phyMode", "Wifi Phy mode", phyMode);
+  cmd.AddValue ("packetSize", "size of application packet sent", packetSize);
+  cmd.AddValue ("numPackets", "number of packets generated", numPackets);
+  cmd.AddValue ("interval", "interval (seconds) between packets", interval);
+  cmd.AddValue ("verbose", "turn on all WifiNetDevice log components", verbose);
+  cmd.Parse (argc, argv);
+  // Convert to time object
+  Time interPacketInterval = Seconds (interval);
+
+
+  NodeContainer c;
+  c.Create (2);
+
+  // The below set of helpers will help us to put together the wifi NICs we want
+  YansWifiPhyHelper wifiPhy =  YansWifiPhyHelper::Default ();
+  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
+  Ptr<YansWifiChannel> channel = wifiChannel.Create ();
+  wifiPhy.SetChannel (channel);
+  // ns-3 supports generate a pcap trace
+  wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11);
+
+  NqosWaveMacHelper wifi80211pMac = NqosWaveMacHelper::Default ();
+  Wifi80211pHelper wifi80211p = Wifi80211pHelper::Default ();
+  if (verbose)
+    {
+      wifi80211p.EnableLogComponents ();      // Turn on all Wifi 802.11p logging
+    }
+
+  wifi80211p.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                      "DataMode",StringValue (phyMode),
+                                      "ControlMode",StringValue (phyMode));
+  NetDeviceContainer devices = wifi80211p.Install (wifiPhy, wifi80211pMac, c);
+
+  MobilityHelper mobility;
+  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
+  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+  positionAlloc->Add (Vector (5.0, 0.0, 0.0));
+  mobility.SetPositionAllocator (positionAlloc);
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (c);
+
+  InternetStackHelper internet;
+  internet.Install (c);
+
+  Ipv4AddressHelper ipv4;
+  NS_LOG_INFO ("Assign IP Addresses.");
+  ipv4.SetBase ("10.1.1.0", "255.255.255.0");
+  Ipv4InterfaceContainer i = ipv4.Assign (devices);
+
+  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
+  Ptr<Socket> recvSink = Socket::CreateSocket (c.Get (0), tid);
+  InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), 80);
+  recvSink->Bind (local);
+  recvSink->SetRecvCallback (MakeCallback (&ReceivePacket));
+
+  Ptr<Socket> source = Socket::CreateSocket (c.Get (1), tid);
+  InetSocketAddress remote = InetSocketAddress (Ipv4Address ("255.255.255.255"), 80);
+  source->SetAllowBroadcast (true);
+  source->Connect (remote);
+
+  Simulator::ScheduleWithContext (source->GetNode ()->GetId (),
+                                  Seconds (1.0), &GenerateTraffic,
+                                  source, packetSize, numPackets, interPacketInterval);
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+
+  return 0;
+}
diff -Naur ns-3.18.1/src/wave/examples/wscript ns-3.19/src/wave/examples/wscript
--- ns-3.18.1/src/wave/examples/wscript	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/examples/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,6 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+def build(bld):
+    obj = bld.create_ns3_program('wave-simple-80211p',
+        ['core', 'applications', 'mobility', 'network', 'wifi','wave'])
+    obj.source = 'wave-simple-80211p.cc'
diff -Naur ns-3.18.1/src/wave/helper/wave-mac-helper.cc ns-3.19/src/wave/helper/wave-mac-helper.cc
--- ns-3.18.1/src/wave/helper/wave-mac-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/helper/wave-mac-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,125 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2009 MIRKO BANCHI
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Author: Junling Bu <linlinjavaer@gmail.com>
+ */
+#include "ns3/wifi-mac.h"
+#include "ns3/wifi-phy.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/boolean.h"
+#include "ns3/string.h"
+#include "wave-mac-helper.h"
+
+namespace ns3 {
+
+NqosWaveMacHelper::NqosWaveMacHelper (void)
+{
+
+}
+NqosWaveMacHelper::~NqosWaveMacHelper (void)
+{
+
+}
+NqosWaveMacHelper
+NqosWaveMacHelper::Default (void)
+{
+  NqosWaveMacHelper helper;
+  // We're making non QoS-enabled Wi-Fi MACs here, so we set the
+  // necessary attribute. I've carefully positioned this here so that
+  // someone who knows what they're doing can override with explicit
+  // attributes.
+  helper.SetType ("ns3::OcbWifiMac", "QosSupported", BooleanValue (false));
+  return helper;
+}
+void
+NqosWaveMacHelper::SetType (std::string type,
+                            std::string n0, const AttributeValue &v0,
+                            std::string n1, const AttributeValue &v1,
+                            std::string n2, const AttributeValue &v2,
+                            std::string n3, const AttributeValue &v3,
+                            std::string n4, const AttributeValue &v4,
+                            std::string n5, const AttributeValue &v5,
+                            std::string n6, const AttributeValue &v6,
+                            std::string n7, const AttributeValue &v7)
+{
+  if (type.compare ("ns3::OcbWifiMac") != 0)
+    {
+      NS_FATAL_ERROR ("QosWaveMacHelper shall set OcbWifiMac");
+    }
+  NqosWifiMacHelper::SetType ("ns3::OcbWifiMac",
+                              n0, v0,
+                              n1, v1,
+                              n2, v2,
+                              n3, v3,
+                              n4, v4,
+                              n5, v5,
+                              n6, v6,
+                              n7, v7);
+}
+
+/**********  QosWifi80211pMacHelper *********/
+QosWaveMacHelper::QosWaveMacHelper ()
+{
+}
+QosWaveMacHelper::~QosWaveMacHelper ()
+{
+}
+QosWaveMacHelper
+QosWaveMacHelper::Default (void)
+{
+  QosWaveMacHelper helper;
+
+  // We're making QoS-enabled Wi-Fi MACs here, so we set the necessary
+  // attribute. I've carefully positioned this here so that someone
+  // who knows what they're doing can override with explicit
+  // attributes.
+  helper.SetType ("ns3::OcbWifiMac", "QosSupported", BooleanValue (true));
+
+  return helper;
+}
+void
+QosWaveMacHelper::SetType (std::string type,
+                           std::string n0, const AttributeValue &v0,
+                           std::string n1, const AttributeValue &v1,
+                           std::string n2, const AttributeValue &v2,
+                           std::string n3, const AttributeValue &v3,
+                           std::string n4, const AttributeValue &v4,
+                           std::string n5, const AttributeValue &v5,
+                           std::string n6, const AttributeValue &v6,
+                           std::string n7, const AttributeValue &v7)
+{
+  if (type.compare ("ns3::OcbWifiMac") != 0)
+    {
+      NS_FATAL_ERROR ("QosWaveMacHelper shall set OcbWifiMac");
+    }
+  QosWifiMacHelper::SetType ("ns3::OcbWifiMac",
+                             n0, v0,
+                             n1, v1,
+                             n2, v2,
+                             n3, v3,
+                             n4, v4,
+                             n5, v5,
+                             n6, v6,
+                             n7, v7);
+}
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/wave/helper/wave-mac-helper.h ns-3.19/src/wave/helper/wave-mac-helper.h
--- ns-3.18.1/src/wave/helper/wave-mac-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/helper/wave-mac-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,144 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2009 MIRKO BANCHI
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Author: Junling Bu <linlinjavaer@gmail.com>
+ */
+#ifndef WAVE_MAC_HELPER_H
+#define WAVE_MAC_HELPER_H
+#include "ns3/qos-wifi-mac-helper.h"
+#include "ns3/nqos-wifi-mac-helper.h"
+
+namespace ns3 {
+
+class NqosWaveMacHelper : public NqosWifiMacHelper
+{
+public:
+  /**
+   * Create a NqosWaveMacHelper to make life easier for people who want to
+   * work with non-QOS Wave MAC layers.
+   */
+  NqosWaveMacHelper (void);
+
+  /**
+   * \internal
+   * Destroy a NqosWaveMacHelper.
+   */
+  virtual ~NqosWaveMacHelper (void);
+  /**
+   * Create a mac helper in a default working state.
+   * i.e., this is an ocb mac by default.
+   */
+  static NqosWaveMacHelper Default (void);
+  /**
+   * \param type the type of ns3::WifiMac to create.
+   * \param n0 the name of the attribute to set
+   * \param v0 the value of the attribute to set
+   * \param n1 the name of the attribute to set
+   * \param v1 the value of the attribute to set
+   * \param n2 the name of the attribute to set
+   * \param v2 the value of the attribute to set
+   * \param n3 the name of the attribute to set
+   * \param v3 the value of the attribute to set
+   * \param n4 the name of the attribute to set
+   * \param v4 the value of the attribute to set
+   * \param n5 the name of the attribute to set
+   * \param v5 the value of the attribute to set
+   * \param n6 the name of the attribute to set
+   * \param v6 the value of the attribute to set
+   * \param n7 the name of the attribute to set
+   * \param v7 the value of the attribute to set
+   *
+   * All the attributes specified in this method should exist
+   * in the requested mac.
+   *
+   * note: Here we require users set type with OcbWifiMac or its
+   * subclass, otherwise it will become error
+   */
+  virtual void SetType (std::string type,
+                        std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
+                        std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
+                        std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
+                        std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
+                        std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
+                        std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
+                        std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
+                        std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
+};
+
+class QosWaveMacHelper : public QosWifiMacHelper
+{
+public:
+  /**
+   * Create a QosWaveMacHelper that is used to make life easier when working
+   * with Wifi 802.11p devices using a QOS MAC layer.
+   */
+  QosWaveMacHelper (void);
+
+  /**
+   * \internal
+   * Destroy a QosWaveMacHelper
+   */
+  virtual ~QosWaveMacHelper (void);
+
+  /**
+   * Create a mac helper in a default working state.
+   */
+  static QosWaveMacHelper Default (void);
+
+  /**
+   * \param type the type of ns3::WifiMac to create.
+   * \param n0 the name of the attribute to set
+   * \param v0 the value of the attribute to set
+   * \param n1 the name of the attribute to set
+   * \param v1 the value of the attribute to set
+   * \param n2 the name of the attribute to set
+   * \param v2 the value of the attribute to set
+   * \param n3 the name of the attribute to set
+   * \param v3 the value of the attribute to set
+   * \param n4 the name of the attribute to set
+   * \param v4 the value of the attribute to set
+   * \param n5 the name of the attribute to set
+   * \param v5 the value of the attribute to set
+   * \param n6 the name of the attribute to set
+   * \param v6 the value of the attribute to set
+   * \param n7 the name of the attribute to set
+   * \param v7 the value of the attribute to set
+   *
+   * All the attributes specified in this method should exist
+   * in the requested mac.
+   *
+   * note: Here we require users set type with OcbWifiMac or its
+   * subclass, otherwise it will become error
+   */
+  virtual void SetType (std::string type,
+                        std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
+                        std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
+                        std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
+                        std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
+                        std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
+                        std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
+                        std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
+                        std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
+};
+
+}
+
+#endif /* WAVE_MAC_HELPER_H */
diff -Naur ns-3.18.1/src/wave/helper/wifi-80211p-helper.cc ns-3.19/src/wave/helper/wifi-80211p-helper.cc
--- ns-3.18.1/src/wave/helper/wifi-80211p-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/helper/wifi-80211p-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,117 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2009 MIRKO BANCHI
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Author: Junling Bu <linlinjavaer@gmail.com>
+ */
+#include "ns3/string.h"
+#include "ns3/log.h"
+#include <typeinfo>
+#include "wave-mac-helper.h"
+#include "wifi-80211p-helper.h"
+
+namespace ns3 {
+
+Wifi80211pHelper::Wifi80211pHelper ()
+{
+}
+
+Wifi80211pHelper::~Wifi80211pHelper ()
+{
+}
+
+Wifi80211pHelper
+Wifi80211pHelper::Default (void)
+{
+  Wifi80211pHelper helper;
+  helper.SetStandard (WIFI_PHY_STANDARD_80211_10MHZ);
+  helper.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                  "DataMode", StringValue ("OfdmRate6MbpsBW10MHz"),
+                                  "ControlMode",StringValue ("OfdmRate6MbpsBW10MHz"));
+  return helper;
+}
+
+void
+Wifi80211pHelper::SetStandard (enum WifiPhyStandard standard)
+{
+  if ((standard == WIFI_PHY_STANDARD_80211a) || (standard == WIFI_PHY_STANDARD_80211_10MHZ))
+    {
+      WifiHelper::SetStandard (standard);
+    }
+  else
+    {
+      NS_FATAL_ERROR ("802.11p only use 802.11 standard with 10MHz or 20MHz");
+    }
+}
+
+
+void
+Wifi80211pHelper::EnableLogComponents (void)
+{
+  WifiHelper::EnableLogComponents ();
+
+  LogComponentEnable ("OcbWifiMac", LOG_LEVEL_ALL);
+  LogComponentEnable ("VendorSpecificAction", LOG_LEVEL_ALL);
+}
+
+NetDeviceContainer
+Wifi80211pHelper::Install (const WifiPhyHelper &phyHelper, const WifiMacHelper &macHelper, NodeContainer c) const
+{
+  bool isWaveMacHelper = false;
+  try
+    {
+      const QosWaveMacHelper& qosMac = dynamic_cast<const QosWaveMacHelper&> (macHelper);
+      isWaveMacHelper = true;
+      // below check will never fail, just used for survive from
+      // gcc warn "-Wunused-but-set-variable"
+      if (&qosMac == 0)
+        {
+          NS_FATAL_ERROR ("it could never get here");
+        }
+    }
+  catch (const std::bad_cast &)
+    {
+
+    }
+
+  try
+    {
+      const NqosWaveMacHelper& nqosMac = dynamic_cast<const NqosWaveMacHelper&> (macHelper);
+      isWaveMacHelper = true;
+      if (&nqosMac == 0)
+        {
+          NS_FATAL_ERROR ("it could never get here");
+        }
+    }
+  catch (const std::bad_cast &)
+    {
+
+    }
+
+  if (!isWaveMacHelper)
+    {
+      NS_FATAL_ERROR ("the macHelper should be either QosWaveMacHelper or NqosWaveMacHelper"
+                      ", or should be the subclass of QosWaveMacHelper or NqosWaveMacHelper");
+    }
+
+  return WifiHelper::Install (phyHelper, macHelper, c);
+}
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/wave/helper/wifi-80211p-helper.h ns-3.19/src/wave/helper/wifi-80211p-helper.h
--- ns-3.18.1/src/wave/helper/wifi-80211p-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/helper/wifi-80211p-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,79 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2009 MIRKO BANCHI
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ * Author: Mirko Banchi <mk.banchi@gmail.com>
+ * Author: Junling Bu <linlinjavaer@gmail.com>
+ */
+#ifndef WIFI_802_11P_HELPER_H
+#define WIFI_802_11P_HELPER_H
+#include "ns3/wifi-helper.h"
+
+namespace ns3 {
+
+/**
+ * \brief helps to create wifi 802.11p objects of
+ * WifiNetDevice class
+ *
+ * This class can help to create a large set of similar
+ * wifi 802.11p objects and to configure a large set of
+ * their attributes during creation.
+ */
+class Wifi80211pHelper : public WifiHelper
+{
+public:
+  Wifi80211pHelper ();
+  virtual ~Wifi80211pHelper ();
+
+  /**
+   * \returns a new Wifi80211pHelper in a default state
+   *
+   * The default state is defined as being an OcbWifiMac MAC
+   * layer with constant rate OfdmRate6MbpsBW10MHz
+   * and both objects using their default attribute values.
+   */
+  static Wifi80211pHelper Default (void);
+
+  /**
+   * \param standard the phy standard to configure during installation
+   *
+   * Users can only configure 802.11a with 10MHz channel bandwidth indicated by
+   * WIFI_PHY_STANDARD_80211_10MHZ or 20MHz channel bandwidth indicated by
+   * WIFI_PHY_STANDARD_80211a, other standard types will be not allowed.
+   * The default standard is 10MHz.
+   */
+  virtual void SetStandard (enum WifiPhyStandard standard);
+
+  /**
+   * \param phy the PHY helper to create PHY objects
+   * \param mac the MAC helper to create MAC objects
+   * \param c the set of nodes on which a wifi device must be created
+   * \returns a device container which contains all the devices created by this method.
+   */
+  virtual NetDeviceContainer Install (const WifiPhyHelper &phy, const WifiMacHelper &macHelper,NodeContainer c) const;
+
+  /**
+   * Helper to enable all WifiNetDevice log components with one statement
+   */
+  static void EnableLogComponents (void);
+};
+
+}
+
+#endif /* WIFI_802_11P_HELPER_H */
diff -Naur ns-3.18.1/src/wave/model/higher-tx-tag.cc ns-3.19/src/wave/model/higher-tx-tag.cc
--- ns-3.18.1/src/wave/model/higher-tx-tag.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/model/higher-tx-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,104 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *         Junling Bu <linlinjavaer@gmail.com>
+ */
+#include "higher-tx-tag.h"
+#include "ns3/tag.h"
+#include "ns3/log.h"
+#include "ns3/uinteger.h"
+
+NS_LOG_COMPONENT_DEFINE ("HigherDataTxVectorTag");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (HigherDataTxVectorTag);
+
+TypeId
+HigherDataTxVectorTag::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::HigherDataTxVectorTag")
+    .SetParent<Tag> ()
+    .AddConstructor<HigherDataTxVectorTag> ()
+  ;
+  return tid;
+}
+HigherDataTxVectorTag::HigherDataTxVectorTag (void)
+  : m_adapter (false)
+{
+  NS_LOG_FUNCTION (this);
+}
+HigherDataTxVectorTag::HigherDataTxVectorTag (WifiTxVector dataTxVector, bool adapter)
+  : m_dataTxVector (dataTxVector),
+    m_adapter (adapter)
+{
+  NS_LOG_FUNCTION (this);
+}
+HigherDataTxVectorTag::~HigherDataTxVectorTag (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+TypeId
+HigherDataTxVectorTag::GetInstanceTypeId (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return GetTypeId ();
+}
+
+WifiTxVector
+HigherDataTxVectorTag::GetDataTxVector (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_dataTxVector;
+}
+bool
+HigherDataTxVectorTag::IsAdapter (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_adapter;
+}
+
+uint32_t
+HigherDataTxVectorTag::GetSerializedSize (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return (sizeof (WifiTxVector) + 1);
+}
+void
+HigherDataTxVectorTag::Serialize (TagBuffer i) const
+{
+  NS_LOG_FUNCTION (this << &i);
+  i.Write ((uint8_t *)&m_dataTxVector, sizeof (WifiTxVector));
+  i.WriteU8 (static_cast<uint8_t> (m_adapter));
+}
+void
+HigherDataTxVectorTag::Deserialize (TagBuffer i)
+{
+  NS_LOG_FUNCTION (this << &i);
+  i.Read ((uint8_t *)&m_dataTxVector, sizeof (WifiTxVector));
+  m_adapter = i.ReadU8 ();
+}
+void
+HigherDataTxVectorTag::Print (std::ostream &os) const
+{
+  NS_LOG_FUNCTION (this << &os);
+  os << " Data=" << m_dataTxVector << " Adapter=" << m_adapter;
+}
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/wave/model/higher-tx-tag.h ns-3.19/src/wave/model/higher-tx-tag.h
--- ns-3.18.1/src/wave/model/higher-tx-tag.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/model/higher-tx-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,59 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *         Junling Bu <linlinjavaer@gmail.com>
+ */
+#ifndef HIGHER_DATA_TXVECTOR_TAG_H
+#define HIGHER_DATA_TXVECTOR_TAG_H
+
+#include "ns3/packet.h"
+#include "ns3/wifi-tx-vector.h"
+
+namespace ns3 {
+class Tag;
+
+/**
+ * This tag will be used to support higher layer control data rate
+ * and tx power level.
+ */
+class HigherDataTxVectorTag : public Tag
+{
+public:
+  HigherDataTxVectorTag (void);
+  HigherDataTxVectorTag (WifiTxVector dataTxVector, bool adapter);
+  virtual ~HigherDataTxVectorTag (void);
+
+  WifiTxVector GetDataTxVector (void) const;
+  bool IsAdapter (void) const;
+
+  static TypeId GetTypeId (void);
+  virtual TypeId GetInstanceTypeId (void) const;
+  virtual uint32_t GetSerializedSize (void) const;
+  virtual void Serialize (TagBuffer i) const;
+  virtual void Deserialize (TagBuffer i);
+  virtual void Print (std::ostream &os) const;
+
+private:
+  WifiTxVector m_dataTxVector;
+  bool m_adapter;
+};
+
+} // namespace ns3
+
+#endif /* HIGHER_DATA_TXVECTOR_TAG_H*/
diff -Naur ns-3.18.1/src/wave/model/ocb-wifi-mac.cc ns-3.19/src/wave/model/ocb-wifi-mac.cc
--- ns-3.18.1/src/wave/model/ocb-wifi-mac.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/model/ocb-wifi-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,372 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *         Junling Bu <linlinjavaer@gmail.com>
+ */
+#include "ns3/pointer.h"
+#include "ns3/log.h"
+#include "ns3/string.h"
+#include "ns3/qos-tag.h"
+#include "ns3/mac-low.h"
+#include "ns3/dcf-manager.h"
+#include "ns3/mac-rx-middle.h"
+#include "ns3/mgt-headers.h"
+#include "wave-mac-low.h"
+#include "ocb-wifi-mac.h"
+#include "vendor-specific-action.h"
+#include "higher-tx-tag.h"
+
+NS_LOG_COMPONENT_DEFINE ("OcbWifiMac");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (OcbWifiMac);
+
+const static Mac48Address WILDCARD_BSSID = Mac48Address::GetBroadcast ();
+
+TypeId
+OcbWifiMac::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::OcbWifiMac")
+    .SetParent<RegularWifiMac> ()
+    .AddConstructor<OcbWifiMac> ()
+  ;
+  return tid;
+}
+
+OcbWifiMac::OcbWifiMac (void)
+{
+  NS_LOG_FUNCTION (this);
+
+  // use WaveMacLow instead of MacLow
+  m_low = CreateObject<WaveMacLow> ();
+  m_low->SetRxCallback (MakeCallback (&MacRxMiddle::Receive, m_rxMiddle));
+  m_dcfManager->SetupLowListener (m_low);
+  m_dca->SetLow (m_low);
+  for (EdcaQueues::iterator i = m_edca.begin (); i != m_edca.end (); ++i)
+    {
+      i->second->SetLow (m_low);
+    }
+
+  // Let the lower layers know that we are acting as an OCB node
+  SetTypeOfStation (OCB);
+  // BSSID is still needed in the low part of MAC
+  RegularWifiMac::SetBssid (WILDCARD_BSSID);
+}
+
+OcbWifiMac::~OcbWifiMac (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+OcbWifiMac::SendVsc (Ptr<Packet> vsc, Mac48Address peer, OrganizationIdentifier oi)
+{
+  NS_LOG_FUNCTION (this << vsc << peer << oi);
+  WifiMacHeader hdr;
+  hdr.SetAction ();
+  hdr.SetAddr1 (peer);
+  hdr.SetAddr2 (GetAddress ());
+  hdr.SetAddr3 (WILDCARD_BSSID);
+  hdr.SetDsNotFrom ();
+  hdr.SetDsNotTo ();
+  VendorSpecificActionHeader vsa;
+  vsa.SetOrganizationIdentifier (oi);
+  vsc->AddHeader (vsa);
+
+  if (m_qosSupported)
+    {
+      uint8_t tid = QosUtilsGetTidForPacket (vsc);
+      tid = tid > 7 ? 0 : tid;
+      m_edca[QosUtilsMapTidToAc (tid)]->Queue (vsc, hdr);
+    }
+  else
+    {
+      m_dca->Queue (vsc, hdr);
+    }
+}
+
+void
+OcbWifiMac::AddReceiveVscCallback (OrganizationIdentifier oi, VscCallback cb)
+{
+  NS_LOG_FUNCTION (this << oi << &cb);
+  m_vscManager.RegisterVscCallback (oi, cb);
+}
+
+void
+OcbWifiMac::RemoveReceiveVscCallback (OrganizationIdentifier oi)
+{
+  NS_LOG_FUNCTION (this << oi);
+  m_vscManager.DeregisterVscCallback (oi);
+}
+
+void
+OcbWifiMac::SetSsid (Ssid ssid)
+{
+  NS_LOG_WARN ("in OCB mode we should not call SetSsid");
+}
+
+Ssid
+OcbWifiMac::GetSsid (void) const
+{
+  NS_FATAL_ERROR ("in OCB mode we should not call GetSsid");
+  // we really do not want to return ssid, however we have to provide
+  return RegularWifiMac::GetSsid ();
+}
+
+
+void
+OcbWifiMac::SetBssid (Mac48Address bssid)
+{
+  NS_FATAL_ERROR ("in OCB mode we should not call SetBsid");
+}
+
+Mac48Address
+OcbWifiMac::GetBssid (void) const
+{
+  NS_FATAL_ERROR ("in OCB mode we should not call GetBssid");
+  return WILDCARD_BSSID;
+}
+
+void
+OcbWifiMac::SetLinkUpCallback (Callback<void> linkUp)
+{
+  NS_LOG_FUNCTION (this << &linkUp);
+  RegularWifiMac::SetLinkUpCallback (linkUp);
+
+  // The approach taken here is that, from the point of view of a STA
+  // in OCB mode, the link is always up, so we immediately invoke the
+  // callback if one is set
+  linkUp ();
+}
+
+void
+OcbWifiMac::SetLinkDownCallback (Callback<void> linkDown)
+{
+  NS_LOG_FUNCTION (this << &linkDown);
+  RegularWifiMac::SetLinkDownCallback (linkDown);
+  NS_LOG_WARN ("in OCB mode the like will never down, so linkDown will never be called");
+}
+
+void
+OcbWifiMac::Enqueue (Ptr<const Packet> packet, Mac48Address to)
+{
+  NS_LOG_FUNCTION (this << packet << to);
+  if (m_stationManager->IsBrandNew (to))
+    {
+      // In ocb mode, we assume that every destination supports all
+      // the rates we support.
+      for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
+        {
+          m_stationManager->AddSupportedMode (to, m_phy->GetMode (i));
+        }
+      m_stationManager->RecordDisassociated (to);
+    }
+
+  WifiMacHeader hdr;
+
+  // If we are not a QoS STA then we definitely want to use AC_BE to
+  // transmit the packet. A TID of zero will map to AC_BE (through \c
+  // QosUtilsMapTidToAc()), so we use that as our default here.
+  uint8_t tid = 0;
+
+  if (m_qosSupported)
+    {
+      hdr.SetType (WIFI_MAC_QOSDATA);
+      hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+      hdr.SetQosNoEosp ();
+      hdr.SetQosNoAmsdu ();
+      // About transmission of multiple frames,
+      // in Ad-hoc mode TXOP is not supported for now, so TxopLimit=0;
+      // however in OCB mode, 802.11p do not allow transmit multiple frames
+      // so TxopLimit must equal 0
+      hdr.SetQosTxopLimit (0);
+
+      // Fill in the QoS control field in the MAC header
+      tid = QosUtilsGetTidForPacket (packet);
+      // Any value greater than 7 is invalid and likely indicates that
+      // the packet had no QoS tag, so we revert to zero, which'll
+      // mean that AC_BE is used.
+      if (tid >= 7)
+        {
+          tid = 0;
+        }
+      hdr.SetQosTid (tid);
+    }
+  else
+    {
+      hdr.SetTypeData ();
+    }
+
+  hdr.SetAddr1 (to);
+  hdr.SetAddr2 (GetAddress ());
+  hdr.SetAddr3 (WILDCARD_BSSID);
+  hdr.SetDsNotFrom ();
+  hdr.SetDsNotTo ();
+
+  if (m_qosSupported)
+    {
+      // Sanity check that the TID is valid
+      NS_ASSERT (tid < 8);
+      m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
+    }
+  else
+    {
+      m_dca->Queue (packet, hdr);
+    }
+}
+
+/*
+ * see 802.11p-2010 chapter 11.19
+ * here we only care about data packet and vsa management frame
+ */
+void
+OcbWifiMac::Receive (Ptr<Packet> packet, const WifiMacHeader *hdr)
+{
+  NS_LOG_FUNCTION (this << packet << hdr);
+  NS_ASSERT (!hdr->IsCtl ());
+  NS_ASSERT (hdr->GetAddr3 () == WILDCARD_BSSID);
+
+  Mac48Address from = hdr->GetAddr2 ();
+  Mac48Address to = hdr->GetAddr1 ();
+
+  if (hdr->IsData ())
+    {
+      if (hdr->IsQosData () && hdr->IsQosAmsdu ())
+        {
+          NS_LOG_DEBUG ("Received A-MSDU from" << from);
+          DeaggregateAmsduAndForward (packet, hdr);
+        }
+      else
+        {
+          ForwardUp (packet, from, to);
+        }
+      return;
+    }
+
+  // why put check here, not before "if (hdr->IsData ())" ?
+  // because WifiNetDevice::ForwardUp needs to m_promiscRx data packet
+  // and will filter data packet for itself
+  // so we need to filter management frame
+  if (to != GetAddress () && !to.IsGroup ())
+    {
+      NS_LOG_LOGIC ("the management frame is not for us");
+      NotifyRxDrop (packet);
+      return;
+    }
+
+  if (hdr->IsMgt () && hdr->IsAction ())
+    {
+      // yes, we only care about VendorSpecificAction frame in OCB mode
+      // other management frames will be handled by RegularWifiMac::Receive
+      VendorSpecificActionHeader vsaHdr;
+      packet->PeekHeader (vsaHdr);
+      if (vsaHdr.GetCategory () == CATEGORY_OF_VSA)
+        {
+          VendorSpecificActionHeader vsa;
+          packet->RemoveHeader (vsa);
+          OrganizationIdentifier oi = vsa.GetOrganizationIdentifier ();
+          VscCallback cb = m_vscManager.FindVscCallback (oi);
+
+          if (cb.IsNull ())
+            {
+              NS_LOG_DEBUG ("cannot find VscCallback for OrganizationIdentifier=" << oi);
+              return;
+            }
+          bool succeed = cb (this, oi,packet, from);
+
+          if (!succeed)
+            {
+              NS_LOG_DEBUG ("vsc callback could not handle the packet successfully");
+            }
+
+          return;
+        }
+    }
+  // Invoke the receive handler of our parent class to deal with any
+  // other frames. Specifically, this will handle Block Ack-related
+  // Management Action frames.
+  RegularWifiMac::Receive (packet, hdr);
+}
+
+void
+OcbWifiMac::ConfigureEdca (uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, enum AcIndex ac)
+{
+  Ptr<Dcf> dcf;
+  switch (ac)
+    {
+    case AC_VO:
+      dcf = RegularWifiMac::GetVOQueue ();
+      dcf->SetMinCw ((cwmin + 1) / 4 - 1);
+      dcf->SetMaxCw ((cwmin + 1) / 2 - 1);
+      dcf->SetAifsn (aifsn);
+      break;
+    case AC_VI:
+      dcf = RegularWifiMac::GetVIQueue ();
+      dcf->SetMinCw ((cwmin + 1) / 2 - 1);
+      dcf->SetMaxCw (cwmin);
+      dcf->SetAifsn (aifsn);
+      break;
+    case AC_BE:
+      dcf = RegularWifiMac::GetBEQueue ();
+      dcf->SetMinCw (cwmin);
+      dcf->SetMaxCw (cwmax);
+      dcf->SetAifsn (aifsn);
+      break;
+    case AC_BK:
+      dcf = RegularWifiMac::GetBKQueue ();
+      dcf->SetMinCw (cwmin);
+      dcf->SetMaxCw (cwmax);
+      dcf->SetAifsn (aifsn);
+      break;
+    case AC_BE_NQOS:
+      dcf = RegularWifiMac::GetDcaTxop ();
+      dcf->SetMinCw (cwmin);
+      dcf->SetMaxCw (cwmax);
+      dcf->SetAifsn (aifsn);
+      break;
+    case AC_UNDEF:
+      NS_FATAL_ERROR ("I don't know what to do with this");
+      break;
+    }
+}
+
+void
+OcbWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard)
+{
+  NS_ASSERT ((standard == WIFI_PHY_STANDARD_80211_10MHZ)
+             || (standard == WIFI_PHY_STANDARD_80211a));
+
+  uint32_t cwmin = 15;
+  uint32_t cwmax = 1023;
+
+  // The special value of AC_BE_NQOS which exists in the Access
+  // Category enumeration allows us to configure plain old DCF.
+  ConfigureEdca (cwmin, cwmax, 2, AC_BE_NQOS);
+
+  // Now we configure the EDCA functions
+  // see IEEE802.11p-2010 section 7.3.2.29
+  // Wave CCH and SCHs set default 802.11p EDCA
+  ConfigureEdca (cwmin, cwmax, 2, AC_VO);
+  ConfigureEdca (cwmin, cwmax, 3, AC_VI);
+  ConfigureEdca (cwmin, cwmax, 6, AC_BE);
+  ConfigureEdca (cwmin, cwmax, 9, AC_BK);
+
+}
+} // namespace ns3
diff -Naur ns-3.18.1/src/wave/model/ocb-wifi-mac.h ns-3.19/src/wave/model/ocb-wifi-mac.h
--- ns-3.18.1/src/wave/model/ocb-wifi-mac.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/model/ocb-wifi-mac.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,141 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *         Junling Bu <linlinjavaer@gmail.com>
+ */
+#ifndef OCB_WIFI_MAC_H
+#define OCB_WIFI_MAC_H
+
+#include "ns3/object-factory.h"
+#include "ns3/regular-wifi-mac.h"
+#include "ns3/wifi-mac-queue.h"
+#include "ns3/qos-utils.h"
+#include "vendor-specific-action.h"
+
+namespace ns3 {
+class OrganizationIdentifier;
+class WifiMacQueue;
+/**
+ * \brief STAs communicate with each directly outside the context of a BSS
+ * \ingroup wave
+ *
+ * In OCB mac mode,synchronization, association, dis-association
+ * and authentication of normal wifi are not used for wireless access in
+ * vehicular environments.
+ *
+ * Although Timing Advertisement frame is a specific management frame defined
+ * in 802.11p. It is mainly used by IEEE Std 1609.4 for channel switch synchronization.
+ * However in simulation nodes are supposed to have GPS synchronization ability,
+ * so we will not implement this feature.
+ */
+class OcbWifiMac : public RegularWifiMac
+{
+public:
+  static TypeId GetTypeId (void);
+  OcbWifiMac (void);
+  virtual ~OcbWifiMac (void);
+  /**
+   * \param vsc management packet to send.
+   * \param peer the address to which the packet should be sent.
+   * \param oi Organization Identifier field
+   * see 7.3.1.31 Organization Identifier field and 10.3.29 Vendor-specific action
+   *
+   * management information can be transmitted over vender specific action frame.
+   * This will be mainly called by IEEE Std 1609.4 to send WSA from IEEE Std 1609.3
+   */
+  void SendVsc (Ptr<Packet> vsc, Mac48Address peer, OrganizationIdentifier oi);
+  /**
+   * \param oi Organization Identifier
+   * \param cb callback to invoke whenever a vender specific action frame has been received and must
+   *        be forwarded to the higher layers.
+   * every node shall register first if it wants to receive specific vendor specific content.
+   */
+  void AddReceiveVscCallback (OrganizationIdentifier oi, VscCallback cb);
+
+  void RemoveReceiveVscCallback (OrganizationIdentifier oi);
+
+  /**
+   * \returns the ssid which this MAC layer is going to try to stay in.
+   *
+   * This method shall not be used in WAVE environment and
+   * here it will overloaded to log warn message
+   */
+  virtual Ssid GetSsid (void) const;
+  /**
+   * \param ssid the current ssid of this MAC layer.
+   *
+   * This method shall not be used in WAVE environment and
+   * here it will overloaded to log warn message
+   */
+  virtual void SetSsid (Ssid ssid);
+  /**
+   * \param bssid the BSSID of the network that this device belongs to.
+   * This method shall not be used in WAVE environment and
+   * here it will overloaded to log warn message
+   */
+  virtual void SetBssid (Mac48Address bssid);
+  /**
+   * \param bssid the BSSID of the network that this device belongs to.
+   *
+   * This method shall not be used in WAVE environment and
+   * here it will overloaded to log warn message
+   */
+  virtual Mac48Address GetBssid (void) const;
+  /**
+   * SetLinkUpCallback and SetLinkDownCallback will be overloaded
+   * In OCB mode, stations can send packets directly whenever they want
+   * so the link is always up and never down even during channel switch
+   */
+  /**
+   * \param linkUp the callback to invoke when the link becomes up.
+   */
+  virtual void SetLinkUpCallback (Callback<void> linkUp);
+  /**
+   * \param linkDown the callback to invoke when the link becomes down.
+   */
+  virtual void SetLinkDownCallback (Callback<void> linkDown);
+  /**
+   * \param packet the packet to send.
+   * \param to the address to which the packet should be sent.
+   *
+   * The packet should be enqueued in a tx queue, and should be
+   * dequeued as soon as the channel access function determines that
+   * access is granted to this MAC.
+   */
+  virtual void Enqueue (Ptr<const Packet> packet, Mac48Address to);
+  /**
+    * \param cwmin the min contention window
+    * \param cwmax the max contention window
+    * \param aifsn the arbitration inter-frame space
+    * \param ac    the access category index
+    *
+    * configure EDCA queue parameters
+    */
+  void ConfigureEdca (uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, enum AcIndex ac);
+
+protected:
+  virtual void FinishConfigureStandard (enum WifiPhyStandard standard);
+private:
+  virtual void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
+
+  VendorSpecificContentManager m_vscManager;
+};
+
+}
+#endif /* OCB_WIFI_MAC_H */
diff -Naur ns-3.18.1/src/wave/model/vendor-specific-action.cc ns-3.19/src/wave/model/vendor-specific-action.cc
--- ns-3.18.1/src/wave/model/vendor-specific-action.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/model/vendor-specific-action.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,346 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Dalian University of Technology
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Junling Bu <linlinjavaer@gmail.com>
+ */
+#include <iomanip>
+#include <iostream>
+#include <cstring>
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "vendor-specific-action.h"
+
+NS_LOG_COMPONENT_DEFINE ("VendorSpecificAction");
+
+namespace ns3 {
+
+/*********** OrganizationIdentifier *******/
+
+ATTRIBUTE_HELPER_CPP (OrganizationIdentifier);
+
+OrganizationIdentifier::OrganizationIdentifier (void)
+  : m_type (Unknown)
+{
+  NS_LOG_FUNCTION (this);
+  m_type = Unknown;
+  std::memset (m_oi, 0, 5);
+}
+
+OrganizationIdentifier::OrganizationIdentifier (const uint8_t *str, uint32_t length)
+{
+  NS_LOG_FUNCTION (this << str << length);
+  if (length == 3)
+    {
+      m_type = OUI24;
+      std::memcpy (m_oi, str, length);
+    }
+  else if (length == 5)
+    {
+      m_type = OUI36;
+      std::memcpy (m_oi, str, length);
+    }
+  else
+    {
+      m_type = Unknown;
+      NS_FATAL_ERROR ("cannot support organization identifier with length=" << length);
+    }
+}
+
+OrganizationIdentifier&
+OrganizationIdentifier::operator= (const OrganizationIdentifier& oi)
+{
+  this->m_type = oi.m_type;
+  std::memcpy (this->m_oi, oi.m_oi, 5);
+  return (*this);
+}
+
+OrganizationIdentifier::~OrganizationIdentifier (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+uint8_t
+OrganizationIdentifier::GetManagementId (void) const
+{
+  NS_LOG_FUNCTION (this);
+  NS_ASSERT (m_type == OUI36);
+  return (m_oi[4] & 0x0f);
+}
+
+bool
+OrganizationIdentifier::IsNull (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_type == Unknown;
+}
+
+uint32_t
+OrganizationIdentifier::GetSerializedSize (void) const
+{
+  NS_LOG_FUNCTION (this);
+  switch (m_type)
+    {
+    case OUI24:
+      return 3;
+    case OUI36:
+      return 5;
+    case Unknown:
+    default:
+      NS_FATAL_ERROR_NO_MSG ();
+      return 0;
+    }
+}
+
+void
+OrganizationIdentifier::SetType (enum OrganizationIdentifierType type)
+{
+  NS_LOG_FUNCTION (this);
+  m_type = type;
+}
+
+enum OrganizationIdentifier::OrganizationIdentifierType
+OrganizationIdentifier::GetType (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_type;
+}
+
+void
+OrganizationIdentifier::Serialize (Buffer::Iterator start) const
+{
+  NS_LOG_FUNCTION (this << &start);
+  start.Write (m_oi, GetSerializedSize ());
+}
+
+/*  because OrganizationIdentifier field is not standard
+ *  and the length of OrganizationIdentifier is variable
+ *  so data parse here is troublesome
+ */
+uint32_t
+OrganizationIdentifier::Deserialize (Buffer::Iterator start)
+{
+  NS_LOG_FUNCTION (this << &start);
+  // first try to parse OUI24 with 3 bytes
+  start.Read (m_oi,  3);
+  for (std::vector<OrganizationIdentifier>::iterator  i = OrganizationIdentifiers.begin (); i != OrganizationIdentifiers.end (); ++i)
+    {
+      if ((i->m_type == OUI24)
+          && (std::memcmp (i->m_oi, m_oi, 3) == 0 ))
+        {
+          m_type = OUI24;
+          return 3;
+        }
+    }
+
+  // then try to parse OUI36 with 5 bytes
+  start.Read (m_oi + 3,  2);
+  for (std::vector<OrganizationIdentifier>::iterator  i = OrganizationIdentifiers.begin (); i != OrganizationIdentifiers.end (); ++i)
+    {
+      if ((i->m_type == OUI36)
+          && (std::memcmp (i->m_oi, m_oi, 4) == 0 ))
+        {
+          // OUI36 first check 4 bytes, then check half of the 5th byte
+          if ((i->m_oi[4] & 0xf0) == (m_oi[4] & 0xf0))
+            {
+              m_type = OUI36;
+              return 5;
+            }
+        }
+    }
+
+  // if we cannot deserialize the organization identifier field,
+  // we will fail
+  NS_FATAL_ERROR ("cannot deserialize the organization identifier field successfully");
+  return 0;
+}
+
+bool operator == (const OrganizationIdentifier& a, const OrganizationIdentifier& b)
+{
+  if (a.m_type != b.m_type)
+    {
+      return false;
+    }
+
+  if (a.m_type == OrganizationIdentifier::OUI24)
+    {
+      return memcmp (a.m_oi, b.m_oi, 3) == 0;
+    }
+
+  if (a.m_type == OrganizationIdentifier::OUI36)
+    {
+      return (memcmp (a.m_oi, b.m_oi, 4) == 0)
+             && ((a.m_oi[4] & 0xf0) == (b.m_oi[4] & 0xf0));
+    }
+
+  return false;
+}
+
+bool operator != (const OrganizationIdentifier& a, const OrganizationIdentifier& b)
+{
+  return !(a == b);
+}
+
+bool operator < (const OrganizationIdentifier& a, const OrganizationIdentifier& b)
+{
+  return memcmp (a.m_oi, b.m_oi, std::min (a.m_type, b.m_type)) < 0;
+}
+
+std::ostream& operator << (std::ostream& os, const OrganizationIdentifier& oi)
+{
+  for (int i = 0; i < oi.m_type; i++)
+    {
+      os << "0x" << std::hex << static_cast<int> (oi.m_oi[i]) << " ";
+    }
+  os << std::endl;
+  return os;
+}
+
+std::istream& operator >> (std::istream& is, const OrganizationIdentifier& oi)
+{
+  return is;
+}
+
+/*********** VendorSpecificActionHeader *******/
+NS_OBJECT_ENSURE_REGISTERED (VendorSpecificActionHeader);
+
+VendorSpecificActionHeader::VendorSpecificActionHeader (void)
+  : m_oi (),
+    m_category (CATEGORY_OF_VSA)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+VendorSpecificActionHeader::~VendorSpecificActionHeader (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+VendorSpecificActionHeader::SetOrganizationIdentifier (OrganizationIdentifier oi)
+{
+  NS_LOG_FUNCTION (this << oi);
+  m_oi = oi;
+}
+
+OrganizationIdentifier
+VendorSpecificActionHeader::GetOrganizationIdentifier (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_oi;
+}
+
+TypeId
+VendorSpecificActionHeader::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::VendorSpecificActionHeader")
+    .SetParent<Header> ()
+    .AddConstructor<VendorSpecificActionHeader> ()
+  ;
+
+  return tid;
+}
+
+uint8_t
+VendorSpecificActionHeader::GetCategory (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return m_category;
+}
+
+TypeId
+VendorSpecificActionHeader::GetInstanceTypeId (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return GetTypeId ();
+}
+
+void
+VendorSpecificActionHeader::Print (std::ostream &os) const
+{
+  NS_LOG_FUNCTION (this << &os);
+  os << "VendorSpecificActionHeader[ "
+     << "category = 0x" << std::hex << (int)m_category
+     << "organization identifier = " << m_oi
+     << std::dec;
+}
+
+uint32_t
+VendorSpecificActionHeader::GetSerializedSize (void) const
+{
+  NS_LOG_FUNCTION (this);
+  return sizeof(m_category) + m_oi.GetSerializedSize ();
+}
+
+void
+VendorSpecificActionHeader::Serialize (Buffer::Iterator start) const
+{
+  NS_LOG_FUNCTION (this << &start);
+  start.WriteU8 (m_category);
+  m_oi.Serialize (start);
+}
+
+uint32_t
+VendorSpecificActionHeader::Deserialize (Buffer::Iterator start)
+{
+  NS_LOG_FUNCTION (this << &start);
+  m_category = start.ReadU8 ();
+  if (m_category != CATEGORY_OF_VSA)
+    {
+      return 0;
+    }
+  m_oi.Deserialize (start);
+
+  return GetSerializedSize ();
+}
+
+/********* VendorSpecificContentManager ***********/
+VendorSpecificContentManager::VendorSpecificContentManager (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+VendorSpecificContentManager::~VendorSpecificContentManager (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+void
+VendorSpecificContentManager::RegisterVscCallback (OrganizationIdentifier oi, VscCallback cb)
+{
+  NS_LOG_FUNCTION (this << oi << &cb);
+  m_callbacks.insert (std::make_pair (oi, cb));
+  OrganizationIdentifiers.push_back (oi);
+}
+
+void
+VendorSpecificContentManager::DeregisterVscCallback (OrganizationIdentifier &oi)
+{
+  NS_LOG_FUNCTION (this << oi);
+  m_callbacks.erase (oi);
+}
+
+static VscCallback null_callback = MakeNullCallback<bool, Ptr<WifiMac>, const OrganizationIdentifier &,Ptr<const Packet>,const Address &> ();
+
+VscCallback
+VendorSpecificContentManager::FindVscCallback (OrganizationIdentifier &oi)
+{
+  NS_LOG_FUNCTION (this << oi);
+  VscCallbacksI i;
+  i = m_callbacks.find (oi);
+  return (i == m_callbacks.end ()) ? null_callback : i->second;
+}
+
+} // namespace ns3
diff -Naur ns-3.18.1/src/wave/model/vendor-specific-action.h ns-3.19/src/wave/model/vendor-specific-action.h
--- ns-3.18.1/src/wave/model/vendor-specific-action.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/model/vendor-specific-action.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,191 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Dalian University of Technology
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Junling Bu <linlinjavaer@gmail.com>
+ */
+#ifndef Vendor_Specific_Action_H
+#define Vendor_Specific_Action_H
+
+#include <ostream>
+#include <map>
+#include "ns3/header.h"
+#include "ns3/packet.h"
+#include "ns3/pointer.h"
+#include "ns3/attribute.h"
+#include "ns3/attribute-helper.h"
+#include "ns3/address.h"
+#include "ns3/wifi-mac.h"
+
+namespace ns3 {
+class VendorSpecificContentManager;
+
+/**
+ * \brief the organization identifier is a public organizationally
+ * unique identifier assigned by the IEEE.
+ * \ingroup wave
+ *
+ * Similar to protocol field of data packets that indicates which
+ * entity of higher layer should handle received packets, Organization
+ * Identifier field is used in Vendor Specific Action frames to
+ * indicate which entity or higher layer should handle vendor specific
+ * content.
+ * Normally the value is assigned by IEEE and the length of field is
+ * either 24 bits or 36 bits.
+ * For more, see IEEE802.11p-2010 section 7.3.1.31 and 7.4.5
+ */
+class OrganizationIdentifier
+{
+public:
+  OrganizationIdentifier (void);
+  OrganizationIdentifier (const uint8_t *str, uint32_t length);
+  OrganizationIdentifier& operator= (const OrganizationIdentifier& oi);
+  virtual ~OrganizationIdentifier (void);
+
+  enum OrganizationIdentifierType
+  {
+    OUI24 = 3,  // 3 bytes
+    OUI36 = 5,   // 5 bytes
+    Unknown = 0,
+  };
+
+  /**
+   * \returns last 4 bits when OrganizationIdentifier is OUI36
+   */
+  uint8_t GetManagementId (void) const;
+  /**
+   * \returns whether current OrganizationIdentifier is initial state
+   */
+  bool IsNull (void) const;
+
+  void SetType (enum OrganizationIdentifierType type);
+  enum OrganizationIdentifierType GetType () const;
+
+  // below methods will be called by VendorSpecificActionHeader
+  uint32_t GetSerializedSize (void) const;
+  void Serialize (Buffer::Iterator start) const;
+  uint32_t Deserialize (Buffer::Iterator start);
+
+private:
+  friend bool operator == (const OrganizationIdentifier& a, const OrganizationIdentifier& b);
+  friend bool operator != (const OrganizationIdentifier& a, const OrganizationIdentifier& b);
+  friend bool operator < (const OrganizationIdentifier& a, const OrganizationIdentifier& b);
+  friend std::ostream& operator << (std::ostream& os, const OrganizationIdentifier& oi);
+  friend std::istream& operator >> (std::istream& is, const OrganizationIdentifier& oi);
+
+  enum OrganizationIdentifierType m_type;
+  uint8_t m_oi[5];
+};
+
+ATTRIBUTE_HELPER_HEADER (OrganizationIdentifier);
+
+bool operator == (const OrganizationIdentifier& a, const OrganizationIdentifier& b);
+bool operator != (const OrganizationIdentifier& a, const OrganizationIdentifier& b);
+bool operator < (const OrganizationIdentifier& a, const OrganizationIdentifier& b);
+
+std::ostream& operator << (std::ostream& os, const OrganizationIdentifier& oi);
+std::istream& operator >> (std::istream& is, const OrganizationIdentifier& oi);
+
+/**
+ * see IEEE 802.11-2007 chapter 7.3.1.11
+ * Table 7-24—Category values
+ */
+const static uint8_t CATEGORY_OF_VSA = 127;
+
+/**
+ * \ingroup wave
+ * See IEEE 802.11-2007 chapter 7.3.1.11 and 7.4.5
+ * also IEEE 802.11p-2010 chapter 7.4.5
+ * Although WifiActionHeader has been defined in wifi mgt-header.h/.cc,
+ * it is not a good way to inherit from it or add vendor specific action support.
+ * The reason is Action field. Other Action frames contains Action field, and
+ * the VSA frame contains OUI or variable OrganizationIdentifier instead of one byte Action field.
+ * Header format: | Category | Organization IdentifierType | Vendor Specific content |
+ *        Octets:       1                j                        Variable
+ *
+ * In ns-3, VSA frame will be divided into  VendorSpecificActionHeader vsaHeader
+ * and Packet vsc that indicates vendor specific content.
+ *
+ * This frame is used by IEEE 1609.4 to send WSA packet of IEEE 1609.3,
+ * and if users want to send management information without customized management
+ * frames, he can use VSA frames.
+ */
+class VendorSpecificActionHeader : public Header
+{
+public:
+  VendorSpecificActionHeader (void);
+  virtual ~VendorSpecificActionHeader (void);
+
+  /**
+   * \param oi the OrganizationIdentifier of current VSA header
+   */
+  void SetOrganizationIdentifier (OrganizationIdentifier oi);
+  /**
+   * \returns current OrganizationIdentifier of the VSA header
+   */
+  OrganizationIdentifier GetOrganizationIdentifier (void) const;
+  /**
+   * the category field shall be CATEGORY_OF_VSA
+   */
+  uint8_t GetCategory () const;
+
+  static TypeId GetTypeId (void);
+  virtual TypeId GetInstanceTypeId (void) const;
+  virtual void Print (std::ostream &os) const;
+  virtual uint32_t GetSerializedSize (void) const;
+  virtual void Serialize (Buffer::Iterator start) const;
+  virtual uint32_t Deserialize (Buffer::Iterator start);
+
+private:
+  OrganizationIdentifier m_oi;
+  uint8_t m_category;
+};
+
+/**
+ * \param mac a pointer to the mac object which is calling this callback
+ * \param oi the organization identifier of vendor specific action frame
+ * \param packet the vendor specifc content packet received
+ * \param sender the address of the sender
+ * \returns true if the callback could handle the packet successfully;
+ *       false otherwise.
+ */
+typedef Callback<bool, Ptr<WifiMac>, const OrganizationIdentifier &, Ptr<const Packet>,const Address &> VscCallback;
+
+class VendorSpecificContentManager
+{
+public:
+  VendorSpecificContentManager (void);
+  virtual ~VendorSpecificContentManager (void);
+  /**
+   * \param oi the specific OrganizationIdentifier when receive management information
+   * by VendorSpecificAction management frame.
+   * \param cb the receive callback when oi related management packets are received
+   */
+  void RegisterVscCallback (OrganizationIdentifier oi, VscCallback cb);
+  void DeregisterVscCallback (OrganizationIdentifier &oi);
+  VscCallback FindVscCallback (OrganizationIdentifier &oi);
+
+private:
+  typedef std::map<OrganizationIdentifier,VscCallback> VscCallbacks;
+  typedef std::map<OrganizationIdentifier,VscCallback>::iterator VscCallbacksI;
+
+  VscCallbacks m_callbacks;
+  friend class OrganizationIdentifier;
+};
+
+static std::vector<OrganizationIdentifier> OrganizationIdentifiers;
+}
+
+#endif /* Vendor_Specific_Action_H */
diff -Naur ns-3.18.1/src/wave/model/wave-mac-low.cc ns-3.19/src/wave/model/wave-mac-low.cc
--- ns-3.18.1/src/wave/model/wave-mac-low.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/model/wave-mac-low.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,86 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *         Junling Bu <linlinjavaer@gmail.com>
+ */
+#include "ns3/log.h"
+#include "wave-mac-low.h"
+#include "higher-tx-tag.h"
+
+NS_LOG_COMPONENT_DEFINE ("WaveMacLow");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (WaveMacLow);
+
+TypeId
+WaveMacLow::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::WaveMacLow")
+    .SetParent<MacLow> ()
+    .AddConstructor<WaveMacLow> ()
+  ;
+  return tid;
+}
+WaveMacLow::WaveMacLow (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+WaveMacLow::~WaveMacLow (void)
+{
+  NS_LOG_FUNCTION (this);
+}
+
+WifiTxVector
+WaveMacLow::GetDataTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
+{
+  NS_LOG_FUNCTION (this << packet << *hdr);
+  HigherDataTxVectorTag datatag;
+  bool found;
+  found = ConstCast<Packet> (packet)->PeekPacketTag (datatag);
+  if (!found)
+    {
+      return MacLow::GetDataTxVector (packet, hdr);
+    }
+
+  if (!datatag.IsAdapter ())
+    {
+      return datatag.GetDataTxVector ();
+    }
+
+  WifiTxVector txHigher = datatag.GetDataTxVector ();
+  WifiTxVector txMac = MacLow::GetDataTxVector (packet, hdr);
+  WifiTxVector txAdapter;
+  // if adapter is true, DataRate set by higher layer is the minimum data rate
+  // that sets the lower bound for the actual data rate.
+  if (txHigher.GetMode ().GetDataRate () > txMac.GetMode ().GetDataRate ())
+    {
+      txAdapter.SetMode (txHigher.GetMode ());
+    }
+  else
+    {
+      txAdapter.SetMode (txMac.GetMode ());
+    }
+
+  // if adapter is true, TxPwr_Level set by higher layer is the maximum
+  // transmit power that sets the upper bound for the actual transmit power;
+  txAdapter.SetTxPowerLevel (std::min (txHigher.GetTxPowerLevel (), txMac.GetTxPowerLevel ()));
+  return txAdapter;
+}
+} // namespace ns3
diff -Naur ns-3.18.1/src/wave/model/wave-mac-low.h ns-3.19/src/wave/model/wave-mac-low.h
--- ns-3.18.1/src/wave/model/wave-mac-low.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/model/wave-mac-low.h	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,51 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ *         Junling Bu <linlinjavaer@gmail.com>
+ */
+#ifndef WAVE_MAC_LOW_H
+#define WAVE_MAC_LOW_H
+
+#include "ns3/mac-low.h"
+
+namespace ns3 {
+/**
+ * \ingroup wave
+ * This class allows higher layer control data rate and tx power level.
+ * If higher layer do not select, it will select by WifiRemoteStationManager
+ * of MAC layer;
+ * If higher layer selects tx arguments without adapter set, the data rate
+ * and tx power level will be used to send the packet.
+ * If higher layer selects tx arguments with adapter set, the data rate
+ * will be lower bound for the actual data rate, and the power level
+ * will be upper bound for the actual transmit power.
+ */
+class WaveMacLow : public MacLow
+{
+public:
+  static TypeId GetTypeId (void);
+  WaveMacLow (void);
+  virtual ~WaveMacLow (void);
+private:
+  virtual WifiTxVector GetDataTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
+};
+
+} // namespace ns3
+
+#endif /* WAVE_MAC_LOW_H*/
diff -Naur ns-3.18.1/src/wave/test/examples-to-run.py ns-3.19/src/wave/test/examples-to-run.py
--- ns-3.18.1/src/wave/test/examples-to-run.py	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/test/examples-to-run.py	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,20 @@
+#! /usr/bin/env python
+## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+# A list of C++ examples to run in order to ensure that they remain
+# buildable and runnable over time.  Each tuple in the list contains
+#
+#     (example_name, do_run, do_valgrind_run).
+#
+# See test.py for more information.
+cpp_examples = [
+    ("wave-simple-80211p", "True", "True"),
+]
+
+# A list of Python examples to run in order to ensure that they remain
+# runnable over time.  Each tuple in the list contains
+#
+#     (example_name, do_run).
+#
+# See test.py for more information.
+python_examples = []
diff -Naur ns-3.18.1/src/wave/test/ocb-test-suite.cc ns-3.19/src/wave/test/ocb-test-suite.cc
--- ns-3.18.1/src/wave/test/ocb-test-suite.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/test/ocb-test-suite.cc	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,396 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013 Dalian University of Technology
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Junling Bu <linlinjavaer@gmail.com>
+ */
+#include "ns3/test.h"
+#include "ns3/rng-seed-manager.h"
+#include "ns3/config.h"
+#include "ns3/data-rate.h"
+#include "ns3/vector.h"
+#include "ns3/string.h"
+#include "ns3/ssid.h"
+#include "ns3/packet-socket-address.h"
+#include "ns3/mobility-model.h"
+#include "ns3/on-off-helper.h"
+#include "ns3/yans-wifi-helper.h"
+#include "ns3/position-allocator.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/nqos-wifi-mac-helper.h"
+#include "ns3/wifi-net-device.h"
+#include <iostream>
+
+#include "ns3/ocb-wifi-mac.h"
+#include "ns3/wifi-80211p-helper.h"
+#include "ns3/wave-mac-helper.h"
+
+using namespace ns3;
+// helper function to assign streams to random variables, to control
+// randomness in the tests
+static void
+AssignWifiRandomStreams (Ptr<WifiMac> mac, int64_t stream)
+{
+  int64_t currentStream = stream;
+  Ptr<RegularWifiMac> rmac = DynamicCast<RegularWifiMac> (mac);
+  if (rmac)
+    {
+      PointerValue ptr;
+      rmac->GetAttribute ("DcaTxop", ptr);
+      Ptr<DcaTxop> dcaTxop = ptr.Get<DcaTxop> ();
+      currentStream += dcaTxop->AssignStreams (currentStream);
+
+      rmac->GetAttribute ("VO_EdcaTxopN", ptr);
+      Ptr<EdcaTxopN> vo_edcaTxopN = ptr.Get<EdcaTxopN> ();
+      currentStream += vo_edcaTxopN->AssignStreams (currentStream);
+
+      rmac->GetAttribute ("VI_EdcaTxopN", ptr);
+      Ptr<EdcaTxopN> vi_edcaTxopN = ptr.Get<EdcaTxopN> ();
+      currentStream += vi_edcaTxopN->AssignStreams (currentStream);
+
+      rmac->GetAttribute ("BE_EdcaTxopN", ptr);
+      Ptr<EdcaTxopN> be_edcaTxopN = ptr.Get<EdcaTxopN> ();
+      currentStream += be_edcaTxopN->AssignStreams (currentStream);
+
+      rmac->GetAttribute ("BK_EdcaTxopN", ptr);
+      Ptr<EdcaTxopN> bk_edcaTxopN = ptr.Get<EdcaTxopN> ();
+      currentStream += bk_edcaTxopN->AssignStreams (currentStream);
+    }
+}
+
+class OcbWifiMacTestCase : public TestCase
+{
+public:
+  OcbWifiMacTestCase (void);
+  virtual ~OcbWifiMacTestCase (void);
+private:
+  virtual void DoRun (void);
+
+  void MacAssoc (std::string context,Mac48Address bssid);
+  void PhyRxOkTrace (std::string context, Ptr<const Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble);
+  void PhyTxTrace (std::string context, Ptr<const Packet> packet, WifiMode mode, WifiPreamble preamble, uint8_t txPower);
+  Vector GetCurrentPosition (uint32_t i);
+  void AdvancePosition (Ptr<Node> node);
+
+  void PreRandomConfiguration (void);
+  void ConfigureApStaMode (Ptr<Node> static_node, Ptr<Node> mobile_node);
+  void ConfigureAdhocMode (Ptr<Node> static_node, Ptr<Node> mobile_node);
+  void ConfigureOcbMode (Ptr<Node> static_node, Ptr<Node> mobile_node);
+  void PostDeviceConfiguration (Ptr<Node> static_node, Ptr<Node> mobile_node);
+
+  Time phytx_time;
+  Vector phytx_pos;
+
+  Time macassoc_time;
+  Vector macassoc_pos;
+
+  Time phyrx_time;
+  Vector phyrx_pos;
+
+  // nodes.Get (0) is static node
+  // nodes.Get (1) is mobile node
+  NodeContainer nodes;
+};
+
+OcbWifiMacTestCase::OcbWifiMacTestCase (void)
+  : TestCase ("Association time: Ap+Sta mode vs Adhoc mode vs Ocb mode")
+{
+}
+
+OcbWifiMacTestCase::~OcbWifiMacTestCase (void)
+{
+}
+
+// mobility is like walk on line with velocity 5 m/s
+// We prefer to update 0.5m every 0.1s rather than 5m every 1s
+void
+OcbWifiMacTestCase::AdvancePosition (Ptr<Node> node)
+{
+  Ptr<MobilityModel> mobility = node->GetObject<MobilityModel> ();
+  Vector pos = mobility->GetPosition ();
+  pos.x -= 0.5;
+  if (pos.x < 1.0 )
+    {
+      pos.x = 1.0;
+      return;
+    }
+  mobility->SetPosition (pos);
+
+  Simulator::Schedule (Seconds (0.1), &OcbWifiMacTestCase::AdvancePosition, this, node);
+}
+
+// here are only two nodes, a stationary and a mobile one
+// the i value of the first = 0; the i value of second = 1.
+Vector
+OcbWifiMacTestCase::GetCurrentPosition (uint32_t i)
+{
+  NS_ASSERT (i < 2);
+  Ptr<Node> node = nodes.Get (i);
+  Ptr<MobilityModel> mobility = node->GetObject<MobilityModel> ();
+  Vector pos = mobility->GetPosition ();
+  return pos;
+}
+
+void
+OcbWifiMacTestCase::MacAssoc (std::string context,Mac48Address bssid)
+{
+  if (macassoc_time == Time (0))
+    {
+      macassoc_time = Now ();
+      macassoc_pos = GetCurrentPosition (1);
+      std::cout << "MacAssoc time = " << macassoc_time.GetNanoSeconds ()
+                << " position = " << macassoc_pos
+                << std::endl;
+    }
+}
+
+// We want to get the time that sta receives the first beacon frame from AP
+// it means that in this time this sta has ability to receive frame
+void
+OcbWifiMacTestCase::PhyRxOkTrace (std::string context, Ptr<const Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble)
+{
+  if (phyrx_time == Time (0))
+    {
+      phyrx_time = Now ();
+      phyrx_pos = GetCurrentPosition (1);
+      std::cout << "PhyRxOk time = " << phyrx_time.GetNanoSeconds ()
+                << " position = " << phyrx_pos
+                << std::endl;
+    }
+}
+
+// We want to get the time that STA sends the first data packet successfully
+void
+OcbWifiMacTestCase::PhyTxTrace (std::string context, Ptr<const Packet> packet, WifiMode mode, WifiPreamble preamble, uint8_t txPower)
+{
+  WifiMacHeader h;
+  packet->PeekHeader (h);
+  if ((phytx_time == Time (0)) && h.IsData ())
+    {
+      phytx_time = Now ();
+      phytx_pos = GetCurrentPosition (1);
+      std::cout << "PhyTx data time = " << phytx_time.GetNanoSeconds ()
+                << " position = " << phytx_pos
+                << std::endl;
+    }
+}
+
+void
+OcbWifiMacTestCase::ConfigureApStaMode (Ptr<Node> static_node, Ptr<Node> mobile_node)
+{
+  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
+  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  Ssid ssid = Ssid ("wifi-default");
+  NqosWifiMacHelper wifiStaMac = NqosWifiMacHelper::Default ();
+  wifiStaMac.SetType ("ns3::StaWifiMac", "Ssid", SsidValue (ssid));
+  NqosWifiMacHelper wifiApMac = NqosWifiMacHelper::Default ();
+  wifiApMac.SetType ("ns3::ApWifiMac","Ssid", SsidValue (ssid));
+
+  WifiHelper wifi = WifiHelper::Default ();
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211_10MHZ);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue ("OfdmRate6MbpsBW10MHz"),
+                                "ControlMode",StringValue ("OfdmRate6MbpsBW10MHz"));
+  wifi.Install (wifiPhy, wifiStaMac, mobile_node);
+  wifi.Install (wifiPhy, wifiApMac, static_node);
+}
+
+void
+OcbWifiMacTestCase::ConfigureAdhocMode (Ptr<Node> static_node, Ptr<Node> mobile_node)
+{
+  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
+  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
+  wifiMac.SetType ("ns3::AdhocWifiMac");
+
+  WifiHelper wifi = WifiHelper::Default ();
+  wifi.SetStandard (WIFI_PHY_STANDARD_80211_10MHZ);
+  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                "DataMode", StringValue ("OfdmRate6MbpsBW10MHz"),
+                                "ControlMode",StringValue ("OfdmRate6MbpsBW10MHz"));
+  wifi.Install (wifiPhy, wifiMac, mobile_node);
+  wifi.Install (wifiPhy, wifiMac, static_node);
+}
+
+void
+OcbWifiMacTestCase::ConfigureOcbMode (Ptr<Node> static_node, Ptr<Node> mobile_node)
+{
+  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
+  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  NqosWaveMacHelper wifi80211pMac = NqosWaveMacHelper::Default ();
+
+  Wifi80211pHelper wifi80211p = Wifi80211pHelper::Default ();
+  wifi80211p.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+                                      "DataMode", StringValue ("OfdmRate6MbpsBW10MHz"),
+                                      "ControlMode",StringValue ("OfdmRate6MbpsBW10MHz"));
+  wifi80211p.Install (wifiPhy, wifi80211pMac, mobile_node);
+  wifi80211p.Install (wifiPhy, wifi80211pMac, static_node);
+}
+
+void
+OcbWifiMacTestCase::PostDeviceConfiguration (Ptr<Node> static_node, Ptr<Node> mobile_node)
+{
+  Ptr<WifiNetDevice> static_device = DynamicCast<WifiNetDevice> (static_node->GetDevice (0));
+  Ptr<WifiNetDevice> mobile_device = DynamicCast<WifiNetDevice> (mobile_node->GetDevice (0));
+
+  // Fix the stream assignment to the Dcf Txop objects (backoffs)
+  // The below stream assignment will result in the DcaTxop object
+  // using a backoff value of zero for this test when the
+  // DcaTxop::EndTxNoAck() calls to StartBackoffNow()
+  AssignWifiRandomStreams (static_device->GetMac (), 21);
+  AssignWifiRandomStreams (mobile_device->GetMac (), 22);
+
+  // setup mobility
+  // the initial position of static node is at 0,
+  // and the initial position of mobile node is 350.
+  MobilityHelper mobility;
+  mobility.Install (mobile_node);
+  mobility.Install (static_node);
+  Ptr<MobilityModel> mm = mobile_node->GetObject<MobilityModel> ();
+  Vector possta = mm->GetPosition ();
+  possta.x = 350;
+  mm->SetPosition (possta);
+  Simulator::Schedule (Seconds (1.0), &OcbWifiMacTestCase::AdvancePosition, this, mobile_node);
+
+  PacketSocketAddress socket;
+  socket.SetSingleDevice (mobile_device->GetIfIndex ());
+  socket.SetPhysicalAddress (static_device->GetAddress ());
+  socket.SetProtocol (1);
+
+  // give packet socket powers to nodes.
+  PacketSocketHelper packetSocket;
+  packetSocket.Install (static_node);
+  packetSocket.Install (mobile_node);
+
+  OnOffHelper onoff ("ns3::PacketSocketFactory", Address (socket));
+  onoff.SetConstantRate (DataRate ("500kb/s"));
+  ApplicationContainer apps = onoff.Install (mobile_node);
+  apps.Start (Seconds (0.5));
+  apps.Stop (Seconds (70.0));
+
+  phytx_time = macassoc_time = phyrx_time = Time ();
+  phytx_pos = macassoc_pos = phyrx_pos = Vector ();
+
+  Config::Connect ("/NodeList/1/DeviceList/*/Mac/Assoc", MakeCallback (&OcbWifiMacTestCase::MacAssoc, this));
+  Config::Connect ("/NodeList/1/DeviceList/*/Phy/State/RxOk", MakeCallback (&OcbWifiMacTestCase::PhyRxOkTrace, this));
+  Config::Connect ("/NodeList/1/DeviceList/*/Phy/State/Tx", MakeCallback (&OcbWifiMacTestCase::PhyTxTrace, this));
+}
+
+/**
+ *
+ *   static-node:0    <----       mobile-node:1
+ *        *   ------ 350m -------    *
+ *
+ * the node transmit range is less than 150m
+ *
+ * Ap+Sta mode vs Adhoc mode vs Ocb mode
+ * first test the time point when the stationary node is
+ * an AP and the mobile node is a Sta
+ * then test when one Ad-hoc node and another Ad-hoc node
+ * last test when one OCB node and another OCB node
+ */
+void
+OcbWifiMacTestCase::DoRun ()
+{
+  std::cout << "test time point for Ap-Sta mode" << std::endl;
+  PreRandomConfiguration ();
+  nodes = NodeContainer ();
+  nodes.Create (2);
+  Ptr<Node> static_node = nodes.Get (0);
+  Ptr<Node> mobile_node = nodes.Get (1);
+  ConfigureApStaMode (static_node, mobile_node);
+  PostDeviceConfiguration (static_node, mobile_node);
+  Simulator::Stop (Seconds (71.0));
+  Simulator::Run ();
+  Simulator::Destroy ();
+  NS_TEST_ASSERT_MSG_LT (phyrx_time, macassoc_time, "In Sta mode with AP, you cannot associate until receive beacon or AssocResponse frame" );
+  NS_TEST_ASSERT_MSG_LT (macassoc_time, phytx_time, "In Sta mode with AP,  you cannot send data packet until associate" );
+  NS_TEST_ASSERT_MSG_GT ((phyrx_pos.x - macassoc_pos.x), 0.0, "");
+  //actually macassoc_pos.x - phytx_pos.x is greater than 0
+  //however associate switch to send is so fast with less than 100ms
+  //and in our mobility model that every 0.1s update position,
+  //so turn out to be that macassoc_pos.x - phytx_pos.x is equal to 0
+  //NS_TEST_ASSERT_MSG_GT ((macassoc_pos.x - phytx_pos.x), 0.0, "");
+
+  std::cout << "test time point for Adhoc mode" << std::endl;
+  PreRandomConfiguration ();
+  nodes = NodeContainer ();
+  nodes.Create (2);
+  static_node = nodes.Get (0);
+  mobile_node = nodes.Get (1);
+  ConfigureAdhocMode (static_node, mobile_node);
+  PostDeviceConfiguration (static_node, mobile_node);
+  Simulator::Stop (Seconds (71.0));
+  Simulator::Run ();
+  Simulator::Destroy ();
+  // below test assert will fail, because AdhocWifiMac has not implement state machine.
+  // if someone takes a look at the output in adhoc mode and in Ocb mode
+  // he will find these two outputs are almost same.
+  //NS_TEST_ASSERT_MSG_LT (phyrx_time, macassoc_time, "In Adhoc mode, you cannot associate until receive beacon or AssocResponse frame" );
+  //NS_TEST_ASSERT_MSG_LT (macassoc_time, phytx_time, "In Adhoc mode,  you cannot send data packet until associate" );
+  //NS_TEST_ASSERT_MSG_GT ((phyrx_pos.x - macassoc_pos.x), 0.0, "");
+  // below test assert result refer to Ap-Sta mode
+  //NS_TEST_ASSERT_MSG_GT ((macassoc_pos.x - phytx_pos.x), 0.0, "");
+
+  std::cout << "test time point for Ocb mode" << std::endl;
+  PreRandomConfiguration ();
+  nodes = NodeContainer ();
+  nodes.Create (2);
+  static_node = nodes.Get (0);
+  mobile_node = nodes.Get (1);
+  ConfigureOcbMode (static_node, mobile_node);
+  PostDeviceConfiguration (static_node, mobile_node);
+  Simulator::Stop (Seconds (71.0));
+  Simulator::Run ();
+  Simulator::Destroy ();
+  NS_TEST_ASSERT_MSG_EQ (macassoc_time.GetNanoSeconds (), 0, "In Ocb mode, there is no associate state machine" );
+  NS_TEST_ASSERT_MSG_LT (phytx_time, phyrx_time, "before mobile node receives frames from far static node, it can send data packet directly" );
+  NS_TEST_ASSERT_MSG_EQ (macassoc_pos.x, 0.0, "");
+  NS_TEST_ASSERT_MSG_GT ((phytx_pos.x - phyrx_pos.x), 0.0, "");
+}
+void
+OcbWifiMacTestCase::PreRandomConfiguration ()
+{
+  // Assign a seed and run number, and later fix the assignment of streams to
+  // WiFi random variables, so that the first backoff used is zero slots
+  RngSeedManager::SetSeed (1);
+  RngSeedManager::SetRun (17);
+  // the WiFi random variables is set in PostDeviceConfiguration method.
+}
+
+class OcbTestSuite : public TestSuite
+{
+public:
+  OcbTestSuite ();
+};
+
+OcbTestSuite::OcbTestSuite ()
+  : TestSuite ("wifi-80211p-ocb", UNIT)
+{
+  // TestDuration for TestCase can be QUICK, EXTENSIVE or TAKES_FOREVER
+  AddTestCase (new OcbWifiMacTestCase, TestCase::QUICK);
+}
+
+// Do not forget to allocate an instance of this TestSuite
+static OcbTestSuite ocbTestSuite;
+
diff -Naur ns-3.18.1/src/wave/wscript ns-3.19/src/wave/wscript
--- ns-3.18.1/src/wave/wscript	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.19/src/wave/wscript	2013-12-20 09:44:50.000000000 -0800
@@ -0,0 +1,40 @@
+# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
+
+# def options(opt):
+#     pass
+
+# def configure(conf):
+#     conf.check_nonfatal(header_name='stdint.h', define_name='HAVE_STDINT_H')
+
+def build(bld):
+    module = bld.create_ns3_module('wave', ['core','wifi', 'propagation', 'applications'])
+    module.source = [
+	'model/wave-mac-low.cc',
+        'model/ocb-wifi-mac.cc',
+        'model/vendor-specific-action.cc',
+        'model/higher-tx-tag.cc',
+        'helper/wave-mac-helper.cc',
+        'helper/wifi-80211p-helper.cc',
+        ]
+
+    module_test = bld.create_ns3_module_test_library('wave')
+    module_test.source = [
+        'test/ocb-test-suite.cc',
+        ]
+
+    headers = bld(features='ns3header')
+    headers.module = 'wave'
+    headers.source = [
+    	'model/wave-mac-low.h',
+        'model/ocb-wifi-mac.h',
+        'model/vendor-specific-action.h',
+        'model/higher-tx-tag.h',
+        'helper/wave-mac-helper.h',
+        'helper/wifi-80211p-helper.h',
+        ]
+
+    if bld.env.ENABLE_EXAMPLES:
+        bld.recurse('examples')
+
+    bld.ns3_python_bindings()
+
diff -Naur ns-3.18.1/src/wifi/bindings/modulegen__gcc_ILP32.py ns-3.19/src/wifi/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/wifi/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/wifi/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -39,7 +39,7 @@
     ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
     module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'])
     ## edca-txop-n.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA'])
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'])
     ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType [enumeration]
     module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'])
     ## address.h (module 'network'): ns3::Address [class]
@@ -189,7 +189,7 @@
     ## vector.h (module 'core'): ns3::Vector3D [class]
     module.add_class('Vector3D', import_from_module='ns.core')
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
-    module.add_class('WifiHelper')
+    module.add_class('WifiHelper', allow_subclassing=True)
     ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper [class]
     module.add_class('WifiMacHelper', allow_subclassing=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
@@ -295,7 +295,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -313,7 +313,7 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING'], outer_class=root_module['ns3::WifiActionHeader'])
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
     module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
@@ -2069,6 +2069,8 @@
     return
 
 def register_Ns3InterferenceHelper_methods(root_module, cls):
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper(ns3::InterferenceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
     ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::InterferenceHelper::Event> ns3::InterferenceHelper::Add(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower, ns3::WifiTxVector txvector) [member function]
@@ -2401,10 +2403,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3969,17 +3972,17 @@
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::NodeContainer', 'c')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, std::string nodeName) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetRemoteStationManager(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetRemoteStationManager', 
                    'void', 
@@ -3987,7 +3990,8 @@
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('SetStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')])
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
     return
 
 def register_Ns3WifiMacHelper_methods(root_module, cls):
@@ -4183,8 +4187,8 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'm'), param('uint8_t', 'l'), param('uint8_t', 'r'), param('bool', 'sg'), param('uint8_t', 'ns'), param('uint8_t', 'ne'), param('bool', 'Stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -4240,10 +4244,10 @@
     cls.add_method('SetShortGuardInterval', 
                    'void', 
                    [param('bool', 'guardinterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbcsatuts) [member function]
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
-                   [param('bool', 'stbcsatuts')])
+                   [param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
     cls.add_method('SetTxPowerLevel', 
                    'void', 
@@ -5033,7 +5037,8 @@
     ## nqos-wifi-mac-helper.h (module 'wifi'): void ns3::NqosWifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetType', 
                    'void', 
-                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
     ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::NqosWifiMacHelper::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
@@ -5323,7 +5328,8 @@
     ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetType', 
                    'void', 
-                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
     ## qos-wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::QosWifiMacHelper::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
@@ -5747,6 +5753,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5757,6 +5768,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5772,6 +5788,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5797,6 +5818,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -6868,10 +6894,10 @@
     cls.add_method('SetProbeResp', 
                    'void', 
                    [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy arg0) [member function]
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
     cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'arg0')])
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
     cls.add_method('SetQosAmsdu', 
                    'void', 
@@ -7010,6 +7036,16 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('uint32_t', 'maxSize')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacQueue::GetAddressForPacket(ns3::WifiMacHeader::AddressType type, std::_List_iterator<ns3::WifiMacQueue::Item> it) [member function]
+    cls.add_method('GetAddressForPacket', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader::AddressType', 'type'), param('std::_List_iterator< ns3::WifiMacQueue::Item >', 'it')], 
+                   visibility='protected')
     return
 
 def register_Ns3WifiMacTrailer_methods(root_module, cls):
@@ -7666,15 +7702,15 @@
                    'void', 
                    [param('bool', 'greenfield')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool GuardInterval) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
     cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('bool', 'guardInterval')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool Ldpc) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('bool', 'ldpc')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
@@ -8280,25 +8316,43 @@
     return
 
 def register_Ns3YansWifiPhy_methods(root_module, cls):
-    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
     ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy() [constructor]
     cls.add_constructor([])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> channel) [member function]
-    cls.add_method('SetChannel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelNumber(uint16_t id) [member function]
-    cls.add_method('SetChannelNumber', 
+    ## yans-wifi-phy.h (module 'wifi'): int64_t ns3::YansWifiPhy::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
+    cls.add_method('CalculateSnr', 
+                   'double', 
+                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('uint16_t', 'id')], 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint16_t ns3::YansWifiPhy::GetChannelNumber() const [member function]
-    cls.add_method('GetChannelNumber', 
-                   'uint16_t', 
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
+    cls.add_method('GetBssMembershipSelector', 
+                   'uint32_t', 
+                   [param('uint32_t', 'selector')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetCcaMode1Threshold() const [member function]
+    cls.add_method('GetCcaMode1Threshold', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::YansWifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::WifiChannel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetChannelBonding() const [member function]
+    cls.add_method('GetChannelBonding', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetChannelFrequencyMhz() const [member function]
@@ -8306,67 +8360,19 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('StartReceivePacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
-    cls.add_method('SetRxNoiseFigure', 
-                   'void', 
-                   [param('double', 'noiseFigureDb')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerStart(double start) [member function]
-    cls.add_method('SetTxPowerStart', 
-                   'void', 
-                   [param('double', 'start')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerEnd(double end) [member function]
-    cls.add_method('SetTxPowerEnd', 
-                   'void', 
-                   [param('double', 'end')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNTxPower(uint32_t n) [member function]
-    cls.add_method('SetNTxPower', 
-                   'void', 
-                   [param('uint32_t', 'n')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxGain(double gain) [member function]
-    cls.add_method('SetTxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxGain(double gain) [member function]
-    cls.add_method('SetRxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetEdThreshold(double threshold) [member function]
-    cls.add_method('SetEdThreshold', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetCcaMode1Threshold(double threshold) [member function]
-    cls.add_method('SetCcaMode1Threshold', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> rate) [member function]
-    cls.add_method('SetErrorRateModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ErrorRateModel >', 'rate')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::Object> device) [member function]
-    cls.add_method('SetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Object >', 'device')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::Object> mobility) [member function]
-    cls.add_method('SetMobility', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Object >', 'mobility')])
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxNoiseFigure() const [member function]
-    cls.add_method('GetRxNoiseFigure', 
-                   'double', 
+    ## yans-wifi-phy.h (module 'wifi'): uint16_t ns3::YansWifiPhy::GetChannelNumber() const [member function]
+    cls.add_method('GetChannelNumber', 
+                   'uint16_t', 
                    [], 
-                   is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxGain() const [member function]
-    cls.add_method('GetTxGain', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetDelayUntilIdle() [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxGain() const [member function]
-    cls.add_method('GetRxGain', 
-                   'double', 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True)
     ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetEdThreshold() const [member function]
@@ -8374,33 +8380,68 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetCcaMode1Threshold() const [member function]
-    cls.add_method('GetCcaMode1Threshold', 
-                   'double', 
-                   [], 
-                   is_const=True)
     ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::YansWifiPhy::GetErrorRateModel() const [member function]
     cls.add_method('GetErrorRateModel', 
                    'ns3::Ptr< ns3::ErrorRateModel >', 
                    [], 
                    is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::Object >', 
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGreenfield() const [member function]
+    cls.add_method('GetGreenfield', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
+                   'uint8_t', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::YansWifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetMobility() [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::Object >', 
                    [])
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerStart() const [member function]
-    cls.add_method('GetTxPowerStart', 
-                   'double', 
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerEnd() const [member function]
-    cls.add_method('GetTxPowerEnd', 
-                   'double', 
+    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNTxPower() const [member function]
@@ -8408,216 +8449,213 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveOkCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveErrorCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet const>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
-    cls.add_method('SendPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
-                   'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateCcaBusy() [member function]
-    cls.add_method('IsStateCcaBusy', 
-                   'bool', 
-                   [], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateIdle() [member function]
-    cls.add_method('IsStateIdle', 
-                   'bool', 
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateBusy() [member function]
-    cls.add_method('IsStateBusy', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateRx() [member function]
-    cls.add_method('IsStateRx', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxGain() const [member function]
+    cls.add_method('GetRxGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxNoiseFigure() const [member function]
+    cls.add_method('GetRxNoiseFigure', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetStateDuration() [member function]
+    cls.add_method('GetStateDuration', 
+                   'ns3::Time', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateTx() [member function]
-    cls.add_method('IsStateTx', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetStbc() const [member function]
+    cls.add_method('GetStbc', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxGain() const [member function]
+    cls.add_method('GetTxGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateBusy() [member function]
+    cls.add_method('IsStateBusy', 
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateSwitching() [member function]
-    cls.add_method('IsStateSwitching', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateCcaBusy() [member function]
+    cls.add_method('IsStateCcaBusy', 
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetStateDuration() [member function]
-    cls.add_method('GetStateDuration', 
-                   'ns3::Time', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateIdle() [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetDelayUntilIdle() [member function]
-    cls.add_method('GetDelayUntilIdle', 
-                   'ns3::Time', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateRx() [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateSwitching() [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateTx() [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::McsToWifiMode(uint8_t mcs) [member function]
+    cls.add_method('McsToWifiMode', 
                    'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
-    cls.add_method('CalculateSnr', 
-                   'double', 
-                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::YansWifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::WifiChannel >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+                   [param('uint8_t', 'mcs')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   [param('ns3::WifiPhyListener *', 'listener')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): int64_t ns3::YansWifiPhy::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
                    is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetCcaMode1Threshold(double threshold) [member function]
+    cls.add_method('SetCcaMode1Threshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> channel) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelBonding(bool channelbonding) [member function]
+    cls.add_method('SetChannelBonding', 
+                   'void', 
+                   [param('bool', 'channelbonding')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelNumber(uint16_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint16_t', 'id')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::Object> device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'device')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetEdThreshold(double threshold) [member function]
+    cls.add_method('SetEdThreshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel >', 'rate')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
                    [param('uint32_t', 'freq')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
-    cls.add_method('SetNumberOfTransmitAntennas', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGreenfield(bool greenfield) [member function]
+    cls.add_method('SetGreenfield', 
                    'void', 
-                   [param('uint32_t', 'tx')], 
+                   [param('bool', 'greenfield')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGuardInterval(bool guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('bool', 'guardInterval')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetLdpc(bool ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('bool', 'ldpc')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::Object> mobility) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'mobility')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNTxPower(uint32_t n) [member function]
+    cls.add_method('SetNTxPower', 
+                   'void', 
+                   [param('uint32_t', 'n')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint32_t', 'rx')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGuardInterval(bool GuardInterval) [member function]
-    cls.add_method('SetGuardInterval', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
+    cls.add_method('SetNumberOfTransmitAntennas', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('uint32_t', 'tx')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetLdpc(bool Ldpc) [member function]
-    cls.add_method('SetLdpc', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveErrorCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet const>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveOkCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxGain(double gain) [member function]
+    cls.add_method('SetRxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
+    cls.add_method('SetRxNoiseFigure', 
+                   'void', 
+                   [param('double', 'noiseFigureDb')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
                    [param('bool', 'stbc')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetStbc() const [member function]
-    cls.add_method('GetStbc', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGreenfield(bool greenfield) [member function]
-    cls.add_method('SetGreenfield', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxGain(double gain) [member function]
+    cls.add_method('SetTxGain', 
                    'void', 
-                   [param('bool', 'greenfield')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
+                   [param('double', 'gain')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerEnd(double end) [member function]
+    cls.add_method('SetTxPowerEnd', 
                    'void', 
-                   [param('bool', 'channelbonding')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint32_t', 
-                   [param('uint32_t', 'selector')], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::YansWifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True, is_virtual=True)
+                   [param('double', 'end')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerStart(double start) [member function]
+    cls.add_method('SetTxPowerStart', 
+                   'void', 
+                   [param('double', 'start')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('StartReceivePacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
     cls.add_method('WifiModeToMcs', 
                    'uint32_t', 
                    [param('ns3::WifiMode', 'mode')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -9721,10 +9759,10 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immeadiateAck) [member function]
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
     cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('bool', 'immeadiateAck')])
+                   [param('bool', 'immediateAck')])
     ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
     cls.add_method('SetReceivedFragment', 
                    'void', 
@@ -11155,6 +11193,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
+    cls.add_method('IsPromisc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySwitchingStartNow(ns3::Time duration) [member function]
     cls.add_method('NotifySwitchingStartNow', 
                    'void', 
@@ -11239,6 +11282,11 @@
     cls.add_method('StartTransmission', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::MacLowTransmissionListener *', 'listener')])
+    ## mac-low.h (module 'wifi'): ns3::WifiTxVector ns3::MacLow::GetDataTxVector(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr) const [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   is_const=True, visibility='protected', is_virtual=True)
     ## mac-low.h (module 'wifi'): void ns3::MacLow::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -12360,6 +12408,31 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::DcaTxop> ns3::RegularWifiMac::GetDcaTxop() const [member function]
+    cls.add_method('GetDcaTxop', 
+                   'ns3::Ptr< ns3::DcaTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('FinishConfigureStandard', 
                    'void', 
@@ -13074,12 +13147,17 @@
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   visibility='private', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
-                   visibility='private', is_virtual=True)
+                   visibility='protected', is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::ForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
+                   visibility='protected')
     return
 
 def register_Ns3YansErrorRateModel_methods(root_module, cls):
@@ -13100,44 +13178,46 @@
     return
 
 def register_Ns3YansWifiChannel_methods(root_module, cls):
-    ## yans-wifi-channel.h (module 'wifi'): static ns3::TypeId ns3::YansWifiChannel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel(ns3::YansWifiChannel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::YansWifiChannel const &', 'arg0')])
     ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel() [constructor]
     cls.add_constructor([])
-    ## yans-wifi-channel.h (module 'wifi'): uint32_t ns3::YansWifiChannel::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Add(ns3::Ptr<ns3::YansWifiPhy> phy) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'phy')])
+    ## yans-wifi-channel.h (module 'wifi'): int64_t ns3::YansWifiChannel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
     ## yans-wifi-channel.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [param('uint32_t', 'i')], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Add(ns3::Ptr<ns3::YansWifiPhy> phy) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'phy')])
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
-    cls.add_method('SetPropagationLossModel', 
+    ## yans-wifi-channel.h (module 'wifi'): uint32_t ns3::YansWifiChannel::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-channel.h (module 'wifi'): static ns3::TypeId ns3::YansWifiChannel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PropagationLossModel >', 'loss')])
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True)
     ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
                    [param('ns3::Ptr< ns3::PropagationDelayModel >', 'delay')])
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) const [member function]
-    cls.add_method('Send', 
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
+    cls.add_method('SetPropagationLossModel', 
                    'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_const=True)
-    ## yans-wifi-channel.h (module 'wifi'): int64_t ns3::YansWifiChannel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
+                   [param('ns3::Ptr< ns3::PropagationLossModel >', 'loss')])
     return
 
 def register_Ns3AddressChecker_methods(root_module, cls):
diff -Naur ns-3.18.1/src/wifi/bindings/modulegen__gcc_LP64.py ns-3.19/src/wifi/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/wifi/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/wifi/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -39,7 +39,7 @@
     ## wifi-mode.h (module 'wifi'): ns3::WifiCodeRate [enumeration]
     module.add_enum('WifiCodeRate', ['WIFI_CODE_RATE_UNDEFINED', 'WIFI_CODE_RATE_3_4', 'WIFI_CODE_RATE_2_3', 'WIFI_CODE_RATE_1_2', 'WIFI_CODE_RATE_5_6'])
     ## edca-txop-n.h (module 'wifi'): ns3::TypeOfStation [enumeration]
-    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA'])
+    module.add_enum('TypeOfStation', ['STA', 'AP', 'ADHOC_STA', 'MESH', 'HT_STA', 'HT_AP', 'HT_ADHOC_STA', 'OCB'])
     ## ctrl-headers.h (module 'wifi'): ns3::BlockAckType [enumeration]
     module.add_enum('BlockAckType', ['BASIC_BLOCK_ACK', 'COMPRESSED_BLOCK_ACK', 'MULTI_TID_BLOCK_ACK'])
     ## address.h (module 'network'): ns3::Address [class]
@@ -189,7 +189,7 @@
     ## vector.h (module 'core'): ns3::Vector3D [class]
     module.add_class('Vector3D', import_from_module='ns.core')
     ## wifi-helper.h (module 'wifi'): ns3::WifiHelper [class]
-    module.add_class('WifiHelper')
+    module.add_class('WifiHelper', allow_subclassing=True)
     ## wifi-helper.h (module 'wifi'): ns3::WifiMacHelper [class]
     module.add_class('WifiMacHelper', allow_subclassing=True)
     ## wifi-mode.h (module 'wifi'): ns3::WifiMode [class]
@@ -295,7 +295,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## trace-source-accessor.h (module 'core'): ns3::TraceSourceAccessor [class]
@@ -313,7 +313,7 @@
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
     module.add_class('WifiActionHeader', parent=root_module['ns3::Header'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enumeration]
-    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING'], outer_class=root_module['ns3::WifiActionHeader'])
+    module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LINK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINATION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHeader'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionValue [enumeration]
     module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CONFIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'])
     ## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionValue [enumeration]
@@ -2069,6 +2069,8 @@
     return
 
 def register_Ns3InterferenceHelper_methods(root_module, cls):
+    ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper(ns3::InterferenceHelper const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::InterferenceHelper const &', 'arg0')])
     ## interference-helper.h (module 'wifi'): ns3::InterferenceHelper::InterferenceHelper() [constructor]
     cls.add_constructor([])
     ## interference-helper.h (module 'wifi'): ns3::Ptr<ns3::InterferenceHelper::Event> ns3::InterferenceHelper::Add(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble, ns3::Time duration, double rxPower, ns3::WifiTxVector txvector) [member function]
@@ -2401,10 +2403,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -3969,17 +3972,17 @@
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::NodeContainer', 'c')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, ns3::Ptr<ns3::Node> node) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('ns3::Ptr< ns3::Node >', 'node')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): ns3::NetDeviceContainer ns3::WifiHelper::Install(ns3::WifiPhyHelper const & phy, ns3::WifiMacHelper const & mac, std::string nodeName) const [member function]
     cls.add_method('Install', 
                    'ns3::NetDeviceContainer', 
                    [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetRemoteStationManager(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetRemoteStationManager', 
                    'void', 
@@ -3987,7 +3990,8 @@
     ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('SetStandard', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')])
+                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   is_virtual=True)
     return
 
 def register_Ns3WifiMacHelper_methods(root_module, cls):
@@ -4183,8 +4187,8 @@
     cls.add_constructor([param('ns3::WifiTxVector const &', 'arg0')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector() [constructor]
     cls.add_constructor([])
-    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc) [constructor]
-    cls.add_constructor([param('ns3::WifiMode', 'm'), param('uint8_t', 'l'), param('uint8_t', 'r'), param('bool', 'sg'), param('uint8_t', 'ns'), param('uint8_t', 'ne'), param('bool', 'Stbc')])
+    ## wifi-tx-vector.h (module 'wifi'): ns3::WifiTxVector::WifiTxVector(ns3::WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc) [constructor]
+    cls.add_constructor([param('ns3::WifiMode', 'mode'), param('uint8_t', 'powerLevel'), param('uint8_t', 'retries'), param('bool', 'shortGuardInterval'), param('uint8_t', 'nss'), param('uint8_t', 'ness'), param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): ns3::WifiMode ns3::WifiTxVector::GetMode() const [member function]
     cls.add_method('GetMode', 
                    'ns3::WifiMode', 
@@ -4240,10 +4244,10 @@
     cls.add_method('SetShortGuardInterval', 
                    'void', 
                    [param('bool', 'guardinterval')])
-    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbcsatuts) [member function]
+    ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
-                   [param('bool', 'stbcsatuts')])
+                   [param('bool', 'stbc')])
     ## wifi-tx-vector.h (module 'wifi'): void ns3::WifiTxVector::SetTxPowerLevel(uint8_t powerlevel) [member function]
     cls.add_method('SetTxPowerLevel', 
                    'void', 
@@ -5033,7 +5037,8 @@
     ## nqos-wifi-mac-helper.h (module 'wifi'): void ns3::NqosWifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetType', 
                    'void', 
-                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
     ## nqos-wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::NqosWifiMacHelper::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
@@ -5323,7 +5328,8 @@
     ## qos-wifi-mac-helper.h (module 'wifi'): void ns3::QosWifiMacHelper::SetType(std::string type, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue(), std::string n4="", ns3::AttributeValue const & v4=ns3::EmptyAttributeValue(), std::string n5="", ns3::AttributeValue const & v5=ns3::EmptyAttributeValue(), std::string n6="", ns3::AttributeValue const & v6=ns3::EmptyAttributeValue(), std::string n7="", ns3::AttributeValue const & v7=ns3::EmptyAttributeValue()) [member function]
     cls.add_method('SetType', 
                    'void', 
-                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')])
+                   [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')], 
+                   is_virtual=True)
     ## qos-wifi-mac-helper.h (module 'wifi'): ns3::Ptr<ns3::WifiMac> ns3::QosWifiMacHelper::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
@@ -5747,6 +5753,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -5757,6 +5768,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -5772,6 +5788,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -5797,6 +5818,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
@@ -6868,10 +6894,10 @@
     cls.add_method('SetProbeResp', 
                    'void', 
                    [])
-    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy arg0) [member function]
+    ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAckPolicy(ns3::WifiMacHeader::QosAckPolicy policy) [member function]
     cls.add_method('SetQosAckPolicy', 
                    'void', 
-                   [param('ns3::WifiMacHeader::QosAckPolicy', 'arg0')])
+                   [param('ns3::WifiMacHeader::QosAckPolicy', 'policy')])
     ## wifi-mac-header.h (module 'wifi'): void ns3::WifiMacHeader::SetQosAmsdu() [member function]
     cls.add_method('SetQosAmsdu', 
                    'void', 
@@ -7010,6 +7036,16 @@
     cls.add_method('SetMaxSize', 
                    'void', 
                    [param('uint32_t', 'maxSize')])
+    ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::Cleanup() [member function]
+    cls.add_method('Cleanup', 
+                   'void', 
+                   [], 
+                   visibility='protected', is_virtual=True)
+    ## wifi-mac-queue.h (module 'wifi'): ns3::Mac48Address ns3::WifiMacQueue::GetAddressForPacket(ns3::WifiMacHeader::AddressType type, std::_List_iterator<ns3::WifiMacQueue::Item> it) [member function]
+    cls.add_method('GetAddressForPacket', 
+                   'ns3::Mac48Address', 
+                   [param('ns3::WifiMacHeader::AddressType', 'type'), param('std::_List_iterator< ns3::WifiMacQueue::Item >', 'it')], 
+                   visibility='protected')
     return
 
 def register_Ns3WifiMacTrailer_methods(root_module, cls):
@@ -7666,15 +7702,15 @@
                    'void', 
                    [param('bool', 'greenfield')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool GuardInterval) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetGuardInterval(bool guardInterval) [member function]
     cls.add_method('SetGuardInterval', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('bool', 'guardInterval')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool Ldpc) [member function]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetLdpc(bool ldpc) [member function]
     cls.add_method('SetLdpc', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('bool', 'ldpc')], 
                    is_pure_virtual=True, is_virtual=True)
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
@@ -8280,25 +8316,43 @@
     return
 
 def register_Ns3YansWifiPhy_methods(root_module, cls):
-    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy(ns3::YansWifiPhy const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::YansWifiPhy const &', 'arg0')])
     ## yans-wifi-phy.h (module 'wifi'): ns3::YansWifiPhy::YansWifiPhy() [constructor]
     cls.add_constructor([])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> channel) [member function]
-    cls.add_method('SetChannel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelNumber(uint16_t id) [member function]
-    cls.add_method('SetChannelNumber', 
+    ## yans-wifi-phy.h (module 'wifi'): int64_t ns3::YansWifiPhy::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
+    cls.add_method('CalculateSnr', 
+                   'double', 
+                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
+    cls.add_method('ConfigureStandard', 
                    'void', 
-                   [param('uint16_t', 'id')], 
+                   [param('ns3::WifiPhyStandard', 'standard')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint16_t ns3::YansWifiPhy::GetChannelNumber() const [member function]
-    cls.add_method('GetChannelNumber', 
-                   'uint16_t', 
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
+    cls.add_method('GetBssMembershipSelector', 
+                   'uint32_t', 
+                   [param('uint32_t', 'selector')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetCcaMode1Threshold() const [member function]
+    cls.add_method('GetCcaMode1Threshold', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::YansWifiPhy::GetChannel() const [member function]
+    cls.add_method('GetChannel', 
+                   'ns3::Ptr< ns3::WifiChannel >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetChannelBonding() const [member function]
+    cls.add_method('GetChannelBonding', 
+                   'bool', 
                    [], 
                    is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetChannelFrequencyMhz() const [member function]
@@ -8306,67 +8360,19 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
-    cls.add_method('StartReceivePacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
-    cls.add_method('SetRxNoiseFigure', 
-                   'void', 
-                   [param('double', 'noiseFigureDb')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerStart(double start) [member function]
-    cls.add_method('SetTxPowerStart', 
-                   'void', 
-                   [param('double', 'start')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerEnd(double end) [member function]
-    cls.add_method('SetTxPowerEnd', 
-                   'void', 
-                   [param('double', 'end')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNTxPower(uint32_t n) [member function]
-    cls.add_method('SetNTxPower', 
-                   'void', 
-                   [param('uint32_t', 'n')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxGain(double gain) [member function]
-    cls.add_method('SetTxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxGain(double gain) [member function]
-    cls.add_method('SetRxGain', 
-                   'void', 
-                   [param('double', 'gain')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetEdThreshold(double threshold) [member function]
-    cls.add_method('SetEdThreshold', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetCcaMode1Threshold(double threshold) [member function]
-    cls.add_method('SetCcaMode1Threshold', 
-                   'void', 
-                   [param('double', 'threshold')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> rate) [member function]
-    cls.add_method('SetErrorRateModel', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::ErrorRateModel >', 'rate')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::Object> device) [member function]
-    cls.add_method('SetDevice', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Object >', 'device')])
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::Object> mobility) [member function]
-    cls.add_method('SetMobility', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Object >', 'mobility')])
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxNoiseFigure() const [member function]
-    cls.add_method('GetRxNoiseFigure', 
-                   'double', 
+    ## yans-wifi-phy.h (module 'wifi'): uint16_t ns3::YansWifiPhy::GetChannelNumber() const [member function]
+    cls.add_method('GetChannelNumber', 
+                   'uint16_t', 
                    [], 
-                   is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxGain() const [member function]
-    cls.add_method('GetTxGain', 
-                   'double', 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetDelayUntilIdle() [member function]
+    cls.add_method('GetDelayUntilIdle', 
+                   'ns3::Time', 
                    [], 
-                   is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxGain() const [member function]
-    cls.add_method('GetRxGain', 
-                   'double', 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::Object >', 
                    [], 
                    is_const=True)
     ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetEdThreshold() const [member function]
@@ -8374,33 +8380,68 @@
                    'double', 
                    [], 
                    is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetCcaMode1Threshold() const [member function]
-    cls.add_method('GetCcaMode1Threshold', 
-                   'double', 
-                   [], 
-                   is_const=True)
     ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::ErrorRateModel> ns3::YansWifiPhy::GetErrorRateModel() const [member function]
     cls.add_method('GetErrorRateModel', 
                    'ns3::Ptr< ns3::ErrorRateModel >', 
                    [], 
                    is_const=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetDevice() const [member function]
-    cls.add_method('GetDevice', 
-                   'ns3::Ptr< ns3::Object >', 
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetFrequency() const [member function]
+    cls.add_method('GetFrequency', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGreenfield() const [member function]
+    cls.add_method('GetGreenfield', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGuardInterval() const [member function]
+    cls.add_method('GetGuardInterval', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetLastRxStartTime() const [member function]
+    cls.add_method('GetLastRxStartTime', 
+                   'ns3::Time', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetLdpc() const [member function]
+    cls.add_method('GetLdpc', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
+    cls.add_method('GetMcs', 
+                   'uint8_t', 
+                   [param('uint8_t', 'mcs')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::YansWifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
+    cls.add_method('GetMembershipSelectorModes', 
+                   'ns3::WifiModeList', 
+                   [param('uint32_t', 'selector')], 
+                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::Object> ns3::YansWifiPhy::GetMobility() [member function]
     cls.add_method('GetMobility', 
                    'ns3::Ptr< ns3::Object >', 
                    [])
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerStart() const [member function]
-    cls.add_method('GetTxPowerStart', 
-                   'double', 
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMode(uint32_t mode) const [member function]
+    cls.add_method('GetMode', 
+                   'ns3::WifiMode', 
+                   [param('uint32_t', 'mode')], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNBssMembershipSelectors() const [member function]
+    cls.add_method('GetNBssMembershipSelectors', 
+                   'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerEnd() const [member function]
-    cls.add_method('GetTxPowerEnd', 
-                   'double', 
+    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetNMcs() const [member function]
+    cls.add_method('GetNMcs', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNModes() const [member function]
+    cls.add_method('GetNModes', 
+                   'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNTxPower() const [member function]
@@ -8408,216 +8449,213 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveOkCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetReceiveOkCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveErrorCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet const>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
-    cls.add_method('SetReceiveErrorCallback', 
-                   'void', 
-                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
-    cls.add_method('SendPacket', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
-    cls.add_method('RegisterListener', 
-                   'void', 
-                   [param('ns3::WifiPhyListener *', 'listener')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateCcaBusy() [member function]
-    cls.add_method('IsStateCcaBusy', 
-                   'bool', 
-                   [], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateIdle() [member function]
-    cls.add_method('IsStateIdle', 
-                   'bool', 
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfReceiveAntennas() const [member function]
+    cls.add_method('GetNumberOfReceiveAntennas', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateBusy() [member function]
-    cls.add_method('IsStateBusy', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfTransmitAntennas() const [member function]
+    cls.add_method('GetNumberOfTransmitAntennas', 
+                   'uint32_t', 
                    [], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateRx() [member function]
-    cls.add_method('IsStateRx', 
-                   'bool', 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxGain() const [member function]
+    cls.add_method('GetRxGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetRxNoiseFigure() const [member function]
+    cls.add_method('GetRxNoiseFigure', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetStateDuration() [member function]
+    cls.add_method('GetStateDuration', 
+                   'ns3::Time', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateTx() [member function]
-    cls.add_method('IsStateTx', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetStbc() const [member function]
+    cls.add_method('GetStbc', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxGain() const [member function]
+    cls.add_method('GetTxGain', 
+                   'double', 
+                   [], 
+                   is_const=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerEnd() const [member function]
+    cls.add_method('GetTxPowerEnd', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::GetTxPowerStart() const [member function]
+    cls.add_method('GetTxPowerStart', 
+                   'double', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): static ns3::TypeId ns3::YansWifiPhy::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateBusy() [member function]
+    cls.add_method('IsStateBusy', 
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateSwitching() [member function]
-    cls.add_method('IsStateSwitching', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateCcaBusy() [member function]
+    cls.add_method('IsStateCcaBusy', 
                    'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetStateDuration() [member function]
-    cls.add_method('GetStateDuration', 
-                   'ns3::Time', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateIdle() [member function]
+    cls.add_method('IsStateIdle', 
+                   'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetDelayUntilIdle() [member function]
-    cls.add_method('GetDelayUntilIdle', 
-                   'ns3::Time', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateRx() [member function]
+    cls.add_method('IsStateRx', 
+                   'bool', 
                    [], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::GetLastRxStartTime() const [member function]
-    cls.add_method('GetLastRxStartTime', 
-                   'ns3::Time', 
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateSwitching() [member function]
+    cls.add_method('IsStateSwitching', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNModes() const [member function]
-    cls.add_method('GetNModes', 
-                   'uint32_t', 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::IsStateTx() [member function]
+    cls.add_method('IsStateTx', 
+                   'bool', 
                    [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::GetMode(uint32_t mode) const [member function]
-    cls.add_method('GetMode', 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::McsToWifiMode(uint8_t mcs) [member function]
+    cls.add_method('McsToWifiMode', 
                    'ns3::WifiMode', 
-                   [param('uint32_t', 'mode')], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): double ns3::YansWifiPhy::CalculateSnr(ns3::WifiMode txMode, double ber) const [member function]
-    cls.add_method('CalculateSnr', 
-                   'double', 
-                   [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::Ptr<ns3::WifiChannel> ns3::YansWifiPhy::GetChannel() const [member function]
-    cls.add_method('GetChannel', 
-                   'ns3::Ptr< ns3::WifiChannel >', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('ConfigureStandard', 
+                   [param('uint8_t', 'mcs')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::RegisterListener(ns3::WifiPhyListener * listener) [member function]
+    cls.add_method('RegisterListener', 
                    'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
+                   [param('ns3::WifiPhyListener *', 'listener')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): int64_t ns3::YansWifiPhy::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')], 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SendPacket(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMode mode, ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [member function]
+    cls.add_method('SendPacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble'), param('ns3::WifiTxVector', 'txvector')], 
                    is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetCcaMode1Threshold(double threshold) [member function]
+    cls.add_method('SetCcaMode1Threshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannel(ns3::Ptr<ns3::YansWifiChannel> channel) [member function]
+    cls.add_method('SetChannel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::YansWifiChannel >', 'channel')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelBonding(bool channelbonding) [member function]
+    cls.add_method('SetChannelBonding', 
+                   'void', 
+                   [param('bool', 'channelbonding')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelNumber(uint16_t id) [member function]
+    cls.add_method('SetChannelNumber', 
+                   'void', 
+                   [param('uint16_t', 'id')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetDevice(ns3::Ptr<ns3::Object> device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'device')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetEdThreshold(double threshold) [member function]
+    cls.add_method('SetEdThreshold', 
+                   'void', 
+                   [param('double', 'threshold')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetErrorRateModel(ns3::Ptr<ns3::ErrorRateModel> rate) [member function]
+    cls.add_method('SetErrorRateModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ErrorRateModel >', 'rate')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetFrequency(uint32_t freq) [member function]
     cls.add_method('SetFrequency', 
                    'void', 
                    [param('uint32_t', 'freq')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetFrequency() const [member function]
-    cls.add_method('GetFrequency', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
-    cls.add_method('SetNumberOfTransmitAntennas', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGreenfield(bool greenfield) [member function]
+    cls.add_method('SetGreenfield', 
                    'void', 
-                   [param('uint32_t', 'tx')], 
+                   [param('bool', 'greenfield')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfTransmitAntennas() const [member function]
-    cls.add_method('GetNumberOfTransmitAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGuardInterval(bool guardInterval) [member function]
+    cls.add_method('SetGuardInterval', 
+                   'void', 
+                   [param('bool', 'guardInterval')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetLdpc(bool ldpc) [member function]
+    cls.add_method('SetLdpc', 
+                   'void', 
+                   [param('bool', 'ldpc')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetMobility(ns3::Ptr<ns3::Object> mobility) [member function]
+    cls.add_method('SetMobility', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Object >', 'mobility')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNTxPower(uint32_t n) [member function]
+    cls.add_method('SetNTxPower', 
+                   'void', 
+                   [param('uint32_t', 'n')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfReceiveAntennas(uint32_t rx) [member function]
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint32_t', 'rx')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNumberOfReceiveAntennas() const [member function]
-    cls.add_method('GetNumberOfReceiveAntennas', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGuardInterval(bool GuardInterval) [member function]
-    cls.add_method('SetGuardInterval', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetNumberOfTransmitAntennas(uint32_t tx) [member function]
+    cls.add_method('SetNumberOfTransmitAntennas', 
                    'void', 
-                   [param('bool', 'GuardInterval')], 
+                   [param('uint32_t', 'tx')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGuardInterval() const [member function]
-    cls.add_method('GetGuardInterval', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetLdpc(bool Ldpc) [member function]
-    cls.add_method('SetLdpc', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveErrorCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet const>, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveErrorCallback', 
                    'void', 
-                   [param('bool', 'Ldpc')], 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetLdpc() const [member function]
-    cls.add_method('GetLdpc', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetReceiveOkCallback(ns3::Callback<void, ns3::Ptr<ns3::Packet>, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty> callback) [member function]
+    cls.add_method('SetReceiveOkCallback', 
+                   'void', 
+                   [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'callback')], 
+                   is_virtual=True)
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxGain(double gain) [member function]
+    cls.add_method('SetRxGain', 
+                   'void', 
+                   [param('double', 'gain')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function]
+    cls.add_method('SetRxNoiseFigure', 
+                   'void', 
+                   [param('double', 'noiseFigureDb')])
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetStbc(bool stbc) [member function]
     cls.add_method('SetStbc', 
                    'void', 
                    [param('bool', 'stbc')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetStbc() const [member function]
-    cls.add_method('GetStbc', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetGreenfield(bool greenfield) [member function]
-    cls.add_method('SetGreenfield', 
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxGain(double gain) [member function]
+    cls.add_method('SetTxGain', 
                    'void', 
-                   [param('bool', 'greenfield')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetGreenfield() const [member function]
-    cls.add_method('GetGreenfield', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): bool ns3::YansWifiPhy::GetChannelBonding() const [member function]
-    cls.add_method('GetChannelBonding', 
-                   'bool', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetChannelBonding(bool channelbonding) [member function]
-    cls.add_method('SetChannelBonding', 
+                   [param('double', 'gain')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerEnd(double end) [member function]
+    cls.add_method('SetTxPowerEnd', 
                    'void', 
-                   [param('bool', 'channelbonding')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNBssMembershipSelectors() const [member function]
-    cls.add_method('GetNBssMembershipSelectors', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetBssMembershipSelector(uint32_t selector) const [member function]
-    cls.add_method('GetBssMembershipSelector', 
-                   'uint32_t', 
-                   [param('uint32_t', 'selector')], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiModeList ns3::YansWifiPhy::GetMembershipSelectorModes(uint32_t selector) [member function]
-    cls.add_method('GetMembershipSelectorModes', 
-                   'ns3::WifiModeList', 
-                   [param('uint32_t', 'selector')], 
-                   is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetNMcs() const [member function]
-    cls.add_method('GetNMcs', 
-                   'uint8_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): uint8_t ns3::YansWifiPhy::GetMcs(uint8_t mcs) const [member function]
-    cls.add_method('GetMcs', 
-                   'uint8_t', 
-                   [param('uint8_t', 'mcs')], 
-                   is_const=True, is_virtual=True)
+                   [param('double', 'end')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::SetTxPowerStart(double start) [member function]
+    cls.add_method('SetTxPowerStart', 
+                   'void', 
+                   [param('double', 'start')])
+    ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::StartReceivePacket(ns3::Ptr<ns3::Packet> packet, double rxPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) [member function]
+    cls.add_method('StartReceivePacket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')])
     ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::WifiModeToMcs(ns3::WifiMode mode) [member function]
     cls.add_method('WifiModeToMcs', 
                    'uint32_t', 
                    [param('ns3::WifiMode', 'mode')], 
                    is_virtual=True)
-    ## yans-wifi-phy.h (module 'wifi'): ns3::WifiMode ns3::YansWifiPhy::McsToWifiMode(uint8_t mcs) [member function]
-    cls.add_method('McsToWifiMode', 
-                   'ns3::WifiMode', 
-                   [param('uint8_t', 'mcs')], 
-                   is_virtual=True)
     ## yans-wifi-phy.h (module 'wifi'): void ns3::YansWifiPhy::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -9721,10 +9759,10 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
-    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immeadiateAck) [member function]
+    ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetHtImmediateAck(bool immediateAck) [member function]
     cls.add_method('SetHtImmediateAck', 
                    'void', 
-                   [param('bool', 'immeadiateAck')])
+                   [param('bool', 'immediateAck')])
     ## ctrl-headers.h (module 'wifi'): void ns3::CtrlBAckResponseHeader::SetReceivedFragment(uint16_t seq, uint8_t frag) [member function]
     cls.add_method('SetReceivedFragment', 
                    'void', 
@@ -11155,6 +11193,11 @@
                    'ns3::Time', 
                    [], 
                    is_const=True)
+    ## mac-low.h (module 'wifi'): bool ns3::MacLow::IsPromisc() const [member function]
+    cls.add_method('IsPromisc', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## mac-low.h (module 'wifi'): void ns3::MacLow::NotifySwitchingStartNow(ns3::Time duration) [member function]
     cls.add_method('NotifySwitchingStartNow', 
                    'void', 
@@ -11239,6 +11282,11 @@
     cls.add_method('StartTransmission', 
                    'void', 
                    [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr'), param('ns3::MacLowTransmissionParameters', 'parameters'), param('ns3::MacLowTransmissionListener *', 'listener')])
+    ## mac-low.h (module 'wifi'): ns3::WifiTxVector ns3::MacLow::GetDataTxVector(ns3::Ptr<ns3::Packet const> packet, ns3::WifiMacHeader const * hdr) const [member function]
+    cls.add_method('GetDataTxVector', 
+                   'ns3::WifiTxVector', 
+                   [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const *', 'hdr')], 
+                   is_const=True, visibility='protected', is_virtual=True)
     ## mac-low.h (module 'wifi'): void ns3::MacLow::DoDispose() [member function]
     cls.add_method('DoDispose', 
                    'void', 
@@ -12360,6 +12408,31 @@
                    'void', 
                    [], 
                    visibility='protected', is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::DcaTxop> ns3::RegularWifiMac::GetDcaTxop() const [member function]
+    cls.add_method('GetDcaTxop', 
+                   'ns3::Ptr< ns3::DcaTxop >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVOQueue() const [member function]
+    cls.add_method('GetVOQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetVIQueue() const [member function]
+    cls.add_method('GetVIQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBEQueue() const [member function]
+    cls.add_method('GetBEQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::EdcaTxopN> ns3::RegularWifiMac::GetBKQueue() const [member function]
+    cls.add_method('GetBKQueue', 
+                   'ns3::Ptr< ns3::EdcaTxopN >', 
+                   [], 
+                   is_const=True, visibility='protected')
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function]
     cls.add_method('FinishConfigureStandard', 
                    'void', 
@@ -13074,12 +13147,17 @@
     cls.add_method('DoDispose', 
                    'void', 
                    [], 
-                   visibility='private', is_virtual=True)
+                   visibility='protected', is_virtual=True)
     ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
                    [], 
-                   visibility='private', is_virtual=True)
+                   visibility='protected', is_virtual=True)
+    ## wifi-net-device.h (module 'wifi'): void ns3::WifiNetDevice::ForwardUp(ns3::Ptr<ns3::Packet> packet, ns3::Mac48Address from, ns3::Mac48Address to) [member function]
+    cls.add_method('ForwardUp', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'from'), param('ns3::Mac48Address', 'to')], 
+                   visibility='protected')
     return
 
 def register_Ns3YansErrorRateModel_methods(root_module, cls):
@@ -13100,44 +13178,46 @@
     return
 
 def register_Ns3YansWifiChannel_methods(root_module, cls):
-    ## yans-wifi-channel.h (module 'wifi'): static ns3::TypeId ns3::YansWifiChannel::GetTypeId() [member function]
-    cls.add_method('GetTypeId', 
-                   'ns3::TypeId', 
-                   [], 
-                   is_static=True)
+    ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel(ns3::YansWifiChannel const & arg0) [copy constructor]
+    cls.add_constructor([param('ns3::YansWifiChannel const &', 'arg0')])
     ## yans-wifi-channel.h (module 'wifi'): ns3::YansWifiChannel::YansWifiChannel() [constructor]
     cls.add_constructor([])
-    ## yans-wifi-channel.h (module 'wifi'): uint32_t ns3::YansWifiChannel::GetNDevices() const [member function]
-    cls.add_method('GetNDevices', 
-                   'uint32_t', 
-                   [], 
-                   is_const=True, is_virtual=True)
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Add(ns3::Ptr<ns3::YansWifiPhy> phy) [member function]
+    cls.add_method('Add', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'phy')])
+    ## yans-wifi-channel.h (module 'wifi'): int64_t ns3::YansWifiChannel::AssignStreams(int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'stream')])
     ## yans-wifi-channel.h (module 'wifi'): ns3::Ptr<ns3::NetDevice> ns3::YansWifiChannel::GetDevice(uint32_t i) const [member function]
     cls.add_method('GetDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [param('uint32_t', 'i')], 
                    is_const=True, is_virtual=True)
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Add(ns3::Ptr<ns3::YansWifiPhy> phy) [member function]
-    cls.add_method('Add', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'phy')])
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
-    cls.add_method('SetPropagationLossModel', 
+    ## yans-wifi-channel.h (module 'wifi'): uint32_t ns3::YansWifiChannel::GetNDevices() const [member function]
+    cls.add_method('GetNDevices', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## yans-wifi-channel.h (module 'wifi'): static ns3::TypeId ns3::YansWifiChannel::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) const [member function]
+    cls.add_method('Send', 
                    'void', 
-                   [param('ns3::Ptr< ns3::PropagationLossModel >', 'loss')])
+                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
+                   is_const=True)
     ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationDelayModel(ns3::Ptr<ns3::PropagationDelayModel> delay) [member function]
     cls.add_method('SetPropagationDelayModel', 
                    'void', 
                    [param('ns3::Ptr< ns3::PropagationDelayModel >', 'delay')])
-    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::Send(ns3::Ptr<ns3::YansWifiPhy> sender, ns3::Ptr<ns3::Packet const> packet, double txPowerDbm, ns3::WifiTxVector txVector, ns3::WifiPreamble preamble) const [member function]
-    cls.add_method('Send', 
+    ## yans-wifi-channel.h (module 'wifi'): void ns3::YansWifiChannel::SetPropagationLossModel(ns3::Ptr<ns3::PropagationLossModel> loss) [member function]
+    cls.add_method('SetPropagationLossModel', 
                    'void', 
-                   [param('ns3::Ptr< ns3::YansWifiPhy >', 'sender'), param('ns3::Ptr< ns3::Packet const >', 'packet'), param('double', 'txPowerDbm'), param('ns3::WifiTxVector', 'txVector'), param('ns3::WifiPreamble', 'preamble')], 
-                   is_const=True)
-    ## yans-wifi-channel.h (module 'wifi'): int64_t ns3::YansWifiChannel::AssignStreams(int64_t stream) [member function]
-    cls.add_method('AssignStreams', 
-                   'int64_t', 
-                   [param('int64_t', 'stream')])
+                   [param('ns3::Ptr< ns3::PropagationLossModel >', 'loss')])
     return
 
 def register_Ns3AddressChecker_methods(root_module, cls):
diff -Naur ns-3.18.1/src/wifi/doc/wifi.rst ns-3.19/src/wifi/doc/wifi.rst
--- ns-3.18.1/src/wifi/doc/wifi.rst	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/wifi/doc/wifi.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 Wifi
 ----
@@ -149,7 +150,7 @@
 loss based on a log distance model with a reference loss of 46.6777 dB at
 reference distance of 1m.
 
-Users will typically type code such as:::
+Users will typically type code such as::
 
   YansWifiChannelHelper wifiChannelHelper = YansWifiChannelHelper::Default ();
   Ptr<WifiChannel> wifiChannel = wifiChannelHelper.Create ();
@@ -174,7 +175,7 @@
 The YansWifiPhyHelper class configures an object factory to create instances of
 a ``YansWifiPhy`` and adds some other objects to it, including possibly a
 supplemental ErrorRateModel and a pointer to a MobilityModel. The user code is
-typically:::
+typically::
 
   YansWifiPhyHelper wifiPhyHelper = YansWifiPhyHelper::Default ();
   wifiPhyHelper.SetChannel (wifiChannel);
@@ -199,7 +200,7 @@
 
 For example the following user code configures a non-QoS MAC that
 will be a non-AP STA in an infrastructure network where the AP has
-SSID ``ns-3-ssid``:::
+SSID ``ns-3-ssid``::
 
     NqosWifiMacHelper wifiMacHelper = NqosWifiMacHelper::Default ();
     Ssid ssid = Ssid ("ns-3-ssid");
@@ -217,7 +218,7 @@
   mechanism should be used) and inactivity timeout.
 
 The following code shows an example use of ``ns3::QosWifiMacHelper`` to 
-create an AP with QoS enabled, aggregation on AC_VO, and Block Ack on AC_BE:::
+create an AP with QoS enabled, aggregation on AC_VO, and Block Ack on AC_BE::
 
   QosWifiMacHelper wifiMacHelper = QosWifiMacHelper::Default ();
   wifiMacHelper.SetType ("ns3::ApWifiMac",
@@ -238,7 +239,7 @@
 
 For example the following user code configures a HT MAC that
 will be a non-AP STA in an infrastructure network where the AP has
-SSID ``ns-3-ssid``:::
+SSID ``ns-3-ssid``::
 
     HtWifiMacHelper wifiMacHelper = HtWifiMacHelper::Default ();
     Ssid ssid = Ssid ("ns-3-ssid");
@@ -252,14 +253,14 @@
 ++++++++++
 
 We're now ready to create WifiNetDevices. First, let's create
-a WifiHelper with default settings:::
+a WifiHelper with default settings::
 
   WifiHelper wifiHelper = WifiHelper::Default ();
 
 What does this do?  It sets the RemoteStationManager to
 ``ns3::ArfWifiManager``.
 Now, let's use the wifiPhyHelper and wifiMacHelper created above to install WifiNetDevices
-on a set of nodes in a NodeContainer "c":::
+on a set of nodes in a NodeContainer "c"::
 
   NetDeviceContainer wifiContainer = WifiHelper::Install (wifiPhyHelper, wifiMacHelper, c);
 
diff -Naur ns-3.18.1/src/wifi/helper/athstats-helper.cc ns-3.19/src/wifi/helper/athstats-helper.cc
--- ns-3.18.1/src/wifi/helper/athstats-helper.cc	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/wifi/helper/athstats-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -105,7 +105,8 @@
 
 
 
-NS_OBJECT_ENSURE_REGISTERED (AthstatsWifiTraceSink);
+NS_OBJECT_ENSURE_REGISTERED (AthstatsWifiTraceSink)
+  ;
 
 TypeId
 AthstatsWifiTraceSink::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/helper/nqos-wifi-mac-helper.h ns-3.19/src/wifi/helper/nqos-wifi-mac-helper.h
--- ns-3.18.1/src/wifi/helper/nqos-wifi-mac-helper.h	2013-11-15 13:50:31.000000000 -0800
+++ ns-3.19/src/wifi/helper/nqos-wifi-mac-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -72,7 +72,7 @@
    * All the attributes specified in this method should exist
    * in the requested mac.
    */
-  void SetType (std::string type,
+  virtual void SetType (std::string type,
                 std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
                 std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
                 std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
@@ -81,6 +81,8 @@
                 std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
                 std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
                 std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
+protected:
+  ObjectFactory m_mac;
 private:
   /**
    * \internal
@@ -89,8 +91,6 @@
    * This method implements the pure virtual method defined in \ref ns3::WifiMacHelper.
    */
   virtual Ptr<WifiMac> Create (void) const;
-
-  ObjectFactory m_mac;
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/wifi/helper/qos-wifi-mac-helper.h ns-3.19/src/wifi/helper/qos-wifi-mac-helper.h
--- ns-3.18.1/src/wifi/helper/qos-wifi-mac-helper.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/helper/qos-wifi-mac-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -77,7 +77,7 @@
    * All the attributes specified in this method should exist
    * in the requested mac.
    */
-  void SetType (std::string type,
+  virtual void SetType (std::string type,
                 std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
                 std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
                 std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
@@ -131,6 +131,8 @@
    * \param timeout number of block of 1024 microseconds.
    */
   void SetBlockAckInactivityTimeoutForAc (enum AcIndex ac, uint16_t timeout);
+protected:
+  ObjectFactory m_mac;
 private:
   /**
    * \internal
@@ -141,8 +143,6 @@
   virtual Ptr<WifiMac> Create (void) const;
   void Setup (Ptr<WifiMac> mac, enum AcIndex ac, std::string dcaAttrName) const;
 
-
-  ObjectFactory m_mac;
   std::map<AcIndex, ObjectFactory> m_aggregators;
   /*
    * Next maps contain, for every access category, the values for
diff -Naur ns-3.18.1/src/wifi/helper/wifi-helper.cc ns-3.19/src/wifi/helper/wifi-helper.cc
--- ns-3.18.1/src/wifi/helper/wifi-helper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/helper/wifi-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -52,6 +52,10 @@
 {
 }
 
+WifiHelper::~WifiHelper ()
+{
+}
+
 WifiHelper::WifiHelper ()
   : m_standard (WIFI_PHY_STANDARD_80211a)
 {
diff -Naur ns-3.18.1/src/wifi/helper/wifi-helper.h ns-3.19/src/wifi/helper/wifi-helper.h
--- ns-3.18.1/src/wifi/helper/wifi-helper.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/helper/wifi-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -88,6 +88,8 @@
 class WifiHelper
 {
 public:
+  virtual ~WifiHelper ();
+
   /**
    * Create a Wifi helper in an empty state: all its parameters
    * must be set before calling ns3::WifiHelper::Install
@@ -140,7 +142,7 @@
    * \param c the set of nodes on which a wifi device must be created
    * \returns a device container which contains all the devices created by this method.
    */
-  NetDeviceContainer Install (const WifiPhyHelper &phy,
+  virtual NetDeviceContainer Install (const WifiPhyHelper &phy,
                               const WifiMacHelper &mac, NodeContainer c) const;
   /**
    * \param phy the PHY helper to create PHY objects
@@ -148,7 +150,7 @@
    * \param node the node on which a wifi device must be created
    * \returns a device container which contains all the devices created by this method.
    */
-  NetDeviceContainer Install (const WifiPhyHelper &phy,
+  virtual NetDeviceContainer Install (const WifiPhyHelper &phy,
                               const WifiMacHelper &mac, Ptr<Node> node) const;
   /**
    * \param phy the PHY helper to create PHY objects
@@ -156,7 +158,7 @@
    * \param nodeName the name of node on which a wifi device must be created
    * \returns a device container which contains all the devices created by this method.
    */
-  NetDeviceContainer Install (const WifiPhyHelper &phy,
+  virtual NetDeviceContainer Install (const WifiPhyHelper &phy,
                               const WifiMacHelper &mac, std::string nodeName) const;
 
   /**
@@ -164,7 +166,7 @@
    *
    * By default, all objects are configured for 802.11a
    */
-  void SetStandard (enum WifiPhyStandard standard);
+  virtual void SetStandard (enum WifiPhyStandard standard);
 
   /**
    * Helper to enable all WifiNetDevice log components with one statement
@@ -187,7 +189,7 @@
   */
   int64_t AssignStreams (NetDeviceContainer c, int64_t stream);
 
-private:
+protected:
   ObjectFactory m_stationManager;
   enum WifiPhyStandard m_standard;
 };
diff -Naur ns-3.18.1/src/wifi/model/aarfcd-wifi-manager.cc ns-3.19/src/wifi/model/aarfcd-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/aarfcd-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/aarfcd-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,6 +34,12 @@
 
 namespace ns3 {
 
+/**
+ * \brief hold per-remote-station state for AARF-CD Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the AARF-CD Wifi manager
+ */
 struct AarfcdWifiRemoteStation : public WifiRemoteStation
 {
   uint32_t m_timer;
@@ -53,7 +59,8 @@
   bool m_haveASuccess;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (AarfcdWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (AarfcdWifiManager)
+  ;
 
 TypeId
 AarfcdWifiManager::GetTypeId (void)
@@ -148,15 +155,7 @@
 {
   NS_LOG_FUNCTION (this << station);
 }
-/**
- * It is important to realize that "recovery" mode starts after failure of
- * the first transmission after a rate increase and ends at the first successful
- * transmission. Specifically, recovery mode transcends retransmissions boundaries.
- * Fundamentally, ARF handles each data transmission independently, whether it
- * is the initial transmission of a packet or the retransmission of a packet.
- * The fundamental reason for this is that there is a backoff between each data
- * transmission, be it an initial transmission or a retransmission.
- */
+
 void
 AarfcdWifiManager::DoReportDataFailed (WifiRemoteStation *st)
 {
diff -Naur ns-3.18.1/src/wifi/model/aarfcd-wifi-manager.h ns-3.19/src/wifi/model/aarfcd-wifi-manager.h
--- ns-3.18.1/src/wifi/model/aarfcd-wifi-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/aarfcd-wifi-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -47,7 +47,19 @@
   virtual WifiRemoteStation * DoCreateStation (void) const;
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode);
+
   virtual void DoReportRtsFailed (WifiRemoteStation *station);
+  /**
+   * It is important to realize that "recovery" mode starts after failure of
+   * the first transmission after a rate increase and ends at the first successful
+   * transmission. Specifically, recovery mode transcends retransmissions boundaries.
+   * Fundamentally, ARF handles each data transmission independently, whether it
+   * is the initial transmission of a packet or the retransmission of a packet.
+   * The fundamental reason for this is that there is a backoff between each data
+   * transmission, be it an initial transmission or a retransmission.
+   *
+   * \param station the station that we failed to send DATA
+   */
   virtual void DoReportDataFailed (WifiRemoteStation *station);
   virtual void DoReportRtsOk (WifiRemoteStation *station,
                               double ctsSnr, WifiMode ctsMode, double rtsSnr);
@@ -61,10 +73,35 @@
                           Ptr<const Packet> packet, bool normally);
   virtual bool IsLowLatency (void) const;
 
+  /**
+   * Check if the use of RTS for the given station can be turned off.
+   *
+   * \param station the station that we are checking
+   */
   void CheckRts (AarfcdWifiRemoteStation *station);
+  /**
+   * Increase the RTS window size of the given station.
+   *
+   * \param station the station to increase RTS window
+   */
   void IncreaseRtsWnd (AarfcdWifiRemoteStation *station);
+  /**
+   * Reset the RTS window of the given station.
+   *
+   * \param station the station to reset RTS window
+   */
   void ResetRtsWnd (AarfcdWifiRemoteStation *station);
+  /**
+   * Turn off RTS for the given station.
+   *
+   * \param station the station to turn RTS off
+   */
   void TurnOffRts (AarfcdWifiRemoteStation *station);
+  /**
+   * Turn on RTS for the given station.
+   *
+   * \param station the station to turn RTS on
+   */
   void TurnOnRts (AarfcdWifiRemoteStation *station);
 
   // aarf fields below
diff -Naur ns-3.18.1/src/wifi/model/aarf-wifi-manager.cc ns-3.19/src/wifi/model/aarf-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/aarf-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/aarf-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,6 +31,12 @@
 
 namespace ns3 {
 
+/**
+ * \brief hold per-remote-station state for AARF Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the AARF Wifi manager
+ */
 struct AarfWifiRemoteStation : public WifiRemoteStation
 {
   uint32_t m_timer;
@@ -46,7 +52,8 @@
 };
 
 
-NS_OBJECT_ENSURE_REGISTERED (AarfWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (AarfWifiManager)
+  ;
 
 TypeId
 AarfWifiManager::GetTypeId (void)
@@ -122,6 +129,8 @@
  * is the initial transmission of a packet or the retransmission of a packet.
  * The fundamental reason for this is that there is a backoff between each data
  * transmission, be it an initial transmission or a retransmission.
+ *
+ * \param st the station that we failed to send DATA
  */
 void
 AarfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
diff -Naur ns-3.18.1/src/wifi/model/adhoc-wifi-mac.cc ns-3.19/src/wifi/model/adhoc-wifi-mac.cc
--- ns-3.18.1/src/wifi/model/adhoc-wifi-mac.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/adhoc-wifi-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -40,7 +40,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (AdhocWifiMac);
+NS_OBJECT_ENSURE_REGISTERED (AdhocWifiMac)
+  ;
 
 TypeId
 AdhocWifiMac::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/amrr-wifi-manager.cc ns-3.19/src/wifi/model/amrr-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/amrr-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/amrr-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,6 +30,12 @@
 
 namespace ns3 {
 
+/**
+ * \brief hold per-remote-station state for AMRR Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the AMRR Wifi manager
+ */
 struct AmrrWifiRemoteStation : public WifiRemoteStation
 {
   Time m_nextModeUpdate;
@@ -44,7 +50,8 @@
 };
 
 
-NS_OBJECT_ENSURE_REGISTERED (AmrrWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (AmrrWifiManager)
+  ;
 
 TypeId
 AmrrWifiManager::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/amrr-wifi-manager.h ns-3.19/src/wifi/model/amrr-wifi-manager.h
--- ns-3.18.1/src/wifi/model/amrr-wifi-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/amrr-wifi-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -60,15 +60,78 @@
   virtual WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
   virtual bool IsLowLatency (void) const;
 
-  void UpdateRetry (AmrrWifiRemoteStation *station);
+  //void UpdateRetry (AmrrWifiRemoteStation *station);
+  /**
+   * Update the mode used to send to the given station.
+   *
+   * \param station
+   */
   void UpdateMode (AmrrWifiRemoteStation *station);
+  /**
+   * Reset transmission statistics of the given station.
+   *
+   * \param station
+   */
   void ResetCnt (AmrrWifiRemoteStation *station);
+  /**
+   * Increase the transmission rate to the given station.
+   *
+   * \param station
+   */
   void IncreaseRate (AmrrWifiRemoteStation *station);
+  /**
+   * Decrease the transmission rate to the given station.
+   *
+   * \param station
+   */
   void DecreaseRate (AmrrWifiRemoteStation *station);
+  /**
+   * Check if the current rate for the given station is the
+   * minimum rate.
+   *
+   * \param station
+   * \return true if the current rate is the minimum rate,
+   *         false otherwise
+   */
   bool IsMinRate (AmrrWifiRemoteStation *station) const;
+  /**
+   * Check if the current rate for the given station is the
+   * maximum rate.
+   *
+   * \param station
+   * \return true if the current rate is the maximum rate,
+   *         false otherwise
+   */
   bool IsMaxRate (AmrrWifiRemoteStation *station) const;
+  /**
+   * Check if the number of retransmission and transmission error
+   * is less than the number of successful transmission (times ratio).
+   *
+   * \param station
+   * \return true if the number of retransmission and transmission error
+   *              is less than the number of successful transmission
+   *              (times ratio), false otherwise
+   */
   bool IsSuccess (AmrrWifiRemoteStation *station) const;
+  /**
+   * Check if the number of retransmission and transmission error
+   * is greater than the number of successful transmission (times ratio).
+   *
+   * \param station
+   * \return true if the number of retransmission and transmission error
+   *              is less than the number of successful transmission
+   *              (times ratio), false otherwise
+   */
   bool IsFailure (AmrrWifiRemoteStation *station) const;
+  /**
+   * Check if the number of retransmission, transmission error,
+   * and successful transmission are greater than 10.
+   *
+   * \param station
+   * \return true if the number of retransmission, transmission error,
+   *         and successful transmission are greater than 10,
+   *         false otherwise
+   */
   bool IsEnough (AmrrWifiRemoteStation *station) const;
 
   Time m_updatePeriod;
diff -Naur ns-3.18.1/src/wifi/model/amsdu-subframe-header.cc ns-3.19/src/wifi/model/amsdu-subframe-header.cc
--- ns-3.18.1/src/wifi/model/amsdu-subframe-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/amsdu-subframe-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (AmsduSubframeHeader);
+NS_OBJECT_ENSURE_REGISTERED (AmsduSubframeHeader)
+  ;
 
 TypeId
 AmsduSubframeHeader::GetTypeId ()
diff -Naur ns-3.18.1/src/wifi/model/ap-wifi-mac.cc ns-3.19/src/wifi/model/ap-wifi-mac.cc
--- ns-3.18.1/src/wifi/model/ap-wifi-mac.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ap-wifi-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -42,7 +42,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ApWifiMac);
+NS_OBJECT_ENSURE_REGISTERED (ApWifiMac)
+  ;
 
 TypeId
 ApWifiMac::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/ap-wifi-mac.h ns-3.19/src/wifi/model/ap-wifi-mac.h
--- ns-3.18.1/src/wifi/model/ap-wifi-mac.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ap-wifi-mac.h	2013-12-20 09:44:50.000000000 -0800
@@ -88,7 +88,7 @@
    */
   void SetBeaconInterval (Time interval);
   /**
-   * \returns the interval between two beacon transmissions.
+   * \return the interval between two beacon transmissions.
    */
   Time GetBeaconInterval (void) const;
   /**
@@ -108,7 +108,23 @@
 
 private:
   virtual void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
+  /**
+   * The packet we sent was successfully received by the receiver
+   * (i.e. we received an ACK from the receiver).  If the packet
+   * was an association response to the receiver, we record that
+   * the receiver is now associated with us.
+   * 
+   * \param hdr the header of the packet that we successfully sent
+   */
   virtual void TxOk (const WifiMacHeader &hdr);
+  /**
+   * The packet we sent was successfully received by the receiver
+   * (i.e. we did not receive an ACK from the receiver).  If the packet
+   * was an association response to the receiver, we record that
+   * the receiver is not associated with us yet.
+   *
+   * \param hdr the header of the packet that we failed to sent
+   */
   virtual void TxFailed (const WifiMacHeader &hdr);
 
   /**
@@ -123,24 +139,77 @@
   virtual void DeaggregateAmsduAndForward (Ptr<Packet> aggregatedPacket,
                                            const WifiMacHeader *hdr);
 
+  /**
+   * Forward the packet down to DCF/EDCAF (enqueue the packet). This method
+   * is a wrapper for ForwardDown with traffic id.
+   *
+   * \param packet the packet we are forwarding to DCF/EDCAF
+   * \param from the address to be used for Address 3 field in the header
+   * \param to the address to be used for Address 1 field in the header
+   */
   void ForwardDown (Ptr<const Packet> packet, Mac48Address from, Mac48Address to);
+  /**
+   * Forward the packet down to DCF/EDCAF (enqueue the packet).
+   *
+   * \param packet the packet we are forwarding to DCF/EDCAF
+   * \param from the address to be used for Address 3 field in the header
+   * \param to the address to be used for Address 1 field in the header
+   * \param tid the traffic id for the packet
+   */
   void ForwardDown (Ptr<const Packet> packet, Mac48Address from, Mac48Address to, uint8_t tid);
+  /**
+   * Forward a probe response packet to the DCF. The standard is not clear on the correct
+   * queue for management frames if QoS is supported. We always use the DCF.
+   *
+   * \param to the address of the STA we are sending a probe response to
+   */
   void SendProbeResp (Mac48Address to);
+  /**
+   * Forward an association response packet to the DCF. The standard is not clear on the correct
+   * queue for management frames if QoS is supported. We always use the DCF.
+   *
+   * \param to the address of the STA we are sending an association response to
+   * \param success indicates whether the association was successful or not
+   */
   void SendAssocResp (Mac48Address to, bool success);
+  /**
+   * Forward a beacon packet to the beacon special DCF.
+   */
   void SendOneBeacon (void);
+  /**
+   * Return the HT capability of the current AP.
+   * 
+   * \return the HT capability that we support
+   */
   HtCapabilities GetHtCapabilities (void) const;
+  /**
+   * Return an instance of SupportedRates that contains all rates that we support
+   * including HT rates.
+   *
+   * \return SupportedRates all rates that we support
+   */
   SupportedRates GetSupportedRates (void) const;
+  /**
+   * Enable or disable beacon generation of the AP.
+   *
+   * \param enable enable or disable beacon generation
+   */
   void SetBeaconGeneration (bool enable);
+  /**
+   * Return whether the AP is generating beacons.
+   *
+   * \return true if beacons are periodically generated, false otherwise
+   */
   bool GetBeaconGeneration (void) const;
   virtual void DoDispose (void);
   virtual void DoInitialize (void);
 
-  Ptr<DcaTxop> m_beaconDca;
-  Time m_beaconInterval;
-  bool m_enableBeaconGeneration;
-  EventId m_beaconEvent;
-  Ptr<UniformRandomVariable> m_beaconJitter;
-  bool m_enableBeaconJitter;
+  Ptr<DcaTxop> m_beaconDca; //!< Dedicated DcaTxop for beacons
+  Time m_beaconInterval; //!< Interval between beacons
+  bool m_enableBeaconGeneration; //!< Flag if beacons are being generated
+  EventId m_beaconEvent; //!< Event to generate one beacon
+  Ptr<UniformRandomVariable> m_beaconJitter; //!< UniformRandomVariable used to randomize the time of the first beacon
+  bool m_enableBeaconJitter; //!< Flag if the first beacon should be generated at random time
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/wifi/model/arf-wifi-manager.cc ns-3.19/src/wifi/model/arf-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/arf-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/arf-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,6 +30,12 @@
 
 namespace ns3 {
 
+/**
+ * \brief hold per-remote-station state for ARF Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the ARF Wifi manager
+ */
 struct ArfWifiRemoteStation : public WifiRemoteStation
 {
   uint32_t m_timer;
@@ -44,7 +50,8 @@
   uint32_t m_rate;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (ArfWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (ArfWifiManager)
+  ;
 
 TypeId
 ArfWifiManager::GetTypeId (void)
@@ -104,6 +111,8 @@
  * is the initial transmission of a packet or the retransmission of a packet.
  * The fundamental reason for this is that there is a backoff between each data
  * transmission, be it an initial transmission or a retransmission.
+ *
+ * \param st the station that we failed to send DATA
  */
 void
 ArfWifiManager::DoReportDataFailed (WifiRemoteStation *st)
diff -Naur ns-3.18.1/src/wifi/model/block-ack-agreement.h ns-3.19/src/wifi/model/block-ack-agreement.h
--- ns-3.18.1/src/wifi/model/block-ack-agreement.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/block-ack-agreement.h	2013-12-20 09:44:50.000000000 -0800
@@ -33,22 +33,96 @@
   friend class MacLow;
 public:
   BlockAckAgreement ();
+  /**
+   * Constructor for BlockAckAgreement with given peer and TID.
+   *
+   * \param peer
+   * \param tid
+   */
   BlockAckAgreement (Mac48Address peer, uint8_t tid);
   ~BlockAckAgreement ();
+  /**
+   * Set buffer size.
+   *
+   * \param bufferSize
+   */
   void SetBufferSize (uint16_t bufferSize);
+  /**
+   * Set timeout.
+   *
+   * \param timeout
+   */
   void SetTimeout (uint16_t timeout);
+  /**
+   * Set starting sequence number.
+   *
+   * \param seq the starting sequence number
+   */
   void SetStartingSequence (uint16_t seq);
+  /**
+   * Set Block ACK policy to immediate ACK.
+   */
   void SetImmediateBlockAck (void);
+  /**
+   * Set Block ACK policy to delayed ACK.
+   */
   void SetDelayedBlockAck (void);
+  /**
+   * Enable or disable A-MSDU support.
+   *
+   * \param supported enable or disable A-MSDU support
+   */
   void SetAmsduSupport (bool supported);
 
+  /**
+   * Return the Traffic ID (TID).
+   *
+   * \return TID
+   */
   uint8_t GetTid (void) const;
+  /**
+   * Return the peer address.
+   *
+   * \return Mac48Address
+   */
   Mac48Address GetPeer (void) const;
+  /**
+   * Return the buffer size.
+   *
+   * \return buffer size
+   */
   uint16_t GetBufferSize (void) const;
+  /**
+   * Return the timeout.
+   *
+   * \return timeout
+   */
   uint16_t GetTimeout (void) const;
+  /**
+   * Return the starting squence number.
+   *
+   * \return starting sequence number
+   */
   uint16_t GetStartingSequence (void) const;
+  /**
+   * Return the starting squence control
+   *
+   * \return starting sequence control
+   */
   uint16_t GetStartingSequenceControl (void) const;
+  /**
+   * Check whether the current ACK policy is immediate block ACK.
+   *
+   * \return true if the current ACK policy is immediate block ACK,
+   *         false otherwise
+   */
   bool IsImmediateBlockAck (void) const;
+  /**
+   * Check whether A-MSDU is supported
+   *
+   * \return true if A-MSDU is supported,
+   *         false otherwise
+   */
   bool IsAmsduSupported (void) const;
 
 protected:
diff -Naur ns-3.18.1/src/wifi/model/block-ack-manager.h ns-3.19/src/wifi/model/block-ack-manager.h
--- ns-3.18.1/src/wifi/model/block-ack-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/block-ack-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -47,6 +47,15 @@
 struct Bar
 {
   Bar ();
+  /**
+   * Construct Block ACK request for a given packet,
+   * receiver address, Traffic ID, and ACK policy.
+   *
+   * \param packet
+   * \param recipient
+   * \param tid
+   * \param immediate
+   */
   Bar (Ptr<const Packet> packet,
        Mac48Address recipient,
        uint8_t tid,
@@ -73,6 +82,7 @@
   /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
+   * \return true  if a block ack agreement exists, false otherwise
    *
    * Checks if a block ack agreement exists with station addressed by
    * <i>recipient</i> for tid <i>tid</i>.
@@ -82,7 +92,8 @@
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
    * \param state The state for block ack agreement
-
+   * \return true if a block ack agreement exists, false otherwise
+   *
    * Checks if a block ack agreement with a state equals to <i>state</i> exists with
    * station addressed by <i>recipient</i> for tid <i>tid</i>.
    */
@@ -122,6 +133,7 @@
   void StorePacket (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp);
   /**
    * \param hdr 802.11 header of returned packet (if exists).
+   * \return the packet
    *
    * This methods returns a packet (if exists) indicated as not received in
    * corresponding block ack bitmap.
@@ -131,6 +143,9 @@
   /**
    * Returns true if there are packets that need of retransmission or at least a
    * BAR is scheduled. Returns false otherwise.
+   *
+   * \return true if there are packets that need of retransmission or at least a
+   *         BAR is scheduled, false otherwise
    */
   bool HasPackets (void) const;
   /**
@@ -146,6 +161,7 @@
   /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
+   * \return the number of packets buffered for a specified agreement
    *
    * Returns number of packets buffered for a specified agreement. This methods doesn't return
    * number of buffered MPDUs but number of buffered MSDUs.
@@ -154,6 +170,7 @@
   /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
+   * \return the number of packets for a specific agreement that need retransmission
    *
    * Returns number of packets for a specific agreement that need retransmission.
    * This method doesn't return number of MPDUs that need retransmission but number of MSDUs.
@@ -216,12 +233,16 @@
   /**
    * \param sequenceNumber Sequence number of the packet which fragment is
    * part of.
+   * \return true if another fragment with the given sequence number is scheduled
+   * for retransmission.
    *
    * Returns true if another fragment with sequence number <i>sequenceNumber</i> is scheduled
    * for retransmission.
    */
   bool HasOtherFragments (uint16_t sequenceNumber) const;
   /**
+   * \return the size of the next packet that needs retransmission
+   *
    * Returns size of the next packet that needs retransmission.
    */
   uint32_t GetNextPacketSize (void) const;
@@ -238,6 +259,12 @@
   void SetBlockDestinationCallback (Callback<void, Mac48Address, uint8_t> callback);
   void SetUnblockDestinationCallback (Callback<void, Mac48Address, uint8_t> callback);
   /**
+   * \param recipient
+   * \param tid
+   * \param startingSeq
+   * \return true if there are packets in the queue that could be sent under block ACK,
+   *         false otherwise
+   *
    * Checks if there are in the queue other packets that could be send under block ack.
    * If yes adds these packets in current block ack exchange.
    * However, number of packets exchanged in the current block ack, will not exceed
@@ -245,6 +272,10 @@
    */
   bool SwitchToBlockAckIfNeeded (Mac48Address recipient, uint8_t tid, uint16_t startingSeq);
   /**
+   * \param recipient
+   * \param tid
+   * \return the sequence number of the next retry packet for a specific agreement
+   *
    * Returns the sequence number of the next retry packet for a specific agreement.
    * If there are no packets that need retransmission for the specified agreement or
    * the agreement doesn't exist the function returns 4096;
@@ -252,6 +283,10 @@
   uint16_t GetSeqNumOfNextRetryPacket (Mac48Address recipient, uint8_t tid) const;
 private:
   /**
+   * \param recipient
+   * \param tid
+   * \return a packet
+   *
    * Checks if all packets, for which a block ack agreement was established or refreshed,
    * have been transmitted. If yes, adds a pair in m_bAckReqs to indicate that
    * at next channel access a block ack request (for established agreement
@@ -265,17 +300,39 @@
   void InactivityTimeout (Mac48Address, uint8_t);
 
   struct Item;
+  /**
+   * typedef for a list of Item struct.
+   */
   typedef std::list<Item> PacketQueue;
+  /**
+   * typedef for an iterator for PacketQueue.
+   */
   typedef std::list<Item>::iterator PacketQueueI;
+  /**
+   * typedef for a const iterator for PacketQueue.
+   */
   typedef std::list<Item>::const_iterator PacketQueueCI;
 
+  /**
+   * typedef for a map between MAC address and block ACK agreement.
+   */
   typedef std::map<std::pair<Mac48Address, uint8_t>,
                    std::pair<OriginatorBlockAckAgreement, PacketQueue> > Agreements;
+  /**
+   * typedef for an iterator for Agreements.
+   */
   typedef std::map<std::pair<Mac48Address, uint8_t>,
                    std::pair<OriginatorBlockAckAgreement, PacketQueue> >::iterator AgreementsI;
+  /**
+   * typedef for a const iterator for Agreements.
+   */
   typedef std::map<std::pair<Mac48Address, uint8_t>,
                    std::pair<OriginatorBlockAckAgreement, PacketQueue> >::const_iterator AgreementsCI;
 
+  /**
+   * A struct for packet, Wifi header, and timestamp.
+   * Used in queue by block ACK manager.
+   */
   struct Item
   {
     Item ();
diff -Naur ns-3.18.1/src/wifi/model/capability-information.h ns-3.19/src/wifi/model/capability-information.h
--- ns-3.18.1/src/wifi/model/capability-information.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/capability-information.h	2013-12-20 09:44:50.000000000 -0800
@@ -28,25 +28,84 @@
 /**
  * \ingroup wifi
  *
- *
+ * Capability information
  */
 class CapabilityInformation
 {
 public:
   CapabilityInformation ();
 
+  /**
+   * Set the Extended Service Set (ESS) bit
+   * in the capability information field.
+   */
   void SetEss (void);
+  /**
+   * Set the Independent BSS (IBSS) bit
+   * in the capability information field.
+   */
   void SetIbss (void);
 
+  /**
+   * Check if the Extended Service Set (ESS) bit
+   * in the capability information field is set to 1.
+   *
+   * \return ESS bit in the capability information
+   *         field is set to 1
+   */
   bool IsEss (void) const;
+  /**
+   * Check if the Independent BSS (IBSS) bit
+   * in the capability information field is set to 1.
+   *
+   * \return IBSS bit in the capability information
+   *         field is set to 1
+   */
   bool IsIbss (void) const;
 
+  /**
+   * Return the serialized size of capability 
+   * information.
+   *
+   * \return the serialized size
+   */
   uint32_t GetSerializedSize (void) const;
+  /**
+   * Serialize capability information to the given buffer.
+   *
+   * \param start an iterator to a buffer
+   * \return an iterator to a buffer after capability information
+   *         was serialized
+   */
   Buffer::Iterator Serialize (Buffer::Iterator start) const;
+  /**
+   * Deserialize capability information from the given buffer.
+   *
+   * \param start an iterator to a buffer
+   * \return an iterator to a buffer after capability information
+   *         was deserialized
+   */
   Buffer::Iterator Deserialize (Buffer::Iterator start);
 private:
+  /**
+   * Check if bit n is set to 1.
+   *
+   * \param n the bit position
+   * \return true if bit n is set to 1,
+   *         false otherwise
+   */
   bool Is (uint8_t n) const;
+  /**
+   * Set bit n to 1.
+   *
+   * \param n the bit position
+   */
   void Set (uint8_t n);
+  /**
+   * Set bit n to 0.
+   *
+   * \param n the bit position
+   */
   void Clear (uint8_t n);
   uint16_t m_capability;
 };
diff -Naur ns-3.18.1/src/wifi/model/cara-wifi-manager.cc ns-3.19/src/wifi/model/cara-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/cara-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/cara-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,12 @@
 
 namespace ns3 {
 
+/**
+ * \brief hold per-remote-station state for CARA Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the CARA Wifi manager
+ */
 struct CaraWifiRemoteStation : public WifiRemoteStation
 {
   uint32_t m_timer;
@@ -40,7 +46,8 @@
   uint32_t m_rate;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (CaraWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (CaraWifiManager)
+  ;
 
 TypeId
 CaraWifiManager::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/constant-rate-wifi-manager.cc ns-3.19/src/wifi/model/constant-rate-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/constant-rate-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/constant-rate-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ConstantRateWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (ConstantRateWifiManager)
+  ;
 
 TypeId
 ConstantRateWifiManager::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/constant-rate-wifi-manager.h ns-3.19/src/wifi/model/constant-rate-wifi-manager.h
--- ns-3.18.1/src/wifi/model/constant-rate-wifi-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/constant-rate-wifi-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -57,8 +57,8 @@
   virtual WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
   virtual bool IsLowLatency (void) const;
 
-  WifiMode m_dataMode;
-  WifiMode m_ctlMode;
+  WifiMode m_dataMode; //!< Wifi mode for unicast DATA frames
+  WifiMode m_ctlMode; //!< Wifi mode for request control frames
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/wifi/model/ctrl-headers.cc ns-3.19/src/wifi/model/ctrl-headers.cc
--- ns-3.18.1/src/wifi/model/ctrl-headers.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ctrl-headers.cc	2013-12-20 09:44:50.000000000 -0800
@@ -30,7 +30,8 @@
  *       Block ack request
  ***********************************/
 
-NS_OBJECT_ENSURE_REGISTERED (CtrlBAckRequestHeader);
+NS_OBJECT_ENSURE_REGISTERED (CtrlBAckRequestHeader)
+  ;
 
 CtrlBAckRequestHeader::CtrlBAckRequestHeader ()
   : m_barAckPolicy (false),
@@ -278,7 +279,8 @@
  *       Block ack response
  ***********************************/
 
-NS_OBJECT_ENSURE_REGISTERED (CtrlBAckResponseHeader);
+NS_OBJECT_ENSURE_REGISTERED (CtrlBAckResponseHeader)
+  ;
 
 CtrlBAckResponseHeader::CtrlBAckResponseHeader ()
   : m_baAckPolicy (false),
diff -Naur ns-3.18.1/src/wifi/model/ctrl-headers.h ns-3.19/src/wifi/model/ctrl-headers.h
--- ns-3.18.1/src/wifi/model/ctrl-headers.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ctrl-headers.h	2013-12-20 09:44:50.000000000 -0800
@@ -24,6 +24,9 @@
 
 namespace ns3 {
 
+/**
+ * Enumeration for different block ACK policies.
+ */
 enum BlockAckType
 {
   BASIC_BLOCK_ACK,
@@ -55,23 +58,101 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
+  /**
+   * Enable or disable HT immediate ACK.
+   *
+   * \param immediateAck enable or disable HT immediate ACK
+   */
   void SetHtImmediateAck (bool immediateAck);
+  /**
+   * Set the block ACK type.
+   *
+   * \param type
+   */
   void SetType (enum BlockAckType type);
+  /**
+   * Set Traffic ID (TID).
+   *
+   * \param tid
+   */
   void SetTidInfo (uint8_t tid);
+  /**
+   * Set the starting sequence number from the given 
+   * raw sequence control field.
+   *
+   * \param seq the raw sequence control 
+   */
   void SetStartingSequence (uint16_t seq);
 
+  /**
+   * Check if the current ACK policy is immediate.
+   *
+   * \return true if the current ACK policy is immediate,
+   *         false otherwise
+   */
   bool MustSendHtImmediateAck (void) const;
+  /**
+   * Return the Traffic ID (TID).
+   *
+   * \return TID
+   */
   uint8_t GetTidInfo (void) const;
+  /**
+   * Return the starting sequence number.
+   *
+   * \return the starting sequence number
+   */
   uint16_t GetStartingSequence (void) const;
+  /**
+   * Check if the current ACK policy is basic
+   * (i.e. not multiple TID and not compressed ACK).
+   *
+   * \return true if the current ACK policy is basic,
+   *         false otherwise
+   */
   bool IsBasic (void) const;
+  /**
+   * Check if the current ACK policy is compressed ACK
+   * and not multiple TID.
+   *
+   * \return true if the current ACK policy is compressed ACK,
+   *         false otherwise
+   */
   bool IsCompressed (void) const;
+  /**
+   * Check if the current ACK policy has multiple TID.
+   *
+   * \return true if the current ACK policy has multiple TID,
+   *         false otherwise
+   */
   bool IsMultiTid (void) const;
 
+  /**
+   * Return the starting sequence control.
+   *
+   * \return the starting sequence control
+   */
   uint16_t GetStartingSequenceControl (void) const;
 
 private:
+  /**
+   * Set the starting sequence control with the given
+   * sequence control value
+   *
+   * \param seqControl
+   */
   void SetStartingSequenceControl (uint16_t seqControl);
+  /**
+   * Return the Block ACK control.
+   *
+   * \return the Block ACK control
+   */
   uint16_t GetBarControl (void) const;
+  /**
+   * Set the Block ACK control.
+   *
+   * \param bar
+   */
   void SetBarControl (uint16_t bar);
 
   /**
@@ -111,35 +192,169 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
-  void SetHtImmediateAck (bool immeadiateAck);
+  /**
+   * Enable or disable HT immediate ACK.
+   *
+   * \param immediateAck enable or disable HT immediate ACK
+   */
+  void SetHtImmediateAck (bool immediateAck);
+  /**
+   * Set the block ACK type.
+   *
+   * \param type
+   */
   void SetType (enum BlockAckType type);
+  /**
+   * Set Traffic ID (TID).
+   *
+   * \param tid
+   */
   void SetTidInfo (uint8_t tid);
+  /**
+   * Set the starting sequence number from the given 
+   * raw sequence control field.
+   *
+   * \param seq the raw sequence control 
+   */
   void SetStartingSequence (uint16_t seq);
 
+  /**
+   * Check if the current ACK policy is immediate.
+   *
+   * \return true if the current ACK policy is immediate,
+   *         false otherwise
+   */
   bool MustSendHtImmediateAck (void) const;
+  /**
+   * Return the Traffic ID (TID).
+   *
+   * \return TID
+   */
   uint8_t GetTidInfo (void) const;
+  /**
+   * Return the starting sequence number.
+   *
+   * \return the starting sequence number
+   */
   uint16_t GetStartingSequence (void) const;
+  /**
+   * Check if the current ACK policy is basic
+   * (i.e. not multiple TID and not compressed ACK).
+   *
+   * \return true if the current ACK policy is basic,
+   *         false otherwise
+   */
   bool IsBasic (void) const;
+  /**
+   * Check if the current ACK policy is compressed ACK
+   * and not multiple TID.
+   *
+   * \return true if the current ACK policy is compressed ACK,
+   *         false otherwise
+   */
   bool IsCompressed (void) const;
+  /**
+   * Check if the current ACK policy has multiple TID.
+   *
+   * \return true if the current ACK policy has multiple TID,
+   *         false otherwise
+   */
   bool IsMultiTid (void) const;
 
+  /**
+   * Set the bitmap that the packet with the given sequence
+   * number was received.
+   *
+   * \param seq
+   */
   void SetReceivedPacket (uint16_t seq);
+  /**
+   * Set the bitmap that the packet with the given sequence
+   * number and fragment number was received.
+   *
+   * \param seq
+   * \param frag
+   */
   void SetReceivedFragment (uint16_t seq, uint8_t frag);
+  /**
+   * Check if the packet with the given sequence number
+   * was ACKed in this Block ACK response.
+   *
+   * \param seq
+   * \return true if the packet with the given sequence number
+   *         was ACKed in this Block ACK response, false otherwise
+   */
   bool IsPacketReceived (uint16_t seq) const;
+  /**
+   * Check if the packet with the given sequence number
+   * and fragment number was ACKed in this Block ACK response.
+   *
+   * \param seq
+   * \param frag
+   * \return true if the packet with the given sequence number
+   *         and sequence number was ACKed in this Block ACK response,
+   *         false otherwise
+   */
   bool IsFragmentReceived (uint16_t seq, uint8_t frag) const;
 
+  /**
+   * Return the starting sequence control.
+   *
+   * \return the starting sequence control
+   */
   uint16_t GetStartingSequenceControl (void) const;
+  /**
+   * Set the starting sequence control with the given
+   * sequence control value
+   *
+   * \param seqControl
+   */
   void SetStartingSequenceControl (uint16_t seqControl);
+  /**
+   * Return the bitmap from the block ACK response header.
+   *
+   * \return the bitmap from the block ACK response header
+   */
   const uint16_t* GetBitmap (void) const;
+  /**
+   * Return the compressed bitmap from the block ACK response header.
+   *
+   * \return the compressed bitmap from the block ACK response header
+   */
   uint64_t GetCompressedBitmap (void) const;
 
+  /**
+   * Reset the bitmap to 0.
+   */
   void ResetBitmap (void);
 
 private:
+  /**
+   * Return the block ACK control.
+   *
+   * \return the block ACK control
+   */
   uint16_t GetBaControl (void) const;
+  /**
+   * Set the block ACK control.
+   *
+   * \param bar
+   */
   void SetBaControl (uint16_t bar);
 
+  /**
+   * Serialize bitmap to the given buffer.
+   *
+   * \param start
+   * \return Buffer::Iterator to the next available buffer
+   */
   Buffer::Iterator SerializeBitmap (Buffer::Iterator start) const;
+  /**
+   * Deserialize bitmap from the given buffer.
+   *
+   * \param start
+   * \return Buffer::Iterator to the next available buffer
+   */
   Buffer::Iterator DeserializeBitmap (Buffer::Iterator start);
 
   /**
diff -Naur ns-3.18.1/src/wifi/model/dca-txop.cc ns-3.19/src/wifi/model/dca-txop.cc
--- ns-3.18.1/src/wifi/model/dca-txop.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/dca-txop.cc	2013-12-20 09:44:50.000000000 -0800
@@ -69,9 +69,17 @@
   DcaTxop *m_txop;
 };
 
+/**
+ * Listener for MacLow events. Forwards to DcaTxop.
+ */
 class DcaTxop::TransmissionListener : public MacLowTransmissionListener
 {
 public:
+  /**
+   * Create a TransmissionListener for the given DcaTxop.
+   *
+   * \param txop
+   */
   TransmissionListener (DcaTxop * txop)
     : MacLowTransmissionListener (),
       m_txop (txop) {
@@ -112,7 +120,8 @@
   DcaTxop *m_txop;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (DcaTxop);
+NS_OBJECT_ENSURE_REGISTERED (DcaTxop)
+  ;
 
 TypeId
 DcaTxop::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/dca-txop.h ns-3.19/src/wifi/model/dca-txop.h
--- ns-3.18.1/src/wifi/model/dca-txop.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/dca-txop.h	2013-12-20 09:44:50.000000000 -0800
@@ -69,14 +69,37 @@
 public:
   static TypeId GetTypeId (void);
 
+  /**
+   * typedef for a callback to invoke when a
+   * packet transmission was completed successfully.
+   */
   typedef Callback <void, const WifiMacHeader&> TxOk;
+  /**
+   * typedef for a callback to invoke when a
+   * packet transmission was failed.
+   */
   typedef Callback <void, const WifiMacHeader&> TxFailed;
 
   DcaTxop ();
   ~DcaTxop ();
 
+  /**
+   * Set MacLow associated with this DcaTxop.
+   *
+   * \param low MacLow
+   */
   void SetLow (Ptr<MacLow> low);
+  /**
+   * Set DcfManager this DcaTxop is associated to.
+   *
+   * \param manager DcfManager
+   */
   void SetManager (DcfManager *manager);
+  /**
+   * Set WifiRemoteStationsManager this DcaTxop is associated to.
+   *
+   * \param remoteManager WifiRemoteStationManager
+   */
   void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> remoteManager);
 
   /**
@@ -90,6 +113,11 @@
    */
   void SetTxFailedCallback (TxFailed callback);
 
+  /**
+   * Return the packet queue associated with this DcaTxop.
+   *
+   * \return WifiMacQueue
+   */
   Ptr<WifiMacQueue > GetQueue () const;
   virtual void SetMinCw (uint32_t minCw);
   virtual void SetMaxCw (uint32_t maxCw);
@@ -129,37 +157,149 @@
   DcaTxop (const DcaTxop &o);
 
   // Inherited from ns3::Object
+  /**
+   * Return the MacLow associated with this DcaTxop.
+   *
+   * \return MacLow
+   */
   Ptr<MacLow> Low (void);
   void DoInitialize ();
   /* dcf notifications forwarded here */
+  /**
+   * Check if the DCF requires access.
+   *
+   * \return true if the DCF requires access,
+   *         false otherwise
+   */
   bool NeedsAccess (void) const;
+  /**
+   * Notify the DCF that access has been granted.
+   */
   void NotifyAccessGranted (void);
+  /**
+   * Notify the DCF that internal collision has occurred.
+   */
   void NotifyInternalCollision (void);
+  /**
+   * Notify the DCF that collision has occurred.
+   */
   void NotifyCollision (void);
   /**
-  * When a channel switching occurs, enqueued packets are removed.
-  */
+   * When a channel switching occurs, enqueued packets are removed.
+   */
   void NotifyChannelSwitching (void);
-  /* event handlers */
+
+  /* Event handlers */
+  /**
+   * Event handler when a CTS is received.
+   *
+   * \param snr
+   * \param txMode
+   */
   void GotCts (double snr, WifiMode txMode);
+  /**
+   * Event handler when a CTS timeout has occurred.
+   */
   void MissedCts (void);
+  /**
+   * Event handler when an ACK is received.
+   *
+   * \param snr
+   * \param txMode
+   */
   void GotAck (double snr, WifiMode txMode);
+  /**
+   * Event handler when an ACK is received.
+   */
   void MissedAck (void);
+  /**
+   * Start transmission for the next fragment.
+   * This is called for fragment only.
+   */
   void StartNext (void);
+  /**
+   * Cancel the transmission.
+   */
   void Cancel (void);
+  /**
+   * Event handler when a transmission that
+   * does not require an ACK has completed.
+   */
   void EndTxNoAck (void);
 
+  /**
+   * Restart access request if needed.
+   */
   void RestartAccessIfNeeded (void);
+  /**
+   * Request access from DCF manager if needed.
+   */
   void StartAccessIfNeeded (void);
+  /**
+   * Check if the current packet should be sent with a RTS protection.
+   *
+   * \param packet
+   * \param header
+   * \return true if RTS protection should be used, false otherwise
+   */
   bool NeedRts (Ptr<const Packet> packet, const WifiMacHeader *header);
+  /**
+   * Check if RTS should be re-transmitted if CTS was missed.
+   *
+   * \return true if RTS should be re-transmitted, false otherwise
+   */
   bool NeedRtsRetransmission (void);
+  /**
+   * Check if DATA should be re-transmitted if ACK was missed.
+   *
+   * \return true if DATA should be re-transmitted, false otherwise
+   */
   bool NeedDataRetransmission (void);
+  /**
+   * Check if the current packet should be fragmented.
+   *
+   * \return true if the current packet should be fragmented,
+   *         false otherwise
+   */
   bool NeedFragmentation (void);
+  /**
+   * Calculate the size of the next fragment.
+   *
+   * \return the size of the next fragment
+   */
   uint32_t GetNextFragmentSize (void);
+  /**
+   * Calculate the size of the current fragment.
+   *
+   * \return the size of the current fragment
+   */
   uint32_t GetFragmentSize (void);
+  /**
+   * Calculate the offset for the current fragment.
+   *
+   * \return the offset for the current fragment
+   */
   uint32_t GetFragmentOffset (void);
+  /**
+   * Check if the curren fragment is the last fragment.
+   *
+   * \return true if the curren fragment is the last fragment,
+   *         false otherwise
+   */
   bool IsLastFragment (void);
+  /**
+   * Continue to the next fragment. This method simply
+   * increments the internal variable that keep track
+   * of the current fragment number.
+   */
   void NextFragment (void);
+  /**
+   * Get the next fragment from the packet with
+   * appropriate Wifi header for the fragment.
+   *
+   * \param hdr
+   * \return the fragment with the current fragment number
+   */
   Ptr<Packet> GetFragmentPacket (WifiMacHeader *hdr);
   virtual void DoDispose (void);
 
diff -Naur ns-3.18.1/src/wifi/model/dcf.cc ns-3.19/src/wifi/model/dcf.cc
--- ns-3.18.1/src/wifi/model/dcf.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/dcf.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Dcf);
+NS_OBJECT_ENSURE_REGISTERED (Dcf)
+  ;
 
 TypeId
 Dcf::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/dcf.h ns-3.19/src/wifi/model/dcf.h
--- ns-3.18.1/src/wifi/model/dcf.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/dcf.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,11 +34,42 @@
 public:
   static TypeId GetTypeId (void);
 
+  /**
+   * Set the minimum congestion window size.
+   *
+   * \param minCw the minimum congestion window size
+   */
   virtual void SetMinCw (uint32_t minCw) = 0;
+  /**
+   * Set the maximum congestion window size.
+   *
+   * \param maxCw the maximum congestion window size
+   */
   virtual void SetMaxCw (uint32_t maxCw) = 0;
+  /**
+   * \param aifsn the number of slots which make up an AIFS for a specific DCF.
+   *        a DIFS corresponds to an AIFSN = 2.
+   *
+   * Calling this method after DcfManager::Add has been called is not recommended.
+   */
   virtual void SetAifsn (uint32_t aifsn) = 0;
+  /**
+   * Return the minimum congestion window size.
+   *
+   * \return the minimum congestion window size
+   */
   virtual uint32_t GetMinCw (void) const = 0;
+  /**
+   * Return the maximum congestion window size.
+   *
+   * \return the maximum congestion window size
+   */
   virtual uint32_t GetMaxCw (void) const = 0;
+  /**
+   * Return the number of slots that make up an AIFS.
+   *
+   * \return the number of slots that make up an AIFS
+   */
   virtual uint32_t GetAifsn (void) const = 0;
 };
 
diff -Naur ns-3.18.1/src/wifi/model/dcf-manager.cc ns-3.19/src/wifi/model/dcf-manager.cc
--- ns-3.18.1/src/wifi/model/dcf-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/dcf-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -163,13 +163,17 @@
 }
 
 
-/***************************************************************
- *         Listener for Nav events. Forwards to DcfManager
- ***************************************************************/
-
+/**
+ * Listener for NAV events. Forwards to DcfManager
+ */
 class LowDcfListener : public ns3::MacLowDcfListener
 {
 public:
+  /**
+   * Create a LowDcfListener for the given DcfManager.
+   *
+   * \param dcf
+   */
   LowDcfListener (ns3::DcfManager *dcf)
     : m_dcf (dcf)
   {
@@ -202,16 +206,20 @@
     m_dcf->NotifyCtsTimeoutResetNow ();
   }
 private:
-  ns3::DcfManager *m_dcf;
+  ns3::DcfManager *m_dcf;  //!< DcfManager to forward events to
 };
 
-/***************************************************************
- *         Listener for PHY events. Forwards to DcfManager
- ***************************************************************/
-
+/**
+ * Listener for PHY events. Forwards to DcfManager
+ */
 class PhyListener : public ns3::WifiPhyListener
 {
 public:
+  /**
+   * Create a PhyListener for the given DcfManager.
+   *
+   * \param dcf
+   */
   PhyListener (ns3::DcfManager *dcf)
     : m_dcf (dcf)
   {
@@ -244,7 +252,7 @@
     m_dcf->NotifySwitchingStartNow (duration);
   }
 private:
-  ns3::DcfManager *m_dcf;
+  ns3::DcfManager *m_dcf;  //!< DcfManager to forward events to
 };
 
 /****************************************************************
diff -Naur ns-3.18.1/src/wifi/model/dcf-manager.h ns-3.19/src/wifi/model/dcf-manager.h
--- ns-3.18.1/src/wifi/model/dcf-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/dcf-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -57,10 +57,35 @@
    * Calling this method after DcfManager::Add has been called is not recommended.
    */
   void SetAifsn (uint32_t aifsn);
+  /**
+   * Set the minimum congestion window size.
+   *
+   * \param minCw the minimum congestion window size
+   */
   void SetCwMin (uint32_t minCw);
+  /**
+   * Set the maximum congestion window size.
+   *
+   * \param maxCw the maximum congestion window size
+   */
   void SetCwMax (uint32_t maxCw);
+  /**
+   * Return the number of slots that make up an AIFS.
+   *
+   * \return the number of slots that make up an AIFS
+   */
   uint32_t GetAifsn (void) const;
+  /**
+   * Return the minimum congestion window size.
+   *
+   * \return the minimum congestion window size
+   */
   uint32_t GetCwMin (void) const;
+  /**
+   * Return the maximum congestion window size.
+   *
+   * \return the maximum congestion window size
+   */
   uint32_t GetCwMax (void) const;
   /**
    * Update the value of the CW variable to take into account
@@ -96,13 +121,44 @@
 private:
   friend class DcfManager;
 
+  /**
+   * Return the current number of backoff slots.
+   *
+   * \return the current number of backoff slots
+   */
   uint32_t GetBackoffSlots (void) const;
+  /**
+   * Return the time when the backoff procedure started.
+   *
+   * \return the time when the backoff procedure started
+   */
   Time GetBackoffStart (void) const;
+  /**
+   * Update backoff slots that nSlots has passed.
+   *
+   * \param nSlots
+   * \param backoffUpdateBound
+   */
   void UpdateBackoffSlotsNow (uint32_t nSlots, Time backoffUpdateBound);
+  /**
+   * Notify that access request has been received.
+   */
   void NotifyAccessRequested (void);
+  /**
+   * Notify that access has been granted.
+   */
   void NotifyAccessGranted (void);
+  /**
+   * Notify that collision has occurred.
+   */
   void NotifyCollision (void);
+  /**
+   * Notify that internal collision has occurred.
+   */
   void NotifyInternalCollision (void);
+  /**
+   * Notify that the device is switching channel.
+   */
   void NotifyChannelSwitching (void);
 
 
@@ -176,7 +232,17 @@
   DcfManager ();
   ~DcfManager ();
 
+  /**
+   * Set up listener for Phy events.
+   *
+   * \param phy
+   */
   void SetupPhyListener (Ptr<WifiPhy> phy);
+  /**
+   * Set up listener for MacLow events.
+   *
+   * \param low
+   */
   void SetupLowListener (Ptr<MacLow> low);
 
   /**
@@ -280,16 +346,82 @@
    * Called at end of rx
    */
   void NotifyNavStartNow (Time duration);
+  /**
+   * Notify that ACK timer has started for the given duration.
+   *
+   * \param duration
+   */
   void NotifyAckTimeoutStartNow (Time duration);
+  /**
+   * Notify that ACK timer has resetted.
+   */
   void NotifyAckTimeoutResetNow ();
+  /**
+   * Notify that CTS timer has started for the given duration.
+   *
+   * \param duration
+   */
   void NotifyCtsTimeoutStartNow (Time duration);
+  /**
+   * Notify that CTS timer has resetted.
+   */
   void NotifyCtsTimeoutResetNow ();
 private:
+  /**
+   * Update backoff slots for all DcfStates.
+   */
   void UpdateBackoff (void);
+  /**
+   * Return the most recent time.
+   *
+   * \param a
+   * \param b
+   * \return the most recent time
+   */
   Time MostRecent (Time a, Time b) const;
+  /**
+   * Return the most recent time.
+   *
+   * \param a
+   * \param b
+   * \param c
+   * \return the most recent time
+   */
   Time MostRecent (Time a, Time b, Time c) const;
+  /**
+   * Return the most recent time.
+   *
+   * \param a
+   * \param b
+   * \param c
+   * \param d
+   * \return the most recent time
+   */
   Time MostRecent (Time a, Time b, Time c, Time d) const;
+  /**
+   * Return the most recent time.
+   *
+   * \param a
+   * \param b
+   * \param c
+   * \param d
+   * \param e
+   * \param f
+   * \return the most recent time
+   */
   Time MostRecent (Time a, Time b, Time c, Time d, Time e, Time f) const;
+  /**
+   * Return the most recent time.
+   *
+   * \param a
+   * \param b
+   * \param c
+   * \param d
+   * \param e
+   * \param f
+   * \param g
+   * \return the most recent time
+   */
   Time MostRecent (Time a, Time b, Time c, Time d, Time e, Time f, Time g) const;
   /**
    * Access will never be granted to the medium _before_
@@ -299,13 +431,44 @@
    * be granted
    */
   Time GetAccessGrantStart (void) const;
+  /**
+   * Return the time when the backoff procedure
+   * started for the given DcfState.
+   *
+   * \param state
+   * \return the time when the backoff procedure started
+   */
   Time GetBackoffStartFor (DcfState *state);
+  /**
+   * Return the time when the backoff procedure
+   * ended (or will ended) for the given DcfState.
+   *
+   * \param state
+   * \return the time when the backoff procedure ended (or will ended)
+   */
   Time GetBackoffEndFor (DcfState *state);
   void DoRestartAccessTimeoutIfNeeded (void);
+  /**
+   * Called when access timeout should occur
+   * (e.g. backoff procedure expired).
+   */
   void AccessTimeout (void);
+  /**
+   * Grant access to DCF
+   */
   void DoGrantAccess (void);
+  /**
+   * Check if the device is busy sending or receiving,
+   * or NAV busy.
+   *
+   * \return true if the device is busy,
+   *         false otherwise
+   */
   bool IsBusy (void) const;
 
+  /**
+   * typedef for a vector of DcfStates
+   */
   typedef std::vector<DcfState *> States;
 
   States m_states;
diff -Naur ns-3.18.1/src/wifi/model/dsss-error-rate-model.h ns-3.19/src/wifi/model/dsss-error-rate-model.h
--- ns-3.18.1/src/wifi/model/dsss-error-rate-model.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/dsss-error-rate-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -67,10 +67,46 @@
 class DsssErrorRateModel
 {
 public:
+  /**
+   * A function DQPSK
+   *
+   * \param x x
+   * \return DQPSK(x)
+   */
   static double DqpskFunction (double x);
+  /**
+   * Return the chunk success rate of the differential BPSK.
+   *
+   * \param sinr the SINR of the chunk
+   * \param nbits the size of the chunk
+   * \return the chunk success rate of the differential BPSK
+   */
   static double GetDsssDbpskSuccessRate (double sinr, uint32_t nbits);
+  /**
+   * Return the chunk success rate of the differential encoded QPSK.
+   *
+   * \param sinr the SINR of the chunk
+   * \param nbits the size of the chunk
+   * \return the chunk success rate of the differential encoded QPSK.
+   */
   static double GetDsssDqpskSuccessRate (double sinr,uint32_t nbits);
+  /**
+   * Return the chunk success rate of the differential encoded QPSK for
+   * 5.5Mbps data rate.
+   *
+   * \param sinr the SINR of the chunk
+   * \param nbits the size of the chunk
+   * \return the chunk success rate of the differential encoded QPSK for
+   */
   static double GetDsssDqpskCck5_5SuccessRate (double sinr,uint32_t nbits);
+  /**
+   * Return the chunk success rate of the differential encoded QPSK for
+   * 11Mbps data rate.
+   *
+   * \param sinr the SINR of the chunk
+   * \param nbits the size of the chunk
+   * \return the chunk success rate of the differential encoded QPSK for
+   */
   static double GetDsssDqpskCck11SuccessRate (double sinr,uint32_t nbits);
 #ifdef ENABLE_GSL
   static double SymbolErrorProb16Cck (double e2);  /// equation (18) in Pursley's paper
diff -Naur ns-3.18.1/src/wifi/model/edca-txop-n.cc ns-3.19/src/wifi/model/edca-txop-n.cc
--- ns-3.18.1/src/wifi/model/edca-txop-n.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/edca-txop-n.cc	2013-12-20 09:44:50.000000000 -0800
@@ -138,7 +138,8 @@
   EdcaTxopN *m_txop;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (EdcaTxopN);
+NS_OBJECT_ENSURE_REGISTERED (EdcaTxopN)
+  ;
 
 TypeId
 EdcaTxopN::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/edca-txop-n.h ns-3.19/src/wifi/model/edca-txop-n.h
--- ns-3.18.1/src/wifi/model/edca-txop-n.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/edca-txop-n.h	2013-12-20 09:44:50.000000000 -0800
@@ -53,6 +53,9 @@
 class BlockAckManager;
 class MgtDelBaHeader;
 
+/**
+ * Enumeration for type of station
+ */
 enum TypeOfStation
 {
   STA,
@@ -61,7 +64,8 @@
   MESH,
   HT_STA,
   HT_AP,
-  HT_ADHOC_STA
+  HT_ADHOC_STA,
+  OCB
 };
 
 
@@ -80,7 +84,15 @@
 class EdcaTxopN : public Dcf
 {
 public:
+  /**
+   * typedef for a callback to invoke when a
+   * packet transmission was completed successfully.
+   */
   typedef Callback <void, const WifiMacHeader&> TxOk;
+  /**
+   * typedef for a callback to invoke when a
+   * packet transmission was failed.
+   */
   typedef Callback <void, const WifiMacHeader&> TxFailed;
 
   static TypeId GetTypeId (void);
@@ -88,15 +100,53 @@
   virtual ~EdcaTxopN ();
   void DoDispose ();
 
+  /**
+   * Set MacLow associated with this EdcaTxopN.
+   *
+   * \param low MacLow
+   */
   void SetLow (Ptr<MacLow> low);
   void SetTxMiddle (MacTxMiddle *txMiddle);
+  /**
+   * Set DcfManager this EdcaTxopN is associated to.
+   *
+   * \param manager DcfManager
+   */
   void SetManager (DcfManager *manager);
+  /**
+   * \param callback the callback to invoke when a
+   * packet transmission was completed successfully.
+   */
   void SetTxOkCallback (TxOk callback);
+  /**
+   * \param callback the callback to invoke when a
+   * packet transmission was completed unsuccessfully.
+   */
   void SetTxFailedCallback (TxFailed callback);
+  /**
+   * Set WifiRemoteStationsManager this EdcaTxopN is associated to.
+   *
+   * \param remoteManager WifiRemoteStationManager
+   */
   void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> remoteManager);
+  /**
+   * Set type of station with the given type.
+   *
+   * \param type
+   */
   void SetTypeOfStation (enum TypeOfStation type);
+  /**
+   * Return type of station.
+   *
+   * \return type of station
+   */
   enum TypeOfStation GetTypeOfStation (void) const;
 
+  /**
+   * Return the packet queue associated with this EdcaTxopN.
+   *
+   * \return WifiMacQueue
+   */
   Ptr<WifiMacQueue > GetQueue () const;
   virtual void SetMinCw (uint32_t minCw);
   virtual void SetMaxCw (uint32_t maxCw);
@@ -105,51 +155,202 @@
   virtual uint32_t GetMaxCw (void) const;
   virtual uint32_t GetAifsn (void) const;
 
+  /**
+   * Return the MacLow associated with this EdcaTxopN.
+   *
+   * \return MacLow
+   */
   Ptr<MacLow> Low (void);
   Ptr<MsduAggregator> GetMsduAggregator (void) const;
 
   /* dcf notifications forwarded here */
+  /**
+   * Check if the EDCAF requires access.
+   *
+   * \return true if the EDCAF requires access,
+   *         false otherwise
+   */
   bool NeedsAccess (void) const;
+  /**
+   * Notify the EDCAF that access has been granted.
+   */
   void NotifyAccessGranted (void);
+  /**
+   * Notify the EDCAF that internal collision has occurred.
+   */
   void NotifyInternalCollision (void);
+  /**
+   * Notify the EDCAF that collision has occurred.
+   */
   void NotifyCollision (void);
   /**
-  * When a channel switching occurs, enqueued packets are removed.
-  */
+   * When a channel switching occurs, enqueued packets are removed.
+   */
   void NotifyChannelSwitching (void);
 
-  /*event handlers*/
+  /* Event handlers */
+  /**
+   * Event handler when a CTS is received.
+   *
+   * \param snr
+   * \param txMode
+   */
   void GotCts (double snr, WifiMode txMode);
+  /**
+   * Event handler when a CTS timeout has occurred.
+   */
   void MissedCts (void);
+  /**
+   * Event handler when an ACK is received.
+   *
+   * \param snr
+   * \param txMode
+   */
   void GotAck (double snr, WifiMode txMode);
+  /**
+   * Event handler when a Block ACK is received.
+   *
+   * \param blockAck
+   * \param recipient
+   */
   void GotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac48Address recipient);
+  /**
+   * Event handler when a Block ACK timeout has occurred.
+   */
   void MissedBlockAck (void);
   void GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient);
   void GotDelBaFrame (const MgtDelBaHeader *delBaHdr, Mac48Address recipient);
+  /**
+   * Event handler when an ACK is received.
+   */
   void MissedAck (void);
+  /**
+   * Start transmission for the next fragment.
+   * This is called for fragment only.
+   */
   void StartNext (void);
+  /**
+   * Cancel the transmission.
+   */
   void Cancel (void);
+  /**
+   * Event handler when a transmission that
+   * does not require an ACK has completed.
+   */
   void EndTxNoAck (void);
 
+  /**
+   * Restart access request if needed.
+   */
   void RestartAccessIfNeeded (void);
+  /**
+   * Request access from DCF manager if needed.
+   */
   void StartAccessIfNeeded (void);
+  /**
+   * Check if the current packet should be sent with a RTS protection.
+   *
+   * \return true if RTS protection should be used, false otherwise
+   */
   bool NeedRts (void);
+  /**
+   * Check if RTS should be re-transmitted if CTS was missed.
+   *
+   * \return true if RTS should be re-transmitted, false otherwise
+   */
   bool NeedRtsRetransmission (void);
+  /**
+   * Check if DATA should be re-transmitted if ACK was missed.
+   *
+   * \return true if DATA should be re-transmitted, false otherwise
+   */
   bool NeedDataRetransmission (void);
+  /**
+   * Check if the current packet should be fragmented.
+   *
+   * \return true if the current packet should be fragmented,
+   *         false otherwise
+   */
   bool NeedFragmentation (void) const;
+  /**
+   * Calculate the size of the next fragment.
+   *
+   * \return the size of the next fragment
+   */
   uint32_t GetNextFragmentSize (void);
+  /**
+   * Calculate the size of the current fragment.
+   *
+   * \return the size of the current fragment
+   */
   uint32_t GetFragmentSize (void);
+  /**
+   * Calculate the offset for the current fragment.
+   *
+   * \return the offset for the current fragment
+   */
   uint32_t GetFragmentOffset (void);
+  /**
+   * Check if the curren fragment is the last fragment.
+   *
+   * \return true if the curren fragment is the last fragment,
+   *         false otherwise
+   */
   bool IsLastFragment (void) const;
+  /**
+   * Continue to the next fragment. This method simply
+   * increments the internal variable that keep track
+   * of the current fragment number.
+   */
   void NextFragment (void);
+  /**
+   * Get the next fragment from the packet with
+   * appropriate Wifi header for the fragment.
+   *
+   * \param hdr
+   * \return the fragment with the current fragment number
+   */
   Ptr<Packet> GetFragmentPacket (WifiMacHeader *hdr);
 
+  /**
+   * Set the access category of this EDCAF.
+   *
+   * \param ac
+   */
   void SetAccessCategory (enum AcIndex ac);
+  /**
+   * \param packet packet to send
+   * \param hdr header of packet to send.
+   *
+   * Store the packet in the internal queue until it
+   * can be sent safely.
+   */
   void Queue (Ptr<const Packet> packet, const WifiMacHeader &hdr);
   void SetMsduAggregator (Ptr<MsduAggregator> aggr);
+  /**
+   * \param packet packet to send
+   * \param hdr header of packet to send.
+   *
+   * Store the packet in the front of the internal queue until it
+   * can be sent safely.
+   */
   void PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr);
+  /**
+   * Complete block ACK configuration.
+   */
   void CompleteConfig (void);
+  /**
+   * Set threshold for block ACK mechanism. If number of packets in the
+   * queue reaches the threshold, block ACK mechanism is used.
+   *
+   * \param threshold
+   */
   void SetBlockAckThreshold (uint8_t threshold);
+  /**
+   * Return the current threshold for block ACK mechanism.
+   *
+   * \return the current threshold for block ACK mechanism
+   */
   uint8_t GetBlockAckThreshold (void) const;
   void SetBlockAckInactivityTimeout (uint16_t timeout);
   void SendDelbaFrame (Mac48Address addr, uint8_t tid, bool byOriginator);
@@ -174,30 +375,48 @@
    * If aggregating sta is an AP
    *   SA = Address3
    *   DA = Address1
+   *
+   * \param hdr
+   * \return Mac48Address
    */
   Mac48Address MapSrcAddressForAggregation (const WifiMacHeader &hdr);
   Mac48Address MapDestAddressForAggregation (const WifiMacHeader &hdr);
   EdcaTxopN &operator = (const EdcaTxopN &);
   EdcaTxopN (const EdcaTxopN &);
 
-  /* If number of packets in the queue reaches m_blockAckThreshold value, an ADDBARequest frame
+  /**
+   * If number of packets in the queue reaches m_blockAckThreshold value, an ADDBARequest frame
    * is sent to destination in order to setup a block ack.
+   *
+   * \return true if we tried to set up block ACK, false otherwise
    */
   bool SetupBlockAckIfNeeded ();
-  /* Sends an ADDBARequest to establish a block ack agreement with sta
+  /**
+   * Sends an ADDBARequest to establish a block ack agreement with sta
    * addressed by <i>recipient</i> for tid <i>tid</i>.
+   *
+   * \param recipient
+   * \param tid
+   * \param startSeq
+   * \param timeout
+   * \param immediateBAck
    */
   void SendAddBaRequest (Mac48Address recipient, uint8_t tid, uint16_t startSeq,
                          uint16_t timeout, bool immediateBAck);
-  /* After that all packets, for which a block ack agreement was established, have been
+  /**
+   * After that all packets, for which a block ack agreement was established, have been
    * transmitted, we have to send a block ack request.
+   *
+   * \param bar
    */
   void SendBlockAckRequest (const struct Bar &bar);
-  /* For now is typically invoked to complete transmission of a packets sent with ack policy
+  /**
+   * For now is typically invoked to complete transmission of a packets sent with ack policy
    * Block Ack: the packet is buffered and dcf is reset.
    */
   void CompleteTx (void);
-  /* Verifies if dequeued packet has to be transmitted with ack policy Block Ack. This happens
+  /**
+   * Verifies if dequeued packet has to be transmitted with ack policy Block Ack. This happens
    * if an established block ack agreement exists with the receiver.
    */
   void VerifyBlockAck (void);
diff -Naur ns-3.18.1/src/wifi/model/error-rate-model.cc ns-3.19/src/wifi/model/error-rate-model.cc
--- ns-3.18.1/src/wifi/model/error-rate-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/error-rate-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -21,7 +21,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ErrorRateModel);
+NS_OBJECT_ENSURE_REGISTERED (ErrorRateModel)
+  ;
 
 TypeId ErrorRateModel::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wifi/model/error-rate-model.h ns-3.19/src/wifi/model/error-rate-model.h
--- ns-3.18.1/src/wifi/model/error-rate-model.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/error-rate-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -43,6 +43,20 @@
    */
   double CalculateSnr (WifiMode txMode, double ber) const;
 
+  /**
+   * A pure virtual method that must be implemented in the subclass.
+   * This method returns the probability that the given 'chuck' of the
+   * packet will be successfully received by the PHY.
+   *
+   * A chuck can be viewed as a part of a packet with equal SNR.
+   * The probability of successfully receiving the chunk depends on
+   * the mode, the SNR, and the size of the chunk.
+   *
+   * \param mode the Wi-Fi mode the chunk is sent
+   * \param snr the SNR of the chunk
+   * \param nbits the number of bits in this chunk
+   * \return probability of successfully receiving the chunk
+   */
   virtual double GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const = 0;
 };
 
diff -Naur ns-3.18.1/src/wifi/model/ht-capabilities.h ns-3.19/src/wifi/model/ht-capabilities.h
--- ns-3.18.1/src/wifi/model/ht-capabilities.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ht-capabilities.h	2013-12-20 09:44:50.000000000 -0800
@@ -72,13 +72,23 @@
   void SerializeInformationField (Buffer::Iterator start) const;
   uint8_t DeserializeInformationField (Buffer::Iterator start,
                                        uint8_t length);
- /*
+  /**
    * This information element is a bit special in that it is only
    * included if the STA is an HT STA. To support this we
    * override the Serialize and GetSerializedSize methods of
    * WifiInformationElement.
+   *
+   * \param start
+   * \return an iterator
    */
   Buffer::Iterator Serialize (Buffer::Iterator start) const;
+  /**
+   * Return the serialized size of this HT capability 
+   * information element.
+   * 
+   * \return the serialized size of this HT capability 
+   * information element
+   */
   uint16_t GetSerializedSize () const;
  
 private:
diff -Naur ns-3.18.1/src/wifi/model/ideal-wifi-manager.cc ns-3.19/src/wifi/model/ideal-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/ideal-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ideal-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,12 +27,19 @@
 
 namespace ns3 {
 
+/**
+ * \brief hold per-remote-station state for Ideal Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the Ideal Wifi manager
+ */
 struct IdealWifiRemoteStation : public WifiRemoteStation
 {
-  double m_lastSnr;
+  double m_lastSnr;  //!< SNR of last packet sent to the remote station
 };
 
-NS_OBJECT_ENSURE_REGISTERED (IdealWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (IdealWifiManager)
+  ;
 
 TypeId
 IdealWifiManager::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/ideal-wifi-manager.h ns-3.19/src/wifi/model/ideal-wifi-manager.h
--- ns-3.18.1/src/wifi/model/ideal-wifi-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ideal-wifi-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -68,15 +68,30 @@
   virtual WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
   virtual bool IsLowLatency (void) const;
 
-  // return the min snr needed to successfully transmit
-  // data with this mode at the specified ber.
+  /**
+   * Return the minimum SNR needed to successfully transmit
+   * data with this mode at the specified BER.
+   *
+   * \param mode WifiMode
+   * \return the minimum SNR for the given mode
+   */
   double GetSnrThreshold (WifiMode mode) const;
-  void AddModeSnrThreshold (WifiMode mode, double ber);
+  /**
+   * Adds a pair of WifiMode and the minimum SNR for that given mode
+   * to the list.
+   *
+   * \param mode WifiMode
+   * \param snr the minimum SNR for the given mode
+   */
+  void AddModeSnrThreshold (WifiMode mode, double snr);
 
+  /**
+   * A vector of <snr, mode> pair that holds the minimum SNR for different mode
+   */
   typedef std::vector<std::pair<double,WifiMode> > Thresholds;
 
-  double m_ber;
-  Thresholds m_thresholds;
+  double m_ber;  //!< The maximum Bit Error Rate acceptable at any transmission mode
+  Thresholds m_thresholds;  //!< List of WifiMode and the minimum SNR pair
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/wifi/model/interference-helper.h ns-3.19/src/wifi/model/interference-helper.h
--- ns-3.18.1/src/wifi/model/interference-helper.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/interference-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -41,21 +41,74 @@
 class InterferenceHelper
 {
 public:
+  /**
+   * Signal event for a packet.
+   */
   class Event : public SimpleRefCount<InterferenceHelper::Event>
   {
 public:
+    /**
+     * Create an Event with the given parameters.
+     *
+     * \param size packet size
+     * \param payloadMode Wi-Fi mode used for the payload
+     * \param preamble preamble type
+     * \param duration duration of the signal
+     * \param rxPower the receive power (w)
+     * \param txvector TXVECTOR of the packet
+     */
     Event (uint32_t size, WifiMode payloadMode,
            enum WifiPreamble preamble,
            Time duration, double rxPower, WifiTxVector txvector);
     ~Event ();
 
+    /**
+     * Return the duration of the signal.
+     *
+     * \return the duration of the signal
+     */
     Time GetDuration (void) const;
+    /**
+     * Return the start time of the signal.
+     *
+     * \return the start time of the signal
+     */
     Time GetStartTime (void) const;
+    /**
+     * Return the end time of the signal.
+     *
+     * \return the end time of the signal
+     */
     Time GetEndTime (void) const;
+    /**
+     * Return the receive power (w).
+     *
+     * \return the receive power (w)
+     */
     double GetRxPowerW (void) const;
+    /**
+     * Return the size of the packet (bytes).
+     *
+     * \return the size of the packet (bytes)
+     */
     uint32_t GetSize (void) const;
+    /**
+     * Return the Wi-Fi mode used for the payload.
+     *
+     * \return the Wi-Fi mode used for the payload
+     */
     WifiMode GetPayloadMode (void) const;
+    /**
+     * Return the preamble type of the packet.
+     *
+     * \return the preamble type of the packet
+     */
     enum WifiPreamble GetPreambleType (void) const;
+    /**
+     * Return the TXVECTOR of the packet.
+     *
+     * \return the TXVECTOR of the packet
+     */
     WifiTxVector GetTxVector (void) const;
 private:
     uint32_t m_size;
@@ -66,6 +119,9 @@
     double m_rxPowerW;
     WifiTxVector m_txVector;
   };
+  /**
+   * A struct for both SNR and PER
+   */
   struct SnrPer
   {
     double snr;
@@ -75,10 +131,30 @@
   InterferenceHelper ();
   ~InterferenceHelper ();
 
+  /**
+   * Set the noise figure.
+   *
+   * \param value noise figure
+   */
   void SetNoiseFigure (double value);
+  /**
+   * Set the error rate model for this interference helper.
+   *
+   * \param rate Error rate model
+   */
   void SetErrorRateModel (Ptr<ErrorRateModel> rate);
 
+  /**
+   * Return the noise figure.
+   *
+   * \return the noise figure
+   */
   double GetNoiseFigure (void) const;
+  /**
+   * Return the error rate model.
+   *
+   * \return Error rate model
+   */
   Ptr<ErrorRateModel> GetErrorRateModel (void) const;
 
 
@@ -90,36 +166,131 @@
    */
   Time GetEnergyDuration (double energyW);
 
-
+  /**
+   * Add the packet-related signal to interference helper.
+   *
+   * \param size packet size
+   * \param payloadMode Wi-Fi mode for the payload
+   * \param preamble Wi-Fi preamble for the packet
+   * \param duration the duration of the signal
+   * \param rxPower receive power (w)
+   * \param txvector TXVECTOR of the packet
+   * \return InterferenceHelper::Event
+   */
   Ptr<InterferenceHelper::Event> Add (uint32_t size, WifiMode payloadMode,
                                       enum WifiPreamble preamble,
                                       Time duration, double rxPower, WifiTxVector txvector);
 
+  /**
+   * Calculate the SNIR at the start of the packet and accumulate
+   * all SNIR changes in the snir vector.
+   *
+   * \param event the event corresponding to the first time the packet arrives
+   * \return struct of SNR and PER
+   */
   struct InterferenceHelper::SnrPer CalculateSnrPer (Ptr<InterferenceHelper::Event> event);
+  /**
+   * Notify that RX has started.
+   */
   void NotifyRxStart ();
+  /**
+   * Notify that RX has ended.
+   */
   void NotifyRxEnd ();
+  /**
+   * Erase all events.
+   */
   void EraseEvents (void);
 private:
+  /**
+   * Noise and Interference (thus Ni) event.
+   */
   class NiChange
   {
 public:
+    /**
+     * Create a NiChange at the given time and the amount of NI change.
+     *
+     * \param time time of the event
+     * \param delta the power
+     */
     NiChange (Time time, double delta);
+    /**
+     * Return the event time.
+     *
+     * \return the event time.
+     */
     Time GetTime (void) const;
+    /**
+     * Return the power
+     *
+     * \return the power
+     */
     double GetDelta (void) const;
+    /**
+     * Compare the event time of two NiChange objects (a < o).
+     *
+     * \param o
+     * \return true if a < o.time, false otherwise
+     */
     bool operator < (const NiChange& o) const;
 private:
     Time m_time;
     double m_delta;
   };
+  /**
+   * typedef for a vector of NiChanges
+   */
   typedef std::vector <NiChange> NiChanges;
+  /**
+   * typedef for a list of Events
+   */
   typedef std::list<Ptr<Event> > Events;
 
-  InterferenceHelper (const InterferenceHelper &o);
-  InterferenceHelper &operator = (const InterferenceHelper &o);
+  //InterferenceHelper (const InterferenceHelper &o);
+  //InterferenceHelper &operator = (const InterferenceHelper &o);
+  /**
+   * Append the given Event.
+   *
+   * \param event
+   */
   void AppendEvent (Ptr<Event> event);
+  /**
+   * Calculate noise and interference power in W.
+   *
+   * \param event
+   * \param ni
+   * \return noise and interference power
+   */
   double CalculateNoiseInterferenceW (Ptr<Event> event, NiChanges *ni) const;
+  /**
+   * Calculate SNR (linear ratio) from the given signal power and noise+interference power.
+   * (Mode is not currently used)
+   *
+   * \param signal
+   * \param noiseInterference
+   * \param mode
+   * \return SNR in liear ratio
+   */
   double CalculateSnr (double signal, double noiseInterference, WifiMode mode) const;
-  double CalculateChunkSuccessRate (double snir, Time delay, WifiMode mode) const;
+  /**
+   * Calculate the success rate of the chunk given the SINR, duration, and Wi-Fi mode.
+   * The duration and mode are used to calculate how many bits are present in the chunk.
+   *
+   * \param snir SINR
+   * \param duration
+   * \param mode
+   * \return the success rate
+   */
+  double CalculateChunkSuccessRate (double snir, Time duration, WifiMode mode) const;
+  /**
+   * Calculate the error rate of the given packet. The packet can be divided into
+   * multiple chunks (e.g. due to interference from other transmissions).
+   *
+   * \param event
+   * \param ni
+   * \return the error rate of the packet
+   */
   double CalculatePer (Ptr<const Event> event, NiChanges *ni) const;
 
   double m_noiseFigure; /**< noise figure (linear) */
@@ -130,6 +301,11 @@
   bool m_rxing;
   /// Returns an iterator to the first nichange, which is later than moment
   NiChanges::iterator GetPosition (Time moment);
+  /**
+   * Add NiChange to the list at the appropriate position.
+   *
+   * \param change
+   */
   void AddNiChangeEvent (NiChange change);
 };
 
diff -Naur ns-3.18.1/src/wifi/model/mac-low.cc ns-3.19/src/wifi/model/mac-low.cc
--- ns-3.18.1/src/wifi/model/mac-low.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/mac-low.cc	2013-12-20 09:44:50.000000000 -0800
@@ -243,14 +243,17 @@
 }
 
 
-/***************************************************************
- *         Listener for PHY events. Forwards to MacLow
- ***************************************************************/
-
-
+/**
+ * Listener for PHY events. Forwards to MacLow
+ */
 class PhyMacLowListener : public ns3::WifiPhyListener
 {
 public:
+  /**
+   * Create a PhyMacLowListener for the given MacLow.
+   *
+   * \param macLow
+   */
   PhyMacLowListener (ns3::MacLow *macLow)
     : m_macLow (macLow)
   {
@@ -295,7 +298,9 @@
     m_waitSifsEvent (),
     m_endTxNoAckEvent (),
     m_currentPacket (0),
-    m_listener (0)
+    m_listener (0),
+    m_phyMacLowListener (0),
+    m_ctsToSelfSupported (false)
 {
   NS_LOG_FUNCTION (this);
   m_lastNavDuration = Seconds (0);
@@ -334,8 +339,11 @@
    m_waitRifsEvent.Cancel();
   m_phy = 0;
   m_stationManager = 0;
-  delete m_phyMacLowListener;
-  m_phyMacLowListener = 0;
+  if (m_phyMacLowListener != 0)
+    {
+	  delete m_phyMacLowListener;
+	  m_phyMacLowListener = 0;
+    }
 }
 
 void
@@ -539,6 +547,11 @@
 {
   return m_bssid;
 }
+bool
+MacLow::IsPromisc (void) const
+{
+  return m_promisc;
+}
 
 void
 MacLow::SetRxCallback (Callback<void,Ptr<Packet>,const WifiMacHeader *> callback)
diff -Naur ns-3.18.1/src/wifi/model/mac-low.h ns-3.19/src/wifi/model/mac-low.h
--- ns-3.18.1/src/wifi/model/mac-low.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/mac-low.h	2013-12-20 09:44:50.000000000 -0800
@@ -150,16 +150,36 @@
   MacLowDcfListener ();
   virtual ~MacLowDcfListener ();
   /**
+   * Norify that NAV has started for the given duration.
+   *
    * \param duration duration of NAV timer
    */
   virtual void NavStart (Time duration) = 0;
   /**
+   * Notify that NAV has resetted.
+   *
    * \param duration duration of NAV timer
    */
   virtual void NavReset (Time duration) = 0;
+  /**
+   * Notify that ACK timeout has started for a given duration.
+   *
+   * \param duration duration of ACK timeout
+   */
   virtual void AckTimeoutStart (Time duration) = 0;
+  /**
+   * Notify that ACK timeout has resetted.
+   */
   virtual void AckTimeoutReset () = 0;
+  /**
+   * Notify that CTS timeout has started for a given duration.
+   *
+   * \param duration duration of CTS timeout
+   */
   virtual void CtsTimeoutStart (Time duration) = 0;
+  /**
+   * Notify that CTS timeout has resetted.
+   */
   virtual void CtsTimeoutReset () = 0;
 };
 
@@ -180,6 +200,9 @@
    * agreement. Timer is reset when a frame with ack policy block ack
    * or a block ack request are received. When this timer reaches zero
    * this method is called and a delba frame is scheduled for transmission.
+   *
+   * \param originator MAC address of the data originator
+   * \param tid
    */
   virtual void BlockAckInactivityTimeout (Mac48Address originator, uint8_t tid) = 0;
 };
@@ -354,6 +377,7 @@
   uint32_t GetNextPacketSize (void) const;
 
 private:
+
   friend std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params);
   uint32_t m_nextSize;
   enum
@@ -370,6 +394,13 @@
   Time m_overrideDurationId;
 };
 
+/**
+ * Serialize MacLowTransmissionParameters to ostream in a human-readable form.
+ *
+ * \param os std::ostream
+ * \param params MacLowTransmissionParameters
+ * \return std::ostream
+ */
 std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params);
 
 
@@ -380,37 +411,170 @@
 class MacLow : public Object
 {
 public:
+  /**
+   * typedef for a callback for MacLowRx
+   */
   typedef Callback<void, Ptr<Packet>, const WifiMacHeader*> MacLowRxCallback;
 
   MacLow ();
   virtual ~MacLow ();
 
+  /**
+   * Set up WifiPhy associated with this MacLow.
+   *
+   * \param phy WifiPhy associated with this MacLow
+   */
   void SetPhy (Ptr<WifiPhy> phy);
+  /**
+   * Set up WifiRemoteStationManager associated with this MacLow.
+   *
+   * \param manager WifiRemoteStationManager associated with this MacLow
+   */
   void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> manager);
 
+  /**
+   * Set MAC address of this MacLow.
+   *
+   * \param ad Mac48Address of this MacLow
+   */
   void SetAddress (Mac48Address ad);
+  /**
+   * Set ACK timeout of this MacLow.
+   *
+   * \param ackTimeout ACK timeout of this MacLow
+   */
   void SetAckTimeout (Time ackTimeout);
+  /**
+   * Set Basic Block ACK timeout of this MacLow.
+   *
+   * \param blockAckTimeout Basic Block ACK timeout of this MacLow
+   */
   void SetBasicBlockAckTimeout (Time blockAckTimeout);
+  /**
+   * Set Compressed Block ACK timeout of this MacLow.
+   *
+   * \param blockAckTimeout Compressed Block ACK timeout of this MacLow
+   */
   void SetCompressedBlockAckTimeout (Time blockAckTimeout);
+  /**
+   * Enable or disable CTS-to-self capability.
+   *
+   * \param enable Enable or disable CTS-to-self capability
+   */
   void SetCtsToSelfSupported (bool enable);
+  /**
+   * Set CTS timeout of this MacLow.
+   *
+   * \param ctsTimeout CTS timeout of this MacLow
+   */
   void SetCtsTimeout (Time ctsTimeout);
+  /**
+   * Set Short Interframe Space (SIFS) of this MacLow.
+   *
+   * \param sifs SIFS of this MacLow
+   */
   void SetSifs (Time sifs);
+  /**
+   * Set Reduced Interframe Space (RIFS) of this MacLow.
+   *
+   * \param rifs RIFS of this MacLow
+   */
   void SetRifs (Time rifs);
+  /**
+   * Set slot duration of this MacLow.
+   *
+   * \param slotTime slot duration of this MacLow
+   */
   void SetSlotTime (Time slotTime);
+  /**
+   * Set PCF Interframe Space (PIFS) of this MacLow.
+   *
+   * \param pifs PIFS of this MacLow
+   */
   void SetPifs (Time pifs);
+  /**
+   * Set the Basic Service Set Identification.
+   *
+   * \param ad the BSSID
+   */
   void SetBssid (Mac48Address ad);
+  /**
+   * Enable promiscuous mode.
+   */
   void SetPromisc (void);
+  /**
+   * Return whether CTS-to-self capability is supported.
+   *
+   * \return true if CTS-to-self is supported, false otherwise
+   */
   bool GetCtsToSelfSupported () const;
+  /**
+   * Return the MAC address of this MacLow.
+   *
+   * \return Mac48Address of this MacLow
+   */
   Mac48Address GetAddress (void) const;
+  /**
+   * Return ACK timeout of this MacLow.
+   *
+   * \return ACK timeout
+   */
   Time GetAckTimeout (void) const;
+  /**
+   * Return Basic Block ACK timeout of this MacLow.
+   *
+   * \return Basic Block ACK timeout
+   */
   Time GetBasicBlockAckTimeout () const;
+  /**
+   * Return Compressed Block ACK timeout of this MacLow.
+   *
+   * \return Compressed Block ACK timeout
+   */
   Time GetCompressedBlockAckTimeout () const;
+  /**
+   * Return CTS timeout of this MacLow.
+   *
+   * \return CTS timeout
+   */
   Time GetCtsTimeout (void) const;
+  /**
+   * Return Short Interframe Space (SIFS) of this MacLow.
+   *
+   * \return SIFS
+   */
   Time GetSifs (void) const;
+  /**
+   * Return slot duration of this MacLow.
+   *
+   * \return slot duration
+   */
   Time GetSlotTime (void) const;
+  /**
+   * Return PCF Interframe Space (PIFS) of this MacLow.
+   *
+   * \return PIFS
+   */
   Time GetPifs (void) const;
+  /**
+   * Return Reduced Interframe Space (RIFS) of this MacLow.
+   *
+   * \return RIFS
+   */
   Time GetRifs (void) const;
+  /**
+   * Return the Basic Service Set Identification.
+   *
+   * \return BSSID
+   */
   Mac48Address GetBssid (void) const;
+  /**
+   * Check if MacLow is operating in promiscuous mode.
+   *
+   * \return true if MacLow is operating in promiscuous mode,
+   *         false otherwise
+   */
+  bool IsPromisc (void) const;
 
   /**
    * \param callback the callback which receives every incoming packet.
@@ -429,6 +593,7 @@
    * \param packet to send (does not include the 802.11 MAC header and checksum)
    * \param hdr header associated to the packet to send.
    * \param parameters transmission parameters of packet.
+   * \return the transmission time that includes the time for the next packet transmission
    *
    * This transmission time includes the time required for
    * the next packet transmission if one was selected.
@@ -512,62 +677,326 @@
    * associated to this AC.
    */
   void RegisterBlockAckListenerForAc (enum AcIndex ac, MacLowBlockAckEventListener *listener);
+protected:
+  /**
+   * Return a TXVECTOR for the DATA frame given the destination.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param packet the packet being asked for TXVECTOR
+   * \param hdr the WifiMacHeader
+   * \return TXVECTOR for the given packet
+   */
+  virtual WifiTxVector GetDataTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
 private:
+  /**
+   * Cancel all scheduled events. Called before beginning a transmission
+   * or switching channel.
+   */
   void CancelAllEvents (void);
+  /**
+   * Return the total ACK size (including FCS trailer).
+   *
+   * \return the total ACK size
+   */
   uint32_t GetAckSize (void) const;
+  /**
+   * Return the total Block ACK size (including FCS trailer).
+   *
+   * \param type the Block ACK type
+   * \return the total Block ACK size
+   */
   uint32_t GetBlockAckSize (enum BlockAckType type) const;
+  /**
+   * Return the total RTS size (including FCS trailer).
+   *
+   * \return the total RTS size
+   */
   uint32_t GetRtsSize (void) const;
+  /**
+   * Return the total CTS size (including FCS trailer).
+   *
+   * \return the total CTS size
+   */
   uint32_t GetCtsSize (void) const;
+  /**
+   * Return the total size of the packet after WifiMacHeader and FCS trailer
+   * have been added.
+   *
+   * \param packet the packet to be encapsulated with WifiMacHeader and FCS trailer
+   * \param hdr the WifiMacHeader
+   * \return the total packet size
+   */
   uint32_t GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
+  /**
+   * Forward the packet down to WifiPhy for transmission.
+   *
+   * \param packet
+   * \param hdr
+   * \param txVector
+   * \param preamble
+   */
   void ForwardDown (Ptr<const Packet> packet, const WifiMacHeader *hdr,
                     WifiTxVector txVector, WifiPreamble preamble);
+  /**
+   * Return a TXVECTOR for the RTS frame given the destination.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param packet the packet being asked for RTS TXVECTOR
+   * \param hdr the WifiMacHeader
+   * \return TXVECTOR for the RTS of the given packet
+   */
   WifiTxVector GetRtsTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
-  WifiTxVector GetDataTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
+  /**
+   * Return a TXVECTOR for the CTS frame given the destination and the mode of the RTS
+   * used by the sender.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param to the MAC address of the CTS receiver
+   * \param rtsTxMode the mode of the RTS used by the sender
+   * \return TXVECTOR for the CTS
+   */
   WifiTxVector GetCtsTxVector (Mac48Address to, WifiMode rtsTxMode) const;
+  /**
+   * Return a TXVECTOR for the ACK frame given the destination and the mode of the DATA
+   * used by the sender.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param to the MAC address of the ACK receiver
+   * \param dataTxMode the mode of the DATA used by the sender
+   * \return TXVECTOR for the ACK
+   */
   WifiTxVector GetAckTxVector (Mac48Address to, WifiMode dataTxMode) const;
+  /**
+   * Return a TXVECTOR for the Block ACK frame given the destination and the mode of the DATA
+   * used by the sender.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param to the MAC address of the Block ACK receiver
+   * \param dataTxMode the mode of the DATA used by the sender
+   * \return TXVECTOR for the Block ACK
+   */
   WifiTxVector GetBlockAckTxVector (Mac48Address to, WifiMode dataTxMode) const;
 
+  /**
+   * Return a TXVECTOR for the CTS-to-self frame.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param packet the packet that requires CTS-to-self
+   * \param hdr the Wifi header of the packet
+   * \return TXVECTOR for the CTS-to-self operation
+   */
   WifiTxVector GetCtsToSelfTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const;
 
+  /**
+   * Return a TXVECTOR for the CTS frame given the destination and the mode of the RTS
+   * used by the sender.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param to the MAC address of the CTS receiver
+   * \param rtsTxMode the mode of the RTS used by the sender
+   * \return TXVECTOR for the CTS
+   */
   WifiTxVector GetCtsTxVectorForRts (Mac48Address to, WifiMode rtsTxMode) const;
+  /**
+   * Return a TXVECTOR for the Block ACK frame given the destination and the mode of the DATA
+   * used by the sender.
+   * The function consults WifiRemoteStationManager, which controls the rate
+   * to different destinations.
+   *
+   * \param to the MAC address of the Block ACK receiver
+   * \param dataTxMode the mode of the DATA used by the sender
+   * \return TXVECTOR for the Block ACK
+   */
   WifiTxVector GetAckTxVectorForData (Mac48Address to, WifiMode dataTxMode) const;
 
+  /**
+   * Return the time required to transmit the CTS (including preamble and FCS).
+   *
+   * \param ctsTxVector
+   * \return the time required to transmit the CTS (including preamble and FCS)
+   */
   Time GetCtsDuration (WifiTxVector ctsTxVector) const;
+  /**
+   * Return the time required to transmit the CTS to the specified address
+   * given the TXVECTOR of the RTS (including preamble and FCS).
+   *
+   * \param to
+   * \param rtsTxVector
+   * \return the time required to transmit the CTS (including preamble and FCS)
+   */
   Time GetCtsDuration (Mac48Address to, WifiTxVector rtsTxVector) const;
+  /**
+   * Return the time required to transmit the ACK (including preamble and FCS).
+   *
+   * \param ackTxVector
+   * \return the time required to transmit the ACK (including preamble and FCS)
+   */
   Time GetAckDuration (WifiTxVector ackTxVector) const;
+  /**
+   * Return the time required to transmit the ACK to the specified address
+   * given the TXVECTOR of the DATA (including preamble and FCS).
+   *
+   * \param to
+   * \param dataTxVector
+   * \return the time required to transmit the ACK (including preamble and FCS)
+   */
   Time GetAckDuration (Mac48Address to, WifiTxVector dataTxVector) const;
   Time GetBlockAckDuration (Mac48Address to, WifiTxVector blockAckReqTxVector, enum BlockAckType type) const;
 
+  /**
+   * Check if CTS-to-self mechanism should be used for the current packet.
+   *
+   * \return true if CTS-to-self mechanism should be used for the current packet,
+   *         false otherwise
+   */
   bool NeedCtsToSelf (void);
   
   Time CalculateOverallTxTime (Ptr<const Packet> packet,
                                const WifiMacHeader* hdr,
                                const MacLowTransmissionParameters &params) const;
   void NotifyNav (Ptr<const Packet> packet,const WifiMacHeader &hdr, WifiMode txMode, WifiPreamble preamble);
+  /**
+   * Reset NAV with the given duration.
+   *
+   * \param duration
+   */
   void DoNavResetNow (Time duration);
+  /**
+   * Start NAV with the given duration.
+   *
+   * \param duration
+   * \return true if NAV is resetted
+   */
   bool DoNavStartNow (Time duration);
+  /**
+   * Check if NAV is zero.
+   *
+   * \return true if NAV is zero,
+   *         false otherwise
+   */
   bool IsNavZero (void) const;
+  /**
+   * Notify DcfManager (via DcfListener) that
+   * ACK timer should be started for the given
+   * duration.
+   *
+   * \param duration
+   */
   void NotifyAckTimeoutStartNow (Time duration);
+  /**
+   * Notify DcfManager (via DcfListener) that
+   * ACK timer should be resetted.
+   */
   void NotifyAckTimeoutResetNow ();
+  /**
+   * Notify DcfManager (via DcfListener) that
+   * CTS timer should be started for the given
+   * duration.
+   *
+   * \param duration
+   */
   void NotifyCtsTimeoutStartNow (Time duration);
+  /**
+   * Notify DcfManager (via DcfListener) that
+   * CTS timer should be resetted.
+   */
   void NotifyCtsTimeoutResetNow ();
 
+  /**
+   * Reset NAV after CTS was missed when the NAV was
+   * setted with RTS.
+   *
+   * \param rtsEndRxTime
+   */
   void NavCounterResetCtsMissed (Time rtsEndRxTime);
+
+  /* Event handlers */
+  /**
+   * Event handler when normal ACK timeout occurs.
+   */
   void NormalAckTimeout (void);
+  /**
+   * Event handler when fast ACK timeout occurs (idle).
+   */
   void FastAckTimeout (void);
+  /**
+   * Event handler when super fast ACK timeout occurs.
+   */
   void SuperFastAckTimeout (void);
+  /**
+   * Event handler when fast ACK timeout occurs (busy).
+   */
   void FastAckFailedTimeout (void);
+  /**
+   * Event handler when block ACK timeout occurs.
+   */
   void BlockAckTimeout (void);
+  /**
+   * Event handler when CTS timeout occurs.
+   */
   void CtsTimeout (void);
+  /**
+   * Send CTS for a CTS-to-self mechanism.
+   */
   void SendCtsToSelf (void);
+  /**
+   * Send CTS after receiving RTS.
+   *
+   * \param source
+   * \param duration
+   * \param txMode
+   * \param rtsSnr
+   */
   void SendCtsAfterRts (Mac48Address source, Time duration, WifiMode txMode, double rtsSnr);
-  void SendAckAfterData (Mac48Address source, Time duration, WifiMode txMode, double rtsSnr);
+  /**
+   * Send ACK after receiving DATA.
+   *
+   * \param source
+   * \param duration
+   * \param dataTxMode
+   * \param dataSnr
+   */
+  void SendAckAfterData (Mac48Address source, Time duration, WifiMode dataTxMode, double dataSnr);
+  /**
+   * Send DATA after receiving CTS.
+   *
+   * \param source
+   * \param duration
+   * \param txMode
+   */
   void SendDataAfterCts (Mac48Address source, Time duration, WifiMode txMode);
+  /**
+   * Event handler that is usually scheduled to fired at the appropriate time
+   * after completing transmissions.
+   */
   void WaitSifsAfterEndTx (void);
+  /**
+   * A transmission that does not require an ACK has completed.
+   */
   void EndTxNoAck (void);
 
+  /**
+   * Send RTS to begin RTS-CTS-DATA-ACK transaction.
+   */
   void SendRtsForPacket (void);
+  /**
+   * Send DATA packet, which can be DATA-ACK or
+   * RTS-CTS-DATA-ACK transaction.
+   */
   void SendDataPacket (void);
+  /**
+   * Start a DATA timer by scheduling appropriate
+   * ACK timeout.
+   *
+   * \param dataTxVector
+   */
   void StartDataTxTimers (WifiTxVector dataTxVector);
   virtual void DoDispose (void);
   /**
@@ -599,70 +1028,93 @@
    * circularly modulo 2^12.
    */
   bool StoreMpduIfNeeded (Ptr<Packet> packet, WifiMacHeader hdr);
-  /*
+  /**
    * Invoked after that a block ack request has been received. Looks for corresponding
    * block ack agreement and creates block ack bitmap on a received packets basis.
+   *
+   * \param reqHdr
+   * \param originator
+   * \param duration
+   * \param blockAckReqTxMode
    */
   void SendBlockAckAfterBlockAckRequest (const CtrlBAckRequestHeader reqHdr, Mac48Address originator,
                                          Time duration, WifiMode blockAckReqTxMode);
-  /*
+  /**
    * This method creates block ack frame with header equals to <i>blockAck</i> and start its transmission.
+   *
+   * \param blockAck
+   * \param originator
+   * \param immediate
+   * \param duration
+   * \param blockAckReqTxMode
    */
   void SendBlockAckResponse (const CtrlBAckResponseHeader* blockAck, Mac48Address originator, bool immediate,
                              Time duration, WifiMode blockAckReqTxMode);
-  /*
+  /**
    * Every time that a block ack request or a packet with ack policy equals to <i>block ack</i>
    * are received, if a relative block ack agreement exists and the value of inactivity timeout
    * is not 0, the timer is reset.
    * see section 11.5.3 in IEEE802.11e for more details.
+   *
+   * \param agreement
    */
   void ResetBlockAckInactivityTimerIfNeeded (BlockAckAgreement &agreement);
 
+  /**
+   * Set up WifiPhy listener for this MacLow.
+   *
+   * \param phy the WifiPhy this MacLow is connected to
+   */
   void SetupPhyMacLowListener (Ptr<WifiPhy> phy);
 
-  Ptr<WifiPhy> m_phy;
-  Ptr<WifiRemoteStationManager> m_stationManager;
-  MacLowRxCallback m_rxCallback;
+  Ptr<WifiPhy> m_phy; //!< Pointer to WifiPhy (actually send/receives frames)
+  Ptr<WifiRemoteStationManager> m_stationManager; //!< Pointer to WifiRemoteStationManager (rate control)
+  MacLowRxCallback m_rxCallback; //!< Callback to pass packet up
+  /**
+   * typedef for an iterator for a list of MacLowDcfListener.
+   */
   typedef std::vector<MacLowDcfListener *>::const_iterator DcfListenersCI;
+  /**
+   * typedef for a list of MacLowDcfListener.
+   */
   typedef std::vector<MacLowDcfListener *> DcfListeners;
-  DcfListeners m_dcfListeners;
+  DcfListeners m_dcfListeners; //!< List of MacLowDcfListener (pass events to Dcf)
 
-  EventId m_normalAckTimeoutEvent;
-  EventId m_fastAckTimeoutEvent;
-  EventId m_superFastAckTimeoutEvent;
-  EventId m_fastAckFailedTimeoutEvent;
-  EventId m_blockAckTimeoutEvent;
-  EventId m_ctsTimeoutEvent;
-  EventId m_sendCtsEvent;
-  EventId m_sendAckEvent;
-  EventId m_sendDataEvent;
-  EventId m_waitSifsEvent;
-  EventId m_endTxNoAckEvent;
-  EventId m_navCounterResetCtsMissed;
-  EventId m_waitRifsEvent;
-
-  Ptr<Packet> m_currentPacket;
-  WifiMacHeader m_currentHdr;
-  MacLowTransmissionParameters m_txParams;
-  MacLowTransmissionListener *m_listener;
-  Mac48Address m_self;
-  Mac48Address m_bssid;
-  Time m_ackTimeout;
-  Time m_basicBlockAckTimeout;
-  Time m_compressedBlockAckTimeout;
-  Time m_ctsTimeout;
-  Time m_sifs;
-  Time m_slotTime;
-  Time m_pifs;
-  Time m_rifs;
+  EventId m_normalAckTimeoutEvent;      //!< Normal ACK timeout event
+  EventId m_fastAckTimeoutEvent;        //!< Fast ACK timeout event
+  EventId m_superFastAckTimeoutEvent;   //!< Super fast ACK timeout event
+  EventId m_fastAckFailedTimeoutEvent;  //!< Fast ACK failed timeout event
+  EventId m_blockAckTimeoutEvent;       //!< Block ACK timeout event
+  EventId m_ctsTimeoutEvent;            //!< CTS timeout event
+  EventId m_sendCtsEvent;               //!< Event to send CTS
+  EventId m_sendAckEvent;               //!< Event to send ACK
+  EventId m_sendDataEvent;              //!< Event to send DATA
+  EventId m_waitSifsEvent;              //!< Wait for SIFS event
+  EventId m_endTxNoAckEvent;            //!< Event for finishing transmission that does not require ACK
+  EventId m_navCounterResetCtsMissed;   //!< Event to reset NAV when CTS is not received
+  EventId m_waitRifsEvent;              //!< Wait for RIFS event
+
+  Ptr<Packet> m_currentPacket;              //!< Current packet transmitted/to be transmitted
+  WifiMacHeader m_currentHdr;               //!< Header of the current packet
+  MacLowTransmissionParameters m_txParams;  //!< Transmission parameters of the current packet
+  MacLowTransmissionListener *m_listener;   //!< Transmission listener for the current packet
+  Mac48Address m_self;                      //!< Address of this MacLow (Mac48Address)
+  Mac48Address m_bssid;                     //!< BSSID address (Mac48Address)
+  Time m_ackTimeout;                        //!< ACK timeout duration
+  Time m_basicBlockAckTimeout;              //!< Basic block ACK timeout duration
+  Time m_compressedBlockAckTimeout;         //!< Compressed block ACK timeout duration
+  Time m_ctsTimeout;                        //!< CTS timeout duration
+  Time m_sifs;                              //!< Short Interframe Space (SIFS) duration
+  Time m_slotTime;                          //!< Slot duration
+  Time m_pifs;                              //!< PCF Interframe Space (PIFS) duration
+  Time m_rifs;                              //!< Reduced Interframe Space (RIFS) duration
 
-  Time m_lastNavStart;
-  Time m_lastNavDuration;
+  Time m_lastNavStart;     //!< The time when the latest NAV started
+  Time m_lastNavDuration;  //!< The duration of the latest NAV
 
-  bool m_promisc;
+  bool m_promisc;  //!< Flag if the device is operating in promiscuous mode
 
-  // Listerner needed to monitor when a channel switching occurs.
-  class PhyMacLowListener * m_phyMacLowListener;
+  class PhyMacLowListener * m_phyMacLowListener; //!< Listerner needed to monitor when a channel switching occurs.
 
   /*
    * BlockAck data structures.
diff -Naur ns-3.18.1/src/wifi/model/mac-rx-middle.cc ns-3.19/src/wifi/model/mac-rx-middle.cc
--- ns-3.18.1/src/wifi/model/mac-rx-middle.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/mac-rx-middle.cc	2013-12-20 09:44:50.000000000 -0800
@@ -33,10 +33,20 @@
 namespace ns3 {
 
 
+/**
+ * A class to keep track of the packet originator status.
+ * It recomposes the packet from multiple fragments.
+ */
 class OriginatorRxStatus
 {
 private:
+  /**
+   * typedef for a list of fragments (i.e. incomplete Packet).
+   */
   typedef std::list<Ptr<const Packet> > Fragments;
+  /**
+   * typedef for a const iterator for Fragments
+   */
   typedef std::list<Ptr<const Packet> >::const_iterator FragmentsCI;
 
   bool m_defragmenting;
@@ -53,16 +63,37 @@
   {
     m_fragments.clear ();
   }
+  /**
+   * Check if we are de-fragmenting packets.
+   *
+   * \return true if we are de-fragmenting packets,
+   *         false otherwise
+   */
   bool IsDeFragmenting (void)
   {
     return m_defragmenting;
   }
+  /**
+   * We have received a first fragmented packet.
+   * We start the deframentation by saving the first fragment.
+   *
+   * \param packet the first fragmented packet
+   */
   void AccumulateFirstFragment (Ptr<const Packet> packet)
   {
     NS_ASSERT (!m_defragmenting);
     m_defragmenting = true;
     m_fragments.push_back (packet);
   }
+  /**
+   * We have received a last fragment of the fragmented packets
+   * (indicated by the no more fragment field).
+   * We re-construct the packet from the fragments we saved
+   * and return the full packet.
+   *
+   * \param packet the last fragment
+   * \return the fully reconstructed packet
+   */
   Ptr<Packet> AccumulateLastFragment (Ptr<const Packet> packet)
   {
     NS_ASSERT (m_defragmenting);
@@ -76,11 +107,25 @@
     m_fragments.erase (m_fragments.begin (), m_fragments.end ());
     return full;
   }
+  /**
+   * We received a fragmented packet (not first and not last).
+   * We simply save it into our internal list.
+   *
+   * \param packet the received fragment
+   */
   void AccumulateFragment (Ptr<const Packet> packet)
   {
     NS_ASSERT (m_defragmenting);
     m_fragments.push_back (packet);
   }
+  /**
+   * Check if the sequence control (i.e. fragment number) is
+   * in order.
+   *
+   * \param sequenceControl the raw sequence control
+   * \return true if the sequence control is in order,
+   *         false otherwise
+   */
   bool IsNextFragment (uint16_t sequenceControl)
   {
     if ((sequenceControl >> 4) == (m_lastSequenceControl >> 4)
@@ -93,10 +138,20 @@
         return false;
       }
   }
+  /**
+   * Return the last sequence control we received.
+   *
+   * \return the last sequence control
+   */
   uint16_t GetLastSequenceControl (void)
   {
     return m_lastSequenceControl;
   }
+  /**
+   * Set the last sequence control we received.
+   *
+   * \param sequenceControl the last sequence control we received
+   */ 
   void SetSequenceControl (uint16_t sequenceControl)
   {
     m_lastSequenceControl = sequenceControl;
diff -Naur ns-3.18.1/src/wifi/model/mac-rx-middle.h ns-3.19/src/wifi/model/mac-rx-middle.h
--- ns-3.18.1/src/wifi/model/mac-rx-middle.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/mac-rx-middle.h	2013-12-20 09:44:50.000000000 -0800
@@ -40,24 +40,75 @@
 class MacRxMiddle
 {
 public:
+  /**
+   * typedef for callback
+   */
   typedef Callback<void, Ptr<Packet>, const WifiMacHeader*> ForwardUpCallback;
 
   MacRxMiddle ();
   ~MacRxMiddle ();
 
+  /**
+   * Set a callback to forward the packet up.
+   *
+   * \param callback
+   */
   void SetForwardCallback (ForwardUpCallback callback);
 
   void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
 private:
   friend class MacRxMiddleTest;
+  /**
+   * Look up for OriginatorRxStatus associated with the sender address
+   * (by looking at ADDR2 field in the header).
+   * The method creates a new OriginatorRxStatus if one is not already presented.
+   *
+   * \param hdr
+   * \return OriginatorRxStatus
+   */
   OriginatorRxStatus* Lookup (const WifiMacHeader* hdr);
+  /**
+   * Check if we have already received the packet from the sender before
+   * (by looking at the sequence control field).
+   *
+   * \param hdr
+   * \param originator
+   * \return true if we already received the packet previously,
+   *         false otherwise
+   */
   bool IsDuplicate (const WifiMacHeader* hdr, OriginatorRxStatus *originator) const;
+  /**
+   * Check if the received packet is a fragment and handle it appropriately.
+   * If the packet is not a fragment, the method returns the packet.
+   * If the packet is a fragment (not the last fragment), the method initiates
+   * de-fragmentation process and return 0.
+   * If the packet is the last fragment, the method tries to re-construct the full packet
+   * and return the packet if success.
+   *
+   * \param packet
+   * \param hdr
+   * \param originator
+   * \return a packet if the packet is successfully reassembled (or not a fragment),
+   *         0 if we failed to reassemble the packet (e.g. missing fragments/out-of-order).
+   */
   Ptr<Packet> HandleFragments (Ptr<Packet> packet, const WifiMacHeader* hdr,
                                OriginatorRxStatus *originator);
 
+  /**
+   * typedef for a map between address and OriginatorRxStatus
+   */
   typedef std::map <Mac48Address, OriginatorRxStatus *, std::less<Mac48Address> > Originators;
+  /**
+   * typedef for a map between address, OriginatorRxStatus, and Traffic ID
+   */
   typedef std::map <std::pair<Mac48Address, uint8_t>, OriginatorRxStatus *, std::less<std::pair<Mac48Address,uint8_t> > > QosOriginators;
+  /**
+   * typedef for an interator for Originators
+   */
   typedef std::map <Mac48Address, OriginatorRxStatus *, std::less<Mac48Address> >::iterator OriginatorsI;
+  /**
+   * typedef for an interator for QosOriginators
+   */
   typedef std::map <std::pair<Mac48Address, uint8_t>, OriginatorRxStatus *, std::less<std::pair<Mac48Address,uint8_t> > >::iterator QosOriginatorsI;
   Originators m_originatorStatus;
   QosOriginators m_qosOriginatorStatus;
diff -Naur ns-3.18.1/src/wifi/model/mac-tx-middle.h ns-3.19/src/wifi/model/mac-tx-middle.h
--- ns-3.18.1/src/wifi/model/mac-tx-middle.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/mac-tx-middle.h	2013-12-20 09:44:50.000000000 -0800
@@ -42,7 +42,20 @@
   MacTxMiddle ();
   ~MacTxMiddle ();
 
+  /**
+   * Return the next sequence number for the given header.
+   *
+   * \param hdr Wi-Fi header
+   * \return the next sequence number
+   */
   uint16_t GetNextSequenceNumberfor (const WifiMacHeader *hdr);
+  /**
+   * Return the next sequence number for the Traffic ID and destination.
+   *
+   * \param tid Traffic ID
+   * \param addr destination address
+   * \return the next sequence number
+   */
   uint16_t GetNextSeqNumberByTidAndAddress (uint8_t tid, Mac48Address addr) const;
 
 private:
diff -Naur ns-3.18.1/src/wifi/model/mgt-headers.cc ns-3.19/src/wifi/model/mgt-headers.cc
--- ns-3.18.1/src/wifi/model/mgt-headers.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/mgt-headers.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
  *          Probe Request
  ***********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (MgtProbeRequestHeader);
+NS_OBJECT_ENSURE_REGISTERED (MgtProbeRequestHeader)
+  ;
 
 MgtProbeRequestHeader::~MgtProbeRequestHeader ()
 {
@@ -122,7 +123,8 @@
  *          Probe Response
  ***********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (MgtProbeResponseHeader);
+NS_OBJECT_ENSURE_REGISTERED (MgtProbeResponseHeader)
+  ;
 
 MgtProbeResponseHeader::MgtProbeResponseHeader ()
 {
@@ -255,7 +257,8 @@
  *          Assoc Request
  ***********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (MgtAssocRequestHeader);
+NS_OBJECT_ENSURE_REGISTERED (MgtAssocRequestHeader)
+  ;
 
 MgtAssocRequestHeader::MgtAssocRequestHeader ()
   : m_listenInterval (0)
@@ -367,7 +370,8 @@
  *          Assoc Response
  ***********************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (MgtAssocResponseHeader);
+NS_OBJECT_ENSURE_REGISTERED (MgtAssocResponseHeader)
+  ;
 
 MgtAssocResponseHeader::MgtAssocResponseHeader ()
   : m_aid (0)
@@ -501,6 +505,7 @@
     case MESH_INTERWORKING:
     case MESH_RESOURCE_COORDINATION:
     case MESH_PROXY_FORWARDING:
+    case VENDOR_SPECIFIC_ACTION:
       break;
     }
 }
@@ -523,6 +528,8 @@
       return MESH_RESOURCE_COORDINATION;
     case MESH_PROXY_FORWARDING:
       return MESH_PROXY_FORWARDING;
+    case VENDOR_SPECIFIC_ACTION:
+      return VENDOR_SPECIFIC_ACTION;
     default:
       NS_FATAL_ERROR ("Unknown action value");
       return MESH_PEERING_MGT;
@@ -579,7 +586,8 @@
           retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */
         }
       break ;
-      
+    case VENDOR_SPECIFIC_ACTION:
+      break ;
     case MESH_LINK_METRIC:
     // not yet supported
     case MESH_INTERWORKING:
@@ -633,7 +641,8 @@
 *                 ADDBARequest
 ****************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (MgtAddBaRequestHeader);
+NS_OBJECT_ENSURE_REGISTERED (MgtAddBaRequestHeader)
+  ;
 
 MgtAddBaRequestHeader::MgtAddBaRequestHeader ()
   : m_dialogToken (1),
@@ -809,7 +818,8 @@
 *                 ADDBAResponse
 ****************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (MgtAddBaResponseHeader);
+NS_OBJECT_ENSURE_REGISTERED (MgtAddBaResponseHeader)
+  ;
 
 MgtAddBaResponseHeader::MgtAddBaResponseHeader ()
   : m_dialogToken (1),
@@ -975,7 +985,8 @@
 *                     DelBa
 ****************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (MgtDelBaHeader);
+NS_OBJECT_ENSURE_REGISTERED (MgtDelBaHeader)
+  ;
 
 MgtDelBaHeader::MgtDelBaHeader ()
   : m_reasonCode (1)
diff -Naur ns-3.18.1/src/wifi/model/mgt-headers.h ns-3.19/src/wifi/model/mgt-headers.h
--- ns-3.18.1/src/wifi/model/mgt-headers.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/mgt-headers.h	2013-12-20 09:44:50.000000000 -0800
@@ -43,14 +43,54 @@
   MgtAssocRequestHeader ();
   ~MgtAssocRequestHeader ();
 
+  /**
+   * Set the Service Set Identifier (SSID).
+   *
+   * \param ssid SSID
+   */
   void SetSsid (Ssid ssid);
+  /**
+   * Set the supported rates.
+   *
+   * \param rates the supported rates
+   */
   void SetSupportedRates (SupportedRates rates);
+  /**
+   * Set the listen interval.
+   *
+   * \param interval the listen interval
+   */
   void SetListenInterval (uint16_t interval);
+  /**
+   * Set the HT capabilities.
+   *
+   * \param htcapabilities HT capabilities
+   */
   void SetHtCapabilities(HtCapabilities htcapabilities);
   
+  /**
+   * Return the HT capabilities.
+   *
+   * \return HT capabilities
+   */
   HtCapabilities GetHtCapabilities (void) const;
+  /**
+   * Return the Service Set Identifier (SSID).
+   *
+   * \return SSID
+   */
   Ssid GetSsid (void) const;
+  /**
+   * Return the supported rates.
+   *
+   * \return the supported rates
+   */
   SupportedRates GetSupportedRates (void) const;
+  /**
+   * Return the listen interval.
+   *
+   * \return the listen interval
+   */
   uint16_t GetListenInterval (void) const;
 
   static TypeId GetTypeId (void);
@@ -61,10 +101,10 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
 private:
-  Ssid m_ssid;
-  SupportedRates m_rates;
-  CapabilityInformation m_capability;
-  HtCapabilities m_htCapability;
+  Ssid m_ssid; //!< Service Set ID (SSID)
+  SupportedRates m_rates; //!< List of supported rates
+  CapabilityInformation m_capability; //!< Capability information
+  HtCapabilities m_htCapability; //!< HT capabilities
   uint16_t m_listenInterval;
 };
 
@@ -79,12 +119,42 @@
   MgtAssocResponseHeader ();
   ~MgtAssocResponseHeader ();
 
+  /**
+   * Return the status code.
+   *
+   * \return the status code
+   */
   StatusCode GetStatusCode (void);
+  /**
+   * Return the supported rates.
+   *
+   * \return the supported rates
+   */
   SupportedRates GetSupportedRates (void);
+  /**
+   * Return the HT capabilities.
+   *
+   * \return HT capabilities
+   */
   HtCapabilities GetHtCapabilities (void) const;
 
+  /**
+   * Set the HT capabilities.
+   *
+   * \param htcapabilities HT capabilities
+   */
   void SetHtCapabilities(HtCapabilities htcapabilities);
+  /**
+   * Set the supported rates.
+   *
+   * \param rates the supported rates
+   */
   void SetSupportedRates (SupportedRates rates);
+  /**
+   * Set the status code.
+   *
+   * \param code the status code
+   */
   void SetStatusCode (StatusCode code);
 
   static TypeId GetTypeId (void);
@@ -95,11 +165,11 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
 private:
-  SupportedRates m_rates;
-  CapabilityInformation m_capability;
-  StatusCode m_code;
+  SupportedRates m_rates; //!< List of supported rates
+  CapabilityInformation m_capability; //!< Capability information
+  StatusCode m_code; //!< Status code
   uint16_t m_aid;
-  HtCapabilities m_htCapability;
+  HtCapabilities m_htCapability; //!< HT capabilities
 };
 
 
@@ -112,12 +182,42 @@
 public:
   ~MgtProbeRequestHeader ();
 
+  /**
+   * Set the Service Set Identifier (SSID).
+   *
+   * \param ssid SSID
+   */
   void SetSsid (Ssid ssid);
+  /**
+   * Set the supported rates.
+   *
+   * \param rates the supported rates
+   */
   void SetSupportedRates (SupportedRates rates);
+  /**
+   * Return the Service Set Identifier (SSID).
+   *
+   * \return SSID
+   */
   Ssid GetSsid (void) const;
+  /**
+   * Return the supported rates.
+   *
+   * \return the supported rates
+   */
   SupportedRates GetSupportedRates (void) const;
- HtCapabilities GetHtCapabilities (void) const;
+  /**
+   * Return the HT capabilities.
+   *
+   * \return HT capabilities
+   */
+  HtCapabilities GetHtCapabilities (void) const;
 
+  /**
+   * Set the HT capabilities.
+   *
+   * \param htcapabilities HT capabilities
+   */
   void SetHtCapabilities(HtCapabilities htcapabilities);
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
@@ -126,9 +226,9 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 private:
-  Ssid m_ssid;
-  SupportedRates m_rates;
-  HtCapabilities m_htCapability;
+  Ssid m_ssid; //!< Service Set ID (SSID)
+  SupportedRates m_rates; //!< List of supported rates
+  HtCapabilities m_htCapability; //!< HT capabilities
 };
 
 
@@ -142,15 +242,60 @@
   MgtProbeResponseHeader ();
   ~MgtProbeResponseHeader ();
 
+  /**
+   * Return the Service Set Identifier (SSID).
+   *
+   * \return SSID
+   */
   Ssid GetSsid (void) const;
+  /**
+   * Return the beacon interval in microseconds unit.
+   *
+   * \return beacon interval in microseconds unit
+   */
   uint64_t GetBeaconIntervalUs (void) const;
+  /**
+   * Return the supported rates.
+   *
+   * \return the supported rates
+   */
   SupportedRates GetSupportedRates (void) const;
- HtCapabilities GetHtCapabilities (void) const;
+  /**
+   * Return the HT capabilities.
+   *
+   * \return HT capabilities
+   */
+  HtCapabilities GetHtCapabilities (void) const;
 
+  /**
+   * Set the HT capabilities.
+   *
+   * \param htcapabilities HT capabilities
+   */
   void SetHtCapabilities(HtCapabilities htcapabilities);
+  /**
+   * Set the Service Set Identifier (SSID).
+   *
+   * \param ssid SSID
+   */
   void SetSsid (Ssid ssid);
+  /**
+   * Set the beacon interval in microseconds unit.
+   *
+   * \param us beacon interval in microseconds unit
+   */
   void SetBeaconIntervalUs (uint64_t us);
+  /**
+   * Set the supported rates.
+   *
+   * \param rates the supported rates
+   */
   void SetSupportedRates (SupportedRates rates);
+  /**
+   * Return the time stamp.
+   *
+   * \return time stamp
+   */
   uint64_t GetTimestamp ();
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId (void) const;
@@ -160,12 +305,12 @@
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
 private:
-  uint64_t m_timestamp;
-  Ssid m_ssid;
-  uint64_t m_beaconInterval;
-  SupportedRates m_rates;
-  CapabilityInformation m_capability;
-  HtCapabilities m_htCapability;
+  uint64_t m_timestamp; //!< Timestamp
+  Ssid m_ssid; //!< Service set ID (SSID)
+  uint64_t m_beaconInterval; //!< Beacon interval
+  SupportedRates m_rates; //!< List of supported rates
+  CapabilityInformation m_capability; //!< Capability information
+  HtCapabilities m_htCapability; //!< HT capabilities
 };
 
 
@@ -194,8 +339,11 @@
   WifiActionHeader ();
   ~WifiActionHeader ();
 
-  /* Compatible with open80211s implementation */
-  enum CategoryValue //table 7-24 staring from 4
+  /**
+   * Compatible with open80211s implementation
+   * Category values - see 802.11-2012 Table 8-38
+   */
+  enum CategoryValue
   {
     BLOCK_ACK = 3,
     MESH_PEERING_MGT = 30,
@@ -204,8 +352,13 @@
     MESH_INTERWORKING = 33,
     MESH_RESOURCE_COORDINATION = 34,
     MESH_PROXY_FORWARDING = 35,
+    // since vendor specific action has no stationary Action value,the parse process is not here.
+    // refer to vendor-specific-action in wave module.
+    VENDOR_SPECIFIC_ACTION = 127,
   };
-  /* Compatible with open80211s implementation */
+  /**
+   * Compatible with open80211s implementation
+   */
   enum PeerLinkMgtActionValue
   {
     PEER_LINK_OPEN = 0,
@@ -217,7 +370,9 @@
     LINK_METRIC_REQUEST = 0,
     LINK_METRIC_REPORT,
   };
-  /* Compatible with open80211s implementation */
+  /**
+   * Compatible with open80211s implementation
+   */
   enum PathSelectionActionValue
   {
     PATH_SELECTION = 0,
@@ -239,12 +394,19 @@
     TBTT_ADJUSTMENT_REQUEST,
     MESH_CHANNEL_SWITCH_ANNOUNCEMENT,
   };
+  /**
+   * Block ACK action field values
+   * See 802.11 Table 8-202
+   */
   enum BlockAckActionValue
   {
     BLOCK_ACK_ADDBA_REQUEST = 0,
     BLOCK_ACK_ADDBA_RESPONSE = 1,
     BLOCK_ACK_DELBA = 2
   };
+  /**
+   * typedef for union of different ActionValues
+   */
   typedef union
   {
     enum PeerLinkMgtActionValue peerLink;
@@ -254,9 +416,25 @@
     enum ResourceCoordinationActionValue resourceCoordination;
     enum BlockAckActionValue blockAck;
   } ActionValue;
+  /**
+   * Set action for this Action header.
+   *
+   * \param type category
+   * \param action action
+   */
   void   SetAction (enum CategoryValue type,ActionValue action);
 
+  /**
+   * Return the category value.
+   *
+   * \return CategoryValue
+   */
   CategoryValue GetCategory ();
+  /**
+   * Return the action value.
+   *
+   * \return ActionValue
+   */
   ActionValue GetAction ();
   static TypeId GetTypeId (void);
   virtual TypeId GetInstanceTypeId () const;
@@ -265,8 +443,8 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 private:
-  uint8_t m_category;
-  uint8_t m_actionValue;
+  uint8_t m_category; //!< Category of the action
+  uint8_t m_actionValue; //!< Action value
 };
 
 /**
@@ -285,34 +463,115 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
+  /**
+   * Enable delayed Block ACK.
+   */
   void SetDelayedBlockAck ();
+  /**
+   * Enable immediate Block ACK
+   */
   void SetImmediateBlockAck ();
+  /**
+   * Set Traffic ID (TID).
+   *
+   * \param tid traffic ID
+   */
   void SetTid (uint8_t tid);
+  /**
+   * Set timeout.
+   *
+   * \param timeout timeout
+   */
   void SetTimeout (uint16_t timeout);
+  /**
+   * Set buffer size.
+   *
+   * \param size buffer size
+   */
   void SetBufferSize (uint16_t size);
+  /**
+   * Set the starting sequence number.
+   *
+   * \param seq the starting sequence number
+   */
   void SetStartingSequence (uint16_t seq);
+  /**
+   * Enable or disable A-MSDU support.
+   *
+   * \param supported enable or disable A-MSDU support
+   */
   void SetAmsduSupport (bool supported);
 
+  /**
+   * Return the starting sequence number.
+   *
+   * \return the starting sequence number
+   */
   uint16_t GetStartingSequence (void) const;
+  /**
+   * Return the Traffic ID (TID).
+   *
+   * \return TID
+   */
   uint8_t GetTid (void) const;
+  /**
+   * Return whether the Block ACK policy is immediate Block ACK.
+   *
+   * \return true if immediate Block ACK is being used, false otherwise
+   */
   bool IsImmediateBlockAck (void) const;
+  /**
+   * Return the timeout.
+   *
+   * \return timeout
+   */
   uint16_t GetTimeout (void) const;
+  /**
+   * Return the buffer size.
+   *
+   * \return the buffer size.
+   */
   uint16_t GetBufferSize (void) const;
+  /**
+   * Return whether A-MSDU capability is supported.
+   *
+   * \return true is A-MSDU is supported, false otherwise
+   */
   bool IsAmsduSupported (void) const;
 
 private:
+  /**
+   * Return the raw parameter set.
+   *
+   * \return the raw parameter set
+   */
   uint16_t GetParameterSet (void) const;
+  /**
+   * Set the parameter set from the given raw value.
+   *
+   * \param params raw parameter set value
+   */
   void SetParameterSet (uint16_t params);
+  /**
+   * Return the raw sequence control.
+   *
+   * \return the raw sequence control
+   */
   uint16_t GetStartingSequenceControl (void) const;
+  /**
+   * Set sequence control with the given raw value.
+   *
+   * \param seqControl
+   */
   void SetStartingSequenceControl (uint16_t seqControl);
 
   uint8_t m_dialogToken; /* Not used for now */
-  uint8_t m_amsduSupport;
-  uint8_t m_policy;
-  uint8_t m_tid;
-  uint16_t m_bufferSize;
-  uint16_t m_timeoutValue;
-  uint16_t m_startingSeq;
+  uint8_t m_amsduSupport; //!< Flag if A-MSDU is supported
+  uint8_t m_policy; //!< Block ACK policy
+  uint8_t m_tid; //!< Traffic ID
+  uint16_t m_bufferSize; //!< Buffer size
+  uint16_t m_timeoutValue; //!< Timeout
+  uint16_t m_startingSeq; //!< Starting sequence number
 };
 
 
@@ -332,32 +591,103 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
+  /**
+   * Enable delayed Block ACK.
+   */
   void SetDelayedBlockAck ();
+  /**
+   * Enable immediate Block ACK
+   */
   void SetImmediateBlockAck ();
+  /**
+   * Set Traffic ID (TID).
+   *
+   * \param tid traffic ID
+   */
   void SetTid (uint8_t tid);
+  /**
+   * Set timeout.
+   *
+   * \param timeout timeout
+   */
   void SetTimeout (uint16_t timeout);
+  /**
+   * Set buffer size.
+   *
+   * \param size buffer size
+   */
   void SetBufferSize (uint16_t size);
+  /**
+   * Set the status code.
+   *
+   * \param code the status code
+   */
   void SetStatusCode (StatusCode code);
+  /**
+   * Enable or disable A-MSDU support.
+   *
+   * \param supported enable or disable A-MSDU support
+   */
   void SetAmsduSupport (bool supported);
 
+  /**
+   * Return the status code.
+   *
+   * \return the status code
+   */
   StatusCode GetStatusCode (void) const;
+  /**
+   * Return the Traffic ID (TID).
+   *
+   * \return TID
+   */
   uint8_t GetTid (void) const;
+  /**
+   * Return whether the Block ACK policy is immediate Block ACK.
+   *
+   * \return true if immediate Block ACK is being used, false otherwise
+   */
   bool IsImmediateBlockAck (void) const;
+  /**
+   * Return the timeout.
+   *
+   * \return timeout
+   */
   uint16_t GetTimeout (void) const;
+  /**
+   * Return the buffer size.
+   *
+   * \return the buffer size.
+   */
   uint16_t GetBufferSize (void) const;
+  /**
+   * Return whether A-MSDU capability is supported.
+   *
+   * \return true is A-MSDU is supported, false otherwise
+   */
   bool IsAmsduSupported (void) const;
 
 private:
+  /**
+   * Return the raw parameter set.
+   *
+   * \return the raw parameter set
+   */
   uint16_t GetParameterSet (void) const;
+  /**
+   * Set the parameter set from the given raw value.
+   *
+   * \param params raw parameter set value
+   */
   void SetParameterSet (uint16_t params);
 
   uint8_t m_dialogToken; /* Not used for now */
-  StatusCode m_code;
-  uint8_t m_amsduSupport;
-  uint8_t m_policy;
-  uint8_t m_tid;
-  uint16_t m_bufferSize;
-  uint16_t m_timeoutValue;
+  StatusCode m_code; //!< Status code
+  uint8_t m_amsduSupport; //!< Flag if A-MSDU is supported
+  uint8_t m_policy; //!< Block ACK policy
+  uint8_t m_tid; //!< Traffic ID
+  uint16_t m_bufferSize; //!< Buffer size
+  uint16_t m_timeoutValue; //!< Timeout
 };
 
 
@@ -377,18 +707,50 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
+  /**
+   * Check if the initiator bit in the DELBA is setted.
+   *
+   * \return true if the initiator bit in the DELBA is setted,
+   *         false otherwise
+   */
   bool IsByOriginator (void) const;
+  /**
+   * Return the Traffic ID (TID).
+   *
+   * \return TID
+   */
   uint8_t GetTid (void) const;
+  /**
+   * Set Traffic ID (TID).
+   *
+   * \param tid traffic ID
+   */
   void SetTid (uint8_t);
+  /**
+   * Set the initiator bit in the DELBA.
+   */
   void SetByOriginator (void);
+  /**
+   * Un-set the initiator bit in the DELBA.
+   */
   void SetByRecipient (void);
 
 private:
+  /**
+   * Return the raw parameter set.
+   *
+   * \return the raw parameter set
+   */
   uint16_t GetParameterSet (void) const;
+  /**
+   * Set the parameter set from the given raw value.
+   *
+   * \param params raw parameter set value
+   */
   void SetParameterSet (uint16_t params);
 
   uint16_t m_initiator;
-  uint16_t m_tid;
+  uint16_t m_tid; //!< Traffic ID
   /* Not used for now.
      Always set to 1: "Unspecified reason" */
   uint16_t m_reasonCode;
diff -Naur ns-3.18.1/src/wifi/model/minstrel-wifi-manager.cc ns-3.19/src/wifi/model/minstrel-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/minstrel-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/minstrel-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -45,7 +45,12 @@
 
 namespace ns3 {
 
-
+/**
+ * \brief hold per-remote-station state for Minstrel Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the Minstrel Wifi manager
+ */
 struct MinstrelWifiRemoteStation : public WifiRemoteStation
 {
   Time m_nextStatsUpdate;  ///< 10 times every second
@@ -78,7 +83,8 @@
   bool m_initialized;  ///< for initializing tables
 };
 
-NS_OBJECT_ENSURE_REGISTERED (MinstrelWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (MinstrelWifiManager)
+  ;
 
 TypeId
 MinstrelWifiManager::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/minstrel-wifi-manager.h ns-3.19/src/wifi/model/minstrel-wifi-manager.h
--- ns-3.18.1/src/wifi/model/minstrel-wifi-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/minstrel-wifi-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -123,6 +123,12 @@
 
   /// for estimating the TxTime of a packet with a given mode
   Time GetCalcTxTime (WifiMode mode) const;
+  /**
+   * Add transmission time for the given mode to an internal list.
+   *
+   * \param mode Wi-Fi mode
+   * \param t transmission time
+   */
   void AddCalcTxTime (WifiMode mode, Time t);
 
   /// update the number of retries and reset accordingly
@@ -151,7 +157,11 @@
 
   void CheckInit (MinstrelWifiRemoteStation *station);  ///< check for initializations
 
-
+  /**
+   * typedef for a vector of a pair of Time, WifiMode.
+   * (Essentially a list for WifiMode and its corresponding transmission time
+   * to transmit a reference packet.
+   */
   typedef std::vector<std::pair<Time,WifiMode> > TxTime;
   MinstrelRate m_minstrelTable;  ///< minstrel table
   SampleRate m_sampleTable;  ///< sample table
diff -Naur ns-3.18.1/src/wifi/model/msdu-aggregator.cc ns-3.19/src/wifi/model/msdu-aggregator.cc
--- ns-3.18.1/src/wifi/model/msdu-aggregator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/msdu-aggregator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MsduAggregator);
+NS_OBJECT_ENSURE_REGISTERED (MsduAggregator)
+  ;
 
 TypeId
 MsduAggregator::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/msdu-standard-aggregator.cc ns-3.19/src/wifi/model/msdu-standard-aggregator.cc
--- ns-3.18.1/src/wifi/model/msdu-standard-aggregator.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/msdu-standard-aggregator.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MsduStandardAggregator);
+NS_OBJECT_ENSURE_REGISTERED (MsduStandardAggregator)
+  ;
 
 TypeId
 MsduStandardAggregator::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/msdu-standard-aggregator.h ns-3.19/src/wifi/model/msdu-standard-aggregator.h
--- ns-3.18.1/src/wifi/model/msdu-standard-aggregator.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/msdu-standard-aggregator.h	2013-12-20 09:44:50.000000000 -0800
@@ -40,6 +40,7 @@
    * \param aggregatedPacket Packet that will contain <i>packet</i>, if aggregation is possible,
    * \param src Source address of <i>packet</i>.
    * \param dest Destination address of <i>packet</i>.
+   * \return true if the packet can be aggregated, false otherwise
    *
    * This method performs an MSDU aggregation.
    * Returns true if <i>packet</i> can be aggregated to <i>aggregatedPacket</i>, false otherwise.
@@ -47,9 +48,13 @@
   virtual bool Aggregate (Ptr<const Packet> packet, Ptr<Packet> aggregatedPacket,
                           Mac48Address src, Mac48Address dest);
 private:
-  /*  Calculates how much padding must be added to the end of aggregated packet,
-      after that a new packet is added.
-      Each A-MSDU subframe is padded so that its length is multiple of 4 octets.
+  /** 
+   * Calculates how much padding must be added to the end of aggregated packet,
+   * after that a new packet is added.
+   * Each A-MSDU subframe is padded so that its length is multiple of 4 octets.
+   *
+   * \param packet
+   * \return the number of octets required for padding
    */
   uint32_t CalculatePadding (Ptr<const Packet> packet);
 
diff -Naur ns-3.18.1/src/wifi/model/nist-error-rate-model.cc ns-3.19/src/wifi/model/nist-error-rate-model.cc
--- ns-3.18.1/src/wifi/model/nist-error-rate-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/nist-error-rate-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (NistErrorRateModel);
+NS_OBJECT_ENSURE_REGISTERED (NistErrorRateModel)
+  ;
 
 TypeId
 NistErrorRateModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/nist-error-rate-model.h ns-3.19/src/wifi/model/nist-error-rate-model.h
--- ns-3.18.1/src/wifi/model/nist-error-rate-model.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/nist-error-rate-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -45,17 +45,80 @@
   virtual double GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const;
 
 private:
+  /**
+   * Return the coded BER for the given p and b.
+   *
+   * \param p
+   * \param bValue
+   * \return BER
+   */
   double CalculatePe (double p, uint32_t bValue) const;
+  /**
+   * Return BER of BPSK at the given SNR.
+   *
+   * \param snr snr value
+   * \return BER of BPSK at the given SNR
+   */
   double GetBpskBer (double snr) const;
+  /**
+   * Return BER of QPSK at the given SNR.
+   *
+   * \param snr snr value
+   * \return BER of QPSK at the given SNR
+   */
   double GetQpskBer (double snr) const;
+  /**
+   * Return BER of QAM16 at the given SNR.
+   *
+   * \param snr snr value
+   * \return BER of QAM16 at the given SNR
+   */
   double Get16QamBer (double snr) const;
+  /**
+   * Return BER of QAM64 at the given SNR.
+   *
+   * \param snr snr value
+   * \return BER of QAM64 at the given SNR
+   */
   double Get64QamBer (double snr) const;
+  /**
+   * Return BER of BPSK at the given SNR after applying FEC.
+   *
+   * \param snr snr value
+   * \param nbits the number of bits in the chunk
+   * \param bValue
+   * \return BER of BPSK at the given SNR after applying FEC
+   */
   double GetFecBpskBer (double snr, double nbits,
                         uint32_t bValue) const;
+  /**
+   * Return BER of QPSK at the given SNR after applying FEC.
+   *
+   * \param snr snr value
+   * \param nbits the number of bits in the chunk
+   * \param bValue
+   * \return BER of QPSK at the given SNR after applying FEC
+   */
   double GetFecQpskBer (double snr, double nbits,
                         uint32_t bValue) const;
+  /**
+   * Return BER of QAM16 at the given SNR after applying FEC.
+   *
+   * \param snr snr value
+   * \param nbits the number of bits in the chunk
+   * \param bValue
+   * \return BER of QAM16 at the given SNR after applying FEC
+   */
   double GetFec16QamBer (double snr, uint32_t nbits,
                          uint32_t bValue) const;
+  /**
+   * Return BER of QAM64 at the given SNR after applying FEC.
+   *
+   * \param snr snr value
+   * \param nbits the number of bits in the chunk
+   * \param bValue
+   * \return BER of QAM64 at the given SNR after applying FEC
+   */
   double GetFec64QamBer (double snr, uint32_t nbits,
                          uint32_t bValue) const;
 };
diff -Naur ns-3.18.1/src/wifi/model/onoe-wifi-manager.cc ns-3.19/src/wifi/model/onoe-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/onoe-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/onoe-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,6 +29,12 @@
 
 namespace ns3 {
 
+/**
+ * \brief hold per-remote-station state for ONOE Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the ONOE Wifi manager
+ */
 struct OnoeWifiRemoteStation : public WifiRemoteStation
 {
   Time m_nextModeUpdate;
@@ -42,7 +48,8 @@
 };
 
 
-NS_OBJECT_ENSURE_REGISTERED (OnoeWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (OnoeWifiManager)
+  ;
 
 TypeId
 OnoeWifiManager::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/onoe-wifi-manager.h ns-3.19/src/wifi/model/onoe-wifi-manager.h
--- ns-3.18.1/src/wifi/model/onoe-wifi-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/onoe-wifi-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -62,6 +62,11 @@
   virtual WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station);
   virtual bool IsLowLatency (void) const;
 
+  /**
+   * Update the number of retry (both short and long).
+   *
+   * \param station
+   */
   void UpdateRetry (OnoeWifiRemoteStation *station);
   void UpdateMode (OnoeWifiRemoteStation *station);
 
diff -Naur ns-3.18.1/src/wifi/model/originator-block-ack-agreement.h ns-3.19/src/wifi/model/originator-block-ack-agreement.h
--- ns-3.18.1/src/wifi/model/originator-block-ack-agreement.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/originator-block-ack-agreement.h	2013-12-20 09:44:50.000000000 -0800
@@ -94,17 +94,46 @@
     UNSUCCESSFUL
   };
   void SetState (enum State state);
+  /**
+   * Check if the current state of this agreement is PENDING.
+   *
+   * \return true if the current state of this agreement is PENDING,
+   *         false otherwise
+   */
   bool IsPending (void) const;
+  /**
+   * Check if the current state of this agreement is ESTABLISHED.
+   *
+   * \return true if the current state of this agreement is ESTABLISHED,
+   *         false otherwise
+   */
   bool IsEstablished (void) const;
+  /**
+   * Check if the current state of this agreement is INACTIVE.
+   *
+   * \return true if the current state of this agreement is INACTIVE,
+   *         false otherwise
+   */
   bool IsInactive (void) const;
+  /**
+   * Check if the current state of this agreement is UNSUCCESSFUL.
+   *
+   * \return true if the current state of this agreement is UNSUCCESSFUL,
+   *         false otherwise
+   */
   bool IsUnsuccessful (void) const;
   /**
    * Notifies a packet's transmission with ack policy Block Ack.
+   *
+   * \param nextSeqNumber
    */
   void NotifyMpduTransmission (uint16_t nextSeqNumber);
   /**
    * Returns true if all packets for which a block ack was negotiated have been transmitted so
    * a block ack request is needed in order to acknowledge them.
+   *
+   * \return  true if all packets for which a block ack was negotiated have been transmitted,
+   * false otherwise
    */
   bool IsBlockAckRequestNeeded (void) const;
   void CompleteExchange (void);
diff -Naur ns-3.18.1/src/wifi/model/qos-blocked-destinations.h ns-3.19/src/wifi/model/qos-blocked-destinations.h
--- ns-3.18.1/src/wifi/model/qos-blocked-destinations.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/qos-blocked-destinations.h	2013-12-20 09:44:50.000000000 -0800
@@ -26,19 +26,55 @@
 
 namespace ns3 {
 
+/**
+ * Keep track of destination address - TID pairs that are waiting
+ * for a block ACK response.
+ */
 class QosBlockedDestinations
 {
 public:
   QosBlockedDestinations ();
   ~QosBlockedDestinations ();
 
+  /**
+   * Block the given destination address and TID from sending (e.g. pending
+   * block ACK response).
+   *
+   * \param dest
+   * \param tid
+   */
   void Block (Mac48Address dest, uint8_t tid);
+  /**
+   * Un-block the given destination address and TID (e.g. block ACK
+   * response received).
+   *
+   * \param dest
+   * \param tid
+   */
   void Unblock (Mac48Address dest, uint8_t tid);
+  /**
+   * Check if the given destination address and TID are blocked
+   * from sending (e.g. pending block ACK response).
+   *
+   * \param dest
+   * \param tid
+   * \return true if the given destination address and TID are blocked
+   *         from sending, false otherwise
+   */
   bool IsBlocked (Mac48Address dest, uint8_t tid) const;
 
 private:
+  /**
+   * typedef for a list of <Mac48Address, TID> pair.
+   */
   typedef std::list<std::pair<Mac48Address, uint8_t> > BlockedPackets;
+  /**
+   * typedef for an iterator of BlockedPackets
+   */
   typedef std::list<std::pair<Mac48Address, uint8_t> >::iterator BlockedPacketsI;
+  /**
+   * typedef for a constan iterator of BlockedPackets
+   */
   typedef std::list<std::pair<Mac48Address, uint8_t> >::const_iterator BlockedPacketsCI;
   BlockedPackets m_blockedQosPackets;
 };
diff -Naur ns-3.18.1/src/wifi/model/qos-tag.cc ns-3.19/src/wifi/model/qos-tag.cc
--- ns-3.18.1/src/wifi/model/qos-tag.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/qos-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -23,7 +23,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (QosTag);
+NS_OBJECT_ENSURE_REGISTERED (QosTag)
+  ;
 
 TypeId
 QosTag::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/qos-tag.h ns-3.19/src/wifi/model/qos-tag.h
--- ns-3.18.1/src/wifi/model/qos-tag.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/qos-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -70,7 +70,9 @@
   QosTag ();
 
   /**
-   * Create a QosTag with the given TID
+   * Create a QosTag with the given Traffic ID
+   *
+   * \param tid the given Traffic ID
    */
   QosTag (uint8_t tid);
 
@@ -100,10 +102,15 @@
   virtual uint32_t GetSerializedSize () const;
   virtual void Print (std::ostream &os) const;
 
+  /**
+   * Return the Type ID.
+   *
+   * \return type ID
+   */
   uint8_t GetTid (void) const;
 
 private:
-  uint8_t m_tid;
+  uint8_t m_tid;  //!< Traffic ID
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/wifi/model/qos-utils.h ns-3.19/src/wifi/model/qos-utils.h
--- ns-3.18.1/src/wifi/model/qos-utils.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/qos-utils.h	2013-12-20 09:44:50.000000000 -0800
@@ -52,6 +52,9 @@
  * \ingroup wifi
  * Maps TID (Traffic ID) to Access classes.
  * For more details see table 9-1 of IEEE802.11 standard.
+ *
+ * \param tid the Traffic ID to be mapped to Access class
+ * \return the access class for the given TID
  */
 AcIndex QosUtilsMapTidToAc (uint8_t tid);
 
@@ -59,6 +62,10 @@
  * \ingroup wifi
  * If a qos tag is attached to the packet, returns a value < 8.
  * A value >= 8 is returned otherwise.
+ *
+ * \param packet the packet to checked for a QoS tag
+ * \return a value less than 8 if QoS tag was present, a value >= 8
+ *         is returned if no QoS tag was present
  */
 uint8_t QosUtilsGetTidForPacket (Ptr<const Packet> packet);
 
@@ -67,6 +74,10 @@
  * Next function is useful to correctly sort buffered packets under block ack.
  * When an BAR is received from originator station, completed "old"
  * (see section 9.10.3 in IEEE802.11e) packets must be forwarded up before "new" packets.
+ *
+ * \param seqControl the sequence control field
+ * \param endSequence
+ * \return a unique integer for the given sequence control and end sequence
  */
 uint32_t QosUtilsMapSeqControlToUniqueInteger (uint16_t seqControl, uint16_t endSequence);
 
@@ -102,7 +113,9 @@
  * if that packet (with sequence number <i>numberSeq</i>)) belongs to the section of the
  * sequence number space marked with '-' characters. The function returns false otherwise.
  *
- *
+ * \param startingSeq the starting sequence number
+ * \param seqNumber the sequence number to be checked
+ * \return true if the packet is old, false otherwise
  */
 bool QosUtilsIsOldPacket (uint16_t startingSeq, uint16_t seqNumber);
 
diff -Naur ns-3.18.1/src/wifi/model/random-stream.h ns-3.19/src/wifi/model/random-stream.h
--- ns-3.18.1/src/wifi/model/random-stream.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/random-stream.h	2013-12-20 09:44:50.000000000 -0800
@@ -34,6 +34,13 @@
 {
 public:
   virtual ~RandomStream ();
+  /**
+   * Get integer between min and max (including min and max).
+   *
+   * \param min lower bound (inclusive)
+   * \param max upper bound (inclusive)
+   * \return a random number between min and max (including min and max)
+   */
   virtual uint32_t GetNext (uint32_t min, uint32_t max) = 0;
 
  /**
@@ -71,6 +78,11 @@
 class TestRandomStream : public RandomStream
 {
 public:
+  /**
+   * Add the given value to the list.
+   *
+   * \param v
+   */
   void AddNext (uint32_t v);
   virtual uint32_t GetNext (uint32_t min, uint32_t max);
 
diff -Naur ns-3.18.1/src/wifi/model/regular-wifi-mac.cc ns-3.19/src/wifi/model/regular-wifi-mac.cc
--- ns-3.18.1/src/wifi/model/regular-wifi-mac.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/regular-wifi-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (RegularWifiMac);
+NS_OBJECT_ENSURE_REGISTERED (RegularWifiMac)
+  ;
 
 RegularWifiMac::RegularWifiMac ()
 {
diff -Naur ns-3.18.1/src/wifi/model/regular-wifi-mac.h ns-3.19/src/wifi/model/regular-wifi-mac.h
--- ns-3.18.1/src/wifi/model/regular-wifi-mac.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/regular-wifi-mac.h	2013-12-20 09:44:50.000000000 -0800
@@ -87,39 +87,51 @@
 
   Time GetRifs (void) const;
   /**
-   * \returns the current PIFS duration.
+   * \return the current PIFS duration.
    */
   Time GetPifs (void) const;
   /**
-   * \returns the current SIFS duration.
+   * \return the current SIFS duration.
    */
   Time GetSifs (void) const;
   /**
-   * \returns the current slot duration.
+   * \return the current slot duration.
    */
   Time GetSlot (void) const;
   /**
-   * \returns the current EIFS minus DIFS duration
+   * \return the current EIFS minus DIFS duration
    */
   Time GetEifsNoDifs (void) const;
   /**
-   * \returns the current CTS timeout duration.
+   * \return the current CTS timeout duration.
    */
   Time GetCtsTimeout (void) const;
   /**
-   * \returns the current ACK timeout duration.
+   * \return the current ACK timeout duration.
    */
   Time GetAckTimeout (void) const;
 
+  /**
+   * Enable or disable CTS-to-self feature.
+   *
+   * \param enable true if CTS-to-self is to be supported,
+   *        false otherwise
+   */
   void SetCtsToSelfSupported (bool enable);
  
+  /**
+   * Return whether the device supports CTS-to-self
+   * capability.
+   *
+   * \return true if CTS-to-self is supported, false otherwise.
+   */
   bool GetCtsToSelfSupported () const;
   /**
-   * \returns the MAC address associated to this MAC layer.
+   * \return the MAC address associated to this MAC layer.
    */
   virtual Mac48Address GetAddress (void) const;
   /**
-   * \returns the ssid which this MAC layer is going to try to stay in.
+   * \return the ssid which this MAC layer is going to try to stay in.
    */
   virtual Ssid GetSsid (void) const;
   /**
@@ -135,7 +147,7 @@
    */
   virtual void SetBssid (Mac48Address bssid);
   /**
-   * \returns the bssid of the network this device belongs to.
+   * \return the bssid of the network this device belongs to.
    */
   virtual Mac48Address GetBssid (void) const;
   /**
@@ -175,7 +187,7 @@
    */
   virtual void SetWifiPhy (Ptr<WifiPhy> phy);
   /**
-   * \returns the physical layer attached to this MAC.
+   * \return the physical layer attached to this MAC.
    */
   virtual Ptr<WifiPhy> GetWifiPhy () const;
   /**
@@ -183,7 +195,7 @@
    */
   virtual void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager);
   /**
-   * \returns the station manager attached to this MAC.
+   * \return the station manager attached to this MAC.
    */
   virtual Ptr<WifiRemoteStationManager> GetWifiRemoteStationManager () const;
 
@@ -222,19 +234,19 @@
   virtual void DoInitialize ();
   virtual void DoDispose ();
 
-  MacRxMiddle *m_rxMiddle;
-  MacTxMiddle *m_txMiddle;
-  Ptr<MacLow> m_low;
-  DcfManager *m_dcfManager;
-  Ptr<WifiPhy> m_phy;
-
-  Ptr<WifiRemoteStationManager> m_stationManager;
-
-  ForwardUpCallback m_forwardUp;
-  Callback<void> m_linkUp;
-  Callback<void> m_linkDown;
+  MacRxMiddle *m_rxMiddle; //!< RX middle (de-fragmentation etc.)
+  MacTxMiddle *m_txMiddle; //!< TX middle (aggregation etc.)
+  Ptr<MacLow> m_low; //!< MacLow (RTS, CTS, DATA, ACK etc.)
+  DcfManager *m_dcfManager; //!< DCF manager (access to channel)
+  Ptr<WifiPhy> m_phy; //!< Wifi PHY
+
+  Ptr<WifiRemoteStationManager> m_stationManager; //!< Remote station manager (rate control, RTS/CTS/fragmentation thresholds etc.)
+
+  ForwardUpCallback m_forwardUp; //!< Callback to forward packet up the stack
+  Callback<void> m_linkUp; //!< Callback when a link is up
+  Callback<void> m_linkDown; //!< Callback when a link is down
 
-  Ssid m_ssid;
+  Ssid m_ssid; //!< Service Set ID (SSID)
 
   /** This holds a pointer to the DCF instance for this WifiMac - used
   for transmission of frames to non-QoS peers. */
@@ -248,6 +260,38 @@
   EdcaQueues m_edca;
 
   /**
+   * Accessor for the DCF object
+   * 
+   * \return a smart pointer to DcaTxop
+   */
+  Ptr<DcaTxop> GetDcaTxop (void) const;
+
+  /**
+   * Accessor for the AC_VO channel access function
+   * 
+   * \return a smart pointer to EdcaTxopN
+   */
+  Ptr<EdcaTxopN> GetVOQueue (void) const;
+  /**
+   * Accessor for the AC_VI channel access function
+   * 
+   * \return a smart pointer to EdcaTxopN
+   */
+  Ptr<EdcaTxopN> GetVIQueue (void) const;
+  /**
+   * Accessor for the AC_BE channel access function
+   * 
+   * \return a smart pointer to EdcaTxopN
+   */
+  Ptr<EdcaTxopN> GetBEQueue (void) const;
+  /**
+   * Accessor for the AC_BK channel access function
+   * 
+   * \return a smart pointer to EdcaTxopN
+   */
+  Ptr<EdcaTxopN> GetBKQueue (void) const;
+
+  /**
    * \param standard the phy standard to be used
    *
    * This method is called by ns3::WifiMac::ConfigureStandard to
@@ -286,9 +330,28 @@
    * \param hdr a pointer to the MAC header of the received frame.
    */
   virtual void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
+    /**
+   * The packet we sent was successfully received by the receiver
+   * (i.e. we received an ACK from the receiver).
+   * 
+   * \param hdr the header of the packet that we successfully sent
+   */
   virtual void TxOk (const WifiMacHeader &hdr);
+  /**
+   * The packet we sent was successfully received by the receiver
+   * (i.e. we did not receive an ACK from the receiver).
+   *
+   * \param hdr the header of the packet that we failed to sent
+   */
   virtual void TxFailed (const WifiMacHeader &hdr);
 
+  /**
+   * Forward the packet up to the device.
+   *
+   * \param packet the packet that we are forwarding up to the device
+   * \param from the address of the source
+   * \param to the address of the destination
+   */
   void ForwardUp (Ptr<Packet> packet, Mac48Address from, Mac48Address to);
 
   /**
@@ -325,9 +388,17 @@
    * however.
    */
   bool m_qosSupported;
-  /** Set accessor for the \c m_qosSupported member */
+  /**
+   * Enable or disable QoS support for the device.
+   *
+   * \param enable whether QoS is supported
+   */
   void SetQosSupported (bool enable);
-  /** Get accessor for the \c m_qosSupported member */
+  /** 
+   * Return whether the device supports QoS.
+   *
+   * \return true if QoS is supported, false otherwise
+   */
   bool GetQosSupported () const;
 
  /**
@@ -344,9 +415,17 @@
    * however.
    */
   bool m_htSupported;
-  /** Set accessor for the \c m_htSupported member */
+  /**
+   * Enable or disable HT support for the device.
+   *
+   * \param enable whether HT is supported
+   */
   void SetHtSupported (bool enable);
-  /** Get accessor for the \c m_htSupported member */
+  /**
+   * Return whether the device supports QoS.
+   *
+   * \return true if HT is supported, false otherwise
+   */
   bool GetHtSupported () const;
 
 private:
@@ -361,18 +440,6 @@
    */
   void SetupEdcaQueue (enum AcIndex ac);
 
-  /** Accessor for the DCF object */
-  Ptr<DcaTxop> GetDcaTxop (void) const;
-
-  /** Accessor for the AC_VO channel access function */
-  Ptr<EdcaTxopN> GetVOQueue (void) const;
-  /** Accessor for the AC_VI channel access function */
-  Ptr<EdcaTxopN> GetVIQueue (void) const;
-  /** Accessor for the AC_BE channel access function */
-  Ptr<EdcaTxopN> GetBEQueue (void) const;
-  /** Accessor for the AC_BK channel access function */
-  Ptr<EdcaTxopN> GetBKQueue (void) const;
-
   TracedCallback<const WifiMacHeader &> m_txOkCallback;
   TracedCallback<const WifiMacHeader &> m_txErrCallback;
 };
diff -Naur ns-3.18.1/src/wifi/model/rraa-wifi-manager.cc ns-3.19/src/wifi/model/rraa-wifi-manager.cc
--- ns-3.18.1/src/wifi/model/rraa-wifi-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/rraa-wifi-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -32,6 +32,12 @@
 
 namespace ns3 {
 
+/**
+ * \brief hold per-remote-station state for RRAA Wifi manager.
+ *
+ * This struct extends from WifiRemoteStation struct to hold additional
+ * information required by the RRAA Wifi manager
+ */
 struct RraaWifiRemoteStation : public WifiRemoteStation
 {
   uint32_t m_counter;
@@ -46,7 +52,8 @@
   uint32_t m_rate;
 };
 
-NS_OBJECT_ENSURE_REGISTERED (RraaWifiManager);
+NS_OBJECT_ENSURE_REGISTERED (RraaWifiManager)
+  ;
 
 TypeId
 RraaWifiManager::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/rraa-wifi-manager.h ns-3.19/src/wifi/model/rraa-wifi-manager.h
--- ns-3.18.1/src/wifi/model/rraa-wifi-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/rraa-wifi-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -71,13 +71,61 @@
                           Ptr<const Packet> packet, bool normally);
   virtual bool IsLowLatency (void) const;
 
+  /**
+   * Return the index for the maximum transmission rate for
+   * the given station.
+   *
+   * \param station
+   * \return the index for the maximum transmission rate
+   */
   uint32_t GetMaxRate (RraaWifiRemoteStation *station);
+  /**
+   * Return the index for the minimum transmission rate for
+   * the given station.
+   *
+   * \param station
+   * \return the index for the minimum transmission rate
+   */
   uint32_t GetMinRate (RraaWifiRemoteStation *station);
+  /**
+   * Check if the counter should be resetted.
+   *
+   * \param station
+   */
   void CheckTimeout (RraaWifiRemoteStation *station);
+  /**
+   * Find an appropriate rate for the given station, using
+   * a basic algorithm.
+   *
+   * \param station
+   */
   void RunBasicAlgorithm (RraaWifiRemoteStation *station);
+  /**
+   * Activate the use of RTS for the given station if the conditions are met.
+   *
+   * \param station
+   */
   void ARts (RraaWifiRemoteStation *station);
+  /**
+   * Reset the counters of the given station.
+   *
+   * \param station
+   */
   void ResetCountersBasic (RraaWifiRemoteStation *station);
+  /**
+   * Get a threshold for the given mode.
+   *
+   * \param mode
+   * \return threshold
+   */
   struct ThresholdsItem GetThresholds (WifiMode mode) const;
+  /**
+   * Get a threshold for the given station and mode index.
+   *
+   * \param station
+   * \param rate
+   * \return threshold
+   */
   struct ThresholdsItem GetThresholds (RraaWifiRemoteStation *station, uint32_t rate) const;
 
   bool m_basic;
diff -Naur ns-3.18.1/src/wifi/model/snr-tag.cc ns-3.19/src/wifi/model/snr-tag.cc
--- ns-3.18.1/src/wifi/model/snr-tag.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/snr-tag.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SnrTag);
+NS_OBJECT_ENSURE_REGISTERED (SnrTag)
+  ;
 
 TypeId
 SnrTag::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/snr-tag.h ns-3.19/src/wifi/model/snr-tag.h
--- ns-3.18.1/src/wifi/model/snr-tag.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/snr-tag.h	2013-12-20 09:44:50.000000000 -0800
@@ -44,6 +44,7 @@
 
   /**
    * Create a SnrTag with the given snr value
+   * \param snr the given SNR value
    */
   SnrTag(double snr);
 
@@ -55,12 +56,17 @@
   /**
    * Set the SNR to the given value.
    *
-   * @param snr the value of the snr to set
+   * \param snr the value of the snr to set
    */
   void Set (double snr);
+  /**
+   * Return the SNR value.
+   *
+   * \return the SNR value
+   */
   double Get (void) const;
 private:
-  double m_snr;
+  double m_snr;  //!< SNR value
 };
 
 
diff -Naur ns-3.18.1/src/wifi/model/ssid.cc ns-3.19/src/wifi/model/ssid.cc
--- ns-3.18.1/src/wifi/model/ssid.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ssid.cc	2013-12-20 09:44:50.000000000 -0800
@@ -129,6 +129,13 @@
 
 ATTRIBUTE_HELPER_CPP (Ssid);
 
+/**
+ * Serialize SSID to the given ostream
+ *
+ * \param os
+ * \param ssid
+ * \return std::ostream
+ */
 std::ostream &
 operator << (std::ostream &os, const Ssid &ssid)
 {
@@ -136,6 +143,13 @@
   return os;
 }
 
+/**
+ * Serialize from the given istream to this SSID.
+ *
+ * \param is
+ * \param ssid
+ * \return std::istream
+ */
 std::istream &operator >> (std::istream &is, Ssid &ssid)
 {
   std::string str;
diff -Naur ns-3.18.1/src/wifi/model/ssid.h ns-3.19/src/wifi/model/ssid.h
--- ns-3.18.1/src/wifi/model/ssid.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/ssid.h	2013-12-20 09:44:50.000000000 -0800
@@ -37,12 +37,41 @@
 public:
   // broadcast ssid
   Ssid ();
+  /**
+   * Create SSID from a given string
+   *
+   * \param s SSID in string
+   */
   Ssid (std::string s);
+  /**
+   * Create SSID from a given array of char and given length.
+   *
+   * \param ssid
+   * \param length
+   */
   Ssid (char const ssid[32], uint8_t length);
 
+  /**
+   * Check if the two SSIDs are equal.
+   *
+   * \param o SSID to compare to
+   * \return true if the two SSIDs are equal,
+   *         false otherwise
+   */
   bool IsEqual (const Ssid& o) const;
+  /**
+   * Check if the SSID is broadcast.
+   *
+   * \return true if the SSID is broadcast,
+   *         false otherwise
+   */
   bool IsBroadcast (void) const;
 
+  /**
+   * Peek the SSID.
+   *
+   * \return a pointer to SSID string
+   */
   char* PeekString (void) const;
 
   WifiInformationElementId ElementId () const;
@@ -52,8 +81,8 @@
                                        uint8_t length);
 
 private:
-  uint8_t m_ssid[33];
-  uint8_t m_length;
+  uint8_t m_ssid[33]; //!< Raw SSID value
+  uint8_t m_length;   //!< Length of the SSID
 };
 
 std::ostream &operator << (std::ostream &os, const Ssid &ssid);
diff -Naur ns-3.18.1/src/wifi/model/status-code.cc ns-3.19/src/wifi/model/status-code.cc
--- ns-3.18.1/src/wifi/model/status-code.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/status-code.cc	2013-12-20 09:44:50.000000000 -0800
@@ -61,6 +61,13 @@
   return start;
 }
 
+/**
+ * Serialize StatusCode to the given ostream.
+ *
+ * \param os
+ * \param code
+ * \return std::ostream
+ */
 std::ostream &
 operator << (std::ostream &os, const StatusCode &code)
 {
diff -Naur ns-3.18.1/src/wifi/model/status-code.h ns-3.19/src/wifi/model/status-code.h
--- ns-3.18.1/src/wifi/model/status-code.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/status-code.h	2013-12-20 09:44:50.000000000 -0800
@@ -26,17 +26,54 @@
 
 namespace ns3 {
 
+/**
+ * Status code for association response.
+ */
 class StatusCode
 {
 public:
   StatusCode ();
+  /**
+   * Set success bit to 0 (success).
+   */
   void SetSuccess (void);
+  /**
+   * Set success bit to 1 (failure.
+   */
   void SetFailure (void);
 
+  /**
+   * Return whether the status code is success.
+   *
+   * \return true if success, false otherwise
+   */
   bool IsSuccess (void) const;
 
+  /**
+   * \returns the expected size of the status code.
+   *
+   * This method should return the number of bytes which are needed to store
+   * the status code data by Serialize.
+   */
   uint32_t GetSerializedSize (void) const;
+  /**
+   * \param start an iterator which points to where the status code should
+   *        be written.
+   * \return Buffer::Iterator
+   *
+   * This method is used to store a status code into the byte buffer.
+   * The data written is expected to match bit-for-bit the representation of this
+   * header in a real network.
+   */
   Buffer::Iterator Serialize (Buffer::Iterator start) const;
+  /**
+   * \param start an iterator which points to where the status code should be read.
+   * \returns the number of bytes read.
+   *
+   * This method is used to re-create a status code from the byte buffer. 
+   * The data read is expected to match bit-for-bit the representation of this
+   * header in real networks.
+   */
   Buffer::Iterator Deserialize (Buffer::Iterator start);
 private:
   uint16_t m_code;
diff -Naur ns-3.18.1/src/wifi/model/sta-wifi-mac.cc ns-3.19/src/wifi/model/sta-wifi-mac.cc
--- ns-3.18.1/src/wifi/model/sta-wifi-mac.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/sta-wifi-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -60,7 +60,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (StaWifiMac);
+NS_OBJECT_ENSURE_REGISTERED (StaWifiMac)
+  ;
 
 TypeId
 StaWifiMac::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/sta-wifi-mac.h ns-3.19/src/wifi/model/sta-wifi-mac.h
--- ns-3.18.1/src/wifi/model/sta-wifi-mac.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/sta-wifi-mac.h	2013-12-20 09:44:50.000000000 -0800
@@ -84,6 +84,9 @@
   void StartActiveAssociation (void);
 
 private:
+  /**
+   * The current MAC state of the STA.
+   */
   enum MacState
   {
     ASSOCIATED,
@@ -93,21 +96,86 @@
     REFUSED
   };
 
+  /**
+   * Enable or disable active probing.
+   *
+   * \param enable enable or disable active probing
+   */
   void SetActiveProbing (bool enable);
+  /**
+   * Return whether active probing is enabled.
+   *
+   * \return true if active probing is enabled, false otherwise
+   */
   bool GetActiveProbing (void) const;
   virtual void Receive (Ptr<Packet> packet, const WifiMacHeader *hdr);
+
+  /**
+   * Forward a probe request packet to the DCF. The standard is not clear on the correct
+   * queue for management frames if QoS is supported. We always use the DCF.
+   */
   void SendProbeRequest (void);
+  /**
+   * Forward an association request packet to the DCF. The standard is not clear on the correct
+   * queue for management frames if QoS is supported. We always use the DCF.
+   */
   void SendAssociationRequest (void);
+  /**
+   * Try to ensure that we are associated with an AP by taking an appropriate action
+   * depending on the current association status.
+   */
   void TryToEnsureAssociated (void);
+  /**
+   * This method is called after the association timeout occurred. We switch the state to 
+   * WAIT_ASSOC_RESP and re-send an association request.
+   */
   void AssocRequestTimeout (void);
+  /**
+   * This method is called after the probe request timeout occurred. We switch the state to 
+   * WAIT_PROBE_RESP and re-send a probe request.
+   */
   void ProbeRequestTimeout (void);
+  /**
+   * Return whether we are associated with an AP.
+   *
+   * \return true if we are associated with an AP, false otherwise
+   */
   bool IsAssociated (void) const;
+  /**
+   * Return whether we are waiting for an association response from an AP.
+   *
+   * \return true if we are waiting for an association response from an AP, false otherwise
+   */
   bool IsWaitAssocResp (void) const;
+  /**
+   * This method is called after we have not received a beacon from the AP 
+   */
   void MissedBeacons (void);
+  /**
+   * Restarts the beacon timer. 
+   *
+   * \param delay the delay before the watchdog fires
+   */
   void RestartBeaconWatchdog (Time delay);
+  /**
+   * Return an instance of SupportedRates that contains all rates that we support
+   * including HT rates.
+   *
+   * \return SupportedRates all rates that we support
+   */
   SupportedRates GetSupportedRates (void) const;
+  /**
+   * Set the current MAC state.
+   *
+   * \param value the new state
+   */
   void SetState (enum MacState value);
 
+  /**
+   * Return the HT capability of the current AP.
+   * 
+   * \return the HT capability that we support
+   */
   HtCapabilities GetHtCapabilities (void) const;
 
 
diff -Naur ns-3.18.1/src/wifi/model/supported-rates.cc ns-3.19/src/wifi/model/supported-rates.cc
--- ns-3.18.1/src/wifi/model/supported-rates.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/supported-rates.cc	2013-12-20 09:44:50.000000000 -0800
@@ -217,6 +217,13 @@
   return length;
 }
 
+/**
+ * Serialize SupportedRates to the given ostream.
+ *
+ * \param os
+ * \param rates
+ * \return std::ostream
+ */
 std::ostream &operator << (std::ostream &os, const SupportedRates &rates)
 {
   os << "[";
diff -Naur ns-3.18.1/src/wifi/model/supported-rates.h ns-3.19/src/wifi/model/supported-rates.h
--- ns-3.18.1/src/wifi/model/supported-rates.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/supported-rates.h	2013-12-20 09:44:50.000000000 -0800
@@ -53,6 +53,12 @@
 {
 public:
   ExtendedSupportedRatesIE ();
+  /**
+   * Create an extended supported rates information element
+   * from the given rates.
+   *
+   * \param rates
+   */
   ExtendedSupportedRatesIE (SupportedRates *rates);
 
   WifiInformationElementId ElementId () const;
@@ -61,13 +67,23 @@
   uint8_t DeserializeInformationField (Buffer::Iterator start,
                                        uint8_t length);
 
-  /*
+  /**
    * This information element is a bit special in that it is only
    * included if there are more than 8 rates. To support this we
    * override the Serialize and GetSerializedSize methods of
    * WifiInformationElement.
+   *
+   * \param start
+   * \return an iterator
    */
   Buffer::Iterator Serialize (Buffer::Iterator start) const;
+  /**
+   * Return the serialized size of this supported rates 
+   * information element.
+   * 
+   * \return the serialized size of this supported rates 
+   * information element
+   */
   uint16_t GetSerializedSize () const;
 private:
   /**
@@ -94,13 +110,46 @@
 public:
   SupportedRates ();
 
+  /**
+   * Add the given rate to the supported rates.
+   *
+   * \param bs the rate to be added
+   */
   void AddSupportedRate (uint32_t bs);
+  /**
+   * Set the given rate to basic rates.
+   *
+   * \param bs the rate to be set
+   */
   void SetBasicRate (uint32_t bs);
 
+  /**
+   * Check if the given rate is supported.
+   *
+   * \param bs the rate to be checked
+   * \return true if the rate is supported, false otherwise
+   */
   bool IsSupportedRate (uint32_t bs) const;
+  /**
+   * Check if the given rate is a basic rate.
+   *
+   * \param bs the rate to be checked
+   * \return true if the rate is a basic rate, false otherwise
+   */
   bool IsBasicRate (uint32_t bs) const;
 
+  /**
+   * Return the number of supported rates.
+   *
+   * \return the number of supported rates
+   */
   uint8_t GetNRates (void) const;
+  /**
+   * Return the rate at the given index.
+   *
+   * \param i the given index
+   * \return the rate
+   */
   uint32_t GetRate (uint8_t i) const;
 
   WifiInformationElementId ElementId () const;
@@ -119,8 +168,8 @@
   friend class ExtendedSupportedRatesIE;
   ExtendedSupportedRatesIE extended;
 private:
-  uint8_t m_nRates;
-  uint8_t m_rates[MAX_SUPPORTED_RATES];
+  uint8_t m_nRates;  //!< Number of supported rates
+  uint8_t m_rates[MAX_SUPPORTED_RATES];  //!< List of supported bitrate (divided by 500000)
 };
 
 std::ostream &operator << (std::ostream &os, const SupportedRates &rates);
diff -Naur ns-3.18.1/src/wifi/model/wifi-channel.cc ns-3.19/src/wifi/model/wifi-channel.cc
--- ns-3.18.1/src/wifi/model/wifi-channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiChannel);
+NS_OBJECT_ENSURE_REGISTERED (WifiChannel)
+  ;
 
 TypeId
 WifiChannel::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/wifi-information-element.h ns-3.19/src/wifi/model/wifi-information-element.h
--- ns-3.18.1/src/wifi/model/wifi-information-element.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-information-element.h	2013-12-20 09:44:50.000000000 -0800
@@ -131,48 +131,99 @@
 {
 public:
   virtual ~WifiInformationElement ();
-  /// Serialize entire IE including Element ID and length fields
+  /**
+   * Serialize entire IE including Element ID and length fields
+   *
+   * \param i an iterator which points to where the IE should
+   *        be written.
+   * \return an iterator
+   */
   Buffer::Iterator Serialize (Buffer::Iterator i) const;
-  /// Deserialize entire IE, which must be present. The iterator
-  /// passed in must be pointing at the Element ID (i.e., the very
-  /// first octet) of the correct type of information element,
-  /// otherwise this method will generate a fatal error.
+  /**
+   * Deserialize entire IE, which must be present. The iterator
+   * passed in must be pointing at the Element ID (i.e., the very
+   * first octet) of the correct type of information element,
+   * otherwise this method will generate a fatal error.
+   *
+   * \param i an iterator which points to where the IE should be read.
+   * \return an iterator
+   */
   Buffer::Iterator Deserialize (Buffer::Iterator i);
-  /// Deserialize entire IE if it is present. The iterator passed in
-  /// must be pointing at the Element ID of an information element. If
-  /// the Element ID is not the one that the given class is interested
-  /// in then it will return the same iterator.
+  /**
+   * Deserialize entire IE if it is present. The iterator passed in
+   * must be pointing at the Element ID of an information element. If
+   * the Element ID is not the one that the given class is interested
+   * in then it will return the same iterator.
+   *
+   * \param i an iterator which points to where the IE should be read.
+   * \return an iterator
+   */
   Buffer::Iterator DeserializeIfPresent (Buffer::Iterator i);
-  /// Get the size of the serialized IE including Element ID and
-  /// length fields.
+  /**
+   * Get the size of the serialized IE including Element ID and
+   * length fields.
+   *
+   * \return the size of the serialized IE
+   */
   uint16_t GetSerializedSize () const;
 
   ///\name Each subclass must implement
   //\{
   /// Own unique Element ID
   virtual WifiInformationElementId ElementId () const = 0;
-  /// Length of serialized information (i.e., the length of the body
-  /// of the IE, not including the Element ID and length octets. This
-  /// is the value that will appear in the second octet of the entire
-  /// IE - the length field)
+  /**
+   * Length of serialized information (i.e., the length of the body
+   * of the IE, not including the Element ID and length octets. This
+   * is the value that will appear in the second octet of the entire
+   * IE - the length field)
+   *
+   * \return the length of serialized information
+   */
   virtual uint8_t GetInformationFieldSize () const = 0;
-  /// Serialize information (i.e., the body of the IE, not including
-  /// the Element ID and length octets)
+  /**
+   * Serialize information (i.e., the body of the IE, not including
+   * the Element ID and length octets)
+   *
+   * \param start an iterator which points to where the information should
+   *        be written.
+   */
   virtual void SerializeInformationField (Buffer::Iterator start) const = 0;
-  /// Deserialize information (i.e., the body of the IE, not including
-  /// the Element ID and length octets)
+  /**
+   * Deserialize information (i.e., the body of the IE, not including
+   * the Element ID and length octets)
+   *
+   * \param start an iterator which points to where the information should
+   *        be written.
+   * \param length
+   * \return the number of bytes read
+   */
   virtual uint8_t DeserializeInformationField (Buffer::Iterator start,
                                                uint8_t length) = 0;
   //\}
 
   /// In addition, a subclass may optionally override the following...
   //\{
-  /// Generate human-readable form of IE
+  /**
+   * Generate human-readable form of IE
+   *
+   * \param os output stream
+   */
   virtual void Print (std::ostream &os) const;
-  /// Compare information elements using Element ID
+  /**
+   * Compare information elements using Element ID
+   *
+   * \param a another information element to compare with
+   * \return true if the Element ID is less than the other IE Element ID,
+   *         false otherwise
+   */
   virtual bool operator< (WifiInformationElement const & a) const;
-  /// Compare two IEs for equality by ID & Length, and then through
-  /// memcmp of serialised version
+  /**
+   * Compare two IEs for equality by ID & Length, and then through
+   * memcmp of serialised version
+   *
+   * \param a another information element to compare with
+   * \return true if the two IEs are equal, false otherwise
+   */
   virtual bool operator== (WifiInformationElement const & a) const;
   //\}
 };
diff -Naur ns-3.18.1/src/wifi/model/wifi-information-element-vector.cc ns-3.19/src/wifi/model/wifi-information-element-vector.cc
--- ns-3.18.1/src/wifi/model/wifi-information-element-vector.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-information-element-vector.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiInformationElementVector);
+NS_OBJECT_ENSURE_REGISTERED (WifiInformationElementVector)
+  ;
 
 WifiInformationElementVector::WifiInformationElementVector ()
   : m_maxSize (1500)
diff -Naur ns-3.18.1/src/wifi/model/wifi-information-element-vector.h ns-3.19/src/wifi/model/wifi-information-element-vector.h
--- ns-3.18.1/src/wifi/model/wifi-information-element-vector.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-information-element-vector.h	2013-12-20 09:44:50.000000000 -0800
@@ -45,8 +45,7 @@
 public:
   WifiInformationElementVector ();
   ~WifiInformationElementVector ();
-  ///\name Inherited from Header
-  // \{
+
   static TypeId GetTypeId ();
   TypeId GetInstanceTypeId () const;
   virtual uint32_t GetSerializedSize () const;
@@ -59,14 +58,14 @@
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
   virtual void Print (std::ostream &os) const;
-  //\}
+
   /**
    * \brief Needed when you try to deserialize a lonely IE inside other header
    * \param start is the start of the buffer
    * \return deserialized bytes
    */
   virtual uint32_t DeserializeSingleIe (Buffer::Iterator start);
-  ///Set maximum size to control overflow of the max packet length
+  /// Set maximum size to control overflow of the max packet length
   void SetMaxSize (uint16_t size);
   /// As soon as this is a vector, we define an Iterator
   typedef std::vector<Ptr<WifiInformationElement> >::iterator Iterator;
@@ -79,12 +78,22 @@
   /// vector of pointers to information elements is the body of IeVector
   Ptr<WifiInformationElement> FindFirst (WifiInformationElementId id) const;
 
+  /**
+   * Check if the given WifiInformationElementVectors are equivalent.
+   * 
+   * \param a another WifiInformationElementVector
+   * \return true if the given WifiInformationElementVectors are equivalent,
+   *         false otherwise
+   */
   virtual bool operator== (const WifiInformationElementVector & a) const;
 protected:
+  /**
+   * typedef for a vector of WifiInformationElements.
+   */
   typedef std::vector<Ptr<WifiInformationElement> > IE_VECTOR;
   /// Current number of bytes
   uint32_t GetSize () const;
-  IE_VECTOR m_elements;
+  IE_VECTOR m_elements; //!< Information element vector
   /// Size in bytes (actually, max packet length)
   uint16_t m_maxSize;
 };
diff -Naur ns-3.18.1/src/wifi/model/wifi-mac.cc ns-3.19/src/wifi/model/wifi-mac.cc
--- ns-3.18.1/src/wifi/model/wifi-mac.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mac.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,9 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiMac);
+NS_OBJECT_ENSURE_REGISTERED (WifiMac)
+  ;
+  
 
 Time
 WifiMac::GetDefaultMaxPropagationDelay (void)
diff -Naur ns-3.18.1/src/wifi/model/wifi-mac.h ns-3.19/src/wifi/model/wifi-mac.h
--- ns-3.18.1/src/wifi/model/wifi-mac.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mac.h	2013-12-20 09:44:50.000000000 -0800
@@ -85,50 +85,54 @@
    */
   void SetMaxPropagationDelay (Time delay);
 /**
-   * \returns the current RIFS duration.
+   * \return the current RIFS duration.
    */
 
   virtual Time GetRifs (void) const = 0;
 
   /**
-   * \returns the current PIFS duration.
+   * \return the current PIFS duration.
    */
   virtual Time GetPifs (void) const = 0;
   /**
-   * \returns the current SIFS duration.
+   * \return the current SIFS duration.
    */
   virtual Time GetSifs (void) const = 0;
   /**
-   * \returns the current slot duration.
+   * \return the current slot duration.
    */
   virtual Time GetSlot (void) const = 0;
   /**
-   * \returns the current EIFS minus DIFS duration
+   * \return the current EIFS minus DIFS duration
    */
   virtual Time GetEifsNoDifs (void) const = 0;
   /**
-   * \returns the current CTS timeout duration.
+   * \return the current CTS timeout duration.
    */
   virtual Time GetCtsTimeout (void) const = 0;
   /**
-   * \returns the current ACK timeout duration.
+   * \return the current ACK timeout duration.
    */
   virtual Time GetAckTimeout (void) const = 0;
   /**
+   * \return the maximum lifetime of an MSDU.
+   *
    * Unused for now.
    */
   Time GetMsduLifetime (void) const;
   /**
+   * \return the maximum propagation delay.
+   * 
    * Unused for now.
    */
   Time GetMaxPropagationDelay (void) const;
 
   /**
-   * \returns the MAC address associated to this MAC layer.
+   * \return the MAC address associated to this MAC layer.
    */
   virtual Mac48Address GetAddress (void) const = 0;
   /**
-   * \returns the ssid which this MAC layer is going to try to stay in.
+   * \return the ssid which this MAC layer is going to try to stay in.
    */
   virtual Ssid GetSsid (void) const = 0;
   /**
@@ -140,7 +144,7 @@
    */
   virtual void SetSsid (Ssid ssid) = 0;
   /**
-   * \returns the bssid of the network this device belongs to.
+   * \return the bssid of the network this device belongs to.
    */
   virtual Mac48Address GetBssid (void) const = 0;
   /**
@@ -173,6 +177,13 @@
    * access it granted to this MAC.
    */
   virtual void Enqueue (Ptr<const Packet> packet, Mac48Address to) = 0;
+  /**
+   * \return if this MAC supports sending from arbitrary address.
+   *
+   * The interface may or may not support sending from arbitrary address.
+   * This function returns true if sending from arbitrary address is supported,
+   * false otherwise.
+   */
   virtual bool SupportsSendFrom (void) const = 0;
   /**
    * \param phy the physical layer attached to this MAC.
@@ -197,36 +208,65 @@
   /* Next functions are not pure virtual so non Qos WifiMacs are not
    * forced to implement them.
    */
+
+  /**
+   * \param blockAckTimeout the duration for basic block ACK timeout.
+   *
+   * Sets the timeout for basic block ACK.
+   */
   virtual void SetBasicBlockAckTimeout (Time blockAckTimeout);
+  /**
+   * \return the current basic block ACK timeout duration.
+   */
   virtual Time GetBasicBlockAckTimeout (void) const;
+  /**
+   * \param blockAckTimeout
+   *
+   * Sets the timeout for compressed block ACK.
+   */
   virtual void SetCompressedBlockAckTimeout (Time blockAckTimeout);
+  /**
+   * \return the current compressed block ACK timeout duration.
+   */
   virtual Time GetCompressedBlockAckTimeout (void) const;
 
   /**
+   * \param packet the packet being enqueued
+   *
    * Public method used to fire a MacTx trace.  Implemented for encapsulation
-   * purposes.
+   * purposes.  Note this trace indicates that the packet was accepted by the
+   * device only.  The packet may be dropped later (e.g. if the queue is full).
    */
   void NotifyTx (Ptr<const Packet> packet);
 
   /**
+   * \param packet the packet being dropped
+   * 
    * Public method used to fire a MacTxDrop trace.  Implemented for encapsulation
-   * purposes.
+   * purposes.  This trace indicates that the packet was dropped before it was
+   * transmitted (e.g. when a STA is not associated with an AP).
    */
   void NotifyTxDrop (Ptr<const Packet> packet);
 
   /**
+   * \param packet the packet we received
+   * 
    * Public method used to fire a MacRx trace.  Implemented for encapsulation
    * purposes.
    */
   void NotifyRx (Ptr<const Packet> packet);
 
   /**
+   * \param packet the packet we received promiscuously
+   *
    * Public method used to fire a MacPromiscRx trace.  Implemented for encapsulation
    * purposes.
    */
   void NotifyPromiscRx (Ptr<const Packet> packet);
 
   /**
+   * \param packet the packet we received but is not destined for us
+   * 
    * Public method used to fire a MacRxDrop trace.  Implemented for encapsulation
    * purposes.
    */
@@ -237,18 +277,88 @@
   void ConfigureStandard (enum WifiPhyStandard standard);
 
 protected:
+  /**
+   * \param dcf the DCF to be configured
+   * \param cwmin the minimum congestion window for the DCF
+   * \param cwmax the maximum congestion window for the DCF
+   * \param ac the access category for the DCF
+   *
+   * Configure the DCF with appropriate values depending on the given access category.
+   */
   void ConfigureDcf (Ptr<Dcf> dcf, uint32_t cwmin, uint32_t cwmax, enum AcIndex ac);
 private:
+  /**
+   * \return the default maximum propagation delay
+   *
+   * By default, we get the maximum propagation delay from 1000 m and speed of light
+   * (3e8 m/s).
+   */
   static Time GetDefaultMaxPropagationDelay (void);
+  /**
+   * \return the default slot duration
+   * 
+   * Return a default slot value for 802.11a (9 microseconds).
+   */
   static Time GetDefaultSlot (void);
+  /**
+   * \return the default short interframe space (SIFS)
+   * 
+   * Return a default SIFS value for 802.11a (16 microseconds).
+   */
   static Time GetDefaultSifs (void);
+  /**
+   * \return the default reduced interframe space (RIFS)
+   * 
+   * Return a default RIFS value for 802.11n (2 microseconds).
+   */
   static Time GetDefaultRifs (void);
+  /**
+   * \return the default extended interframe space (EIFS) without
+   *          DCF interframe space (DIFS)
+   * 
+   * Return default SIFS + default CTS-ACK delay
+   */
   static Time GetDefaultEifsNoDifs (void);
+  /**
+   * \return the default CTS-ACK delay
+   * 
+   * Return a default value for 802.11a at 6Mbps (44 microseconds)
+   */
   static Time GetDefaultCtsAckDelay (void);
+  /**
+   * \return the default CTS and ACK timeout
+   * 
+   * Return the default CTS and ACK timeout.
+   * Cts_Timeout and Ack_Timeout are specified in the Annex C
+   * (Formal description of MAC operation, see details on the
+   * Trsp timer setting at page 346)
+   */
   static Time GetDefaultCtsAckTimeout (void);
+  /**
+   * Return the default basic block ACK delay.
+   * Currently it returns 250 microseconds.
+   *
+   * \return the default basic block ACK delay
+   */
   static Time GetDefaultBasicBlockAckDelay (void);
+  /**
+   * Return the default basic block ACK timeout.
+   *
+   * \return the default basic block ACK timeout
+   */
   static Time GetDefaultBasicBlockAckTimeout (void);
+  /**
+   * Return the default compressed block ACK delay.
+   * Currently it returns 76 microseconds.
+   *
+   * \return the default compressed block ACK delay
+   */
   static Time GetDefaultCompressedBlockAckDelay (void);
+  /**
+   * Return the default compressed block ACK timeout.
+   *
+   * \return the default compressed block ACK timeout
+   */
   static Time GetDefaultCompressedBlockAckTimeout (void);
   /**
    * \param standard the phy standard to be used
@@ -262,12 +372,33 @@
 
   Time m_maxPropagationDelay;
 
+  /**
+   * Configure appropriate timing parameters for 802.11a.
+   */
   void Configure80211a (void);
+  /**
+   * Configure appropriate timing parameters for 802.11b.
+   */
   void Configure80211b (void);
+  /**
+   * Configure appropriate timing parameters for 802.11g.
+   */
   void Configure80211g (void);
+  /**
+   * Configure appropriate timing parameters for 802.11 with 10Mhz channel spacing.
+   */
   void Configure80211_10Mhz (void);
+  /**
+   * Configure appropriate timing parameters for 802.11 with 5Mhz channel spacing.
+   */
   void Configure80211_5Mhz ();
+  /**
+   * Configure appropriate timing parameters for 802.11n operating at 2.4Ghz.
+   */
   void Configure80211n_2_4Ghz (void);
+  /**
+   * Configure appropriate timing parameters for 802.11n operating at 5Ghz.
+   */
   void Configure80211n_5Ghz (void);
 
   /**
diff -Naur ns-3.18.1/src/wifi/model/wifi-mac-header.cc ns-3.19/src/wifi/model/wifi-mac-header.cc
--- ns-3.18.1/src/wifi/model/wifi-mac-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mac-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiMacHeader);
+NS_OBJECT_ENSURE_REGISTERED (WifiMacHeader)
+  ;
 
 enum
 {
diff -Naur ns-3.18.1/src/wifi/model/wifi-mac-header.h ns-3.19/src/wifi/model/wifi-mac-header.h
--- ns-3.18.1/src/wifi/model/wifi-mac-header.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mac-header.h	2013-12-20 09:44:50.000000000 -0800
@@ -29,6 +29,9 @@
 
 namespace ns3 {
 
+/**
+ * Combination of valid MAC header type/subtype.
+ */
 enum WifiMacType
 {
   WIFI_MAC_CTL_RTS = 0,
@@ -77,6 +80,9 @@
 class WifiMacHeader : public Header
 {
 public:
+  /**
+   * ACK policy for QoS frames.
+   */
   enum QosAckPolicy
   {
     NORMAL_ACK = 0,
@@ -85,6 +91,9 @@
     BLOCK_ACK = 3,
   };
 
+  /**
+   * Address types.
+   */
   enum AddressType
   {
     ADDR1,
@@ -103,103 +112,513 @@
   virtual void Serialize (Buffer::Iterator start) const;
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
-
+  /**
+   * Set Type/Subtype values for an association request header.
+   */
   void SetAssocReq (void);
+  /**
+   * Set Type/Subtype values for an association response header.
+   */
   void SetAssocResp (void);
+  /**
+   * Set Type/Subtype values for a probe request header.
+   */
   void SetProbeReq (void);
+  /**
+   * Set Type/Subtype values for a probe response header.
+   */
   void SetProbeResp (void);
+  /**
+   * Set Type/Subtype values for a beacon header.
+   */
   void SetBeacon (void);
+  /**
+   * Set Type/Subtype values for a data packet with
+   * no subtype equal to 0.
+   */
   void SetTypeData (void);
+  /**
+   * Set Type/Subtype values for an action header.
+   */
   void SetAction ();
+  /**
+   * Set Type/Subtype values for a Block Ack Request header.
+   */
   void SetBlockAckReq (void);
+  /**
+   * Set Type/Subtype values for a Block Ack header.
+   */
   void SetBlockAck (void);
+  /**
+   * Set Type/Subtype values for a multihop action header.
+   */
   void SetMultihopAction ();
+  /**
+   * Set the From DS bit in the Frame Control field.
+   */
   void SetDsFrom (void);
+  /**
+   * Un-set the From DS bit in the Frame Control field.
+   */
   void SetDsNotFrom (void);
+  /**
+   * Set the To DS bit in the Frame Control field.
+   */
   void SetDsTo (void);
+  /**
+   * Un-set the To DS bit in the Frame Control field.
+   */
   void SetDsNotTo (void);
+  /**
+   * Fill the Address 1 field with the given address.
+   *
+   * \param address the address to be used in the Address 1 field
+   */
   void SetAddr1 (Mac48Address address);
+  /**
+   * Fill the Address 2 field with the given address.
+   *
+   * \param address the address to be used in the Address 2 field
+   */
   void SetAddr2 (Mac48Address address);
+  /**
+   * Fill the Address 3 field with the given address.
+   *
+   * \param address the address to be used in the Address 3 field
+   */
   void SetAddr3 (Mac48Address address);
+  /**
+   * Fill the Address 4 field with the given address.
+   *
+   * \param address the address to be used in the Address 4 field
+   */
   void SetAddr4 (Mac48Address address);
+  /**
+   * Set Type/Subtype values with the correct values depending
+   * on the given type.
+   *
+   * \param type the WifiMacType for the header
+   */
   void SetType (enum WifiMacType type);
+  /**
+   * Set the Duration/ID field with the given raw uint16_t value.
+   *
+   * \param duration the raw duration in uint16_t
+   */
   void SetRawDuration (uint16_t duration);
+  /**
+   * Set the Duration/ID field with the given duration (Time object).
+   * The method converts the given time to microseconds.
+   *
+   * \param duration the duration (Time object)
+   */
   void SetDuration (Time duration);
+  /**
+   * Set the Duration/ID field with the given ID.
+   *
+   * \param id the ID
+   */
   void SetId (uint16_t id);
+  /**
+   * Set the sequence number of the header.
+   *
+   * \param seq the given sequence number
+   */
   void SetSequenceNumber (uint16_t seq);
+  /**
+   * Set the fragment number of the header.
+   *
+   * \param frag the given fragment number
+   */
   void SetFragmentNumber (uint8_t frag);
+  /**
+   * Un-set the More Fragment bit in the Frame Control Field
+   */
   void SetNoMoreFragments (void);
+  /**
+   * Set the More Fragment bit in the Frame Control field
+   */
   void SetMoreFragments (void);
+  /**
+   * Set the Retry bit in the Frame Control field.
+   */
   void SetRetry (void);
+  /**
+   * Un-set the Retry bit in the Frame Control field.
+   */
   void SetNoRetry (void);
+  /**
+   * Set the TID for the QoS header.
+   *
+   * \param tid the TID for the QoS header
+   */
   void SetQosTid (uint8_t tid);
+  /**
+   * Set the end of service period (EOSP) bit in the QoS control field.
+   */
   void SetQosEosp ();
+  /**
+   * Un-set the end of service period (EOSP) bit in the QoS control field.
+   */
   void SetQosNoEosp ();
-  void SetQosAckPolicy (enum QosAckPolicy);
+  /**
+   * Set the QoS ACK policy in the QoS control field.
+   *
+   * \param policy
+   */
+  void SetQosAckPolicy (enum QosAckPolicy policy);
+  /**
+   * Set the QoS ACK policy in the QoS control field to normal ACK.
+   */
   void SetQosNormalAck (void);
+  /**
+   * Set the QoS ACK policy in the QoS control field to block ACK.
+   */
   void SetQosBlockAck (void);
+  /**
+   * Set the QoS ACK policy in the QoS control field to no ACK.
+   */
   void SetQosNoAck (void);
+  /**
+   * Set that A-MSDU is present.
+   */
   void SetQosAmsdu (void);
+  /**
+   * Set that A-MSDU is not present.
+   */
   void SetQosNoAmsdu (void);
+  /**
+   * Set TXOP limit in the QoS control field.
+   *
+   * \param txop
+   */
   void SetQosTxopLimit (uint8_t txop);
+  /**
+   * Set order bit in the frame control field.
+   */
   void SetOrder (void);
+  /**
+   * Unset order bit in the frame control field.
+   */
   void SetNoOrder (void);
 
+  /**
+   * Return the address in the Address 1 field.
+   *
+   * \return the address in the Address 1 field
+   */
   Mac48Address GetAddr1 (void) const;
+  /**
+   * Return the address in the Address 2 field.
+   *
+   * \return the address in the Address 2 field
+   */
   Mac48Address GetAddr2 (void) const;
+  /**
+   * Return the address in the Address 3 field.
+   *
+   * \return the address in the Address 3 field
+   */
   Mac48Address GetAddr3 (void) const;
+  /**
+   * Return the address in the Address 4 field.
+   *
+   * \return the address in the Address 4 field
+   */
   Mac48Address GetAddr4 (void) const;
+  /**
+   * Return the type (enum WifiMacType)
+   *
+   * \return the type (enum WifiMacType)
+   */
   enum WifiMacType GetType (void) const;
+  /**
+   * \return true if From DS bit is set, false otherwise
+   */
   bool IsFromDs (void) const;
+  /**
+   * \return true if To DS bit is set, false otherwise
+   */
   bool IsToDs (void) const;
+  /**
+   * Return true if the Type is DATA.  The method does
+   * not check the Subtype field. (e.g. the header may be
+   * DATA with QoS)
+   *
+   * \return true if Type is DATA, false otherwise
+   */
   bool IsData (void) const;
+  /**
+   * Return true if the Type is DATA and Subtype is one of the
+   * possible values for QoS DATA.
+   *
+   * \return true if Type is QoS DATA, false otherwise
+   */
   bool IsQosData (void) const;
+  /**
+   * Return true if the Type is Control.
+   *
+   * \return true if Type is Control, false otherwise
+   */
   bool IsCtl (void) const;
+  /**
+   * Return true if the Type is Management.
+   *
+   * \return true if Type is Management, false otherwise
+   */
   bool IsMgt (void) const;
+  /**
+   * Return true if the Type/Subtype is one of the possible CF-Poll headers.
+   *
+   * \return true if the Type/Subtype is one of the possible CF-Poll headers, false otherwise
+   */
   bool IsCfpoll (void) const;
+  /**
+   * Return true if the header is a RTS header.
+   *
+   * \return true if the header is a RTS header, false otherwise
+   */
   bool IsRts (void) const;
+  /**
+   * Return true if the header is a CTS header.
+   *
+   * \return true if the header is a CTS header, false otherwise
+   */
   bool IsCts (void) const;
+  /**
+   * Return true if the header is an ACK header.
+   *
+   * \return true if the header is an ACK header, false otherwise
+   */
   bool IsAck (void) const;
+  /**
+   * Return true if the header is a Block ACK Request header.
+   *
+   * \return true if the header is a Block ACK Request header, false otherwise
+   */
   bool IsBlockAckReq (void) const;
+  /**
+   * Return true if the header is a Block ACK header.
+   *
+   * \return true if the header is a Block ACK header, false otherwise
+   */
   bool IsBlockAck (void) const;
+  /**
+   * Return true if the header is an Association Request header.
+   *
+   * \return true if the header is an Association Request header, false otherwise
+   */
   bool IsAssocReq (void) const;
+  /**
+   * Return true if the header is an Association Response header.
+   *
+   * \return true if the header is an Association Response header, false otherwise
+   */
   bool IsAssocResp (void) const;
+  /**
+   * Return true if the header is a Reassociation Request header.
+   *
+   * \return true if the header is a Reassociation Request header, false otherwise
+   */
   bool IsReassocReq (void) const;
+  /**
+   * Return true if the header is a Reassociation Response header.
+   *
+   * \return true if the header is a Reassociation Response header, false otherwise
+   */
   bool IsReassocResp (void) const;
+  /**
+   * Return true if the header is a Probe Request header.
+   *
+   * \return true if the header is a Probe Request header, false otherwise
+   */
   bool IsProbeReq (void) const;
+  /**
+   * Return true if the header is a Probe Response header.
+   *
+   * \return true if the header is a Probe Response header, false otherwise
+   */
   bool IsProbeResp (void) const;
+  /**
+   * Return true if the header is a Beacon header.
+   *
+   * \return true if the header is a Beacon header, false otherwise
+   */
   bool IsBeacon (void) const;
+  /**
+   * Return true if the header is a Disassociation header.
+   *
+   * \return true if the header is a Disassociation header, false otherwise
+   */
   bool IsDisassociation (void) const;
+  /**
+   * Return true if the header is an Authentication header.
+   *
+   * \return true if the header is an Authentication header, false otherwise
+   */
   bool IsAuthentication (void) const;
+  /**
+   * Return true if the header is a Deauthentication header.
+   *
+   * \return true if the header is a Deauthentication header, false otherwise
+   */
   bool IsDeauthentication (void) const;
+  /**
+   * Return true if the header is an Action header.
+   *
+   * \return true if the header is an Action header, false otherwise
+   */
   bool IsAction () const;
+  /**
+   * Check if the header is a Multihop action header.
+   *
+   * \return true if the header is a Multihop action header,
+   *         false otherwise
+   */
   bool IsMultihopAction () const;
+  /**
+   * Return the raw duration from the Duration/ID field.
+   *
+   * \return the raw duration from the Duration/ID field
+   */
   uint16_t GetRawDuration (void) const;
+  /**
+   * Return the duration from the Duration/ID field (Time object).
+   *
+   * \return the duration from the Duration/ID field (Time object)
+   */
   Time GetDuration (void) const;
+  /**
+   * Return the raw Sequence Control field.
+   *
+   * \return the raw Sequence Control field
+   */
   uint16_t GetSequenceControl (void) const;
+  /**
+   * Return the sequence number of the header.
+   *
+   * \return the sequence number of the header
+   */
   uint16_t GetSequenceNumber (void) const;
+  /**
+   * Return the fragment number of the header.
+   *
+   * \return the fragment number of the header
+   */
   uint16_t GetFragmentNumber (void) const;
+  /**
+   * Return if the Retry bit is set.
+   *
+   * \return true if the Retry bit is set, false otherwise
+   */
   bool IsRetry (void) const;
+  /**
+   * Return if the More Fragment bit is set.
+   *
+   * \return true if the More Fragment bit is set, false otherwise
+   */
   bool IsMoreFragments (void) const;
+  /**
+   * Return if the QoS ACK policy is Block ACK.
+   *
+   * \return true if the QoS ACK policy is Block ACK, false otherwise
+   */
   bool IsQosBlockAck (void) const;
+  /**
+   * Return if the QoS ACK policy is No ACK.
+   *
+   * \return true if the QoS ACK policy is No ACK, false otherwise
+   */
   bool IsQosNoAck (void) const;
+  /**
+   * Return if the QoS ACK policy is Normal ACK.
+   *
+   * \return true if the QoS ACK policy is No ACK, false otherwise
+   */
   bool IsQosAck (void) const;
+  /**
+   * Return if the end of service period (EOSP) is set.
+   *
+   * \return true if the end of service period (EOSP) is set, false otherwise
+   */
   bool IsQosEosp (void) const;
+  /**
+   * Check if the A-MSDU present bit is set in the QoS control field.
+   *
+   * \return true if the A-MSDU present bit is set,
+   *        false otherwise
+   */
   bool IsQosAmsdu (void) const;
+  /**
+   * Return the Traffic ID of a QoS header.
+   *
+   * \return the Traffic ID of a QoS header
+   */
   uint8_t GetQosTid (void) const;
+  /**
+   * Return the QoS ACK Policy of a QoS header.
+   *
+   * \return the QoS ACK Policy of a QoS header
+   */
   enum QosAckPolicy GetQosAckPolicy (void) const;
+  /**
+   * Return the TXOP limit.
+   *
+   * \return the TXOP limit
+   */
   uint8_t GetQosTxopLimit (void) const;
 
+  /**
+   * Return the size of the WifiMacHeader in octets.
+   * GetSerializedSize calls this function.
+   *
+   * \return the size of the WifiMacHeader in octets
+   */
   uint32_t GetSize (void) const;
+  /**
+   * Return a string corresponds to the header type.
+   *
+   * \returns a string corresponds to the header type.
+   */
   const char * GetTypeString (void) const;
 
 
 private:
+  /**
+   * Return the raw Frame Control field.
+   *
+   * \return the raw Frame Control field
+   */
   uint16_t GetFrameControl (void) const;
+  /**
+   * Return the raw QoS Control field.
+   *
+   * \return the raw QoS Control field
+   */
   uint16_t GetQosControl (void) const;
+  /**
+   * Set the Frame Control field with the given raw value.
+   *
+   * \param control the raw Frame Control field value
+   */
   void SetFrameControl (uint16_t control);
+  /**
+   * Set the Sequence Control field with the given raw value.
+   *
+   * \param seq the raw Sequence Control field value
+   */
   void SetSequenceControl (uint16_t seq);
+  /**
+   * Set the QoS Control field with the given raw value.
+   *
+   * \param qos the raw QoS Control field value
+   */
   void SetQosControl (uint16_t qos);
+  /**
+   * Print the Frame Control field to the output stream.
+   *
+   * \param os the output stream to print to
+   */
   void PrintFrameControl (std::ostream &os) const;
 
   uint8_t m_ctrlType;
diff -Naur ns-3.18.1/src/wifi/model/wifi-mac-queue.cc ns-3.19/src/wifi/model/wifi-mac-queue.cc
--- ns-3.18.1/src/wifi/model/wifi-mac-queue.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mac-queue.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiMacQueue);
+NS_OBJECT_ENSURE_REGISTERED (WifiMacQueue)
+  ;
 
 WifiMacQueue::Item::Item (Ptr<const Packet> packet,
                           const WifiMacHeader &hdr,
diff -Naur ns-3.18.1/src/wifi/model/wifi-mac-queue.h ns-3.19/src/wifi/model/wifi-mac-queue.h
--- ns-3.18.1/src/wifi/model/wifi-mac-queue.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mac-queue.h	2013-12-20 09:44:50.000000000 -0800
@@ -30,8 +30,6 @@
 #include "wifi-mac-header.h"
 
 namespace ns3 {
-
-class WifiMacParameters;
 class QosBlockedDestinations;
 
 /**
@@ -56,14 +54,58 @@
   WifiMacQueue ();
   ~WifiMacQueue ();
 
+  /**
+   * Set the maximum queue size.
+   *
+   * \param maxSize the maximum queue size
+   */
   void SetMaxSize (uint32_t maxSize);
+  /**
+   * Set the maximum delay before the packet is discarded.
+   *
+   * \param delay the maximum delay
+   */
   void SetMaxDelay (Time delay);
+  /**
+   * Return the maximum queue size.
+   *
+   * \return the maximum queue size
+   */
   uint32_t GetMaxSize (void) const;
+  /**
+   * Return the maximum delay before the packet is discarded.
+   *
+   * \return the maximum delay
+   */
   Time GetMaxDelay (void) const;
 
+  /**
+   * Enqueue the given packet and its corresponding WifiMacHeader at the <i>end</i> of the queue.
+   *
+   * \param packet the packet to be euqueued at the end
+   * \param hdr the header of the given packet
+   */
   void Enqueue (Ptr<const Packet> packet, const WifiMacHeader &hdr);
+  /**
+   * Enqueue the given packet and its corresponding WifiMacHeader at the <i>front</i> of the queue.
+   *
+   * \param packet the packet to be euqueued at the end
+   * \param hdr the header of the given packet
+   */
   void PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr);
+  /**
+   * Dequeue the packet in the front of the queue.
+   *
+   * \param hdr the WifiMacHeader of the packet
+   * \return the packet
+   */
   Ptr<const Packet> Dequeue (WifiMacHeader *hdr);
+  /**
+   * Peek the packet in the front of the queue. The packet is not removed.
+   *
+   * \param hdr the WifiMacHeader of the packet
+   * \return the packet
+   */
   Ptr<const Packet> Peek (WifiMacHeader *hdr);
   /**
    * Searchs and returns, if is present in this queue, first packet having
@@ -71,6 +113,12 @@
    * equals to <i>tid</i>. This method removes the packet from this queue.
    * Is typically used by ns3::EdcaTxopN in order to perform correct MSDU
    * aggregation (A-MSDU).
+   *
+   * \param hdr the header of the dequeued packet
+   * \param tid the given TID
+   * \param type the given address type
+   * \param addr the given destination
+   * \return packet
    */
   Ptr<const Packet> DequeueByTidAndAddress (WifiMacHeader *hdr,
                                             uint8_t tid,
@@ -82,6 +130,12 @@
    * equals to <i>tid</i>. This method doesn't remove the packet from this queue.
    * Is typically used by ns3::EdcaTxopN in order to perform correct MSDU
    * aggregation (A-MSDU).
+   *
+   * \param hdr the header of the dequeued packet
+   * \param tid the given TID
+   * \param type the given address type
+   * \param addr the given destination
+   * \return packet
    */
   Ptr<const Packet> PeekByTidAndAddress (WifiMacHeader *hdr,
                                          uint8_t tid,
@@ -91,11 +145,19 @@
    * If exists, removes <i>packet</i> from queue and returns true. Otherwise it
    * takes no effects and return false. Deletion of the packet is
    * performed in linear time (O(n)).
+   *
+   * \param packet the packet to be removed
+   * \return true if the packet was removed, false otherwise
    */
   bool Remove (Ptr<const Packet> packet);
   /**
    * Returns number of QoS packets having tid equals to <i>tid</i> and address
    * specified by <i>type</i> equals to <i>addr</i>.
+   *
+   * \param tid the given TID
+   * \param type the given address type
+   * \param addr the given destination
+   * \return the number of QoS packets
    */
   uint32_t GetNPacketsByTidAndAddress (uint8_t tid,
                                        WifiMacHeader::AddressType type,
@@ -106,44 +168,97 @@
    * respectively that index a pending agreement in the BlockAckManager object.
    * So that packet must not be transmitted until reception of an ADDBA response frame from station
    * addressed by <i>addr</i>. This method removes the packet from queue.
+   *
+   * \param hdr the header of the dequeued packet
+   * \param tStamp
+   * \param blockedPackets
+   * \return packet
    */
   Ptr<const Packet> DequeueFirstAvailable (WifiMacHeader *hdr,
                                            Time &tStamp,
                                            const QosBlockedDestinations *blockedPackets);
   /**
-   * Returns first available packet for transmission. The packet isn't removed from queue.
+   * Returns first available packet for transmission. The packet isn't removed from queue.  
+   *
+   * \param hdr the header of the dequeued packet
+   * \param tStamp
+   * \param blockedPackets
+   * \return packet
    */
   Ptr<const Packet> PeekFirstAvailable (WifiMacHeader *hdr,
                                         Time &tStamp,
                                         const QosBlockedDestinations *blockedPackets);
+  /**
+   * Flush the queue.
+   */
   void Flush (void);
 
+  /**
+   * Return if the queue is empty.
+   *
+   * \return true if the queue is empty, false otherwise
+   */
   bool IsEmpty (void);
+  /**
+   * Return the current queue size.
+   *
+   * \return the current queue size
+   */
   uint32_t GetSize (void);
-private:
+protected:
+  /**
+   * Clean up the queue by removing packets that exceeded the maximum delay.
+   */
+  virtual void Cleanup (void);
+
   struct Item;
 
+  /**
+   * typedef for packet (struct Item) queue.
+   */
   typedef std::list<struct Item> PacketQueue;
+  /**
+   * typedef for packet (struct Item) queue reverse iterator.
+   */
   typedef std::list<struct Item>::reverse_iterator PacketQueueRI;
+  /**
+   * typedef for packet (struct Item) queue iterator.
+   */
   typedef std::list<struct Item>::iterator PacketQueueI;
+  /**
+   * Return the appropriate address for the given packet (given by PacketQueue iterator).
+   *
+   * \param type
+   * \param it
+   * \return the address
+   */
+  Mac48Address GetAddressForPacket (enum WifiMacHeader::AddressType type, PacketQueueI it);
 
-  void Cleanup (void);
-  Mac48Address GetAddressForPacket (enum WifiMacHeader::AddressType type, PacketQueueI);
-
+  /**
+   * A struct that holds information about a packet for putting
+   * in a packet queue.
+   */
   struct Item
   {
+    /**
+     * Create a struct with the given parameters.
+     *
+     * \param packet
+     * \param hdr
+     * \param tstamp
+     */
     Item (Ptr<const Packet> packet,
           const WifiMacHeader &hdr,
           Time tstamp);
-    Ptr<const Packet> packet;
-    WifiMacHeader hdr;
-    Time tstamp;
+    Ptr<const Packet> packet; //!< Actual packet
+    WifiMacHeader hdr; //!< Wifi MAC header associated with the packet
+    Time tstamp; //!< timestamp when the packet arrived at the queue
   };
 
-  PacketQueue m_queue;
-  uint32_t m_size;
-  uint32_t m_maxSize;
-  Time m_maxDelay;
+  PacketQueue m_queue; //!< Packet (struct Item) queue
+  uint32_t m_size; //!< Current queue size
+  uint32_t m_maxSize; //!< Queue capacity
+  Time m_maxDelay; //!< Time to live for packets in the queue
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/wifi/model/wifi-mac-trailer.cc ns-3.19/src/wifi/model/wifi-mac-trailer.cc
--- ns-3.18.1/src/wifi/model/wifi-mac-trailer.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mac-trailer.cc	2013-12-20 09:44:50.000000000 -0800
@@ -22,7 +22,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiMacTrailer);
+NS_OBJECT_ENSURE_REGISTERED (WifiMacTrailer)
+  ;
 
 WifiMacTrailer::WifiMacTrailer ()
 {
diff -Naur ns-3.18.1/src/wifi/model/wifi-mode.cc ns-3.19/src/wifi/model/wifi-mode.cc
--- ns-3.18.1/src/wifi/model/wifi-mode.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mode.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,15 +24,37 @@
 
 namespace ns3 {
 
+/**
+ * Check if the two WifiModes are identical.
+ *
+ * \param a WifiMode
+ * \param b WifiMode
+ * \return true if the two WifiModes are identical,
+ *         false otherwise
+ */
 bool operator == (const WifiMode &a, const WifiMode &b)
 {
   return a.GetUid () == b.GetUid ();
 }
+/**
+ * Serialize WifiMode to ostream (human-readable).
+ *
+ * \param os std::ostream
+ * \param mode
+ * \return std::ostream
+ */
 std::ostream & operator << (std::ostream & os, const WifiMode &mode)
 {
   os << mode.GetUniqueName ();
   return os;
 }
+/**
+ * Serialize WifiMode from istream (human-readable).
+ *
+ * \param is std::istream
+ * \param mode
+ * \return std::istream
+ */
 std::istream & operator >> (std::istream &is, WifiMode &mode)
 {
   std::string str;
diff -Naur ns-3.18.1/src/wifi/model/wifi-mode.h ns-3.19/src/wifi/model/wifi-mode.h
--- ns-3.18.1/src/wifi/model/wifi-mode.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-mode.h	2013-12-20 09:44:50.000000000 -0800
@@ -150,9 +150,20 @@
    * its initialization.
    */
   WifiMode ();
+  /**
+   * Create a WifiMode if the given string represents a valid
+   * WifiMode name.
+   *
+   * \param name std::string of a valid WifiMode name
+   */
   WifiMode (std::string name);
 private:
   friend class WifiModeFactory;
+  /**
+   * Create a WifiMode from a given unique ID.
+   *
+   * \param uid unique ID
+   */
   WifiMode (uint32_t uid);
   uint32_t m_uid;
 };
@@ -175,9 +186,18 @@
  * WifiModeList type, and a corresponding iterator.
  */
 typedef std::vector<WifiMode> WifiModeList;
+/**
+ * An iterator for WifiModeList vector.
+ */
 typedef WifiModeList::const_iterator WifiModeListIterator;
 
+/**
+ * A list of Wi-Fi Modulation and Coding Scheme (MCS).
+ */
 typedef std::vector<uint8_t> WifiMcsList;
+/**
+ * An iterator for WifiMcsList vector.
+ */
 typedef WifiMcsList::const_iterator WifiMcsListIterator;
 
 /**
@@ -198,11 +218,12 @@
    *        associated WifiMode is used.
    * \param dataRate the rate (bits/second) at which the user data is transmitted
    * \param codingRate if convolutional coding is used for this rate
-   * then this parameter specifies the convolutional coding rate
-   * used. If there is no explicit convolutional coding step (e.g.,
-   * for DSSS rates) then the caller should set this parameter to
-   * WIFI_CODE_RATE_UNCODED.
+   *        then this parameter specifies the convolutional coding rate
+   *        used. If there is no explicit convolutional coding step (e.g.,
+   *        for DSSS rates) then the caller should set this parameter to
+   *        WIFI_CODE_RATE_UNCODED.
    * \param constellationSize the order of the constellation used.
+   * \return WifiMode
    *
    * Create a WifiMode.
    */
@@ -217,6 +238,12 @@
 private:
   friend class WifiMode;
   friend std::istream & operator >> (std::istream &is, WifiMode &mode);
+
+  /**
+   * Return a WifiModeFactory
+   *
+   * \return a WifiModeFactory
+   */
   static WifiModeFactory* GetFactory ();
   WifiModeFactory ();
 
@@ -237,10 +264,31 @@
     bool isMandatory;
   };
 
+  /**
+   * Search and return WifiMode from a given name.
+   *
+   * \param name human-readable WifiMode
+   * \return WifiMode
+   */
   WifiMode Search (std::string name);
-  uint32_t AllocateUid (std::string uniqueName);
+  /**
+   * Allocate a WifiModeItem from a given uniqueUid.
+   *
+   * \param uniqueUid
+   * \return uid
+   */
+  uint32_t AllocateUid (std::string uniqueUid);
+  /**
+   * Return a WifiModeItem at the given uid index.
+   *
+   * \param uid
+   * \return WifiModeItem at the given uid
+   */
   WifiModeItem* Get (uint32_t uid);
 
+  /**
+   * typedef for a vector of WifiModeItem.
+   */
   typedef std::vector<struct WifiModeItem> WifiModeItemList;
   WifiModeItemList m_itemList;
 };
diff -Naur ns-3.18.1/src/wifi/model/wifi-net-device.cc ns-3.19/src/wifi/model/wifi-net-device.cc
--- ns-3.18.1/src/wifi/model/wifi-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (WifiNetDevice)
+  ;
 
 TypeId
 WifiNetDevice::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/wifi-net-device.h ns-3.19/src/wifi/model/wifi-net-device.h
--- ns-3.18.1/src/wifi/model/wifi-net-device.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-net-device.h	2013-12-20 09:44:50.000000000 -0800
@@ -109,17 +109,41 @@
   virtual bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
   virtual void SetPromiscReceiveCallback (PromiscReceiveCallback cb);
   virtual bool SupportsSendFrom (void) const;
-
+protected:
+   virtual void DoDispose (void);
+   virtual void DoInitialize (void);
+  /**
+   * Receive a packet from the lower layer and pass the
+   * packet up the stack.
+   *
+   * \param packet
+   * \param from
+   * \param to
+   */
+   void ForwardUp (Ptr<Packet> packet, Mac48Address from, Mac48Address to);
 private:
   // This value conforms to the 802.11 specification
   static const uint16_t MAX_MSDU_SIZE = 2304;
 
-  virtual void DoDispose (void);
-  virtual void DoInitialize (void);
-  void ForwardUp (Ptr<Packet> packet, Mac48Address from, Mac48Address to);
+  /**
+   * Set that the link is up. A link is always up in ad-hoc mode.
+   * For a STA, a link is up when the STA is associated with an AP.
+   */
   void LinkUp (void);
+  /**
+   * Set that the link is down (i.e. STA is not associated).
+   */
   void LinkDown (void);
+  /**
+   * Return the WifiChannel this device is connected to.
+   *
+   * \return WifiChannel
+   */
   Ptr<WifiChannel> DoGetChannel (void) const;
+  /**
+   * Complete the configuration of this Wi-Fi device by
+   * connecting all lower components (e.g. MAC, WifiRemoteStation) together.
+   */
   void CompleteConfig (void);
 
   Ptr<Node> m_node;
diff -Naur ns-3.18.1/src/wifi/model/wifi-phy.cc ns-3.19/src/wifi/model/wifi-phy.cc
--- ns-3.18.1/src/wifi/model/wifi-phy.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -48,7 +48,8 @@
  *       The actual WifiPhy class
  ****************************************************************/
 
-NS_OBJECT_ENSURE_REGISTERED (WifiPhy);
+NS_OBJECT_ENSURE_REGISTERED (WifiPhy)
+  ;
 
 TypeId
 WifiPhy::GetTypeId (void)
@@ -260,7 +261,7 @@
             }
       }
     case WIFI_MOD_CLASS_ERP_OFDM:
-      return 16;
+      return 4;
 
     case WIFI_MOD_CLASS_DSSS:
       if (preamble == WIFI_PREAMBLE_SHORT)
@@ -309,7 +310,7 @@
            return 16;
       }
     case WIFI_MOD_CLASS_ERP_OFDM:
-      return 4;
+      return 16;
 
     case WIFI_MOD_CLASS_DSSS:
       if (preamble == WIFI_PREAMBLE_SHORT)
@@ -498,9 +499,7 @@
 }
 
 
-/**
- * Clause 15 rates (DSSS)
- */
+// Clause 15 rates (DSSS)
 
 WifiMode
 WifiPhy::GetDsssRate1Mbps ()
@@ -529,9 +528,8 @@
 }
 
 
-/**
- * Clause 18 rates (HR/DSSS)
- */
+// Clause 18 rates (HR/DSSS)
+
 WifiMode
 WifiPhy::GetDsssRate5_5Mbps ()
 {
@@ -559,9 +557,8 @@
 }
 
 
-/**
- * Clause 19.5 rates (ERP-OFDM)
- */
+// Clause 19.5 rates (ERP-OFDM)
+
 WifiMode
 WifiPhy::GetErpOfdmRate6Mbps ()
 {
@@ -667,9 +664,8 @@
 }
 
 
-/**
- * Clause 17 rates (OFDM)
- */
+// Clause 17 rates (OFDM)
+
 WifiMode
 WifiPhy::GetOfdmRate6Mbps ()
 {
@@ -774,7 +770,8 @@
   return mode;
 }
 
-/* 10 MHz channel rates */
+// 10 MHz channel rates
+
 WifiMode
 WifiPhy::GetOfdmRate3MbpsBW10MHz ()
 {
@@ -879,7 +876,8 @@
   return mode;
 }
 
-/* 5 MHz channel rates */
+// 5 MHz channel rates
+
 WifiMode
 WifiPhy::GetOfdmRate1_5MbpsBW5MHz ()
 {
@@ -984,7 +982,7 @@
   return mode;
 }
 
-/*Clause 20*/
+// Clause 20
 
 WifiMode
 WifiPhy::GetOfdmRate6_5MbpsBW20MHz ()
diff -Naur ns-3.18.1/src/wifi/model/wifi-phy.h ns-3.19/src/wifi/model/wifi-phy.h
--- ns-3.18.1/src/wifi/model/wifi-phy.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-phy.h	2013-12-20 09:44:50.000000000 -0800
@@ -162,10 +162,20 @@
   WifiPhy ();
   virtual ~WifiPhy ();
 
+  /**
+   * Return the minimum available transmission power level (dBm).
+   *
+   * \return the minimum available transmission power level in dBm
+   */
   virtual double GetTxPowerStart (void) const = 0;
+  /**
+   * Return the maximum available transmission power level (dBm).
+   *
+   * \return the maximum available transmission power level in dBm
+   */
   virtual double GetTxPowerEnd (void) const = 0;
   /**
-   * \returns the number of tx power levels available for this PHY.
+   * \return the number of tx power levels available for this PHY.
    */
   virtual uint32_t GetNTxPower (void) const = 0;
 
@@ -198,41 +208,46 @@
   virtual void RegisterListener (WifiPhyListener *listener) = 0;
 
   /**
-   * \returns true of the current state of the PHY layer is WifiPhy::IDLE, false otherwise.
+   * \return true of the current state of the PHY layer is WifiPhy::IDLE, false otherwise.
    */
   virtual bool IsStateIdle (void) = 0;
   /**
-   * \returns true of the current state of the PHY layer is WifiPhy::CCA_BUSY, false otherwise.
+   * \return true of the current state of the PHY layer is WifiPhy::CCA_BUSY, false otherwise.
    */
   virtual bool IsStateCcaBusy (void) = 0;
   /**
-   * \returns true of the current state of the PHY layer is not WifiPhy::IDLE, false otherwise.
+   * \return true of the current state of the PHY layer is not WifiPhy::IDLE, false otherwise.
    */
   virtual bool IsStateBusy (void) = 0;
   /**
-   * \returns true of the current state of the PHY layer is WifiPhy::RX, false otherwise.
+   * \return true of the current state of the PHY layer is WifiPhy::RX, false otherwise.
    */
   virtual bool IsStateRx (void) = 0;
   /**
-   * \returns true of the current state of the PHY layer is WifiPhy::TX, false otherwise.
+   * \return true of the current state of the PHY layer is WifiPhy::TX, false otherwise.
    */
   virtual bool IsStateTx (void) = 0;
   /**
-   * \returns true of the current state of the PHY layer is WifiPhy::SWITCHING, false otherwise.
+   * \return true of the current state of the PHY layer is WifiPhy::SWITCHING, false otherwise.
    */
   virtual bool IsStateSwitching (void) = 0;
   /**
-   * \returns the amount of time since the current state has started.
+   * \return the amount of time since the current state has started.
    */
   virtual Time GetStateDuration (void) = 0;
   /**
-   * \returns the predicted delay until this PHY can become WifiPhy::IDLE.
+   * \return the predicted delay until this PHY can become WifiPhy::IDLE.
    *
    * The PHY will never become WifiPhy::IDLE _before_ the delay returned by
    * this method but it could become really idle later.
    */
   virtual Time GetDelayUntilIdle (void) = 0;
 
+  /**
+   * Return the start time of the last received packet.
+   *
+   * \return the start time of the last received packet
+   */
   virtual Time GetLastRxStartTime (void) const = 0;
 
   /**
@@ -313,7 +328,7 @@
    * WifiRemoteStationManager), which itself is a superset (again, not
    * necessarily proper) of the BSSBasicRateSet.
    *
-   * \returns the number of transmission modes supported by this PHY.
+   * \return the number of transmission modes supported by this PHY.
    *
    * \sa WifiPhy::GetMode()
    */
@@ -332,7 +347,7 @@
    * necessarily proper) of the BSSBasicRateSet.
    *
    * \param mode index in array of supported modes
-   * \returns the mode whose index is specified.
+   * \return the mode whose index is specified.
    *
    * \sa WifiPhy::GetNModes()
    */
@@ -340,12 +355,12 @@
   /**
    * \param txMode the transmission mode
    * \param ber the probability of bit error rate
-   * \returns the minimum snr which is required to achieve
+   * \return the minimum snr which is required to achieve
    *          the requested ber for the specified transmission mode. (W/W)
    */
   virtual double CalculateSnr (WifiMode txMode, double ber) const = 0;
    /**
-   * The WifiPhy::NBssMembershipSelectors() and WifiPhy::BssMembershipSelector() methods are used
+   * The WifiPhy::NBssMembershipSelectors() method is used
    * (e.g., by a WifiRemoteStationManager) to determine the set of
    * transmission/reception modes that this WifiPhy(-derived class)
    * can support - a set of WifiMode objects which we call the
@@ -353,13 +368,22 @@
    *
    * This was introduced with 11n
    *
-   * \param selector index in array of supported memeberships
-   * \returns the memebership selector whose index is specified.
-   *
-   * \sa WifiPhy::NBssMembershipSelectors()
+   * \return the memebership selector whose index is specified.
    */
   virtual uint32_t GetNBssMembershipSelectors (void) const=0;
 
+   /**
+   * The WifiPhy::BssMembershipSelector() method is used
+   * (e.g., by a WifiRemoteStationManager) to determine the set of
+   * transmission/reception modes that this WifiPhy(-derived class)
+   * can support - a set of WifiMode objects which we call the
+   * BssMemebershipSelectorSet, and which is stored as WifiPhy::m_bssMembershipSelectorSet.
+   *
+   * This was introduced with 11n
+   *
+   * \param selector index in array of supported memeberships
+   * \return the memebership selector whose index is specified.
+   */
   virtual uint32_t GetBssMembershipSelector (uint32_t selector) const=0;
   /**
    * The WifiPhy::GetMembershipSelectorModes() method is used
@@ -371,13 +395,13 @@
    * This was introduced with 11n
    *
    * \param selector index in array of supported memeberships
-   * \returns a WifiModeList that contains the WifiModes associrated with the selected index.
+   * \return a WifiModeList that contains the WifiModes associrated with the selected index.
    *
    * \sa WifiPhy::GetMembershipSelectorModes()
    */
   virtual WifiModeList GetMembershipSelectorModes(uint32_t selector)=0;
   /**
-   * The WifiPhy::GetNMcs() and  WifiPhy::GetMcs() methods are used
+   * The WifiPhy::GetNMcs() method is used
    * (e.g., by a WifiRemoteStationManager) to determine the set of
    * transmission/reception MCS indexes that this WifiPhy(-derived class)
    * can support - a set of Mcs indexes which we call the
@@ -385,16 +409,38 @@
    *
    * This was introduced with 11n
    *
-   * \param Mcs index in array of supported Mcs
-   * \returns the Mcs index whose index is specified.
-   *
-   * \sa WifiPhy::GetNMcs()
+   * \return the Mcs index whose index is specified.
    */
   virtual uint8_t GetNMcs (void) const=0;
+  /**
+   * The WifiPhy::GetMcs() method is used
+   * (e.g., by a WifiRemoteStationManager) to determine the set of
+   * transmission/reception MCS indexes that this WifiPhy(-derived class)
+   * can support - a set of Mcs indexes which we call the
+   * DeviceMcsSet, and which is stored as WifiPhy::m_deviceMcsSet.
+   *
+   * This was introduced with 11n
+   *
+   * \param mcs index in array of supported Mcs
+   * \return the Mcs index whose index is specified.
+   */
   virtual uint8_t GetMcs (uint8_t mcs) const=0;
 
-  /* Converts from DataRate to MCS index and vice versa */
+  /**
+  * For a given WifiMode finds the corresponding MCS value and returns it 
+  * as defined in the IEEE 802.11n standard 
+  *
+  * \param mode the WifiMode
+  * \return the MCS number that corresponds to the given WifiMode
+  */
   virtual uint32_t WifiModeToMcs (WifiMode mode)=0;
+ /**
+  * For a given MCS finds the corresponding WifiMode and returns it 
+  * as defined in the IEEE 802.11n standard. 
+  * 
+  * \param mcs the MCS number 
+  * \return the WifiMode that corresponds to the given mcs number
+  */
   virtual WifiMode McsToWifiMode (uint8_t mcs)=0;
 
   
@@ -405,119 +451,489 @@
    *
    * where Starting channel frequency is standard-dependent, see SetStandard()
    * as defined in IEEE 802.11-2007 17.3.8.3.2.
+   *
+   * \param id the channel number
    */
   virtual void SetChannelNumber (uint16_t id) = 0;
-  /// Return current channel number, see SetChannelNumber()
+  /**  
+   * Return current channel number.
+   *
+   * \return the current channel number
+   */
   virtual uint16_t GetChannelNumber () const = 0;
 
+  /**
+   * Configure the PHY-level parameters for different Wi-Fi standard.
+   *
+   * \param standard the Wi-Fi standard
+   */
   virtual void ConfigureStandard (enum WifiPhyStandard standard) = 0;
 
+  /**
+   * Return the WifiChannel this WifiPhy is connected to.
+   *
+   * \return the WifiChannel this WifiPhy is connected to
+   */
   virtual Ptr<WifiChannel> GetChannel (void) const = 0;
 
+  /**
+   * Return a WifiMode for DSSS at 1Mbps.
+   *
+   * \return a WifiMode for DSSS at 1Mbps
+   */
   static WifiMode GetDsssRate1Mbps ();
+  /**
+   * Return a WifiMode for DSSS at 2Mbps.
+   *
+   * \return a WifiMode for DSSS at 2Mbps
+   */
   static WifiMode GetDsssRate2Mbps ();
+  /**
+   * Return a WifiMode for DSSS at 5.5Mbps.
+   *
+   * \return a WifiMode for DSSS at 5.5Mbps
+   */
   static WifiMode GetDsssRate5_5Mbps ();
+  /**
+   * Return a WifiMode for DSSS at 11Mbps.
+   *
+   * \return a WifiMode for DSSS at 11Mbps
+   */
   static WifiMode GetDsssRate11Mbps ();
+  /**
+   * Return a WifiMode for ERP-ODFM at 6Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 6Mbps
+   */
   static WifiMode GetErpOfdmRate6Mbps ();
+  /**
+   * Return a WifiMode for ERP-ODFM at 9Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 9Mbps
+   */
   static WifiMode GetErpOfdmRate9Mbps ();
+  /**
+   * Return a WifiMode for ERP-ODFM at 12Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 12Mbps
+   */
   static WifiMode GetErpOfdmRate12Mbps ();
+  /**
+   * Return a WifiMode for ERP-ODFM at 18Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 18Mbps
+   */
   static WifiMode GetErpOfdmRate18Mbps ();
+  /**
+   * Return a WifiMode for ERP-ODFM at 24Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 24Mbps
+   */
   static WifiMode GetErpOfdmRate24Mbps ();
+  /**
+   * Return a WifiMode for ERP-ODFM at 36Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 36Mbps
+   */
   static WifiMode GetErpOfdmRate36Mbps ();
+  /**
+   * Return a WifiMode for ERP-ODFM at 48Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 48Mbps
+   */
   static WifiMode GetErpOfdmRate48Mbps ();
+  /**
+   * Return a WifiMode for ERP-ODFM at 54Mbps.
+   *
+   * \return a WifiMode for ERP-OFDM at 54Mbps
+   */
   static WifiMode GetErpOfdmRate54Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 6Mbps.
+   *
+   * \return a WifiMode for OFDM at 6Mbps
+   */
   static WifiMode GetOfdmRate6Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 9Mbps.
+   *
+   * \return a WifiMode for OFDM at 9Mbps
+   */
   static WifiMode GetOfdmRate9Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 12Mbps.
+   *
+   * \return a WifiMode for OFDM at 12Mbps
+   */
   static WifiMode GetOfdmRate12Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 18Mbps.
+   *
+   * \return a WifiMode for OFDM at 18Mbps
+   */
   static WifiMode GetOfdmRate18Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 24Mbps.
+   *
+   * \return a WifiMode for OFDM at 24Mbps
+   */
   static WifiMode GetOfdmRate24Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 36Mbps.
+   *
+   * \return a WifiMode for OFDM at 36Mbps
+   */
   static WifiMode GetOfdmRate36Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 48Mbps.
+   *
+   * \return a WifiMode for OFDM at 48Mbps
+   */
   static WifiMode GetOfdmRate48Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 54Mbps.
+   *
+   * \return a WifiMode for OFDM at 54Mbps
+   */
   static WifiMode GetOfdmRate54Mbps ();
+  /**
+   * Return a WifiMode for ODFM at 3Mbps with 10MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 3Mbps with 10MHz channel spacing
+   */
   static WifiMode GetOfdmRate3MbpsBW10MHz ();
+  /**
+   * Return a WifiMode for ODFM at 4.5Mbps with 10MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 4.5Mbps with 10MHz channel spacing
+   */
   static WifiMode GetOfdmRate4_5MbpsBW10MHz ();
+  /**
+   * Return a WifiMode for ODFM at 6Mbps with 10MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 6Mbps with 10MHz channel spacing
+   */
   static WifiMode GetOfdmRate6MbpsBW10MHz ();
+  /**
+   * Return a WifiMode for ODFM at 9Mbps with 10MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 9Mbps with 10MHz channel spacing
+   */
   static WifiMode GetOfdmRate9MbpsBW10MHz ();
+  /**
+   * Return a WifiMode for ODFM at 12Mbps with 10MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 12Mbps with 10MHz channel spacing
+   */
   static WifiMode GetOfdmRate12MbpsBW10MHz ();
+  /**
+   * Return a WifiMode for ODFM at 18Mbps with 10MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 18Mbps with 10MHz channel spacing
+   */
   static WifiMode GetOfdmRate18MbpsBW10MHz ();
+  /**
+   * Return a WifiMode for ODFM at 24Mbps with 10MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 24Mbps with 10MHz channel spacing
+   */
   static WifiMode GetOfdmRate24MbpsBW10MHz ();
+  /**
+   * Return a WifiMode for ODFM at 27Mbps with 10MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 27Mbps with 10MHz channel spacing
+   */
   static WifiMode GetOfdmRate27MbpsBW10MHz ();
+  /**
+   * Return a WifiMode for ODFM at 1.5Mbps with 5MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 1.5Mbps with 5MHz channel spacing
+   */
   static WifiMode GetOfdmRate1_5MbpsBW5MHz ();
+  /**
+   * Return a WifiMode for ODFM at 2.25Mbps with 5MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 2.25Mbps with 5MHz channel spacing
+   */
   static WifiMode GetOfdmRate2_25MbpsBW5MHz ();
+  /**
+   * Return a WifiMode for ODFM at 3Mbps with 5MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 3Mbps with 5MHz channel spacing
+   */
   static WifiMode GetOfdmRate3MbpsBW5MHz ();
+  /**
+   * Return a WifiMode for ODFM at 4.5Mbps with 5MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 4.5Mbps with 5MHz channel spacing
+   */
   static WifiMode GetOfdmRate4_5MbpsBW5MHz ();
+  /**
+   * Return a WifiMode for ODFM at 6Mbps with 5MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 6Mbps with 5MHz channel spacing
+   */
   static WifiMode GetOfdmRate6MbpsBW5MHz ();
+  /**
+   * Return a WifiMode for ODFM at 9Mbps with 5MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 9Mbps with 5MHz channel spacing
+   */
   static WifiMode GetOfdmRate9MbpsBW5MHz ();
+  /**
+   * Return a WifiMode for ODFM at 12Mbps with 5MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 12Mbps with 5MHz channel spacing
+   */
   static WifiMode GetOfdmRate12MbpsBW5MHz ();
+  /**
+   * Return a WifiMode for ODFM at 13.5Mbps with 5MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 13.5Mbps with 5MHz channel spacing
+   */
   static WifiMode GetOfdmRate13_5MbpsBW5MHz ();
+  /**
+   * Return a WifiMode for ODFM at 6.5Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 6.5Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate6_5MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 13Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 13Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate13MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 19.5Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 19.5Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate19_5MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 26Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 26Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate26MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 39Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 39Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate39MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 52Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 52Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate52MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 58.5Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 58.5Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate58_5MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 65Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 65Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate65MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 13.5Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 13.5Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate13_5MbpsBW40MHz ();
-  static WifiMode GetOfdmRate27MbpsBW40MHz (); 
+  /**
+   * Return a WifiMode for ODFM at 27Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 27Mbps with 40MHz channel spacing
+   */
+  static WifiMode GetOfdmRate27MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 40.5Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 40.5Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate40_5MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 54Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 54Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate54MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 81Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 81Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate81MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 108Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 108Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate108MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 121.5Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 121.5Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate121_5MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 135Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 135Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate135MbpsBW40MHz ();
   //Rates for clause 20 with short guard interval
+  /**
+   * Return a WifiMode for ODFM at 7.2Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 7.2Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate7_2MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 14.4Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 14.4Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate14_4MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 21.7Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 21.7Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate21_7MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 28.9Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 28.9Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate28_9MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 43.3Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 43.3Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate43_3MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 57.8Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 57.8Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate57_8MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 65Mbps with 20MHz channel spacing.
+   * The rate supports short guard interval.
+   *
+   * \return a WifiMode for OFDM at 65Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate65MbpsBW20MHzShGi ();
+  /**
+   * Return a WifiMode for ODFM at 72.2Mbps with 20MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 72.2Mbps with 20MHz channel spacing
+   */
   static WifiMode GetOfdmRate72_2MbpsBW20MHz ();
+  /**
+   * Return a WifiMode for ODFM at 15Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 15Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate15MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 30Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 30Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate30MbpsBW40MHz (); 
+  /**
+   * Return a WifiMode for ODFM at 45Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 45Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate45MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 60Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 60Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate60MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 90Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 90Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate90MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 120Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 120Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate120MbpsBW40MHz ();
+  /**
+   * Return a WifiMode for ODFM at 135Mbps with 40MHz channel spacing.
+   * The rate supports short guard interval.
+   *
+   * \return a WifiMode for OFDM at 135Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate135MbpsBW40MHzShGi ();
+  /**
+   * Return a WifiMode for ODFM at 150Mbps with 40MHz channel spacing.
+   *
+   * \return a WifiMode for OFDM at 150Mbps with 40MHz channel spacing
+   */
   static WifiMode GetOfdmRate150MbpsBW40MHz ();
 
 
   /**
    * Public method used to fire a PhyTxBegin trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet the packet being transmitted
    */
   void NotifyTxBegin (Ptr<const Packet> packet);
 
   /**
    * Public method used to fire a PhyTxEnd trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet the packet that was transmitted
    */
   void NotifyTxEnd (Ptr<const Packet> packet);
 
   /**
    * Public method used to fire a PhyTxDrop trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet the packet that was failed to transmitted
    */
   void NotifyTxDrop (Ptr<const Packet> packet);
 
   /**
    * Public method used to fire a PhyRxBegin trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet the packet being received
    */
   void NotifyRxBegin (Ptr<const Packet> packet);
 
   /**
    * Public method used to fire a PhyRxEnd trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet the packet received
    */
   void NotifyRxEnd (Ptr<const Packet> packet);
 
   /**
    * Public method used to fire a PhyRxDrop trace.  Implemented for encapsulation
    * purposes.
+   *
+   * \param packet the packet that was not successfully received
    */
   void NotifyRxDrop (Ptr<const Packet> packet);
 
@@ -526,20 +942,20 @@
    * Public method used to fire a MonitorSniffer trace for a wifi packet being received.  Implemented for encapsulation
    * purposes.
    *
-   * @param packet the packet being received
-   * @param channelFreqMhz the frequency in MHz at which the packet is
-   * received. Note that in real devices this is normally the
-   * frequency to which  the receiver is tuned, and this can be
-   * different than the frequency at which the packet was originally
-   * transmitted. This is because it is possible to have the receiver
-   * tuned on a given channel and still to be able to receive packets
-   * on a nearby channel.
-   * @param channelNumber the channel on which the packet is received
-   * @param rate the PHY data rate in units of 500kbps (i.e., the same
-   * units used both for the radiotap and for the prism header)
-   * @param isShortPreamble true if short preamble is used, false otherwise
-   * @param signalDbm signal power in dBm
-   * @param noiseDbm  noise power in dBm
+   * \param packet the packet being received
+   * \param channelFreqMhz the frequency in MHz at which the packet is
+   *        received. Note that in real devices this is normally the
+   *        frequency to which  the receiver is tuned, and this can be
+   *        different than the frequency at which the packet was originally
+   *        transmitted. This is because it is possible to have the receiver
+   *        tuned on a given channel and still to be able to receive packets
+   *        on a nearby channel.
+   * \param channelNumber the channel on which the packet is received
+   * \param rate the PHY data rate in units of 500kbps (i.e., the same
+   *        units used both for the radiotap and for the prism header)
+   * \param isShortPreamble true if short preamble is used, false otherwise
+   * \param signalDbm signal power in dBm
+   * \param noiseDbm  noise power in dBm
    */
   void NotifyMonitorSniffRx (Ptr<const Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble,
                              double signalDbm, double noiseDbm);
@@ -549,13 +965,14 @@
    * Public method used to fire a MonitorSniffer trace for a wifi packet being transmitted.  Implemented for encapsulation
    * purposes.
    *
-   * @param packet the packet being transmitted
-   * @param channelFreqMhz the frequency in MHz at which the packet is
-   * transmitted.
-   * @param channelNumber the channel on which the packet is transmitted
-   * @param rate the PHY data rate in units of 500kbps (i.e., the same
-   * units used both for the radiotap and for the prism header)
-   * @param isShortPreamble true if short preamble is used, false otherwise
+   * \param packet the packet being transmitted
+   * \param channelFreqMhz the frequency in MHz at which the packet is
+   *        transmitted.
+   * \param channelNumber the channel on which the packet is transmitted
+   * \param rate the PHY data rate in units of 500kbps (i.e., the same
+   *        units used both for the radiotap and for the prism header)
+   * \param isShortPreamble true if short preamble is used, false otherwise
+   * \param txPower the transmission power in dBm
    */
   void NotifyMonitorSniffTx (Ptr<const Packet> packet, uint16_t channelFreqMhz, uint16_t channelNumber, uint32_t rate, bool isShortPreamble, uint8_t txPower);
 
@@ -570,63 +987,69 @@
   virtual int64_t AssignStreams (int64_t stream) = 0;
 
   /**
-   * \param the operating frequency on this node.
+   * \param freq the operating frequency on this node.
    */
   virtual void SetFrequency (uint32_t freq)=0;
+  /**
+   * \return the operating frequency on this node
+   */
   virtual uint32_t GetFrequency (void) const=0;
   /**
-   * \param the number of transmitters on this node.
+   * \param tx the number of transmitters on this node.
    */
   virtual void SetNumberOfTransmitAntennas (uint32_t tx)=0;
 
+  /**
+   * \return the number of transmit antenna on this device
+   */
   virtual uint32_t GetNumberOfTransmitAntennas (void) const=0;
    /**
-   * \param the number of recievers on this node.
+   * \param rx the number of recievers on this node.
    */
   virtual void SetNumberOfReceiveAntennas (uint32_t rx)=0 ;
   /**
-   * \returns the number of recievers on this node.
+   * \return the number of recievers on this node.
    */
   virtual uint32_t GetNumberOfReceiveAntennas (void) const=0;
   /**
-   * \paramif short guard interval is supported or not
+   * \param guardInterval Enable or disable short guard interval
    */
-   virtual void SetGuardInterval (bool GuardInterval)=0;
+   virtual void SetGuardInterval (bool guardInterval)=0;
    /**
-   *  \returns if short guard interval is supported or not
+   *  \return true if short guard interval is supported, false otherwise
    */
   virtual bool GetGuardInterval (void) const = 0;
   /**
-   * \paramif LDPC is supported or not
+   * \param ldpc Enable or disable LDPC
    */
-  virtual void SetLdpc (bool Ldpc)=0;
+  virtual void SetLdpc (bool ldpc)=0;
   /**
-   * \returns if LDPC is supported or not
+   * \return true if LDPC is supported, false otherwise
    */
   virtual bool GetLdpc (void) const=0;
   /**
-   * \paramif STBC is supported or not
+   * \param stbc Enable or disable STBC is supported
    */
   virtual void SetStbc (bool stbc)=0;
   /**
-   *  \returns if STBC is supported or not
+   *  \return true if STBC is supported, false otherwise
    */
   virtual bool GetStbc (void) const=0;
    
   /**
-   * \paramif GreenField is supported or not
+   * \param greenfield Enable or disable GreenField
    */
   virtual void SetGreenfield (bool greenfield)=0;
   /**
-   *  \returns if Green field is supported or not
+   * \return true if Greenfield is supported, false otherwise
    */
   virtual bool GetGreenfield (void) const=0;
   /**
-   * \paramif channel bonding 40 MHz is supported or not
+   * \return true if channel bonding 40 MHz is supported, false otherwise
    */
   virtual bool GetChannelBonding (void) const = 0;
   /**
-   *  \returns if channel bonding is supported or not
+   *  \param channelbonding Enable or disable channel bonding
    */
   virtual void SetChannelBonding (bool channelbonding) = 0 ;
 
@@ -707,6 +1130,7 @@
 /**
  * \param os          output stream
  * \param state       wifi state to stringify
+ * \return output stream
  */
 std::ostream& operator<< (std::ostream& os, enum WifiPhy::State state);
 
diff -Naur ns-3.18.1/src/wifi/model/wifi-phy-state-helper.cc ns-3.19/src/wifi/model/wifi-phy-state-helper.cc
--- ns-3.18.1/src/wifi/model/wifi-phy-state-helper.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-phy-state-helper.cc	2013-12-20 09:44:50.000000000 -0800
@@ -26,7 +26,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiPhyStateHelper);
+NS_OBJECT_ENSURE_REGISTERED (WifiPhyStateHelper)
+  ;
 
 TypeId
 WifiPhyStateHelper::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/wifi-phy-state-helper.h ns-3.19/src/wifi/model/wifi-phy-state-helper.h
--- ns-3.18.1/src/wifi/model/wifi-phy-state-helper.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-phy-state-helper.h	2013-12-20 09:44:50.000000000 -0800
@@ -39,40 +39,179 @@
 
   WifiPhyStateHelper ();
 
+  /**
+   * Set a callback for a successful reception.
+   *
+   * \param callback
+   */
   void SetReceiveOkCallback (WifiPhy::RxOkCallback callback);
+  /**
+   * Set a callback for a failed reception.
+   *
+   * \param callback
+   */
   void SetReceiveErrorCallback (WifiPhy::RxErrorCallback callback);
+  /**
+   * Register WifiPhyListener to this WifiPhyStateHelper.
+   *
+   * \param listener
+   */
   void RegisterListener (WifiPhyListener *listener);
+  /**
+   * Return the current state of WifiPhy.
+   *
+   * \return the current state of WifiPhy
+   */
   enum WifiPhy::State GetState (void);
+  /**
+   * Check whether the current state is CCA busy.
+   *
+   * \return true if the current state is CCA busy, false otherwise
+   */
   bool IsStateCcaBusy (void);
+  /**
+   * Check whether the current state is IDLE.
+   *
+   * \return true if the current state is IDLE, false otherwise
+   */
   bool IsStateIdle (void);
+  /**
+   * Check whether the current state is not IDLE.
+   *
+   * \return true if the current state is not IDLE, false otherwise
+   */
   bool IsStateBusy (void);
+  /**
+   * Check whether the current state is RX.
+   *
+   * \return true if the current state is RX, false otherwise
+   */
   bool IsStateRx (void);
+  /**
+   * Check whether the current state is TX.
+   *
+   * \return true if the current state is TX, false otherwise
+   */
   bool IsStateTx (void);
+  /**
+   * Check whether the current state is SWITCHING.
+   *
+   * \return true if the current state is SWITCHING, false otherwise
+   */
   bool IsStateSwitching (void);
+  /**
+   * Return the elapsed time of the current state.
+   *
+   * \return the elapsed time of the current state
+   */
   Time GetStateDuration (void);
+  /**
+   * Return the time before the state is back to IDLE.
+   *
+   * \return the delay before the state is back to IDLE
+   */
   Time GetDelayUntilIdle (void);
+  /**
+   * Return the time the last RX start.
+   *
+   * \return the time the last RX start.
+   */
   Time GetLastRxStartTime (void) const;
 
+  /**
+   * Switch state to TX for the given duration.
+   *
+   * \param txDuration the duration of the TX
+   * \param packet the packet
+   * \param txMode the transmission mode of the packet
+   * \param preamble the preamble of the packet
+   * \param txPower the transmission power
+   */
   void SwitchToTx (Time txDuration, Ptr<const Packet> packet, WifiMode txMode, WifiPreamble preamble, uint8_t txPower);
+  /**
+   * Switch state to RX for the given duration.
+   *
+   * \param rxDuration the duration of the RX
+   */
   void SwitchToRx (Time rxDuration);
+  /**
+   * Switch state to channel switching for the given duration.
+   *
+   * \param switchingDuration the duration of required to switch the channel
+   */
   void SwitchToChannelSwitching (Time switchingDuration);
+  /**
+   * Switch from RX after the reception was successful.
+   *
+   * \param packet the successfully received packet
+   * \param snr the SNR of the received packet
+   * \param mode the transmission mode of the packet
+   * \param preamble the preamble of the received packet
+   */
   void SwitchFromRxEndOk (Ptr<Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble);
+  /**
+   * Switch from RX after the reception failed.
+   *
+   * \param packet the packet that we failed to received
+   * \param snr the SNR of the received packet
+   */
   void SwitchFromRxEndError (Ptr<const Packet> packet, double snr);
+  /**
+   * Switch to CCA busy.
+   *
+   * \param duration the duration of CCA busy state
+   */
   void SwitchMaybeToCcaBusy (Time duration);
 
   TracedCallback<Time,Time,enum WifiPhy::State> m_stateLogger;
 private:
+  /**
+   * typedef for a list of WifiPhyListeners
+   */
   typedef std::vector<WifiPhyListener *> Listeners;
 
+  /**
+   * Log the ideal and CCA states.
+   */
   void LogPreviousIdleAndCcaBusyStates (void);
 
+  /**
+   * Notify all WifiPhyListener that the transmission has started for the given duration.
+   *
+   * \param duration the duration of the transmission
+   */
   void NotifyTxStart (Time duration);
-  void NotifyWakeup (void);
+  //void NotifyWakeup (void);
+  /**
+   * Notify all WifiPhyListener that the reception has started for the given duration.
+   *
+   * \param duration the duration of the reception
+   */
   void NotifyRxStart (Time duration);
+  /**
+   * Notify all WifiPhyListener that the reception was successful.
+   */
   void NotifyRxEndOk (void);
+  /**
+   * Notify all WifiPhyListener that the reception was not successful.
+   */
   void NotifyRxEndError (void);
+  /**
+   * Notify all WifiPhyListener that the CCA has started for the given duration.
+   *
+   * \param duration the duration of the CCA state
+   */
   void NotifyMaybeCcaBusyStart (Time duration);
+  /**
+   * Notify all WifiPhyListener that we are switching channel with the given channel
+   * switching delay.
+   *
+   * \param duration the delay to switch the channel
+   */
   void NotifySwitchingStart (Time duration);
+  /**
+   * Switch the state from RX.
+   */
   void DoSwitchFromRx (void);
 
   bool m_rxing;
diff -Naur ns-3.18.1/src/wifi/model/wifi-remote-station-manager.cc ns-3.19/src/wifi/model/wifi-remote-station-manager.cc
--- ns-3.18.1/src/wifi/model/wifi-remote-station-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-remote-station-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -45,6 +45,9 @@
 public:
   HighLatencyDataTxVectorTag ();
   HighLatencyDataTxVectorTag (WifiTxVector dataTxVector);
+  /**
+   * \returns the transmission mode to use to send this packet
+   */
   WifiTxVector GetDataTxVector (void) const;
 
   static TypeId GetTypeId (void);
@@ -110,6 +113,10 @@
 public:
   HighLatencyRtsTxVectorTag ();
   HighLatencyRtsTxVectorTag (WifiTxVector rtsTxVector);
+  /**
+   * \returns the transmission mode to use to send the RTS prior to the
+   *          transmission of the data packet itself.
+   */
   WifiTxVector GetRtsTxVector (void) const;
 
   static TypeId GetTypeId (void);
@@ -175,6 +182,9 @@
 public:
   HighLatencyCtsToSelfTxVectorTag ();
   HighLatencyCtsToSelfTxVectorTag (WifiTxVector ctsToSelfTxVector);
+  /**
+   * \returns the transmission mode to use for the CTS-to-self.
+   */
   WifiTxVector GetCtsToSelfTxVector (void) const;
 
   static TypeId GetTypeId (void);
@@ -239,7 +249,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WifiRemoteStationManager);
+NS_OBJECT_ENSURE_REGISTERED (WifiRemoteStationManager)
+  ;
 
 TypeId
 WifiRemoteStationManager::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/wifi-remote-station-manager.h ns-3.19/src/wifi/model/wifi-remote-station-manager.h
--- ns-3.18.1/src/wifi/model/wifi-remote-station-manager.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-remote-station-manager.h	2013-12-20 09:44:50.000000000 -0800
@@ -57,13 +57,15 @@
   void NotifyTxSuccess (uint32_t retryCounter);
   /// Updates average frame error rate when final data or RTS has failed.
   void NotifyTxFailed ();
-  /// Returns frame error rate (probability that frame is corrupted due to transmission error).
+  /// Return frame error rate (probability that frame is corrupted due to transmission error).
   double GetFrameErrorRate () const;
 private:
   /**
    * \brief Calculate averaging coefficient for frame error rate. Depends on time of the last update.
    * \attention Calling this method twice gives different results,
    * because it resets time of last update.
+   *
+   * \return average coefficient for frame error rate
    */
   double CalculateAveragingCoefficient ();
   /// averaging coefficient depends on the memory time
@@ -88,47 +90,171 @@
   WifiRemoteStationManager ();
   virtual ~WifiRemoteStationManager ();
 
+  /**
+   * Set up PHY associated with this device since it is the object that
+   * knows the full set of transmit rates that are supported.
+   *
+   * \param phy the PHY of this device
+   */
   virtual void SetupPhy (Ptr<WifiPhy> phy);
 
+  /**
+   * Return the maximum STA short retry count (SSRC).
+   *
+   * \return the maximum SSRC
+   */
   uint32_t GetMaxSsrc (void) const;
+  /**
+   * Return the maximum STA long retry count (SLRC).
+   *
+   * \return the maximum SLRC
+   */
   uint32_t GetMaxSlrc (void) const;
+  /**
+   * Return the RTS threshold.
+   *
+   * \return the RTS threshold
+   */
   uint32_t GetRtsCtsThreshold (void) const;
+  /**
+   * Return the fragmentation threshold.
+   *
+   * \return the fragmentation threshold
+   */
   uint32_t GetFragmentationThreshold (void) const;
+  /**
+   * Sets the maximum STA short retry count (SSRC).
+   *
+   * \param maxSsrc the maximum SSRC
+   */
   void SetMaxSsrc (uint32_t maxSsrc);
+  /**
+   * Sets the maximum STA long retry count (SLRC).
+   *
+   * \param maxSlrc the maximum SLRC
+   */
   void SetMaxSlrc (uint32_t maxSlrc);
+  /**
+   * Sets the RTS threshold.
+   *
+   * \param threshold the RTS threshold
+   */
   void SetRtsCtsThreshold (uint32_t threshold);
+  /**
+   * Sets a fragmentation threshold. The method calls a private method
+   * DoSetFragmentationThreshold that checks the validity of the value given.
+   *
+   * \param threshold the fragmentation threshold
+   */
   void SetFragmentationThreshold (uint32_t threshold);
-  void AddStationHtCapabilities (Mac48Address from,HtCapabilities     htcapabilities);
+  /**
+   * Records HT capabilities of the remote station.
+   *
+   * \param from the address of the station being recorded
+   * \param htcapabilities the HT capabilities of the station
+   */
+  void AddStationHtCapabilities (Mac48Address from, HtCapabilities htcapabilities);
+  /**
+   * Enable or disable HT capability support.
+   *
+   * \param enable enable or disable HT capability support
+   */
   void SetHtSupported (bool enable);
+  /**
+   * Return whether the device has HT capability support enabled.
+   *
+   * \return true if HT capability support is enabled, false otherwise
+   */
   bool HasHtSupported (void) const;
 
-  // Invoked in a STA upon dis-association
-  // or in an AP upon reboot
+  /**
+   * Reset the station, invoked in a STA upon dis-association or in an AP upon reboot.
+   */
   void Reset (void);
-  // Invoked in a STA upon association to store
-  // the set of rates which belong to the
-  // BSSBasicRateSet of the associated AP
-  // and which are supported locally.
-  // Invoked in an AP to configure the BSSBasicRateSet
+  /**
+   * Invoked in a STA upon association to store the set of rates which belong to the
+   * BSSBasicRateSet of the associated AP and which are supported locally.
+   * Invoked in an AP to configure the BSSBasicRateSet.
+   * 
+   * \param mode the WifiMode to be added to the basic mode set
+   */
   void AddBasicMode (WifiMode mode);
 
+  /**
+   * Return the default transmission mode.
+   *
+   * \return WifiMode the default transmission mode
+   */
   WifiMode GetDefaultMode (void) const;
+  /**
+   * Return the number of basic modes we support.
+   *
+   * \return the number of basic modes we support
+   */
   uint32_t GetNBasicModes (void) const;
+  /**
+   * Return a basic mode from the set of basic modes.
+   *
+   * \param i index of the basic mode in the basic mode set
+   * \return the basic mode at the given index
+   */
   WifiMode GetBasicMode (uint32_t i) const;
+  /**
+   * Return whether the station supports Greenfield or not.
+   *
+   * \param address the address of the station
+   * \return true if Greenfield is supported by the station,
+   *          false otherwise
+   */
   bool GetGreenfieldSupported (Mac48Address address) const;
+  /**
+   * Add a given Modulation and Coding Scheme (MCS) index to
+   * the set of basic MCS.
+   *
+   * \param mcs the MCS index
+   */
   void AddBasicMcs (uint8_t mcs);
 
+  /**
+   * Return the default Modulation and Coding Scheme (MCS) index.
+   *
+   * \return the default MCS index
+   */
   uint8_t GetDefaultMcs (void) const;
+  /**
+   * Return the number of basic MCS index.
+   *
+   * \return the number of basic MCS index
+   */
   uint32_t GetNBasicMcs (void) const;
+  /**
+   * Return the MCS at the given <i>list</i> index.
+   *
+   * \param i the position in the list
+   * \return the MCS at the given list index
+   */
   uint8_t GetBasicMcs (uint32_t i) const;
+  /**
+   * Record the MCS index supported by the station.
+   * 
+   * \param address the address of the station
+   * \param mcs the MCS index
+   */
   void AddSupportedMcs (Mac48Address address, uint8_t mcs);
 
+  /**
+   * Return a mode for non-unicast packets.
+   *
+   * \return WifiMode for non-unicast packets
+   */
   WifiMode GetNonUnicastMode (void) const;
 
 
   /**
    * Invoked in an AP upon disassociation of a
    * specific STA.
+   *
+   * \param address the address of the STA
    */
   void Reset (Mac48Address address);
   /**
@@ -137,16 +263,64 @@
    * also supported locally.
    * The set of supported modes includes
    * the BSSBasicRateSet.
+   *
+   * \param address the address of the station being recorded
+   * \param mode the WifiMode supports by the station
    */
   void AddSupportedMode (Mac48Address address, WifiMode mode);
   //void  AddBssMembershipParameters(Mac48Address address, uint32_t selector);
 
+  /**
+   * Return whether the station state is brand new.
+   *
+   * \param address the address of the station
+   * \return true if the state of the station is brand new,
+   *          false otherwise
+   */
   bool IsBrandNew (Mac48Address address) const;
+  /**
+   * Return whether the station associated.
+   *
+   * \param address the address of the station
+   * \return true if the station is associated,
+   *          false otherwise
+   */
   bool IsAssociated (Mac48Address address) const;
+  /**
+   * Return whether we are waiting for an ACK for
+   * the association response we sent.
+   *
+   * \param address the address of the station
+   * \return true if the station is associated,
+   *          false otherwise
+   */
   bool IsWaitAssocTxOk (Mac48Address address) const;
+  /**
+   * Records that we are waiting for an ACK for
+   * the association response we sent.
+   *
+   * \param address the address of the station
+   */
   void RecordWaitAssocTxOk (Mac48Address address);
+  /**
+   * Records that we got an ACK for
+   * the association response we sent.
+   *
+   * \param address the address of the station
+   */
   void RecordGotAssocTxOk (Mac48Address address);
+  /**
+   * Records that we missed an ACK for
+   * the association response we sent.
+   *
+   * \param address the address of the station
+   */
   void RecordGotAssocTxFailed (Mac48Address address);
+  /**
+   * Records that the STA was disassociated.
+   *
+   * \param address the address of the station
+   */
   void RecordDisassociated (Mac48Address address);
 
   /**
@@ -168,7 +342,7 @@
    * \param header MAC header
    * \param packet the packet to send
    * \param fullPacketSize the size of the packet after its 802.11 MAC header has been added.
-   * \returns the transmission mode to use to send this packet
+   * \return the transmission mode to use to send this packet
    */
   WifiTxVector GetDataTxVector (Mac48Address address, const WifiMacHeader *header,
                         Ptr<const Packet> packet, uint32_t fullPacketSize);
@@ -176,49 +350,88 @@
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
-   * \returns the transmission mode to use to send the RTS prior to the
+   *
+   * \return the transmission mode to use to send the RTS prior to the
    *          transmission of the data packet itself.
    */
   WifiTxVector GetRtsTxVector (Mac48Address address, const WifiMacHeader *header,
                        Ptr<const Packet> packet);
 
+  /**
+   * \param header MAC header
+   * \param packet the packet to send
+   *
+   * \return the transmission mode to use to send the CTS-to-self prior to the
+   *          transmission of the data packet itself.
+   */
   WifiTxVector GetCtsToSelfTxVector (const WifiMacHeader *header,
                        Ptr<const Packet> packet);
 
-  //Since CTS to Self parameters don't depened on the station it is implemented in wifiremote station manager
+  /**
+   * Since CTS-to-self parameters are not dependent on the station,
+   * it is implemented in wifiremote station manager
+   *
+   * \return the transmission mode to use to send the CTS-to-self prior to the
+   *          transmission of the data packet itself.
+   */
   WifiTxVector DoGetCtsToSelfTxVector (void);
 
 
   /**
    * Should be invoked whenever the RtsTimeout associated to a transmission
    * attempt expires.
+   *
+   * \param address the address of the receiver
+   * \param header MAC header of the DATA packet
    */
   void ReportRtsFailed (Mac48Address address, const WifiMacHeader *header);
   /**
    * Should be invoked whenever the AckTimeout associated to a transmission
    * attempt expires.
+   *
+   * \param address the address of the receiver
+   * \param header MAC header of the DATA packet
    */
   void ReportDataFailed (Mac48Address address, const WifiMacHeader *header);
   /**
    * Should be invoked whenever we receive the Cts associated to an RTS
-   * we just sent.
+   * we just sent. Note that we also get the SNR of the RTS we sent since
+   * the receiver put a SnrTag in the CTS.
+   * 
+   * \param address the address of the receiver
+   * \param header MAC header of the DATA packet
+   * \param ctsSnr the SNR of the CTS we received
+   * \param ctsMode the WifiMode the receiver used to send the CTS
+   * \param rtsSnr the SNR of the RTS we sent
    */
   void ReportRtsOk (Mac48Address address, const WifiMacHeader *header,
                     double ctsSnr, WifiMode ctsMode, double rtsSnr);
   /**
    * Should be invoked whenever we receive the Ack associated to a data packet
    * we just sent.
+   *
+   * \param address the address of the receiver
+   * \param header MAC header of the DATA packet
+   * \param ackSnr the SNR of the ACK we received
+   * \param ackMode the WifiMode the receiver used to send the ACK
+   * \param dataSnr the SNR of the DATA we sent
    */
   void ReportDataOk (Mac48Address address, const WifiMacHeader *header,
                      double ackSnr, WifiMode ackMode, double dataSnr);
   /**
    * Should be invoked after calling ReportRtsFailed if
    * NeedRtsRetransmission returns false
+   *
+   * \param address the address of the receiver
+   * \param header MAC header of the DATA packet
    */
   void ReportFinalRtsFailed (Mac48Address address, const WifiMacHeader *header);
   /**
    * Should be invoked after calling ReportDataFailed if
    * NeedDataRetransmission returns false
+   *
+   * \param address the address of the receiver
+   * \param header MAC header of the DATA packet
    */
   void ReportFinalDataFailed (Mac48Address address, const WifiMacHeader *header);
 
@@ -237,18 +450,24 @@
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
-   * \returns true if we want to use an RTS/CTS handshake for this
+   * \return true if we want to use an RTS/CTS handshake for this
    *          packet before sending it, false otherwise.
    */
   bool NeedRts (Mac48Address address, const WifiMacHeader *header,
                 Ptr<const Packet> packet);
+  /**
+   * Return if we need to do Cts-to-self before sending a DATA.
+   *
+   * \param txVector the TXVECTOR of the packet to be sent
+   * \return true if Cts-to-self is needed, false otherwise
+   */
   bool NeedCtsToSelf (WifiTxVector txVector);
 
   /**
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
-   * \returns true if we want to restart a failed RTS/CTS
+   * \return true if we want to restart a failed RTS/CTS
    *          handshake, false otherwise.
    */
   bool NeedRtsRetransmission (Mac48Address address, const WifiMacHeader *header,
@@ -257,7 +476,7 @@
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
-   * \returns true if we want to resend a packet
+   * \return true if we want to resend a packet
    *          after a failed transmission attempt, false otherwise.
    */
   bool NeedDataRetransmission (Mac48Address address, const WifiMacHeader *header,
@@ -267,7 +486,7 @@
    * \param address remote address
    * \param header MAC header
    * \param packet the packet to send
-   * \returns true if this packet should be fragmented, false otherwise.
+   * \return true if this packet should be fragmented, false otherwise.
    */
   bool NeedFragmentation (Mac48Address address, const WifiMacHeader *header,
                           Ptr<const Packet> packet);
@@ -276,7 +495,7 @@
    * \param header MAC header
    * \param packet the packet to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
-   * \returns the size of the corresponding fragment.
+   * \return the size of the corresponding fragment.
    */
   uint32_t GetFragmentSize (Mac48Address address, const WifiMacHeader *header,
                             Ptr<const Packet> packet, uint32_t fragmentNumber);
@@ -285,7 +504,7 @@
    * \param header MAC header
    * \param packet the packet to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
-   * \returns the offset within the original packet where this fragment starts.
+   * \return the offset within the original packet where this fragment starts.
    */
   uint32_t GetFragmentOffset (Mac48Address address, const WifiMacHeader *header,
                               Ptr<const Packet> packet, uint32_t fragmentNumber);
@@ -294,7 +513,7 @@
    * \param header MAC header
    * \param packet the packet to send
    * \param fragmentNumber the fragment index of the next fragment to send (starts at zero).
-   * \returns true if this is the last fragment, false otherwise.
+   * \return true if this is the last fragment, false otherwise.
    */
   bool IsLastFragment (Mac48Address address, const WifiMacHeader *header,
                        Ptr<const Packet> packet, uint32_t fragmentNumber);
@@ -302,64 +521,135 @@
   /**
    * \param address remote address
    * \param rtsMode the transmission mode used to send an RTS we just received
-   * \returns the transmission mode to use for the CTS to complete the RTS/CTS
+   * \return the transmission mode to use for the CTS to complete the RTS/CTS
    *          handshake.
    */
   WifiTxVector GetCtsTxVector (Mac48Address address, WifiMode rtsMode);
   /**
    * \param address
    * \param dataMode the transmission mode used to send an ACK we just received
-   * \returns the transmission mode to use for the ACK to complete the data/ACK
+   * \return the transmission mode to use for the ACK to complete the data/ACK
    *          handshake.
    */
   WifiTxVector GetAckTxVector (Mac48Address address, WifiMode dataMode);
   /**
    * \param address
    * \param dataMode the transmission mode used to send an ACK we just received
-   * \returns the transmission mode to use for the ACK to complete the data/ACK
+   * \return the transmission mode to use for the ACK to complete the data/ACK
    *          handshake.
    */
   WifiTxVector GetBlockAckTxVector (Mac48Address address, WifiMode dataMode);
   /**
-   * \returns the default transmission power
+   * \return the default transmission power
    */ 
   uint8_t GetDefaultTxPowerLevel (void) const;
   /**
    * \param address of the remote station
-   * \returns information regarding the remote station associated with the given address
+   * \return information regarding the remote station associated with the given address
    */
   WifiRemoteStationInfo GetInfo (Mac48Address address);
   /**
    * Set the default transmission power level
+   *
+   * \param txPower the default transmission power level
    */
   void SetDefaultTxPowerLevel (uint8_t txPower);
  /**
-  * \returns the number of transmit antennas supported by the phy layer
+  * \return the number of transmit antennas supported by the phy layer
   */
  uint32_t GetNumberOfTransmitAntennas (void);
 
  protected:
   virtual void DoDispose (void);
-  // for convenience
+  /**
+   * Return whether mode associated with the specified station at the specified index.
+   *
+   * \param station the station being queried
+   * \param i the index
+   * \return WifiMode at the given index of the specified station
+   */
   WifiMode GetSupported (const WifiRemoteStation *station, uint32_t i) const;
+  /**
+   * Return the number of modes supported by the given station.
+   *
+   * \param station the station being queried
+   * \return the number of modes supported by the given station
+   */
   uint32_t GetNSupported (const WifiRemoteStation *station) const;
+  /**
+   * Return the MCS index supported by the specified station at the specified index.
+   *
+   * \param station the station being queried
+   * \param i the index
+   * \return the MCS index at the given index of the specified station
+   */
   uint8_t GetMcsSupported (const WifiRemoteStation *station, uint32_t i) const;
+  /**
+   * Return the number of MCS supported by the given station.
+   *
+   * \param station the station being queried
+   * \return the number of MCS supported by the given station
+   */
   uint32_t GetNMcsSupported (const WifiRemoteStation *station) const;
 
+  /**
+   * Return whether the given station supports short guard interval.
+   *
+   * \param station the station being queried
+   * \return true if the station supports short guard interval,
+   *          false otherwise
+   */
   bool GetShortGuardInterval (const WifiRemoteStation *station) const;
+  /**
+   * Return whether the given station supports space-time block coding (STBC).
+   *
+   * \param station the station being queried
+   * \return true if the station supports STBC, false otherwise
+   */
   bool GetStbc (const WifiRemoteStation *station) const;
+  /**
+   * Return whether the station supports Greenfield or not.
+   *
+   * \param station the station being queried
+   * \return true if Greenfield is supported by the station,
+   *          false otherwise
+   */
   bool GetGreenfield (const WifiRemoteStation *station) const;
+  /**
+   * Return the number of receive antenna the station has.
+   *
+   * \param station the station being queried
+   * \return the number of receive antenna the station has
+   */
   uint32_t GetNumberOfReceiveAntennas (const WifiRemoteStation *station) const;
+  /**
+   * Return the number of transmit antenna the station has.
+   *
+   * \param station the station being queried
+   * \return the number of transmit antenna the station has
+   */
   uint32_t GetNumberOfTransmitAntennas (const WifiRemoteStation *station) const;
+  /**
+   * Return the long retry limit of the given station.
+   *
+   * \param station the station being queried
+   * \return the long retry limit of the the station
+   */
   uint32_t GetLongRetryCount (const WifiRemoteStation *station) const;
+  /**
+   * Return the short retry limit of the given station.
+   *
+   * \param station the station being queried
+   * \return the short retry limit of the the station
+   */
   uint32_t GetShortRetryCount (const WifiRemoteStation *station) const;
 private:
   /**
-   * \param station the station with which we need to communicate
+   * \param station the station that we need to communicate
    * \param packet the packet to send
    * \param normally indicates whether the normal 802.11 rts enable mechanism would
    *        request that the rts is sent or not.
-   * \returns true if we want to use an RTS/CTS handshake for this
+   * \return true if we want to use an RTS/CTS handshake for this
    *          packet before sending it, false otherwise.
    *
    * Note: This method is called before a unicast packet is sent on the medium.
@@ -367,11 +657,11 @@
   virtual bool DoNeedRts (WifiRemoteStation *station,
                           Ptr<const Packet> packet, bool normally);
   /**
-   * \param station the station with which we need to communicate
+   * \param station the station that we need to communicate
    * \param packet the packet to send
    * \param normally indicates whether the normal 802.11 rts enable mechanism would
    *        request that the rts is retransmitted or not.
-   * \returns true if we want to restart a failed RTS/CTS
+   * \return true if we want to restart a failed RTS/CTS
    *          handshake, false otherwise.
    *
    * Note: This method is called after an rts/cts handshake has been attempted
@@ -380,11 +670,11 @@
   virtual bool DoNeedRtsRetransmission (WifiRemoteStation *station,
                                         Ptr<const Packet> packet, bool normally);
   /**
-   * \param station the station with which we need to communicate
+   * \param station the station that we need to communicate
    * \param packet the packet to send
    * \param normally indicates whether the normal 802.11 data retransmission mechanism
    *        would request that the data is retransmitted or not.
-   * \returns true if we want to resend a packet
+   * \return true if we want to resend a packet
    *          after a failed transmission attempt, false otherwise.
    *
    * Note: This method is called after a unicast packet transmission has been attempted
@@ -394,18 +684,18 @@
                                          Ptr<const Packet> packet, bool normally);
 
   /**
-   * \param station the station with which we need to communicate
+   * \param station the station that we need to communicate
    * \param packet the packet to send
    * \param normally indicates whether the normal 802.11 data fragmentation mechanism
    *        would request that the data packet is fragmented or not.
-   * \returns true if this packet should be fragmented, false otherwise.
+   * \return true if this packet should be fragmented, false otherwise.
    *
    * Note: This method is called before sending a unicast packet.
    */
   virtual bool DoNeedFragmentation (WifiRemoteStation *station,
                                     Ptr<const Packet> packet, bool normally);
   /**
-   * \returns whether this manager is a manager designed to work in low-latency
+   * \return whether this manager is a manager designed to work in low-latency
    *          environments.
    *
    * Note: In this context, low vs high latency is defined in <i>IEEE 802.11 Rate Adaptation:
@@ -417,9 +707,9 @@
    */
   virtual WifiRemoteStation* DoCreateStation (void) const = 0;
  /**
-   * \param station the station with which we need to communicate
+   * \param station the station that we need to communicate
    * \param size size of the packet or fragment we want to send
-   * \returns the transmission mode to use to send a packet to the station
+   * \return the transmission mode to use to send a packet to the station
    *
    * Note: This method is called before sending a unicast packet or a fragment
    *       of a unicast packet to decide which transmission mode to use.
@@ -427,8 +717,8 @@
   virtual WifiTxVector DoGetDataTxVector (WifiRemoteStation *station,
                                   uint32_t size) = 0;
   /**
-   * \param station the station with which we need to communicate
-   * \returns the transmission mode to use to send an rts to the station
+   * \param station the station that we need to communicate
+   * \return the transmission mode to use to send an rts to the station
    *
    * Note: This method is called before sending an rts to a station
    *       to decide which transmission mode to use for the rts.
@@ -446,7 +736,7 @@
 
   /** 
    * \param address the address of the recipient of the ACK
-   * \param ctsMode the mode to be used for the ACK 
+   * \param ackMode the mode to be used for the ACK 
    * 
    * \return the power level to be used to send the ACK
    */  
@@ -454,7 +744,7 @@
 
   /** 
    * \param address the address of the recipient of the Block ACK
-   * \param ctsMode the mode to be used for the Block ACK 
+   * \param blockAckMode the mode to be used for the Block ACK 
    * 
    * \return the power level to be used to send the Block ACK
    */  
@@ -474,32 +764,127 @@
   virtual uint8_t DoGetBlockAckTxNess(Mac48Address address, WifiMode blockAckMode);
   virtual bool DoGetBlockAckTxStbc(Mac48Address address, WifiMode blockAckMode);
 
+  /**
+   * This method is a pure virtual method that must be implemented by the sub-class.
+   * This allows different types of WifiRemoteStationManager to respond differently,
+   *
+   * \param station the station that we failed to send RTS
+   */
   virtual void DoReportRtsFailed (WifiRemoteStation *station) = 0;
+  /**
+   * This method is a pure virtual method that must be implemented by the sub-class.
+   * This allows different types of WifiRemoteStationManager to respond differently,
+   *
+   * \param station the station that we failed to send DATA
+   */
   virtual void DoReportDataFailed (WifiRemoteStation *station) = 0;
+  /**
+   * This method is a pure virtual method that must be implemented by the sub-class.
+   * This allows different types of WifiRemoteStationManager to respond differently,
+   *
+   * \param station the station that we successfully sent RTS
+   * \param ctsSnr the SNR of the CTS we received
+   * \param ctsMode the WifiMode the receiver used to send the CTS
+   * \param rtsSnr the SNR of the RTS we sent
+   */
   virtual void DoReportRtsOk (WifiRemoteStation *station,
                               double ctsSnr, WifiMode ctsMode, double rtsSnr) = 0;
+  /**
+   * This method is a pure virtual method that must be implemented by the sub-class.
+   * This allows different types of WifiRemoteStationManager to respond differently,
+   *
+   * \param station the station that we successfully sent RTS
+   * \param ackSnr the SNR of the ACK we received
+   * \param ackMode the WifiMode the receiver used to send the ACK
+   * \param dataSnr the SNR of the DATA we sent
+   */
   virtual void DoReportDataOk (WifiRemoteStation *station,
                                double ackSnr, WifiMode ackMode, double dataSnr) = 0;
+  /**
+   * This method is a pure virtual method that must be implemented by the sub-class.
+   * This allows different types of WifiRemoteStationManager to respond differently,
+   *
+   * \param station the station that we failed to send RTS
+   */
   virtual void DoReportFinalRtsFailed (WifiRemoteStation *station) = 0;
+  /**
+   * This method is a pure virtual method that must be implemented by the sub-class.
+   * This allows different types of WifiRemoteStationManager to respond differently,
+   *
+   * \param station the station that we failed to send DATA
+   */
   virtual void DoReportFinalDataFailed (WifiRemoteStation *station) = 0;
+  /**
+   * This method is a pure virtual method that must be implemented by the sub-class.
+   * This allows different types of WifiRemoteStationManager to respond differently,
+   *
+   * \param station the station that sent the DATA to us
+   * \param rxSnr the SNR of the DATA we received
+   * \param txMode the WifiMode the sender used to send the DATA
+   */
   virtual void DoReportRxOk (WifiRemoteStation *station,
                              double rxSnr, WifiMode txMode) = 0;
 
+  /**
+   * Return the state of the station associated with the given address.
+   *
+   * \param address the address of the station
+   * \return WifiRemoteStationState corresponding to the address
+   */
   WifiRemoteStationState* LookupState (Mac48Address address) const;
+  /**
+   * Return the station associated with the given address and TID.
+   *
+   * \param address the address of the station
+   * \param tid the TID
+   * \return WifiRemoteStation corresponding to the address
+   */
   WifiRemoteStation* Lookup (Mac48Address address, uint8_t tid) const;
   /// Find a remote station by its remote address and TID taken from MAC header
+  /**
+   * Return the station associated with the given address and MAC header.
+   * It simply gets TID from the MAC header and calls Lookup with tid.
+   *
+   * \param address the address of the station
+   * \param header MAC header
+   * \return WifiRemoteStation corresponding to the address
+   */
   WifiRemoteStation* Lookup (Mac48Address address, const WifiMacHeader *header) const;
   WifiMode GetControlAnswerMode (Mac48Address address, WifiMode reqMode);
 
+  /**
+   * Actually sets the fragmentation threshold, it also checks the validity of
+   * the given threshold.
+   *
+   * \param threshold the fragmentation threshold
+   */
   void DoSetFragmentationThreshold (uint32_t threshold);
+  /**
+   * Return the current fragmentation threshold
+   * 
+   * \return the fragmentation threshold
+   */
   uint32_t DoGetFragmentationThreshold (void) const;
+  /**
+   * Return the number of fragments needed for the given packet.
+   *
+   * \param header MAC header
+   * \param packet the packet to be fragmented
+   * \return the number of fragments needed
+   */
   uint32_t GetNFragments (const WifiMacHeader *header, Ptr<const Packet> packet);
 
+  /**
+   * A vector of WifiRemoteStations
+   */
   typedef std::vector <WifiRemoteStation *> Stations;
+  /**
+   * A vector of WifiRemoteStationStates
+   */
   typedef std::vector <WifiRemoteStationState *> StationStates;
 
-  StationStates m_states;
-  Stations m_stations;
+  StationStates m_states;  //!< States of known stations
+  Stations m_stations;  //!< Information for each known stations
   /**
    * This is a pointer to the WifiPhy associated with this
    * WifiRemoteStationManager that is set on call to
@@ -509,8 +894,8 @@
    * "DeviceRateSet").
    */
   Ptr<WifiPhy> m_wifiPhy;
-  WifiMode m_defaultTxMode;
-  uint8_t m_defaultTxMcs;
+  WifiMode m_defaultTxMode;  //!< The default transmission mode
+  uint8_t m_defaultTxMcs;  //!< The default transmission modulation-coding scheme (MCS)
 
   /**
    * This member is the list of WifiMode objects that comprise the
@@ -523,13 +908,13 @@
   WifiModeList m_bssBasicRateSet;
   WifiMcsList m_bssBasicMcsSet;
 
-  bool m_htSupported;
-  uint32_t m_maxSsrc;
-  uint32_t m_maxSlrc;
-  uint32_t m_rtsCtsThreshold;
-  uint32_t m_fragmentationThreshold;
-  uint8_t m_defaultTxPowerLevel;
-  WifiMode m_nonUnicastMode;
+  bool m_htSupported;  //!< Flag if HT capability is supported
+  uint32_t m_maxSsrc;  //!< Maximum STA short retry count (SSRC)
+  uint32_t m_maxSlrc;  //!< Maximum STA long retry count (SLRC)
+  uint32_t m_rtsCtsThreshold;  //!< Threshold for RTS/CTS
+  uint32_t m_fragmentationThreshold;  //!< Threshold for fragmentation
+  uint8_t m_defaultTxPowerLevel;  //!< Default tranmission power level
+  WifiMode m_nonUnicastMode;  //!< Transmission mode for non-unicast DATA frames
 
   /**
    * The trace source fired when the transmission of a single RTS has failed
@@ -552,8 +937,14 @@
 
 };
 
+/**
+ * A struct that holds information about each remote station.
+ */
 struct WifiRemoteStationState
 {
+  /**
+   * State of the station
+   */
   enum
   {
     BRAND_NEW,
@@ -573,13 +964,13 @@
    */
   WifiModeList m_operationalRateSet;
   WifiMcsList m_operationalMcsSet;
-  Mac48Address m_address;
+  Mac48Address m_address;  //!< Mac48Address of the remote station
   WifiRemoteStationInfo m_info;
-  bool m_shortGuardInterval;
-  uint32_t m_rx;
-  uint32_t m_tx;
-  bool m_stbc;
-  bool m_greenfield;
+  bool m_shortGuardInterval;  //!< Flag if short guard interval is supported by the remote station
+  uint32_t m_rx;  //!< Number of RX antennae of the remote station
+  uint32_t m_tx;  //!< Number of TX antennae of the remote station
+  bool m_stbc;  //!< Flag if STBC is used by the remote station
+  bool m_greenfield;  //!< Flag if green field is used by the remote station
 
 };
 
@@ -593,10 +984,10 @@
  */
 struct WifiRemoteStation
 {
-  WifiRemoteStationState *m_state;
-  uint32_t m_ssrc;
-  uint32_t m_slrc;
-  uint8_t m_tid;
+  WifiRemoteStationState *m_state; //!< Remote station state
+  uint32_t m_ssrc; //!< STA short retry count
+  uint32_t m_slrc; //!< STA long retry count
+  uint8_t m_tid; //!< traffic ID
 };
 
 
diff -Naur ns-3.18.1/src/wifi/model/wifi-tx-vector.cc ns-3.19/src/wifi/model/wifi-tx-vector.cc
--- ns-3.18.1/src/wifi/model/wifi-tx-vector.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-tx-vector.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,14 +27,14 @@
 {
 }
 
-WifiTxVector::WifiTxVector (WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc)
-  : m_mode (m),
-    m_txPowerLevel (l),
-    m_retries (r),
-    m_shortGuardInterval(sg),
-    m_nss(ns),
-    m_ness(ne),
-    m_stbc(Stbc)
+WifiTxVector::WifiTxVector (WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc)
+  : m_mode (mode),
+    m_txPowerLevel (powerLevel),
+    m_retries (retries),
+    m_shortGuardInterval(shortGuardInterval),
+    m_nss(nss),
+    m_ness(ness),
+    m_stbc(stbc)
 {
 }
 
diff -Naur ns-3.18.1/src/wifi/model/wifi-tx-vector.h ns-3.19/src/wifi/model/wifi-tx-vector.h
--- ns-3.18.1/src/wifi/model/wifi-tx-vector.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/wifi-tx-vector.h	2013-12-20 09:44:50.000000000 -0800
@@ -48,13 +48,26 @@
 {
 public:
   WifiTxVector ();
-  WifiTxVector (WifiMode m, uint8_t l, uint8_t r, bool sg, uint8_t ns, uint8_t ne, bool Stbc);
+  /**
+   * Create a TXVECTOR with the given parameters.
+   *
+   * \param mode WifiMode
+   * \param powerLevel transmission power level
+   * \param retries retries
+   * \param shortGuardInterval enable or disable short guard interval
+   * \param nss the number of spatial STBC streams (NSS)
+   * \param ness the number of extension spatial streams (NESS)
+   * \param stbc enable or disable STBC
+   */
+  WifiTxVector (WifiMode mode, uint8_t powerLevel, uint8_t retries, bool shortGuardInterval, uint8_t nss, uint8_t ness, bool stbc);
   /**
    *  \returns the txvector payload mode
    */
   WifiMode GetMode (void) const;
- /**
+  /**
   * Sets the selected payload transmission mode
+  *
+  * \param mode
   */
   void SetMode (WifiMode mode);
   /**
@@ -63,14 +76,18 @@
   uint8_t GetTxPowerLevel (void) const;
   /**
    * Sets the selected transmission power level
+   *
+   * \param powerlevel
    */
   void SetTxPowerLevel (uint8_t powerlevel);
   /**
    *  \returns the number of retries
    */
   uint8_t GetRetries (void) const;
-   /**
+  /**
    * Sets the number of retries
+   *
+   * \param retries
    */
   void SetRetries (uint8_t retries);
   /**
@@ -79,32 +96,42 @@
   bool IsShortGuardInterval (void) const;
    /**
    * Sets if short gurad interval is being used
+   *
+   * \param guardinterval enable or disable short guard interval
    */
   void SetShortGuardInterval (bool guardinterval);
- /**
+  /**
    *  \returns the number of Nss
    */
   uint8_t GetNss (void) const;
-   /**
+  /**
    * Sets the number of Nss refer to IEEE802.11n Table 20-28 for explanation and range
+   *
+   * \param nss
    */
   void SetNss (uint8_t nss);
   /**
    *  \returns the number of Ness  
    */
   uint8_t GetNess (void) const;
-   /**
+  /**
    * Sets the Ness number refer to IEEE802.11n Table 20-6 for explanation
+   *
+   * \param ness
    */
   void SetNess (uint8_t ness);
   /**
-   *  \returns if STBC is used or not
+   * Check if STBC is used or not
+   *  \returns true if STBC is used,
+   *           false otherwise
    */
   bool IsStbc (void) const;
   /**
    * Sets if STBC is being used
+   *
+   * \param stbc enable or disable STBC
    */
-  void SetStbc (bool stbcsatuts);
+  void SetStbc (bool stbc);
 
   
 private:
@@ -124,6 +151,13 @@
 
 };
 
+/**
+ * Serialize WifiTxVector to the given ostream.
+ *
+ * \param os
+ * \param v
+ * \return ostream
+ */
 std::ostream & operator << (std::ostream & os,const WifiTxVector &v); 
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/wifi/model/yans-error-rate-model.cc ns-3.19/src/wifi/model/yans-error-rate-model.cc
--- ns-3.18.1/src/wifi/model/yans-error-rate-model.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/yans-error-rate-model.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (YansErrorRateModel);
+NS_OBJECT_ENSURE_REGISTERED (YansErrorRateModel)
+  ;
 
 TypeId
 YansErrorRateModel::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/yans-error-rate-model.h ns-3.19/src/wifi/model/yans-error-rate-model.h
--- ns-3.18.1/src/wifi/model/yans-error-rate-model.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/yans-error-rate-model.h	2013-12-20 09:44:50.000000000 -0800
@@ -62,17 +62,89 @@
   virtual double GetChunkSuccessRate (WifiMode mode, double snr, uint32_t nbits) const;
 
 private:
+  /**
+   * Return the logarithm of the given value to base 2.
+   *
+   * \param val
+   * \return the logarithm of val to base 2.
+   */
   double Log2 (double val) const;
+  /**
+   * Return BER of BPSK with the given parameters.
+   *
+   * \param snr snr value
+   * \param signalSpread
+   * \param phyRate
+   * \return BER of BPSK at the given SNR
+   */
   double GetBpskBer (double snr, uint32_t signalSpread, uint32_t phyRate) const;
+  /**
+   * Return BER of QAM-m with the given parameters.
+   *
+   * \param snr snr value
+   * \param m
+   * \param signalSpread
+   * \param phyRate
+   * \return BER of BPSK at the given SNR
+   */
   double GetQamBer (double snr, unsigned int m, uint32_t signalSpread, uint32_t phyRate) const;
+  /**
+   * Return k!
+   *
+   * \param k
+   * \return k!
+   */
   uint32_t Factorial (uint32_t k) const;
+  /**
+   * Return Binomial distribution for a given k, p, and n
+   * 
+   * \param k
+   * \param p
+   * \param n
+   * \return a Binomial distribution
+   */
   double Binomial (uint32_t k, double p, uint32_t n) const;
+  /**
+   * \param ber
+   * \param d
+   * \return double
+   */
   double CalculatePdOdd (double ber, unsigned int d) const;
+  /**
+   * \param ber
+   * \param d
+   * \return double
+   */
   double CalculatePdEven (double ber, unsigned int d) const;
+  /**
+   * \param ber
+   * \param d
+   * \return double
+   */
   double CalculatePd (double ber, unsigned int d) const;
+  /**
+   * \param snr
+   * \param nbits
+   * \param signalSpread
+   * \param phyRate
+   * \param dFree
+   * \param adFree
+   * \return double
+   */
   double GetFecBpskBer (double snr, double nbits,
                         uint32_t signalSpread, uint32_t phyRate,
                         uint32_t dFree, uint32_t adFree) const;
+  /**
+   * \param snr
+   * \param nbits
+   * \param signalSpread
+   * \param phyRate
+   * \param m
+   * \param dfree
+   * \param adFree
+   * \param adFreePlusOne
+   * \return double
+   */
   double GetFecQamBer (double snr, uint32_t nbits,
                        uint32_t signalSpread,
                        uint32_t phyRate,
diff -Naur ns-3.18.1/src/wifi/model/yans-wifi-channel.cc ns-3.19/src/wifi/model/yans-wifi-channel.cc
--- ns-3.18.1/src/wifi/model/yans-wifi-channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/yans-wifi-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (YansWifiChannel);
+NS_OBJECT_ENSURE_REGISTERED (YansWifiChannel)
+  ;
 
 TypeId
 YansWifiChannel::GetTypeId (void)
diff -Naur ns-3.18.1/src/wifi/model/yans-wifi-channel.h ns-3.19/src/wifi/model/yans-wifi-channel.h
--- ns-3.18.1/src/wifi/model/yans-wifi-channel.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/yans-wifi-channel.h	2013-12-20 09:44:50.000000000 -0800
@@ -59,6 +59,11 @@
   virtual uint32_t GetNDevices (void) const;
   virtual Ptr<NetDevice> GetDevice (uint32_t i) const;
 
+  /**
+   * Adds the given YansWifiPhy to the PHY list
+   *
+   * \param phy the YansWifiPhy to be added to the PHY list
+   */
   void Add (Ptr<YansWifiPhy> phy);
 
   /**
@@ -74,7 +79,7 @@
    * \param sender the device from which the packet is originating.
    * \param packet the packet to send
    * \param txPowerDbm the tx power associated to the packet
-   * \param wifiMode the tx mode associated to the packet
+   * \param txVector the TXVECTOR associated to the packet
    * \param preamble the preamble associated to the packet
    *
    * This method should not be invoked by normal users. It is
@@ -96,17 +101,31 @@
   int64_t AssignStreams (int64_t stream);
 
 private:
-  YansWifiChannel& operator = (const YansWifiChannel &);
-  YansWifiChannel (const YansWifiChannel &);
+  //YansWifiChannel& operator = (const YansWifiChannel &);
+  //YansWifiChannel (const YansWifiChannel &);
 
+  /**
+   * A vector of pointers to YansWifiPhy.
+   */
   typedef std::vector<Ptr<YansWifiPhy> > PhyList;
+  /**
+   * This method is scheduled by Send for each associated YansWifiPhy.
+   * The method then calls the corresponding YansWifiPhy that the first
+   * bit of the packet has arrived.
+   *
+   * \param i index of the corresponding YansWifiPhy in the PHY list
+   * \param packet the packet being sent
+   * \param rxPowerDbm the received power of the packet
+   * \param txVector the TXVECTOR of the packet
+   * \param preamble the type of preamble being used to send the packet
+   */
   void Receive (uint32_t i, Ptr<Packet> packet, double rxPowerDbm,
                 WifiTxVector txVector, WifiPreamble preamble) const;
 
 
-  PhyList m_phyList;
-  Ptr<PropagationLossModel> m_loss;
-  Ptr<PropagationDelayModel> m_delay;
+  PhyList m_phyList; //!< List of YansWifiPhys connected to this YansWifiChannel
+  Ptr<PropagationLossModel> m_loss; //!< Propagation loss model
+  Ptr<PropagationDelayModel> m_delay; //!< Propagation delay model
 };
 
 } // namespace ns3
diff -Naur ns-3.18.1/src/wifi/model/yans-wifi-phy.cc ns-3.19/src/wifi/model/yans-wifi-phy.cc
--- ns-3.18.1/src/wifi/model/yans-wifi-phy.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/yans-wifi-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -42,7 +42,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (YansWifiPhy);
+NS_OBJECT_ENSURE_REGISTERED (YansWifiPhy)
+  ;
 
 TypeId
 YansWifiPhy::GetTypeId (void)
@@ -862,9 +863,9 @@
   return m_guardInterval;
 }
 void
-YansWifiPhy::SetGuardInterval (bool GuardInterval)
+YansWifiPhy::SetGuardInterval (bool guardInterval)
 {
-  m_guardInterval = GuardInterval;
+  m_guardInterval = guardInterval;
 }
 
 uint32_t
diff -Naur ns-3.18.1/src/wifi/model/yans-wifi-phy.h ns-3.19/src/wifi/model/yans-wifi-phy.h
--- ns-3.18.1/src/wifi/model/yans-wifi-phy.h	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wifi/model/yans-wifi-phy.h	2013-12-20 09:44:50.000000000 -0800
@@ -69,59 +69,181 @@
   YansWifiPhy ();
   virtual ~YansWifiPhy ();
 
+  /**
+   * Set the YansWifiChannel this YansWifiPhy is to be connected to.
+   *
+   * \param channel the YansWifiChannel this YansWifiPhy is to be connected to
+   */
   void SetChannel (Ptr<YansWifiChannel> channel);
 
   /**
-   * \brief Set channel number.
-   *
-   * Channel center frequency = Channel starting frequency + 5 MHz * nch
-   *
-   * where Starting channel frequency is standard-dependent, see SetStandard()
-   * as defined in IEEE 802.11-2007 17.3.8.3.2.
+   * Set the current channel number.
    *
-   * YansWifiPhy can switch among different channels. Basically, YansWifiPhy
-   * has a private attribute m_channelNumber that identifies the channel the
-   * PHY operates on. Channel switching cannot interrupt an ongoing transmission.
-   * When PHY is in TX state, the channel switching is postponed until the end
-   * of the current transmission. When the PHY is in RX state, the channel
-   * switching causes the drop of the synchronized packet.
+   * \param id the channel number
    */
   void SetChannelNumber (uint16_t id);
-  /// Return current channel number, see SetChannelNumber()
+  /**
+   * Return the current channel number.
+   *
+   * \return the current channel number
+   */
   uint16_t GetChannelNumber () const;
-  /// Return current center channel frequency in MHz, see SetChannelNumber()
+  /**
+   * Return current center channel frequency in MHz.
+   *
+   * \return the current center channel frequency in MHz
+   */  
   double GetChannelFrequencyMhz () const;
 
+  /**
+   * Starting receiving the packet (i.e. the first bit of the preamble has arrived).
+   *
+   * \param packet the arriving packet
+   * \param rxPowerDbm the receive power in dBm
+   * \param txVector the TXVECTOR of the arriving packet
+   * \param preamble the preamble of the arriving packet
+   */
   void StartReceivePacket (Ptr<Packet> packet,
                            double rxPowerDbm,
                            WifiTxVector txVector,
                            WifiPreamble preamble);
 
+  /**
+   * Sets the RX loss (dB) in the Signal-to-Noise-Ratio due to non-idealities in the receiver.
+   *
+   * \param noiseFigureDb noise figure in dB
+   */
   void SetRxNoiseFigure (double noiseFigureDb);
+  /**
+   * Sets the minimum available transmission power level (dBm).
+   *
+   * \param start the minimum transmission power level (dBm)
+   */
   void SetTxPowerStart (double start);
+  /**
+   * Sets the maximum available transmission power level (dBm).
+   *
+   * \param end the maximum transmission power level (dBm)
+   */
   void SetTxPowerEnd (double end);
+  /**
+   * Sets the number of transmission power levels available between the
+   * minimum level and the maximum level.  Transmission power levels are
+   * equally separated (in dBm) with the minimum and the maximum included.
+   *
+   * \param n the number of available levels
+   */
   void SetNTxPower (uint32_t n);
+  /**
+   * Sets the transmission gain (dB).
+   *
+   * \param gain the transmission gain in dB
+   */
   void SetTxGain (double gain);
+  /**
+   * Sets the reception gain (dB).
+   *
+   * \param gain the reception gain in dB
+   */
   void SetRxGain (double gain);
+  /**
+   * Sets the energy detection threshold (dBm).
+   * The energy of a received signal should be higher than
+   * this threshold (dbm) to allow the PHY layer to detect the signal.
+   *
+   * \param threshold the energy detction threshold in dBm
+   */
   void SetEdThreshold (double threshold);
+  /**
+   * Sets the CCA threshold (dBm).  The energy of a received signal
+   * should be higher than this threshold to allow the PHY
+   * layer to declare CCA BUSY state.
+   *
+   * \param threshold the CCA threshold in dBm
+   */
   void SetCcaMode1Threshold (double threshold);
+  /**
+   * Sets the error rate model.
+   *
+   * \param rate the error rate model
+   */
   void SetErrorRateModel (Ptr<ErrorRateModel> rate);
+  /**
+   * Sets the device this PHY is associated with.
+   *
+   * \param device the device this PHY is associated with
+   */
   void SetDevice (Ptr<Object> device);
+  /**
+   * Sets the mobility model.
+   *
+   * \param mobility the mobility model this PHY is associated with
+   */
   void SetMobility (Ptr<Object> mobility);
+  /**
+   * Return the RX noise figure (dBm).
+   *
+   * \return the RX noise figure in dBm
+   */
   double GetRxNoiseFigure (void) const;
+  /**
+   * Return the transmission gain (dB).
+   *
+   * \return the transmission gain in dB
+   */
   double GetTxGain (void) const;
+  /**
+   * Return the reception gain (dB).
+   *
+   * \return the reception gain in dB
+   */
   double GetRxGain (void) const;
+  /**
+   * Return the energy detection threshold (dBm).
+   *
+   * \return the energy detection threshold in dBm
+   */
   double GetEdThreshold (void) const;
+  /**
+   * Return the CCA threshold (dBm).
+   *
+   * \return the CCA threshold in dBm
+   */
   double GetCcaMode1Threshold (void) const;
+  /**
+   * Return the error rate model this PHY is using.
+   *
+   * \return the error rate model this PHY is using
+   */
   Ptr<ErrorRateModel> GetErrorRateModel (void) const;
+  /**
+   * Return the device this PHY is associated with
+   *
+   * \return the device this PHY is associated with
+   */
   Ptr<Object> GetDevice (void) const;
+  /**
+   * Return the mobility model this PHY is associated with.
+   *
+   * \return the mobility model this PHY is associated with
+   */
   Ptr<Object> GetMobility (void);
 
-
-
-
+  /**
+   * Return the minimum available transmission power level (dBm).
+   * \return the minimum available transmission power level (dBm)
+   */
   virtual double GetTxPowerStart (void) const;
+  /**
+   * Return the maximum available transmission power level (dBm).
+   * \return the maximum available transmission power level (dBm)
+   */
   virtual double GetTxPowerEnd (void) const;
+  /**
+   * Return the number of available transmission power levels.
+   *
+   * \return the number of available transmission power levels
+   */
   virtual uint32_t GetNTxPower (void) const;
   virtual void SetReceiveOkCallback (WifiPhy::RxOkCallback callback);
   virtual void SetReceiveErrorCallback (WifiPhy::RxErrorCallback callback);
@@ -140,6 +262,7 @@
   virtual WifiMode GetMode (uint32_t mode) const;
   virtual double CalculateSnr (WifiMode txMode, double ber) const;
   virtual Ptr<WifiChannel> GetChannel (void) const;
+  
   virtual void ConfigureStandard (enum WifiPhyStandard standard);
 
  /**
@@ -153,61 +276,83 @@
   int64_t AssignStreams (int64_t stream);
 
   /**
-   * \param the operating frequency on this node (2.4 GHz or 5GHz).
+   * \param freq the operating frequency on this node (2.4 GHz or 5GHz).
    */
   virtual void SetFrequency (uint32_t freq);
   /**
-   * \returns the operating frequency on this node
+   * \return the operating frequency on this node
    */
   virtual uint32_t GetFrequency (void) const;
   /**
-   * \param the number of transmitters on this node.
+   * \param tx the number of transmitters on this node.
    */
   virtual void SetNumberOfTransmitAntennas (uint32_t tx);
   virtual uint32_t GetNumberOfTransmitAntennas (void) const;
   /**
-   * \param the number of receivers on this node.
+   * \param rx the number of receivers on this node.
    */
   virtual void SetNumberOfReceiveAntennas (uint32_t rx) ;
   /**
-   * \returns the number of receivers on this node.
+   * \return the number of receivers on this node.
    */
   virtual uint32_t GetNumberOfReceiveAntennas (void) const;
   /**
-   * \param set short/long guard interval.
+   * Enable or disable short/long guard interval.
+   *
+   * \param guardInterval Enable or disable guard interval
    */
-  virtual void SetGuardInterval (bool GuardInterval);
-   virtual bool GetGuardInterval (void) const;
+  virtual void SetGuardInterval (bool guardInterval);
   /**
-   * \param sets LDPC is supported or not
+   * Return whether guard interval is being used.
+   *
+   * \return true if guard interval is being used, false otherwise
    */
-  virtual void SetLdpc (bool Ldpc);
+  virtual bool GetGuardInterval (void) const;
   /**
-   * \returns if LDPC is supported or not
+   * Enable or disable LDPC.
+   * \param ldpc Enable or disable LDPC
+   */
+  virtual void SetLdpc (bool ldpc);
+  /**
+   * Return if LDPC is supported.
+   *
+   * \return true if LDPC is supported, false otherwise
    */
   virtual bool GetLdpc (void) const;
   /**
-   * \param sets STBC is supported or not
+   * Enable or disable STBC.
+   *
+   * \param stbc Enable or disable STBC
    */
   virtual void SetStbc (bool stbc);
- /**
-   * \returns if STBC is supported or not
+  /**
+   * Return whether STBC is supported. 
+   *
+   * \return true if STBC is supported, false otherwise
    */
   virtual bool GetStbc (void) const;
   /**
-   * \param sets Greenfield is supported or not
+   * Enable or disable Greenfield support.
+   *
+   * \param greenfield Enable or disable Greenfield
    */
   virtual void SetGreenfield (bool greenfield);
   /**
-   * \returns if Greenfield is supported or not
+   * Return whether Greenfield is supported.
+   *
+   * \return true if Greenfield is supported, false otherwise
    */
   virtual bool GetGreenfield (void) const;
   /**
-   * \param sets channel bonding is supported or not
+   * Return whether channel bonding is supported.
+   * 
+   * \return true if channel bonding is supported, false otherwise
    */
   virtual bool GetChannelBonding (void) const ;
   /**
-   * \returns if channel bonding is supported or not
+   * Enable or disable channel bonding support.
+   * 
+   * \param channelbonding Enable or disable channel bonding
    */
   virtual void SetChannelBonding (bool channelbonding) ;
 
@@ -215,73 +360,119 @@
   virtual uint32_t GetBssMembershipSelector (uint32_t selector) const;
   virtual WifiModeList GetMembershipSelectorModes(uint32_t selector);
   /**
-   * \returns the number of MCS supported by this phy
+   * \return the number of MCS supported by this phy
    */
   virtual uint8_t GetNMcs (void) const;
   virtual uint8_t GetMcs (uint8_t mcs) const;
-  /**
-  * For a given WifiMode finds the corresponding MCS value and returns it 
-  * as defined in the IEEE 802.11n standard 
-  *
-  * \param mode the WifiMode
-  * \returns the MCS number that corresponds to the given WifiMode
-  */
+
   virtual uint32_t WifiModeToMcs (WifiMode mode);
- /**
-  * For a given MCS finds the corresponding WifiMode and returns it 
-  * as defined in the IEEE 802.11n standard. 
-  * 
-  * \param mcs the MCS number 
-  * \returns the WifiMode that corresponds to the given mcs number
-  */
   virtual WifiMode McsToWifiMode (uint8_t mcs);
 
 private:
-  YansWifiPhy (const YansWifiPhy &o);
+  //YansWifiPhy (const YansWifiPhy &o);
   virtual void DoDispose (void);
+  /**
+   * Configure YansWifiPhy with appropriate channel frequency and
+   * supported rates for 802.11a standard.
+   */
   void Configure80211a (void);
+  /**
+   * Configure YansWifiPhy with appropriate channel frequency and
+   * supported rates for 802.11b standard.
+   */
   void Configure80211b (void);
+  /**
+   * Configure YansWifiPhy with appropriate channel frequency and
+   * supported rates for 802.11g standard.
+   */
   void Configure80211g (void);
+  /**
+   * Configure YansWifiPhy with appropriate channel frequency and
+   * supported rates for 802.11a standard with 10MHz channel spacing.
+   */
   void Configure80211_10Mhz (void);
+  /**
+   * Configure YansWifiPhy with appropriate channel frequency and
+   * supported rates for 802.11a standard with 5MHz channel spacing.
+   */
   void Configure80211_5Mhz ();
   void ConfigureHolland (void);
+  /**
+   * Configure YansWifiPhy with appropriate channel frequency and
+   * supported rates for 802.11n standard.
+   */
   void Configure80211n (void);
+  /**
+   * Return the energy detection threshold.
+   *
+   * \return the energy detection threshold.
+   */
   double GetEdThresholdW (void) const;
+  /**
+   * Convert from dBm to Watts.
+   *
+   * \param dbm the power in dBm
+   * \return the equivalent Watts for the given dBm
+   */
   double DbmToW (double dbm) const;
+  /**
+   * Convert from dB to ratio.
+   *
+   * \param db
+   * \return ratio
+   */
   double DbToRatio (double db) const;
+  /**
+   * Convert from Watts to dBm.
+   *
+   * \param w the power in Watts
+   * \return the equivalent dBm for the given Watts
+   */
   double WToDbm (double w) const;
+  /**
+   * Convert from ratio to dB.
+   *
+   * \param ratio
+   * \return dB
+   */
   double RatioToDb (double ratio) const;
+  /**
+   * Get the power of the given power level in dBm.
+   * In YansWifiPhy implementation, the power levels are equally spaced (in dBm).
+   *
+   * \param power the power level
+   * \return the transmission power in dBm at the given power level
+   */
   double GetPowerDbm (uint8_t power) const;
+  /**
+   * The last bit of the packet has arrived.
+   *
+   * \param packet the packet that the last bit has arrived
+   * \param event the corresponding event of the first time the packet arrives
+   */
   void EndReceive (Ptr<Packet> packet, Ptr<InterferenceHelper::Event> event);
 
 private:
-  double   m_edThresholdW;
-  double   m_ccaMode1ThresholdW;
-  double   m_txGainDb;
-  double   m_rxGainDb;
-  double   m_txPowerBaseDbm;
-  double   m_txPowerEndDbm;
-  uint32_t m_nTxPower;
-
-  Ptr<YansWifiChannel> m_channel;
-  uint16_t             m_channelNumber;
-  Ptr<Object>          m_device;
-  Ptr<Object>          m_mobility;
-
-  // number of transmitters
-  uint32_t m_numberOfTransmitters;
-  // number of receivers
-  uint32_t m_numberOfReceivers;
-  //if true use LDPC
-  bool     m_ldpc;
-  // True if STBC is used
-  bool     m_stbc;
-  //True if GreenField format is supported
-  bool     m_greenfield;
-  //True is short guard interval is used
-  bool     m_guardInterval;
-  //True if channel bonding is used
-  bool     m_channelBonding;
+  double   m_edThresholdW;        //!< Energy detection threshold in watts
+  double   m_ccaMode1ThresholdW;  //!< Clear channel assessment (CCA) threshold in watts
+  double   m_txGainDb;            //!< Transmission gain (dB)
+  double   m_rxGainDb;            //!< Reception gain (dB)
+  double   m_txPowerBaseDbm;      //!< Minimum transmission power (dBm)
+  double   m_txPowerEndDbm;       //!< Maximum transmission power (dBm)
+  uint32_t m_nTxPower;            //!< Number of available transmission power levels
+
+  Ptr<YansWifiChannel> m_channel;        //!< YansWifiChannel that this YansWifiPhy is connected to
+  uint16_t             m_channelNumber;  //!< Operating channel number
+  Ptr<Object>          m_device;         //!< Pointer to the device
+  Ptr<Object>          m_mobility;       //!< Pointer to the mobility model
+
+  uint32_t m_numberOfTransmitters;  //!< Number of transmitters
+  uint32_t m_numberOfReceivers;     //!< Number of receivers
+  bool     m_ldpc;                  //!< Flag if LDPC is used
+  bool     m_stbc;                  //!< Flag if STBC is used      
+  bool     m_greenfield;            //!< Flag if GreenField format is supported
+  bool     m_guardInterval;         //!< Flag if short guard interval is used
+  bool     m_channelBonding;        //!< Flag if channel conding is used
 
 
   /**
@@ -325,13 +516,12 @@
   std::vector<uint32_t> m_bssMembershipSelectorSet;
   std::vector<uint8_t> m_deviceMcsSet;
   EventId m_endRxEvent;
-  /// Provides uniform random variables.
-  Ptr<UniformRandomVariable> m_random;
-  /// Standard-dependent center frequency of 0-th channel, MHz
-  double m_channelStartingFrequency;
-  Ptr<WifiPhyStateHelper> m_state;
-  InterferenceHelper m_interference;
-  Time m_channelSwitchDelay;
+
+  Ptr<UniformRandomVariable> m_random;  //!< Provides uniform random variables.
+  double m_channelStartingFrequency;    //!< Standard-dependent center frequency of 0-th channel in MHz
+  Ptr<WifiPhyStateHelper> m_state;      //!< Pointer to WifiPhyStateHelper
+  InterferenceHelper m_interference;    //!< Pointer to InterferenceHelper
+  Time m_channelSwitchDelay;            //!< Time required to switch between channel
 
 };
 
diff -Naur ns-3.18.1/src/wimax/bindings/modulegen__gcc_ILP32.py ns-3.19/src/wimax/bindings/modulegen__gcc_ILP32.py
--- ns-3.18.1/src/wimax/bindings/modulegen__gcc_ILP32.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/bindings/modulegen__gcc_ILP32.py	2013-12-20 09:44:50.000000000 -0800
@@ -305,7 +305,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## wimax-tlv.h (module 'wimax'): ns3::Tlv [class]
@@ -2076,10 +2076,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -6479,6 +6480,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -6489,6 +6495,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -6504,6 +6515,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -6529,6 +6545,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/wimax/bindings/modulegen__gcc_LP64.py ns-3.19/src/wimax/bindings/modulegen__gcc_LP64.py
--- ns-3.18.1/src/wimax/bindings/modulegen__gcc_LP64.py	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/bindings/modulegen__gcc_LP64.py	2013-12-20 09:44:50.000000000 -0800
@@ -305,7 +305,7 @@
     ## nstime.h (module 'core'): ns3::Time [class]
     module.add_class('Time', import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time::Unit [enumeration]
-    module.add_enum('Unit', ['S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
+    module.add_enum('Unit', ['Y', 'D', 'H', 'MIN', 'S', 'MS', 'US', 'NS', 'PS', 'FS', 'LAST'], outer_class=root_module['ns3::Time'], import_from_module='ns.core')
     ## nstime.h (module 'core'): ns3::Time [class]
     root_module['ns3::Time'].implicitly_converts_to(root_module['ns3::int64x64_t'])
     ## wimax-tlv.h (module 'wimax'): ns3::Tlv [class]
@@ -2076,10 +2076,11 @@
                    'bool', 
                    [param('ns3::Ipv6Address const &', 'other')], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() [member function]
+    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsIpv4MappedAddress() const [member function]
     cls.add_method('IsIpv4MappedAddress', 
                    'bool', 
-                   [])
+                   [], 
+                   is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsLinkLocal() const [member function]
     cls.add_method('IsLinkLocal', 
                    'bool', 
@@ -6479,6 +6480,11 @@
                    'ns3::Time', 
                    [param('uint64_t', 'value'), param('ns3::Time::Unit', 'timeUnit')], 
                    is_static=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetDays() const [member function]
+    cls.add_method('GetDays', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): double ns3::Time::GetDouble() const [member function]
     cls.add_method('GetDouble', 
                    'double', 
@@ -6489,6 +6495,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetHours() const [member function]
+    cls.add_method('GetHours', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetInteger() const [member function]
     cls.add_method('GetInteger', 
                    'int64_t', 
@@ -6504,6 +6515,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetMinutes() const [member function]
+    cls.add_method('GetMinutes', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): int64_t ns3::Time::GetNanoSeconds() const [member function]
     cls.add_method('GetNanoSeconds', 
                    'int64_t', 
@@ -6529,6 +6545,11 @@
                    'int64_t', 
                    [], 
                    is_const=True)
+    ## nstime.h (module 'core'): double ns3::Time::GetYears() const [member function]
+    cls.add_method('GetYears', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## nstime.h (module 'core'): bool ns3::Time::IsNegative() const [member function]
     cls.add_method('IsNegative', 
                    'bool', 
diff -Naur ns-3.18.1/src/wimax/doc/wimax.rst ns-3.19/src/wimax/doc/wimax.rst
--- ns-3.18.1/src/wimax/doc/wimax.rst	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/doc/wimax.rst	2013-12-20 09:44:50.000000000 -0800
@@ -1,4 +1,5 @@
 .. include:: replace.txt
+.. highlight:: cpp
 
 Wimax NetDevice
 ---------------
@@ -78,7 +79,7 @@
 The helper API is defined in ``src/wimax/helper/wimax-helper.{cc,h}``.
 
 The example ``src/wimax/examples/wimax-simple.cc`` contains some basic code that
-shows how to set up the model:::
+shows how to set up the model::
 
   switch (schedType)
     {
@@ -117,7 +118,7 @@
 
 Different variants of ``Install`` are available; for instance, the example
 ``src/wimax/examples/wimax-multicast.cc`` shows how to specify a non-default channel
-or propagation model:::
+or propagation model::
 
   channel = CreateObject<SimpleOfdmWimaxChannel> ();
   channel->SetPropagationModel (SimpleOfdmWimaxChannel::COST231_PROPAGATION);
@@ -140,11 +141,11 @@
 priority, rate, scheduling type, etc. The base station is responsible for
 issuing service flow identifiers and mapping them to WiMAX connections. The
 following code from ``src/wimax/examples/wimax-multicast.cc`` shows how this is
-configured from a helper level:::
+configured from a helper level::
 
  ServiceFlow MulticastServiceFlow = wimax.CreateServiceFlow (ServiceFlow::SF_DIRECTION_DOWN,
-                                                              ServiceFlow::SF_TYPE_UGS,
-                                                              MulticastClassifier);
+                                                             ServiceFlow::SF_TYPE_UGS,
+                                                             MulticastClassifier);
 
   bs->GetServiceFlowManager ()->AddMulticastServiceFlow (MulticastServiceFlow, WimaxPhy::MODULATION_TYPE_QPSK_12);
 
@@ -178,7 +179,7 @@
 existing trace sources, or to define and export new ones.  
 
 Many |ns3| users use the built-in Pcap or Ascii tracing, and the
-WimaxHelper has similar APIs:::
+WimaxHelper has similar APIs::
 
     AsciiTraceHelper ascii;
     WimaxHelper wimax;
@@ -505,7 +506,9 @@
 
 The names of the files should respect the following format: modulation0.txt for
 modulation 0, modulation1.txt for modulation 1 and so on...  The file format
-should be as follows::
+should be as follows:
+
+.. sourcecode:: text
 
     SNR_value1   BER  Blc_ER  STANDARD_DEVIATION  CONFIDENCE_INTERVAL1  CONFIDENCE_INTERVAL2
     SNR_value2   BER  Blc_ER  STANDARD_DEVIATION  CONFIDENCE_INTERVAL1  CONFIDENCE_INTERVAL2
diff -Naur ns-3.18.1/src/wimax/model/bandwidth-manager.cc ns-3.19/src/wimax/model/bandwidth-manager.cc
--- ns-3.18.1/src/wimax/model/bandwidth-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bandwidth-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -37,7 +37,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BandwidthManager);
+NS_OBJECT_ENSURE_REGISTERED (BandwidthManager)
+  ;
 
 TypeId BandwidthManager::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/bs-link-manager.cc ns-3.19/src/wimax/model/bs-link-manager.cc
--- ns-3.18.1/src/wimax/model/bs-link-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-link-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BSLinkManager);
+NS_OBJECT_ENSURE_REGISTERED (BSLinkManager)
+  ;
 
 TypeId BSLinkManager::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/bs-net-device.cc ns-3.19/src/wimax/model/bs-net-device.cc
--- ns-3.18.1/src/wimax/model/bs-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -50,7 +50,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BaseStationNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (BaseStationNetDevice)
+  ;
 
 TypeId BaseStationNetDevice::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/bs-scheduler.cc ns-3.19/src/wimax/model/bs-scheduler.cc
--- ns-3.18.1/src/wimax/model/bs-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 NS_LOG_COMPONENT_DEFINE ("BSScheduler");
 
 namespace ns3 {
-NS_OBJECT_ENSURE_REGISTERED (BSScheduler);
+NS_OBJECT_ENSURE_REGISTERED (BSScheduler)
+  ;
 
 TypeId
 BSScheduler::GetTypeId (void)
diff -Naur ns-3.18.1/src/wimax/model/bs-scheduler-rtps.cc ns-3.19/src/wimax/model/bs-scheduler-rtps.cc
--- ns-3.18.1/src/wimax/model/bs-scheduler-rtps.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-scheduler-rtps.cc	2013-12-20 09:44:50.000000000 -0800
@@ -41,7 +41,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BSSchedulerRtps);
+NS_OBJECT_ENSURE_REGISTERED (BSSchedulerRtps)
+  ;
 
 TypeId
 BSSchedulerRtps::GetTypeId (void)
diff -Naur ns-3.18.1/src/wimax/model/bs-scheduler-simple.cc ns-3.19/src/wimax/model/bs-scheduler-simple.cc
--- ns-3.18.1/src/wimax/model/bs-scheduler-simple.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-scheduler-simple.cc	2013-12-20 09:44:50.000000000 -0800
@@ -39,7 +39,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BSSchedulerSimple);
+NS_OBJECT_ENSURE_REGISTERED (BSSchedulerSimple)
+  ;
 
 TypeId BSSchedulerSimple::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/bs-uplink-scheduler.cc ns-3.19/src/wimax/model/bs-uplink-scheduler.cc
--- ns-3.18.1/src/wimax/model/bs-uplink-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-uplink-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UplinkScheduler);
+NS_OBJECT_ENSURE_REGISTERED (UplinkScheduler)
+  ;
 
 UplinkScheduler::UplinkScheduler (void)
   : m_bs (0),
diff -Naur ns-3.18.1/src/wimax/model/bs-uplink-scheduler-mbqos.cc ns-3.19/src/wimax/model/bs-uplink-scheduler-mbqos.cc
--- ns-3.18.1/src/wimax/model/bs-uplink-scheduler-mbqos.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-uplink-scheduler-mbqos.cc	2013-12-20 09:44:50.000000000 -0800
@@ -33,7 +33,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (UplinkSchedulerMBQoS);
+NS_OBJECT_ENSURE_REGISTERED (UplinkSchedulerMBQoS)
+  ;
 
 UplinkSchedulerMBQoS::UplinkSchedulerMBQoS ()
 {
diff -Naur ns-3.18.1/src/wimax/model/bs-uplink-scheduler-rtps.cc ns-3.19/src/wimax/model/bs-uplink-scheduler-rtps.cc
--- ns-3.18.1/src/wimax/model/bs-uplink-scheduler-rtps.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-uplink-scheduler-rtps.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,9 @@
 NS_LOG_COMPONENT_DEFINE ("UplinkSchedulerRtps");
 
 namespace ns3 {
-NS_OBJECT_ENSURE_REGISTERED ( UplinkSchedulerRtps);
+NS_OBJECT_ENSURE_REGISTERED ( UplinkSchedulerRtps)
+  ;
+  
 
 UplinkSchedulerRtps::UplinkSchedulerRtps ()
 {
diff -Naur ns-3.18.1/src/wimax/model/bs-uplink-scheduler-simple.cc ns-3.19/src/wimax/model/bs-uplink-scheduler-simple.cc
--- ns-3.18.1/src/wimax/model/bs-uplink-scheduler-simple.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/bs-uplink-scheduler-simple.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 NS_LOG_COMPONENT_DEFINE ("UplinkSchedulerSimple");
 
 namespace ns3 {
-NS_OBJECT_ENSURE_REGISTERED (UplinkSchedulerSimple);
+NS_OBJECT_ENSURE_REGISTERED (UplinkSchedulerSimple)
+  ;
 
 UplinkSchedulerSimple::UplinkSchedulerSimple (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/burst-profile-manager.cc ns-3.19/src/wimax/model/burst-profile-manager.cc
--- ns-3.18.1/src/wimax/model/burst-profile-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/burst-profile-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (BurstProfileManager);
+NS_OBJECT_ENSURE_REGISTERED (BurstProfileManager)
+  ;
 
 TypeId BurstProfileManager::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/connection-manager.cc ns-3.19/src/wimax/model/connection-manager.cc
--- ns-3.18.1/src/wimax/model/connection-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/connection-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ConnectionManager);
+NS_OBJECT_ENSURE_REGISTERED (ConnectionManager)
+  ;
 
 TypeId ConnectionManager::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/dl-mac-messages.cc ns-3.19/src/wimax/model/dl-mac-messages.cc
--- ns-3.18.1/src/wimax/model/dl-mac-messages.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/dl-mac-messages.cc	2013-12-20 09:44:50.000000000 -0800
@@ -312,7 +312,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (Dcd);
+NS_OBJECT_ENSURE_REGISTERED (Dcd)
+  ;
 
 Dcd::Dcd (void)
   : m_reserved (0),
@@ -544,7 +545,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (DlMap);
+NS_OBJECT_ENSURE_REGISTERED (DlMap)
+  ;
 
 DlMap::DlMap (void)
   : m_dcdCount (0),
diff -Naur ns-3.18.1/src/wimax/model/ipcs-classifier.cc ns-3.19/src/wimax/model/ipcs-classifier.cc
--- ns-3.18.1/src/wimax/model/ipcs-classifier.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/ipcs-classifier.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (IpcsClassifier);
+NS_OBJECT_ENSURE_REGISTERED (IpcsClassifier)
+  ;
 
 TypeId IpcsClassifier::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/mac-messages.cc ns-3.19/src/wimax/model/mac-messages.cc
--- ns-3.18.1/src/wimax/model/mac-messages.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/mac-messages.cc	2013-12-20 09:44:50.000000000 -0800
@@ -29,7 +29,8 @@
 NS_LOG_COMPONENT_DEFINE ("MACMESSAGES");
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ManagementMessageType);
+NS_OBJECT_ENSURE_REGISTERED (ManagementMessageType)
+  ;
 
 ManagementMessageType::ManagementMessageType (void)
   : m_type (~0)
@@ -106,7 +107,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (RngReq);
+NS_OBJECT_ENSURE_REGISTERED (RngReq)
+  ;
 
 RngReq::RngReq (void)
   : m_reserved (0),
@@ -220,7 +222,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (RngRsp);
+NS_OBJECT_ENSURE_REGISTERED (RngRsp)
+  ;
 
 RngRsp::RngRsp (void)
   : m_reserved (0),
@@ -497,7 +500,8 @@
 
 // ----------------------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (DsaReq);
+NS_OBJECT_ENSURE_REGISTERED (DsaReq)
+  ;
 
 DsaReq::DsaReq (void)
   : m_transactionId (0),
@@ -631,7 +635,8 @@
 
 // ----------------------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (DsaRsp);
+NS_OBJECT_ENSURE_REGISTERED (DsaRsp)
+  ;
 
 DsaRsp::DsaRsp (void)
   : m_transactionId (0),
@@ -771,7 +776,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (DsaAck);
+NS_OBJECT_ENSURE_REGISTERED (DsaAck)
+  ;
 
 DsaAck::DsaAck (void)
   : m_transactionId (0),
diff -Naur ns-3.18.1/src/wimax/model/service-flow-manager.cc ns-3.19/src/wimax/model/service-flow-manager.cc
--- ns-3.18.1/src/wimax/model/service-flow-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/service-flow-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,7 +43,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (ServiceFlowManager);
+NS_OBJECT_ENSURE_REGISTERED (ServiceFlowManager)
+  ;
 
 TypeId ServiceFlowManager::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/simple-ofdm-wimax-channel.cc ns-3.19/src/wimax/model/simple-ofdm-wimax-channel.cc
--- ns-3.18.1/src/wimax/model/simple-ofdm-wimax-channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/simple-ofdm-wimax-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -36,7 +36,8 @@
 NS_LOG_COMPONENT_DEFINE ("simpleOfdmWimaxChannel");
 
 namespace ns3 {
-// NS_OBJECT_ENSURE_REGISTERED (simpleOfdmWimaxChannel);
+// NS_OBJECT_ENSURE_REGISTERED (simpleOfdmWimaxChannel)
+//   ;
 
 
 SimpleOfdmWimaxChannel::SimpleOfdmWimaxChannel (void)
diff -Naur ns-3.18.1/src/wimax/model/simple-ofdm-wimax-phy.cc ns-3.19/src/wimax/model/simple-ofdm-wimax-phy.cc
--- ns-3.18.1/src/wimax/model/simple-ofdm-wimax-phy.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/simple-ofdm-wimax-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -38,7 +38,8 @@
 NS_LOG_COMPONENT_DEFINE ("SimpleOfdmWimaxPhy");
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SimpleOfdmWimaxPhy);
+NS_OBJECT_ENSURE_REGISTERED (SimpleOfdmWimaxPhy)
+  ;
 
 TypeId SimpleOfdmWimaxPhy::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/ss-link-manager.cc ns-3.19/src/wimax/model/ss-link-manager.cc
--- ns-3.18.1/src/wimax/model/ss-link-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/ss-link-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -35,7 +35,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SSLinkManager);
+NS_OBJECT_ENSURE_REGISTERED (SSLinkManager)
+  ;
 
 TypeId SSLinkManager::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/ss-manager.cc ns-3.19/src/wimax/model/ss-manager.cc
--- ns-3.18.1/src/wimax/model/ss-manager.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/ss-manager.cc	2013-12-20 09:44:50.000000000 -0800
@@ -28,7 +28,8 @@
 NS_LOG_COMPONENT_DEFINE ("SSManager");
 
 namespace ns3 {
-NS_OBJECT_ENSURE_REGISTERED (SSManager);
+NS_OBJECT_ENSURE_REGISTERED (SSManager)
+  ;
 
 TypeId SSManager::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/ss-net-device.cc ns-3.19/src/wimax/model/ss-net-device.cc
--- ns-3.18.1/src/wimax/model/ss-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/ss-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -46,7 +46,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (SubscriberStationNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (SubscriberStationNetDevice)
+  ;
 
 Time SubscriberStationNetDevice::GetDefaultLostDlMapInterval ()
 {
diff -Naur ns-3.18.1/src/wimax/model/ss-scheduler.cc ns-3.19/src/wimax/model/ss-scheduler.cc
--- ns-3.18.1/src/wimax/model/ss-scheduler.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/ss-scheduler.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 NS_LOG_COMPONENT_DEFINE ("SSScheduler");
 
 namespace ns3 {
-NS_OBJECT_ENSURE_REGISTERED (SSScheduler);
+NS_OBJECT_ENSURE_REGISTERED (SSScheduler)
+  ;
 
 TypeId SSScheduler::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/ul-mac-messages.cc ns-3.19/src/wimax/model/ul-mac-messages.cc
--- ns-3.18.1/src/wimax/model/ul-mac-messages.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/ul-mac-messages.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (Ucd);
+NS_OBJECT_ENSURE_REGISTERED (Ucd)
+  ;
 
 UcdChannelEncodings::UcdChannelEncodings (void)
   : m_bwReqOppSize (0),
@@ -577,7 +578,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (UlMap);
+NS_OBJECT_ENSURE_REGISTERED (UlMap)
+  ;
 
 UlMap::UlMap (void)
   : m_reserved (0),
diff -Naur ns-3.18.1/src/wimax/model/wimax-channel.cc ns-3.19/src/wimax/model/wimax-channel.cc
--- ns-3.18.1/src/wimax/model/wimax-channel.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/wimax-channel.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WimaxChannel);
+NS_OBJECT_ENSURE_REGISTERED (WimaxChannel)
+  ;
 
 TypeId WimaxChannel::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/wimax-connection.cc ns-3.19/src/wimax/model/wimax-connection.cc
--- ns-3.18.1/src/wimax/model/wimax-connection.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/wimax-connection.cc	2013-12-20 09:44:50.000000000 -0800
@@ -27,7 +27,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WimaxConnection);
+NS_OBJECT_ENSURE_REGISTERED (WimaxConnection)
+  ;
 
 TypeId WimaxConnection::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/wimax-mac-header.cc ns-3.19/src/wimax/model/wimax-mac-header.cc
--- ns-3.18.1/src/wimax/model/wimax-mac-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/wimax-mac-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -25,7 +25,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (MacHeaderType);
+NS_OBJECT_ENSURE_REGISTERED (MacHeaderType)
+  ;
 
 MacHeaderType::MacHeaderType (void)
   : m_type (0)
@@ -92,7 +93,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (GenericMacHeader);
+NS_OBJECT_ENSURE_REGISTERED (GenericMacHeader)
+  ;
 
 GenericMacHeader::GenericMacHeader (void)
   : m_ht (0),
@@ -296,7 +298,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (BandwidthRequestHeader);
+NS_OBJECT_ENSURE_REGISTERED (BandwidthRequestHeader)
+  ;
 
 BandwidthRequestHeader::BandwidthRequestHeader (void)
   : m_ht (1),
@@ -478,7 +481,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (GrantManagementSubheader);
+NS_OBJECT_ENSURE_REGISTERED (GrantManagementSubheader)
+  ;
 
 GrantManagementSubheader::GrantManagementSubheader (void)
   : m_si (0),
@@ -569,7 +573,8 @@
 
 // ----------------------------------------------------------------------------------------------------------
 
-NS_OBJECT_ENSURE_REGISTERED (FragmentationSubheader);
+NS_OBJECT_ENSURE_REGISTERED (FragmentationSubheader)
+  ;
 
 FragmentationSubheader::FragmentationSubheader (void)
   : m_fc (0),
diff -Naur ns-3.18.1/src/wimax/model/wimax-mac-queue.cc ns-3.19/src/wimax/model/wimax-mac-queue.cc
--- ns-3.18.1/src/wimax/model/wimax-mac-queue.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/wimax-mac-queue.cc	2013-12-20 09:44:50.000000000 -0800
@@ -31,7 +31,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WimaxMacQueue);
+NS_OBJECT_ENSURE_REGISTERED (WimaxMacQueue)
+  ;
 
 WimaxMacQueue::QueueElement::QueueElement (void)
   : m_packet (Create<Packet> ()),
diff -Naur ns-3.18.1/src/wimax/model/wimax-mac-to-mac-header.cc ns-3.19/src/wimax/model/wimax-mac-to-mac-header.cc
--- ns-3.18.1/src/wimax/model/wimax-mac-to-mac-header.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/wimax-mac-to-mac-header.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 #include "ns3/log.h"
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WimaxMacToMacHeader);
+NS_OBJECT_ENSURE_REGISTERED (WimaxMacToMacHeader)
+  ;
 
 WimaxMacToMacHeader::WimaxMacToMacHeader (void)
   : m_len (0)
diff -Naur ns-3.18.1/src/wimax/model/wimax-net-device.cc ns-3.19/src/wimax/model/wimax-net-device.cc
--- ns-3.18.1/src/wimax/model/wimax-net-device.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/wimax-net-device.cc	2013-12-20 09:44:50.000000000 -0800
@@ -43,7 +43,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WimaxNetDevice);
+NS_OBJECT_ENSURE_REGISTERED (WimaxNetDevice)
+  ;
 
 uint32_t WimaxNetDevice::m_nrFrames = 0;
 uint8_t WimaxNetDevice::m_direction = ~0;
diff -Naur ns-3.18.1/src/wimax/model/wimax-phy.cc ns-3.19/src/wimax/model/wimax-phy.cc
--- ns-3.18.1/src/wimax/model/wimax-phy.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/wimax-phy.cc	2013-12-20 09:44:50.000000000 -0800
@@ -34,7 +34,8 @@
 
 namespace ns3 {
 
-NS_OBJECT_ENSURE_REGISTERED (WimaxPhy);
+NS_OBJECT_ENSURE_REGISTERED (WimaxPhy)
+  ;
 
 TypeId WimaxPhy::GetTypeId (void)
 {
diff -Naur ns-3.18.1/src/wimax/model/wimax-tlv.cc ns-3.19/src/wimax/model/wimax-tlv.cc
--- ns-3.18.1/src/wimax/model/wimax-tlv.cc	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/src/wimax/model/wimax-tlv.cc	2013-12-20 09:44:50.000000000 -0800
@@ -24,7 +24,8 @@
 NS_LOG_COMPONENT_DEFINE ("Tlv");
 
 namespace ns3 {
-// NS_OBJECT_ENSURE_REGISTERED ("Tlv");
+// NS_OBJECT_ENSURE_REGISTERED ("Tlv")
+//    ;
 
 TypeId Tlv::GetInstanceTypeId (void) const
 {
diff -Naur ns-3.18.1/VERSION ns-3.19/VERSION
--- ns-3.18.1/VERSION	2013-11-15 15:32:34.000000000 -0800
+++ ns-3.19/VERSION	2013-12-20 09:44:50.000000000 -0800
@@ -1 +1 @@
-3.18.1
+3.19
diff -Naur ns-3.18.1/waf ns-3.19/waf
--- ns-3.18.1/waf	2013-11-15 13:50:32.000000000 -0800
+++ ns-3.19/waf	2013-12-20 09:44:50.000000000 -0800
@@ -32,11 +32,11 @@
 
 import os, sys
 
-VERSION="1.7.11"
-REVISION="edc6ccb516c5e3f9b892efc9f53a610f"
+VERSION="1.7.13"
+REVISION="5a064c2686fe54de4e11018d22148cfc"
 INSTALL=''
-C1='#+'
-C2='#*'
+C1='#('
+C2='#$'
 cwd = os.getcwd()
 join = os.path.join
 
@@ -163,5 +163,5 @@
 	Scripting.waf_entry_point(cwd, VERSION, wafdir)
 
 #==>
-#BZh91AY&SY`|2t (2D  H  Hag                  S`WlT*W;=SUvhJgsZ>ҥB}n4}=p}vc[+D slpk zzsx}o}U]|{#*v]  }hǯ'E sJ:(ꁶt;>h dٻ@օJ+T}hAJ%@JU #+lj+};2[T#+}#+͜z]޽}w;;޷^I.{}{}8Z^]w{Cvb"i;eQFlԽ:Iwc;<a(]dU"x=׹FvڲvrpY[뷳rj_<w2Ni{Z{dw8wznҼ﻽돹-A(}[=Ϩ}mwdGחVcv{ǲmۺPE#*o}ym]fhKާ VUg}:>tku-vy)Սty\$ wssa=@4(ж.1\O4ռwgm^wVV%B@ۺC׫: #*;j꾼==nsw{:D^ށw>x{.;5fow]WǏNu{TTx;7^g[.|Z<^yܡ n3n An&ovz)ZOfuz^=Gl>{4h}vxa ls]{zam-0t{}PFaۼσl`_X+F iPǑ5=TӴS#*%H˸Oloau*oujkvz޷=}urئ6z^Qr__;_}Sl[˯ᦈ @  4&4ѓFzD1h  hM=22#*=    	da4 "y4Oji4jhOS@   D = MP<=MG(#*dd    $D0C@!L&&LF&Fj1Di#@#*Ih"SGM=LOI#*G      G (fG!r(p 4QPPh(Rn@Y@O?O!%G޿*^fiSOWMw0LV#)*'Ou33 nQ Mw	Ts1j\J!^>#\MhIf#ܸxwV&`^c.aV%:TquR(G"2#+%R(.LSC1DZR0: " DT.Q$2)C@",EQUQQ3D4MA5SIM3%2QMUQ1AARTTQD1(@P1EEU2TTD$T-5T4I4AKIE#*4AQUQ$HQ5LU4E-  T5M0ER4EMA-	T*0E$LDHPTBM$(PDI DRMM42ERJUM$RPD%1	A2D#*P3QMMQEE1PTUM34PT51ESRD!UC#*UDĐU3%SD$@QDHDTT1CSCDTPU1LEADCDIE	RDTPUPDSET1JPIPDMQUPĕKA@PTA#*S4SQE2ETS4R3UEQEQIITUDDIKTCTPIPPTIT02CTEMEII54L1ALSLD1BTCRLKTLRRTA,Q"UTS3M$0DDPLA0IIA5AAPEE10DPUMQDDPUDLLTAPEBECJPQQ$M15$R4UPE#*0D5	3%)TA-MDIS#*K34DRBKALMIDL#*@AU$QA@411R%,CSU#*14TPĴLTQ%0E2ITDEBE#,-TTLUAQ@Ҕ#ԑ4EMEECUD4CDJPE4DBI5SAQDSQSMDQDHRDLU4C,(PDTDQS1T@%1IA2I,A0PLS@J!PLLS$#+H`Ha "#+J#+	"%i	(*Za("(#+BR&iX#+I#+j$Bh"#+b(FX&)aX fH")$`((f#+h$#+"T"RJ%*$#+*)ZR %#+"#+P)b"XIH$R"iajb&e#+`"X%F@J@`PB !)j*e&&(!aB!HXJ#+@)&)* #+JbbB"h`"Hh#+bf#+*(		i JHI&j"$B*BH(*Z(j J!$"F`jjif(!)Re)h)ii!&)j h **"iJH)&Zi	fi 	!bX) *f("!(&`BBaFa&!!a(eB)(bb#+eBj$)()F&b"(hHJ"Hj#+"Yb`"&*Xb*#+"FJ#+@#+() ""j !)beVB%#+"j#+"(&*& ""( X"H$hX"Hfh&	B#+"`&)hjf $ h	H#+J@ijj#+)B$b*)@h &BJ#+B&hH"*`*(&#+(i!RBD(JA%)H!Zi#+*#+% #+J*F*HiJiX("#+	%)*"hhJ V HibJ(&#+((bX(( h#+R#+E(@X""Z`FK$D-1PU	H ]⛌2CkD`,iؖrVkRs4fF((֧MnCnΏOȋ,] >gpF+ ;#O<фR,Zx~ʨc7p1NScy@!'V GWac0}"pQxppPCnf2cq010ᑭFL7/|gETTDjMTߎa!xN	^XfZhHqqheܺc# 2Ɉ<M͎wǇkrq.1;f}E>3$^ɦ,C9Zda?S.5*Skn툟gapa8!/Fm'jGA?/s]Yobs#+maQY,LSDDD#*{<yܵtH9S$5DMg~cY+Qۢ"*5nq a*F{|ot`MB{r܌E5$ԄM=]&oYƶQE3,";ׁ.rjs"Xf޾?,l D/}xD`hf!2/1Φ{b-FnzLQl/Djevo~olN@	(Ywh{njadQ%?LHQ-6u:xѓ˛[hҮzR#*hz}2#*̌,n竺^KR\<zl ccL;Khc<]ugLƎQqRFvc!e(>lye(h(5d4?#*#zfT>Y{)%9(zFi("-߯:,!Vძ9'*nl"_wir[zb.κii#+IaAla\XgX)_>h?l8qHOS%1JF0.p:x6Qԁg#*Q%6A#*flYj2gVtj:|g"	3)kyh9eCṽ5 b>ZKN22QwXsm1vaSwzODyG>n/>U~ío%nX/.Ϗ8!oTa$iy\)ڊ{ՠ@뢅&dւ#*#*bcҚC#>ƣwY@M{V3k"4r	#*1wˏETtkr"=i+#mGr>=N)8lWzs^#*		)Z,!8_i𷊇}j#+jL*hC3Zٷf!$y+]#*`Q	);bWuQ5ًWIf[~'=,E#*'M-/;jVɛmgߞq.FpHj<ͳplsp#*i4QVѪL9값!2/=V~~2*l/w\xϷp<*$h,~>ǆNiB;7cml_6-Tvl|d"vFL{r0>9V"Fx1v9<5kgU&u0AHU16PۼOGR2#*z;i5cwoMxĎѧwZywwH^Jv!V*zV'ћ=̎l]]'W,58s>_{7hs5ݘd 1ö,ZhaEߎ!x>-AC鬒m5Zx'tr?y4xhY=WZRRȸ=M2#*AID̞M+k#+6V_fn^1qA	ܴ#`[!@:ф	4ao̦hp}hi1H ^#eFj}kY7ǇljigAזڽ!@:KYmC2uC֏XhG##*v1#+}S>_#*jQ#eҭ1*r@y'!.E4TjT<l7ޝ*։o,l8#m2#*a6Ԇگ0fr5"MI};xJx5̷z=ڝV:#ɔؑHN'0#I_b0ޯGi8p8qo,%.Ǣ"[kLS<!;j+MfdgwѬL^?$4LC-By57?<îe،ԾL	83 2GbF#+WtdCR#N(Gq[ctX-M`qOkξ=޾Gl3mWv!ɚf#*lVFf=dw&Ԙ)Zŉk/6>O2d_'z7.66;Auߕ&c'9r@JPȤHTYY^6{TJn[]jkMM|xTs|õ>Gɿ`RHH^m39EejlyNqS];w#+]1۔XzaF5i[$v& (dMHHB@=xK(d\{BCW~22BQ=.^q^$	N8$wPߘt~snx >ޫ !6Mxm'Ƞ+|^<ٌ#p&7G׏dR{l(#gs]hkor5c8y-"+GWu#0mv\s!y!_c~#+pt"ksh	.鿣蕋%l}Z4#*la7"fH&l9f(9?8^2HY[X!&PRm^OۭtYTk-/GŸC'|QlsD)iS.ac^^vvElx"Kk綃Qe~J~	>(1; 5,6O6 #elg}S|ɭF~uьӏ9}<+407;e+m#*dtgk^~eN[jUto!Ԝ翄Tf/^,gl%S1ɱ*}Q!B1ֶUQ3eMjP`E150Vj5צ<lֈ}ӌvΝf|z̏>7c3{Cފ5t-TJ-r+O!X>s#:]X$N'\Na6dxzA|y'ȣ1dCn6@m(*`;jv!9fZUJ&`F"s$hA4&5fQcDAZ",1#bTбppmD%7p*+ƣ=9դɛ=C)f5ti."L`*ǲйBu/fQҧZ>j;WۘBrK2A$CL&ɾY0{s5$fLyM*:5F!c ֙$EM\x!D_b_EE#*eEP3>|Z{8lW2"hwc>U[ɉ]%6换EPq_$cw#+ b֑uNʧV첩ZKoVc#+?%ןKNЯ^ͺgNhpNlZ.OfIuv#Çۢ߄ӥczyԶ;	̰˦kۇHjWN$!-;;aUpCչ	Yu#*F#+^7|uzGiLҌyt>dܱ;dBڭyDRU@|7DD$*Y46 ad9}Iy)Ky$>//k[|)9Y=3BH13=5rT7Nx$s!XwE-dAkr!֓Jg8i&4##+Ynkײʢ{Bnu#7rڃ8pcۮ\M.>گ5=y3w'?C3ZKN"j6;)umT,UlvO-XjwAs^y~?Wc`o0Ho^jnSčk]RT5{_1sf麻ljc{5Y !	AE*fRJd!&*ǝQ	ݎsn%͚e#cI&5TzY;kʉ:Ő8E]9]7>_2xO+"3:o<._t"v(L="v<zס䟯d豜r%}FqRy50/cϥl*P<#+N?th$j{;P|o7ܞ2Ʈa-iAG c#@5껶X"ztI5Fm,[*WQl,r\uᷔ[T|	Tu}G7N{jD*h!V|\q8$~/oj39vHGfZ+'Wfɧ3|lDx$A2*bMCD8 i!:HE`|ygƃϫJ  W)רgY` O2(6X90E!D~Ζ#i! X{殚~kN}Z.a]V2&ʐMkQf55Cz&v{q )ݼ$&LF}tݻq}{D!'qۏhbg@E6St{/ͽqn%h.q,@!}Bv:e[~?P^V~b`HBb;cސ}#+#*v׫Twzoqn= IZnSJD9~\͗Wѿ;A~b*Riu߼ yZGO"ݍ4{X=	TxNwWGfy4'a#L|+v:vi7F2CghK'>4nb,<w#+?PuNp@dâ#*<TaLthmaI#*U|Z-XMJ$.TwwlꀉHFň+קJg3Lܦt&jd 7ӞqǨH*[	zK] %rEV#A̾0o<ÚX9]= ,#+ѸaG16(c1]53NF|#Ha#EXSH?*MWAh"r.(sD&y=q2,q0AMNyOz[ViJi):h=֎#*AmMEf֚gQD(sp[W78_Ulh$#*gM%,8k2#6Tuy>;{2?j,"h1 '55{ych#w<fzLG^5؍HmHR$juG/Q7<hB_;1KrߍooLݔWoWp0C-u8?ԥ5>l>L8;a#+t:%a|H2f6ّBV&^B_҂L<Mߋm}KM'.ܑJ¡_pzmĲL!gDX-m*׽1x#C=z֜'	RN71Fe8mk48H;zװ6A/WONYb!=Vfiftnj]	#*C$?:;nݿ>+{hNlG& 1TgS`~6zR:݌a<ZĀ8{DGdUFp#+GS054y/.Ѻ۵Q].N.|[Rl^{a2..f)z.LLGJ2-I=<v<cNTκCQzצ%	N&]rytβ(άͰًcliɋØ\9IB77IiZPXv j^:?y4{9JNpH1̎=5;G$Z[D2Yls;xxvqoW-p>L#+5v?`s&ƾ`+Cyϳɮ>KҦ>ٱ,mC<{+|Ts7TEfrH"5k|=_nR}\SfIЌmu`?~ӮR{@>JЏNxmh!i:#*xl#(3:,v;|n[#r@Xna"UGuc|o?H|9LF6$[X7-}p6#*Tv.7#*I#+<4=#ϬlTCCx$rFȾ<	v_MVKZqWق2CL$BFN#*'kGUD+P˚":R֟Ph#yFc'Hf	⚡3в4ukyߡ:`AEf5'|$?0W 5.U9j+Rhci(.M?sga`L%3`O)TDA0S$i;@uγF&yƥ.pMTHt#tAmΙxSUJY,hx-hNg?zJFzъ#* ?ic~am˰#+@;h"zyި4X؉jg8w>٧9baZPq#*&#7ټ=\yڷٌa]b<(ik#^7g:1do:tK	$ Z pLnm&\v9[	w5}ΰٌKpj9ic^I-VfrWo\;.=8`2w	)W	8=X0Pm0]ȘVz\Ժ߶q'鈖7TfzgB8`T~MM"q?xoӴ^P+#1p \?FiM168>^*سa&A8IK"F9^j5U`mQ9#*ƌі&9Bрv瘡10.:hIG9Iem#*%D #*+)#*͜aսzj^%ԸuMc.]'{avb1PܣI04K˳wA>1h8đ"t}[7I-u:+1JhCG^׵2W+qltNE_7i5f/U7~2yl@|xuɍK#$gCGRX|^l&Iswg[@.Yg9}%T`E#+7]LRYMbw,N;&"3#*)bt:S#*MB&Cu	tNp2D9 06=.vJ{qf%o^qRY|#zkBg112hHPª4v͸ I	jӥ⬆&xl1VgՐ,lo w֬|yXˑ?ՋszQM;rg vb@U ܖa!6׌ZKvEtMBoh(nBRj!!"(B(\p&LCTORQglM-q3%kE[yiiw<g#+(:?fu{濏׼!IBNJ>B|GEZbd9Δ	-o_~c|z-dy/أ?:yq3G}_	 \|?CNAG+5:z݇ѓ;㜼AU?9t#(b`<@+Ӯz,'$Q"sׯgpF{DYUJtwԂᖶmNm}[C4+@\*6UeVKxXt?VtكV:k*B~zq?w_u=~dsOF'yeif\d<wUcOib?ݍ,`&YA?b5RCCBabk2f3m'>գ?^.LFSʗPsJƳmntc6XV@Y8BVK@$H2(?gB	Pc(x7q(4IN?饐d$#+FmUDAMH@CD|,iIiaiCuS_=7o@T?+ $I`+5Y?M;ӯ=<h1s0\ @PoZ[P!q+ϫOE=cLeB0O`0QpD@шpU%(QL5({lTn_نHLD4'#rnC	#**|d#D!ćp~ͺ<5TFf3yns9K?	euG]`?#*Ŋ1?Y{V2OՋ^֗(̓@c#*#*ffUYSk>Czs9!2a%<҈<ur0d'-$oKaSI*Mi{F~f@NA-YMP΁F<%yфv-cPHM9$نOⰮIJz(aP	4;t$Ȝ:}<&z?p<nNLpNW?~~5[7wŝ?RG¿ÄC'P1q"Dr;yUU]SĳKm}ן	Dq3բ.K,+O:glG㩖w;+Hȃd8k-~p#+UXg%Լ0ͨyj7ke85?6K ea8y>C,Rl|SwqC#+7WB|N4m%ojX({̔1x͖|l:~m?UO1>X}Y_ĸr)EEqo|[Yas?Q[HޠDϏOW'>lv#rя,;lK}oot8[e0gGƛ?cކTt#Rt7r1%5&~y9'?ëA3WQ@P곟柊pqB$#+#*Azܩ"F4$&oլQ|{#+x>	ºkf@hE~-zXȅM#+iTEĩX.d0s&Mq$#+ 2YJ#4UWnoc}U,fɿH'cEauV*&pd;\u[8 ?>"AyX/Fه?)ޟ_GWz:&bl٢Z#*ye|#*h#*蜶WFFjaBU#*k)pPy=}0,L>/б^QY nkw;8QxN[4xh.M_0ٮ>˽Y|sJxxGwOgK c#+NyOK&-U_租W#*Oc7e%;*N='(g7yRZδu3K}tپYKE5T[:+tKuӜԈ8説XQX#*·"L#+}~N5YVS8qsdaoEݝ6gj_P(/E>#	UI;B̡qwR[ ʰ1?BԎ9i|;\43y?g{^&~!i1Xyҿ]x{ҡrsFx܏=y='t{f};z|!Y1Dn/P{gpxQzD>!Okt3Jx_Wѫ:hxXgPJ6NBw#*6?7e8>/wkY7C?OghW.Gk2>{1AA*X9BP*(;qJA3T҅I8 kxQSOa~v(ː1?Q}Կv~yhy:_wUNGFy.zx~0?h:?s'7!IJ]Scm_n8^4ʿt2;|kes<Gǳ4;f<$'%~s=nUW!J｟ӒplS~o/cJ7%0_G,y|wflW۝%}[*%I!?;HyvVt?^iSf#ÕZE(2Y (ەPTȒ#+A#+8CPV\+q6R#+W#D+	+V_+!8\=z_u<@mEAM.m}ɹzqf0͹Xo$#*Gám!$|w= gJ1R78V_.3U>muneׁUyhEolk8Fzuۗ78sn}3ծgj֎ Ҟ1#+JPwi/e0diNwxUd5_}z7KFtپiD`"^"2 CG-ajCQ]PtAd1|Cb=p$߰itDaٞ_T=cq#+iT(dRۑFVYGQvtƟˣJf,\^_gl?h҂qxul+įMuQE|u-Qރf=01vwK?BD-Q]xpV5K/yCO$A۾2~`F`ORKr6V܄|XF1<"ݕAXih mQZ*T+%MZ!Lb1AQb#+`zp4.vC*i4#+B0lEmTT8vі1̑vf2FuDChi/Y޳!	A/yLddjOvj<cgBؙHGS"s⾋oFܗdH;Xi @y{tMHdU"hj)4N"ep<`#+H[kWӒz׮ںV}nÉW#+RrB8zMSg'ȟUQ?af^otI4܋ԠNsUuR[U9焄1#+"Sw">i_w,|yἄ + LJ,S#*ɂs9fvv;H!:n#*ry%S*sz?;9Nd>|G+ù䧲g? Z+?la'1std)4[#*alcjǌ a2)qL	iXyl(ɀ ى2IbXE-aKXč4NⅪ)Rn5h(Q؉FX2)ZhS :-j\p'BW&#+olc4#**өt(N(Ù{a(er(@b!4&DC&O*D %(fkQs@4#*<deF8XP*UDaT&c"".ZA#+!f(l,UY4찵#*J(uamLFZ!QNE8oAlcYu֡^n^<̀Gؔ8W`tyh]ӻ7L>p4#*=VKw ^VOUgViag	2a#l y\5"y&,H/[&gaE*DY?y!<=4ӹ*34`cU=񐥧\p>P7j,*~x}";1csK":Ǆ9EZPpQ\`;;$اFi{u'ITIUUT-T&2h?jl_+rq}Q`Gxj<x_Grαde}Ԑd^$2)!"2a诣<l4Vs3g5mira7SxO~a?ptf<S3AoEp>gO?kǰrS'SPi@1RJFm`ڵaUuXh/o5-%k4*&ǚzIۤbP#*o֋G?RJ);NOɷ]t-0J/)@FWXmP$#Ԉj%Qcރc+3WPhǛ立?}wf#+! #+LWBnf㡪VdCk|ow,&$*ZTF"J1Q)&jG$+QFQZ6_G^ٰ+]\qyU@Q۽`L	uVp#\ZZDzaA1c4vMD>rBX#&XEecbv4ذ9#*(pʖjt6qu`f1+16C%wYN3KBM:qˮݠmsC8̪Ɣ#+xZ3]8&T:P7(tg?o>iub7|=hߺZWY1#+J Pof7<Y#+3!`A{!y~n`URjr)29>5_ԝ ?x{`p11g44K/G#*U-G#"D5$zoH'Hoڜi)>gk6m:t;MnQZ.bUXhQTܡ$mڌ * NϗOq"nDqv9[7\>y[!,jFPk}EOlW|q&EJ*FM]|VAM@յ#*#,[lua.NB")W$L*)Xihײk:2. hWBƤ<7jh2ҪuTI2%oxuw#*u+ hJ4.V1huh	:Z574Sklz2;܅]SdPh#+eU  "JEgqz}u#zܚ	}jf.RܜQCia4)(v	IӀQ?suT9HMz<x4d<d!NO8/?}/ork-6քw^4^xGNVDKPnݕf,mيҽ3+M8#D-VĘj#*fjet8S:;l>IW?f05;OgtE-dC$Ћ Z}RbJsJs-6}͸j	NۍlnhXc05L"%)l))];i8`Dr]&u0V %S&MAhI$$Z9ӍxƶГ]IUݭА%tLP;o6-A%1ݹmfkg`w$MQmLv9V+$<2VNmfpVgv$<#*Tm/̛dDhC^l|2vp_.I@LVJ7:3H# DDKR]ЍNy|sN ~AJP[SLF?o>/3u"-zUu'ZD[=ukS+^y+7lނ#ܢVu[)<WEΚ%2yG:2z~=*m'bgȵ,2UxɈ$"FüdĎĢ	v050#\b<;4$-ɿ\7n,`	F9(8j.egM}$-m,Y&D!uRε<KV-@.>ԏdW2%Rx88}$TRG0<WA_/mO6hYL#+$8%KZL\;\NdޒN*fxϦq]nH*κ3JUZ$WO=:*qq=u硇j_6v?pד+F7DOB0K&6#*2kʗ2Jߑ۱|LF$Id#+BB^CdݻL*;a{B^w9~xPu#e#*w\:K*ط枤s.L5g#'kyd}w(^پ?uZa,gћQmp|ost+o䷈{ܙym glR.hU͊UplP1)3}>m$FQȱV,6-:E,h'jӤ-ܦΫQOaF4t -RXRnHv(A\JkSqì=(P`2	Imo*Uu?AEI.#r&$vl|-#*XS.t5y4C}䴸	8ZQV`eguka%٨jBD^ Ar#*v0" (M% ]<C>탿7~]`%BcVz8Ou<iKtcb}I{qiAua\RM솴mnQE-x1Rew72uV᧾pzk)ˠ@8;QADOǯNjVL΋@,P&a h!dEڱ|AJIdn::߼8$$uch~?/fHWj^?Yi{7SþhCdc̣-DLF񼜆0}.,j$!@Ǚ4#*?I2Mz}꿝$˱8~Tމ@'Ꮓ7ѯNYc;(מ^rAoX2Αr̍t:p|4"pzb̌V'բ+9yi^^IU&!^X3&LlfWxmtIX<*8>mG:8ԡ/!>磝֔ےߗK'dO%;]܍vUMH`G0m7ccO%#aT@L"Zc:#+2&Rf/ɾSOQ	\M\߇I_ه=*[YMOF]& <@u*@"Fc5ApbWMkPqx{?n#zM\7yRmUzZCc+WAA"D4hK.KьΉHþn!1#*uV<-"ݮJ]Γ=I$qfևATMEЭDZT` I-69l#+Tg;yH=|qv.͒_^DGq#+ЃܽOL=VjoUFvG#*;c+SVPA{Ѫ*उP=wF"&1e\;mdTCMLJiGP+{8$eLۄaNBza0me#*+ܲi|#nc9zwFd[ltۦD-~j7ǫ;[IvFiT60*`f]2>,B=٨T܃=%#*?|y)G]RTyS*>Fv$ΥZ($=Ԗmm3#?|q^|ax'|yˬi.Q"ѻ+`۶}=AuN'<FwƃmmCy-@;:euy#*Aܱq#SKͬO0~؁$u#;Io=Iy+H+jFȾs~#*֠QhSܪ0XQwjuje3Iu&&ɨe#+¤Hdq^x&U6[NHW#*%gx0a9/ZkLoqn]Π:mJQԶaټ'w,FpH-T_`XijtEv|0hFM*t'Rͷ9V*zz^DS"BDb新ZK)x:edFHJ^wQь*V#*~{ӭ=#=P΁EvcUt5z֤<9a]P*d/{6'ܪ.p|,ҜUp&;.#(Kׅ+}Ea]ґ}r_ukxØ=#?Xq	oSwMbkZÅ#+C+b=w<=A664LQꔅ1:R0i঵[]-3U	a~M+\VjhbrH7,D7|1U'W5D#+R0?tz?;TYƏ[clmާoj~C)alu0sЛrX1pfovtC yc#*aFN:$?cRڠ4+A^bvOOSp-5Zq:7;ڱ"0B=	}A)ܣt=l칅z-7WxQ.(^[u\{7병i:Cs8txतT}蕼̞;2*X75JX_OIy8SA{t-<g(Nnu:qrskW]mg<#XFOVoXg[Naf,.غO'6,rZמu::ҍ0\0*Uf!#*\t52ig'T[8sZ:[{IIGZүGVsNH&1gaYN"ݍSdYǊ^o^LW~#+m,jb{,0h9KJQ#*Ј\Q3pMpJ!Yfji8dIH#*mJpDЛXYzxSmuớ9.j4Ρ`	if#=F*LqR?WTKF6TA^]>{T=z킁U=t&4LkE^`RأcZ#m&.wZ{)gE9.-YKL\]Sr{SN{N&w:s_V綹*EI%!<ͷ&v{h#y$}<Xf +|Oqxon:pR<X!B+ ,Uv?[ռ/QڹMVuX\-.s<n#+Ϣap.X!V_,rƦ%,/nx_USsxf7Hۨ<d-`a0OٜK8篌gۮhҵ{@lv|cW8|c]m׀Z9V%Y'HM=cxj`>ɡ>"fG4ySd/%.%%Џ9Wn|4~jIsuz)	/w[m\f,kʩ.kVjY(wmm`vՀlQY7m+٤c1zO\]LqcSѴʖMO/%12'YϢ{sQ6G;}d/LR>V+^~XD({YrGBK96I/i[m#+ykK;ot273R+vF{Q!=2xvDp@}/MH_QW* (ʉt#rׂ0Ǧ9U8ݫm(y,maeCmC.i}ev\1veɏ'Ue`ć{wZ-`u|3w_=_s7O~ϭsz#Uib*T#+YK%Q!ϳTޜPl,P*3PVqztG*fdc;!gM2@WWS=*42mwmc:pJWK;#+f(]V(h(E-@*0{Εn<k} &Zڜ8*,hΗn7 >sVDGw/\*EGT:CEjfwgSV#*>s(*K"g07?8Gi|?[پ#+WMc,#*?HkMM reBmO*JZ#*3pQgr#*#<Wn5P=i㝗8ѫDѭdW"3R7~YeiK֟ʪld/\uNiK$=!liؼ5*b#KYAe0-KjnS. |U] `DbrW1]t@`D8N̡t*v5EV98ʿ9ê)0PS㿺0t2#s ֢E}o%?$%P틶uE!ֺ_<D㪫pMVD("#+i'B3Ԗw|`s}?ۢyuL>*{BVUp2yE>{,zLs=Ha+\L@$P<5J7@XjGA"Ml!>hhz+(:FFI^uU8BgV*Z:F`s_ĉӏQ#n%/*j]*zޙXvXV߃#+ .!sVWk|=._z[S&CcMFµf!$DU]&ܔOPe_Kn.}(Z+o5.\'Bd9yL&Anɓ@~??S8Ńf!f.T'!_QPD\/՚F&Խ*]j:͍):LO⷗j*EVCEf$63dgE	ڭI%cmyT)T4lZόtS}dw@JRa-1+Q:nӺ#*˵=˹oVS͔p德-	qNL͛ z3!'3FΚiJ,GjP0u-\ğ#*Ns1影~Cڍ3XôRA3ͣ^J]AVs"1f5/%V4-"@*͉IڝE\[2#*'zLYnf?m+#+'k.5mgbs7[#Lb45Zx $ 5)z3}#/<F6׳~R#*NtiP)#+7f3 kw@XwA5E@IĘUF;]dI#*<+੓+#+VdWFj_HuK03c٤!el[pK.;=Lm'ħ!Nd	Ze;yam-OcrK-3U~eo)J<1`³P -=UғjUa:MobEJgEq`Wyq+9G@WN}=38'}ޯφ#uZ>ՐEGnL)`|z5Nyl,ڈ>c#*<ID$P~ "V#+@3:9P!(Co۽o  m{񐈢'!):)ȒЕS%$@t_EE4.J	zʨr>qzw2ay,fb$@=dD	o1p"}@KΏ#Q3CIF.fcMDwfC"?$!Mh">B: P95|HM{3Y+`@Zgߣ#+(-[G+h+nS	0K윀7#*;68Lc[>0Kw8lT#+I{3Pb7HݢX62NfDD}fe5jc(1gC=w|iizKZAeQ4oGvU\J Տa~Z"ጹȸnj	pB$Gp!Ȼ-<ꂻ83L{ЁF?:Ǿd$~jADB7KAJۺC+w!L= !z#*YA=шxqӜZ;龊T.ˆ0 klL%OPIIaĝ+הk]Zq3M3Ha[2!L3\yֲ)L;=I;)RS} >+` ' ԭ^Wzm$ojyf)3. /v_I	N`A(˺r=J>_^g=3DM٢v ds4kz(#G(61y1(|Gwx!Gs 39$hOii&I!Atp!cq\HRMK0iZ(<}{8I?q~:w=(4(Ni\%fJ Eǫ2?,71d)<3ADD	58xt+Dnl^gr܃d-C{'Lͺ5#**\5wel{w'rk}| nW؁08gd$ZdiME.Wf#*}~)2I,~l3h^ gYc^2aV"!	)0PS%OJsDŀy$ #+!r/xllBcR+5!mh^~u8#5ЀKoZ#+ L*S	J8#*Q[4XW;"*3<H]p,fDgyNvpfgib*VMy+""9R6#+=*_`l9cI4tW4 LT- -i,9KE$R!#BCS8uÝO/+}Tvo4K9otnkC&wQvtqք67}e'_'ωz#+"׆k.P0:jV#>Sǩk'Vut{_ā?!Q^b}t&ARcef(Q-!#+kh?@3(4(]h:gѯ]":7RC.EN`<w	z@[Gwj#*"È[ql0au*b5F#*hE	iCZlN!Jo&tl	0^OK_ L3#|<SB^jCX9>:uuU,&̎aQ^cM mGD؎N8!} ]03: ?\/;a>8C7Jƥ'nq0#+R&1NkufB#%lF+$:bҹԽ~؛Ȁ[U)^	rfI0W́Q]02Y[qW:ٺ!r'd]&E3kJ`%M0GAPކj'CkwT e)2n#*s7 2s	LRV䣆*IEPX6ݐf9 L'*;Q"]9Zl([AxYYHֶ"D]$\b|.skӼJ5@o@ߎv5PD5h::kf]PLd T+mЌ(6°IOL)hj3˧_]|\]#*2(cO~+;|}=LkP$c^WhhD9VЮd#+Je9W!Do*TQM#*$,1Zd&IUHo_zՙd|CɝǏ/G$6BHĄDaDCxfwGKx4]>|QSPHȃKKɑz=Ghy2d& (TA:=E8yKl:qd@[!*4lMjCNKMa/#:_,ZN*WXwN#*p&({6wT}yWQF	*#iOҞ!ʱ}u&Qi#+s/|Q9SwYP=#+nN	Ȑ 鉎mݓs.OpԐ(>~82{Y!'/<IKJ/{yeI$HQZ@Q?Lx?7~#*)=i<C?@E$?  l'jv/	GXAaK؈16K	c!a10!@݈DbhM~ )Q%:UZ4-#*]3ߠ"FM;0`'2!b#+KB$$'s}zW'e?]4blT,L-Rx)V}pAt:KR^tvٚgt˒xt\>fUPʡw	V&Qx.Rx#i]f?ں8DX9TãLf|u#$,s0<Y1"R}`z")#7l3f];wjO*F9q5~IWiyVǂ*>`b}ĸ:,q2\6q?gGt![5WY,2q`_bI}ėt=AywffޏQ!1ˬΑ oB,ʡbd`}-rx}80dc2#*In> xsN4tU58%7VWmKf#*gٝ$cD`Cc0N[[Q(QEp~P8!\@7ڐ-o.22ޗKtj>up,`<&@=ƜGhC7׹􍲏THw7&$kw3t`w33 )~6!}2f|hF#y?<;!ꂄD	i4Jh RhB ma}1W r#+T"(4<r\dd9(go-p$0$ӆ]s4ƫBRV5eܮ1$e>!#xIU?4IGͫvRp/l3I$$d!LoR^#*#*s>=YV-aSNuta 0ݒdjh<#~?:BHE񹣽RrI	T3"H!^%|l:G5cj^5G-Ր#+{IĉAJa޼=]yzLNGXIHvuirãa+lpƾ#U5R3HE#+:6nGݴʊ(k`j	bm6hV]:Vq,!Ō1狷&D[1}o,`9Wys`!#*ufMEԄ$yB>	C OD)Xb8T[#DBY4̲d'M	;8 S8E;Wƅ#EL0dDiNͼ]'"{fqkpٙs_hJ˼lYĐH%F	x~`,X☓V4TY29ǖfVe*APb\Izg$89ƪ*d!KiܱJWKn7!DQ(p0;zicܨ4a3y#Co;4|e"rS55.^QDSr*+<5&3E>7xFt]{Q-99ʢxI+z&cdMZ(05W$ɑoM11!Gj^</g6{Ꭵ:}CUK}úzFx#+Җ Sc>?Ns{1xi#*ۘMfFU#+0q\18sp:fQ-w*s]A	$\\k<r!*Qc@o,tsOS@i+\#*fs5)[A	i8D^i;!}+37aPj(1MKq tfќָ;8҆1cdN#*8;fW7WrwC}vm0B=pZ]p%0N'u|l8Sc>	1$7'"9yxєF0]VV}W,ݝв<6#*KXq'_Lddee==?*Mdt7iԩs`=.βӴ4DޙPCXBq!,[%b:7nsɡO6˜Ac|r)#A1+څC[c8׭A}Ze]asPLДnLV%7t*#+JScwkEFZ#~=cidCW!}ITثT쫺=ݩQLk!)8]!<n.cpbAm뗮-[( o|#*8Mo>H)=}=p*ÖeYٓуyLAwv۱ XB?"Yxf?/wݤ5|sa0V%%EjK*²J篢*U͟#*qm{p\I(t4ʶ&2T%7&owL{D눏$j*q4A=GHJIS4	7l3bh*ED#|&C۝&P{~Ϩ=xݹ EШgRU-FI_:o#*ahzpծDb#dk/v)9 =DPRSi?<W[6N*, aw90\σ02ΜV,%]9si_>{ѧ%l(Bo,aoQA5CTUn#*xH0%W7i7Jzj#+9͔ ճq&XbEuʹ=ӫѶ>GѨH.\9BTotJw1@%>nB<*}!Lp-n'+jZtMz rOkЪ,*ssank|D?䢮ݭpz-}R@#=|ܳaMU	JCUoZC]?ѓ]ھ/;\=OK/4=L=3#*hzDD3xh!=Nǟ~~3'7o`l&{!"& Ɛ9& "Wo]eзƿc`Ĩ|h9p>^N'%'+22#*Sç/I}ucll#+(3&Jm,%Owg,ޘ`/>ð7bD[Wh9<WX[Gե?{9І#*Sm8GbaZNc:2,C+}	|	ࢇU_{*'e\9n)L sw|PrvTp ܟ)#sq,A]5kw6VPWILSɲ\#+	J@(?F3s\=nhiT;Ȟj匏ʃVq,'/WfM~7M}"=RBP0rm.nBIl}#*A>wN yyA?24N@jpV]1DݠeQP׭COv뿳"˿Lt%pUAǛ_W7|Ú՘UuQuY+Ea2XiӘX)5J!zD13hk5M15%Wwdm<O5g	h#+*@J;ӧKl)zNVO"W|ͯ]0zMy2[zJ37ReYNopW!huWjuf`tvu$D3TYZg,We&F1@%\|P r{?0Gt =Ò5huH<9| 5AD㏍)tNh>1>d3ʵ|,M6MA}aL uNUf3X_6gx 97]p?+Ё;}.=aO6]]]t0#)-_DۨѻGVyfъw+TX`@=/ȵWS|jWw#+5 kEaxˀq+82cPZxrcdzSTΝ:r0[4}{<јX΂1uɪ;::#*ԬV8H=*2eJ*_i\vQN oGz{L`ۏM͟t}sLf{Q;'b'逄$bʼCцt3e!lA@Mx7ottĈ7Jʋ~F16-Z[Jf1NeJoC>ouʫ+0uDCLCx0Dqv޾?j/#*SXus#Q$غ[}Q$N9/feUۼ	y^P}(>9}~:-#soٌJ~gq|?<pGuۻjFr'Z;?_\Yd	I獯SOlWVu}Z949^*֞9'N"Ȟnh=ob娠?()qأ|bK		]U<QCmF}gz[ta[s]g==|0uB"3 ][x4٭r(rE	#+AO&*PǇo2T!N~uLIG(ԳJckE'>+Tϳ9_*?C#Q	ob#+-pbG+DsUJho&s_j=ÇOkBE;{VkЋúB|wh5#F~x)'Cӎ6tzuU7ɮޥx,W9Is-J1%E#-<]ui.RdEcYb!A2NBNqxVȂzdD~n,'֨(^VQL2$1Yis:zuI'w}?M	'Omjj	DɄ:J!* </ϡ^!=VFZGGvK٧m{z2TJ:{Tpo誫*Xʸ2#uԼWN"J)^\T&?sCKe@dkyDQnցDG\\5Rc!rTј_|ن~T(Z5gM M򟜱j[jO`3@Þ,~Bm/I`aCs<tnh`Lu2_ixbo#+0s.y׃4>"KEd~I;n#~C}C֜ G=gG~]&|~}La1#*YwwVxxq~ncc]'ÿWeY7FO:GDƻt[Z6g1,ò@Z<0U3V.oZm,7)=s6X7ǣ'mOC/+:;F$Z7=P奱#*sZO6ߕl@roƄ}Sӏ`CTu-'oQ1_xh^&IjW/[5nD j(x]#, bjZǻ`!ƬE.#*1$7a9l1tWmx31;	[G;׫Yݽήvm0!1qd4*5icԂ63`u,28g'WBzTy)D簒]Mb@@\gs!Dd8pOݭ5uR-],4~~	cDUo&w(!}m祑10	18pK0=7#+?Xli>}|gs'/~ؐ]S2XZ5$ 1}e@]U8kL	ƴgDj;y*`ZAU]gk kg.(ePHݯ1 U8#>ʀ`d?=zi%H#^AF#$#*^H?Τ#m|:"G,kN>ϛ:b?S<iّ{2ה5#+%D*<es@nnOV!"IB#hG&^|_/h=X&Z1hn¤^a*?uflXQ#+#ߏbZOA1EXBEb@(gGkuT]ek*9Cޫ56U8!ǈnݎv$F#+ڽʅ3:#+PsaD"INb$ 6lmh x4/(*)Q@<@>kaynIHᶯ4^ݗ^#\D70H#+Ebh`Bkݚ~[Ny4StXv"׎oxzdC{yCY;:;?r? |!d8%#56E	}]TzNeE97ür!r|~ۦ-DfgYhѧcy3?lC;:ce-׉b#+BT.ol\D"GH"<ަ_?} xo'ak9Q;#*z-3ՇuhcS>RFQGDpVV*ᰒC2¾s?TyP$̣bbjI>;,ßg8o3}zEMk;}xSA=̭AR	$XqH)4>2a(|	FUBddJH:cN0½#5ң;vksw5%)i6~	"WD(L#LpIUcQ>6o||CGe#*,4^ҽGPq7 b;0b!Y$ps=7<aJ]y[YwP<\l[+:&tB-y~iAF7_FШ@eQx0'f46]dBx]T75-:A^2fQIUKDe`7Nؗuވfcc|F[qKӹZi<3{\H(JC֖Ć`UV6xm.n-M6AHtf#*I`U#+ bW} ̢\YFE2t!;115r>KrmNV{g/(*04Gr͍12DV+M[@+։T~0$7@v]\rAYęIhq)84>[tÚޥ&MÆSgD(r4iI\9ޡ&H9{b v"SR,)F\d8S<,24Ckhr~jM1]tψY<SM`X.e[D4Qb1`vA=DX4[k*Zd@oE6dr=oMcw?kõz ꬮQm:X7?$JHGPhzN֕&SU qmgZv"/c8pE2kV #*ũw("2_PSKi8[_ɀ	p2vOtMs:Y#+͡ScQHJBHNs]#+q듮2ƖGU?A~w Ψ7K_>N#+F AiLM3t'hAEd0h+n)!}{0Qj|9+=G%$#+$Vj[AH¶|$ Zm0K:UѻK ߩhA:^1#CTmQ#+'X,2մ#*}omѩ>{#HzYsQT@ d2׃L-we@MV&9]ĎG+%	@G#p@E[I]jb+nLD~Ky89ӽO T銞ڼ8	iE@EZ>hzymH-(Bkb۟-.c;yv8la0y&-gZ9⮓6 Vsocw#*|}j + &!b2ս``¡FN66c'öq}/#*'t#*T1̶_'Xmu>rPN G	eԴ5. "1ѻ*ᾨ<yYiFOÏ>m|ZuRcZ1J;{}]qįͳ</'W~j	#_=%zǌ\tŞH>)p^*́B63 rj#+?rww?W,<)(ϔE0йu!gv\^o]7F4v{XVB-1=8O&?#+0$~!Rw0+uIdVm_'#LJ,E`}A|.ߎRP8ۜAV;*]D- f Dqq|>6+zba{k[ &Wh[8Uꆨw&&$1a#+E+\TGŇ }C=_GhG2M~! Qz]uuW҆Sĉ6YI$(TUȋB˭C=}@>˅5o iZw^X#.bXWE~Uﳯo_GII4OKeZʁ?x N7>gM6?wΏIV\T#+ !Ɇ?˗S	;ww'SPOևal3fT@_& >MCHl#BĢ5B$KAr?ٞ<y.ߎ|YZ pG7*cSǉ3CB\+$INѵD(%VE0 ;O6NQçzcM0:)χ@<;4,SeNwDGB\ϵn`9[G\"{Ӟ7̩;]À.#+{S)e4FJ^%oohǜFG%>#*).Eͼ0	d*|z|̦:8 ַ~P)<G}#+ťey]SCR_e(CdF?xIOIr8,XdB_'(*FBX#*l!lh(Ġ.E)K׊I7T3Crs&=;#8*k`&39,=%H|d.p&u>8Ma@#j$m%7??Q.j `0)`p{KqRdz'RfHR]	lLU[b%)PWԧ/n]#Q*2*q| :lph	i2#m _X'D/eMMd$}fв)5ASNla@S/] @/3zdLv7΅&6ĸ0n)vt󮒕xxyWp(q}au)f?rhY aϳ[h|c!f?SITHɑ=yY!Qv*Cs7(EʪCP{cBcvD!U	A .c?Csws#tM{m%ݡx"2)IF3VI9o5s1g?N3537wE&IeoI)nHR)lód6#CƼc<ů?#dГTEe!$mWW,e^Ce??S!F=M|0ߞv3W!#6F߬$kda_E ڢ!lC$BNv#Kw""Jb5F;5NRߍ*,#+ېpNOq_OcID3DиaQhDHJdw*MI8#+@9N&gEwwźjVHhaj=1VGOÂ(N&bUuǲJ350<G3s&_{}$F5	?OEI:C)tېH}]dh^{#+s4091a!{kΟ5A#+HO}<Q*QarQܙ\lnh5_K}843Xo#nMAqf+ӈVŰc&idqGlf-0SUƌuwZ*z#*ۏ8J7UBo5rcbS揶)YMfLl0#+I0:ݧ~l?W}vz[Üdn̛	s#*QJTUrXNb׬4%!ZؤX.cIA'	\*)lWNj"#+J+m[5ݻk\$mPز`fUPDLP!en('[q]T]IHA?uV+3;13S)(~9#*'~w{DUTQO2ʜd:JH5Hճ>`zXˁDX˓"1Ip?N	!0Úk5	HqNhnu985`ELJ*G8gPr(M9GTz:xvzMۤC#/!`&΄Fy2}M}FF:!'@FvTP<g7UɵS%|,]@B:#+Ceh ,{hh"_au{u1}u`w|#*m!F	߸$ל9QƜn2Ir@_}|y#*:5rF<@r=*0 g&Z:͆[{]J̎HI?a<C-=xl|G:}QADIrܷ bP9{8<-CjN 7>cBJW{bF?{d_}|?W+;'f&awI@z̪VESJ-؄o$NnC[T\%M@H	0?(@$zPNai:#*G)*s٬@Ǒ?Li;ӗ\|!&%8GHx xz:0.u%`0t8$>͏`B#j#rNQ3bZNFʺ(&=Ksݸבi?D0mzAbN5/%c:12??<0phe#jloM᭬8G֣A9Mm 8A|NӀ%!F}oXHl_zkm!g=;c_(Oˮ@O=fAr8!	Ԩu \:>l`#UR?hw}^S(t	{kޤވ?#84ʧR9hՏN6B$xމiNnR݀8>g'4xdyĺ@2?&>/:Z}U[5 b`DY4#+B>XƏBO?L%0r.{pŊsԧY;2ۖM՛5rƳu}7~9:F:׶?"ٌfAī8!X2%RNxir$bGh-m٘"JKZ8$qU,2!4aB'nl%.htRL"B#0T3=~@A6-~)}s4!c3׊?@_:X#W ;Ҟ%;DԲPRt#;A?Gwɨ턿(yֶHCĽ2ȩ V"ch,2cTPQRC*iBQx.^kP Lй|}~(6 ({CT!sr]]hKBDƩ@,#*:<8Rۘ2]$Z5X{SX! l1m"˫(	 1#*`SAAeQ-hHm1՗7$	o.`tN~{&4Q5܄-*'pn#+0A*}3A|e:$d }A ,ihxvƴ-iIԒW-m~|(fkX<;WPZA4&X!`	~^c>=|Z!I4h!ʄ8&Et<ɂq<8ѽoPbe*'Ar{_y:< 91KY$#*p$qIGϗLо(|pSPdxHuOvOnU{8=Ia~|[2	тC#+,MjE.T@`x\:!GwcK|@LΠZ)b2+֦08.;@>9g(ݫX<MJqS	l?g`0U90Cs٣(Spo#*/DuɟtR@n=.!&`9s5XsUNχ<y3j6p:4d%܉ѽX+J)B'>[<mWPJ#S1`6	kR Ydnd%m8сVҽ<T Nvk{-\C\˧7ia }0g~8ε=T)KCL4/N3K=Ƿ}Ҟo3^БA6/"NhF̒di3H&%w*@$p1E/BzQ3ʤc $<ivZfOP2⾣D<R,GQW= 9#+0><0b#*L,iP9=ڝ=Gle#֠{P؞:_8jwJ"e0C4`{XTYđ$Eu>uݻӐ$O?N0LP}<_E!6< ?: =rg폤4be,21h:<VV;wk{">I*Ѧ	_QkzY?;xڼtcȿCJ1$pXVMZCrĨi(?Lx8%z%'?[XɀSU?A@80HDdCo#*Ȼ#*g(ta5P(7nXh*m>հ:f|Á$0DcB{i-QYބקb	&%^C@>O7BybR~?=k{ o4DDCTEARfOf'^81>y-牆B6d8vq)D<^e	}3߂aL:If׻JBAy*  rpak0OsMǰ7Ctʵ>+'.fX BTD6i=z pܿq0QgyQ*;Gc	[ HHVnZkHBmUH#+gI2]8?71`7mezbM#YGBl[i#*:c#*J5%ŊE.e#*o9;EݸC 6H |#wb>_^XHE*US;#*'yl5v^O_r10wvS|ľH:j{|ǐyvwOMf*iPΑ_m7B̄I:}AKN%2#*3a~TJ0Kh#*P {!.P\oKB|$pGm9ZY<led1p@vn#*,r[\GRV.C{aSgÐ74=$rѻ|<DIn~wTD&&Pkph:ȑ4̈m"-1P0ǎ1Fs,$L7JjA8ͺ#*N@#*4NZ4B l^!٬PRh*pH2*4V&XB9_ĠoTC0) OJti26j+@=n@b"c	b&6 	 <wHT2#*'Z:A9^<_&Ȏȿ']9:6Ux!oU_>	ܟݹ3+gsζc{e35{l2gJ8F鄃V*_	^rK@xɿ!'r u׹3{am`][k ,O]}Xcp#*#+N)GOqjh.`}ʟHIl[#*	JHdz,%G #B__oG8,W~Hx,<A7z$/GM}o#+d4dh/9H7* At*HZ*W}7\@ē."%1RON9q_߆	_zc7pzS_.z#+ʟ$D;$"K8v%ɺ䰒UP_bI랝#7e0%}#*+$$ADq!Tn=Q^	XE%;2dk#eJ-dC^4aH] 7@s D1apǼ`= /Eoy*w]z#nIƗj=<Q~HtIiw9	&I"#&I\mxN_n}p)o'*V^c5oB	CcwѺfd0fr]8m'6?̷6VPBOyT7D|{1=ŇsHv{GSك)'\=>Zk|~(y]Zߪڱ`bny{egGc<K#+%s;3|"ALN6(:nZ_@.̩R76Dq#+a,ƴB	|eU[!YӪJ\U_B?M隓LǳZ5ieb(>K,	?/#+;9u8[w^<z2ߥ"V/wRs/zplp&Pw6N#+ʔ{	Ƞ#+NѧgSB[9©tmE>Du2mc)qYE(@4@P%%RD@Rݣg#+j>~:l\y0fd(m59PP03PWW	$#+'fB;M#*C[hJl?UpsNe]dgXŌ||Thum73lԤcswg(9zNLX}HN\}ptS$$%]{B}6	-c\EWkV1Y&2]G(vtגo걻˘55cejLeRJ:r1>~<52ϺkǪ)DΡ/ @_؜ݐ5Glpjշ0_#*{y?x#AB'}x+G[z(gq%|lŘgr	Hm|_t?N<ؒ"U_g{`nUyFkZ^.AzRƇws!<'(zvdEK@PBwS`߯AQڛP`H#2yO$L#*i625XV3 Ҿ"{x":녱Xۗ AU MvLAJT75YDqcb!?R8֕TȦ͡Q{W@Vn/t93CheNJ)!jO662|HBSPrكp~r*BR`]ޖ?~24cM-j?Gx漎Hl"O_a5qة\p?goPJc؟:0+_\p0O,h4M1;Azٓ߁ВF#*[.3+&F"r{͏|;gs{z OGSL,t<`ۀ꽙0,= 9-៩:`Վ7u^:xG`gG~zhJ8d!*FhP97UUPm$2UO<M1z.PI2ၹ44,\YȵQ{0}߯#+qdջy@#*nÝv5gU9Fe-L/ wH`F"#*UH&0Š	p&;(y!S 7ژlgq}xrxGV}[HPZUKsf#7nO!C?WNŪG}GR~O9ߌc<{EZ`4`T#5 lNRss~#*lFdc@NfHysÁ~&CHSitLAT%~5XF#+!Ig+i_æZ=<A,\>d#t%ԁBHEvXH\V3j4%LAyXgUCPlۤ("dv9AT!66LObIufPwo´@#K4Q>Ӡ>dDz=Gz٣]$)\#*xjֺ^w@=%bͩ0UϣlI.gOk*ծnKBYUAo_;{:sƪSR$tMxH9rێE7^s"<h4Nx͹19cqxCOZ9HV[5mK3 a	Vsݶ%6}Kk6N:) ZIgG0EI`a4ap0yܾ!!j5>;20D:aD<@mis:JXR1$#Gݶ]65ؒkҲurxOb@Ұ 	{@F!Y{y͂6&x?Āt6Uc׌.AEh^,q:!0BBul|Og <<҆Os2,c$jױy6d#*Tl<qƘ0c.+<1##urL&(˔!D#+#+83Kn|&ëC@$jp8	Djz	7dޚ%EFyENgrshLiAҞ13F2R秾YJ2<XW:ѪjܦR[O1.!~>I^|ѱ&MuAϺ];Lq\ w=70	#+LDPDEj]aAIGhyG[gc-ʱˏ32e̳.a\JTǆn4\#+jV	0#jTL0{0LׂKwxS<dLp9lC|z/;P& IC.<K:C2W=-[mV;Ci`]fu#Z|TlFv{5:AÞx>~fc1-AEafX!	%.fޝYedi3ocVaN6՚ؒCz㻳;oh`*1`Jr<I/#+863 dzx*T0D)C=jmǾV'^mgsְh譀@MǙeBL&q3-3lY.v3NN#+4@]FzXYaԈ^aIlb";EEm_	Z3\cك)3=4FPpƛp; ELAWq7i:I#v LM{7(Aa3D'c3=XTu/0vIa^AhYn51~FOf$Er3u&O,Htm<rc4G@RfZۑ~yh龽0ALȦ&V8|*t1:w4$(%LW2vI鵧Tu,chlix=jlzUgJP[Ȃ`xd	#*3;:T3ɑ9SiMx͆51x(,hD`8pCgy ]劋ޝ|wTәQѠ'[IcǺ1!U=[i҆0jcLr\D<842==ftp]A#+3߈O$PgT썡\)8̓#qA\9ӶSe߆aXiAu,Bxu {oW|1qGpgƣS&nxժ4	#*%7Npk\;f##+]X1JKe=vA ?!\~6 UB#* MO.xvo-PlpgOV?l39xB CrHc0D#+P>~IJIh:⛑; HM3,4M#+F#+L<v|<uBkQ#*P4}aʪ*z5|hzx"#+\0$.5zʟ'HŻ"RtPChx/6]XsS"Bg5H&ߨ_ h'(C?>'a &C>6F*X3"p`H(v@XS_Wj03x	mxqf4oXh"8I0#kݸ"0K%76Qnr18?^ 藦&+oB$GhAO9C #*uAt3[	&͎ko -Vp> e8(b+oh"P"hZDfD!FF9`*=E]DLuأaY[ky#J0k#*aM,!h*bŏzsqZ55PոLN88a ȣD_얅Ris톣EU 	OJ` ;gC#+&"ѡl}l ZTMo窿GvE@Ke(MTkWa3#*1P	<@,XeFQp?i!ġh\迳jO 	ZQ* HDH&Ti5:{%CIbx}Ca[:1#*h[9KD۬)7=;?%L3ȣlîyK/^	nQb襏.:ʕcq-_5l~l6!ȫ夵X9e\QxX;Z_BrD:8.ٶGg.,%@,H܄$&f	(^MAβ#+dKQ)i>`GTOItFS #''uACGs~[\RD]=ZZC^|#*P)jR%?6G(#+iPA((F`$hJ"`AIUOJ+_2QރWAZ$ ZUR#'19_\hZɪӶC[Ýo"W.GEurbu426j7xp&R5L4UTh}9X#*x(>胼3F2xB ,zh䏋#*%sn6jC=`zH%4BL#K)A0L)wr|Խ4|D2H (dzDG0<4y82*i|`o:ka=y״I>X+σoCz~)ٻjj2ܙjcn5JPC'`HSąeS嵪)]\GWFR	E5C>X^֖aP6ҜRu_@8t#" r|	HvJN|z 8Ixfeu	o,VnJ#lnXlM~MiRhlʴv,Ѷe*q#+kC	^.wݬ#*HC;#byk7rS^vMuP#+6[#+Oku)lе(ڬ` 1	-eS?y@2)	"}4aLEf(lhVsy%r񂐁SFR귞5aI[:0z\M`#*!n:ۼ{ >!B^⚈z(C 9r:8mY}'5ZߝpX[a Dƛ=eI_3q"{<fW(6Yp{-˪^75P^o^-.n6hn2:1>aF9 2V iG#*&AwWƿU\iZ"ZVzȾV~#+aHtTzڅ\ `#*qK͑_B'=Yk.7F<#*/'5}9L'úGo:lLk.(wueT&>3J|ʕCg+ٝ6c^S{6y Dwpu:ѫCݞ<Lr:\H=]|xKfs5{	-I1̍Άub>7 ٴOeP`*ǥ3Aqt6ex:bdc°S1z8 YHeQ)ի%$|A	ޟٛDէݯ 	1{O,pMP	$tmxMrr㑸n7:`;}>|xp#*oǨ`.g{K_=vקFy^;8-R={,|㿍zuo7Bksc87U.])ӗYZdI*aDÿ7n8sdI,0KׯHά$la$*${vc9V&{FDfMZhtVeP!7닏/U{]CRgVo4bjF5xJv98#Ğd7E[еP$~?f^̣;Iﭹ3/GM!;nbZG-Z#M!EE11-!`If&gK'd	X6p/	,^<L.cewK**YB"G!Q"LR^?O\Adg:TuZgR̂?=hC5U_0	c_,s34&,kUsW4R"=eaN(2S9VfpqqbY+ x+1x1ZfY+V$ǖT|EJ)uS3!9)e\-yDQ7-cِP9QDȒD*0BqpqG1+E(̛-",M>ӵ(Pz@FCtBݤ-AǙwrc;{^*.ϊźyo+٥T#M+i<G<ׁmX/{.h!PːWB#=#*{4kTA~}^Y!ԻRVn25(3t1ޓ\c/}H(Pui{9X/|jȲ!Ipwc,1qqPhT2Y5|;N-qs݆%	k	*vsޒae2 Ŝ 9 L-L63$Dn7ِ@Ţ]eGT&`f"^Aa1BHZ4<ZmR/.wjW>4YN2+rBA**5K]PCHL:1\DO dٌZ1f&mͨiMaAvAЙB?E%Fܴi1H"h#+zF*5M?.7=jlߍI#+x颣T&N}PTa$_SR1wa-8_bȼ(Nͱ!x|)#ϙ]02k˥Ol;t+ffzϹ6LaQDIQc`}6S\ N@`Iqaӑ	<L0* p{ϑ	@(oR<^:_VҥP_g>>.4I>`e-r616}&Cp0o\&6:v~/,K	 4ӃH+(jO(EƃU10C06=p8Q==FaqwYq64#%h29'4zQ?_9h ۽'H>C%M 6,/Xšp Pr{2Ǎ!XܶM!C:["Ҕ3~nVLm\ 7.##*Qb7)G[,$0cW_={:\h{MMHR0lUt!З#+i:12duZkt;g;3ꐎ	wj32bD B2t[ЫUY$#`F)`fk9y}*\Ŋ6բDi#*x8:!yȇU|6\vwb͖j^N#*0#*Iqwf8t~l]FHXĮS=	$$lT$8`%U;0q$ pi̝Xa,!Xข{ XVaHvw kǤ7c-9(@ss1$f#Y1rY3LH1$j)܉<]evM*AfSBq	&~n1	ֲ6#+ZRPbVxe';<0od-Ӌ-qÖZho,#*͂<m8E.χn֍1=X=B,@qP΁%!}+6;ۉCb*Htbޮ<pү-.a#ގ31#*c;qзmPZ`\Yf)08L<+GmY)I"eugr.T_Q\֢QlsLο#*FSrQ\,eFKlON z޽JuR #*_ #+\!1aQ5 &9$sMH`RI{9!s-&EQ~)&hMK܁SmAXYłiqzcd#*g$iKĵˇ͇j ^OR;#*[z_96M^"a#*	M!	7JNcȋEy0O VpFGTP$%(}8cL)"#+#+Q"@Z+A()`b>~@寈{H.ZǬXru1Uy wvCHA DLTTDU4IEL3A$L5LH%STВAQQI1Q3I݆L,AK$̩DLE3MUBITk!"((JJ)"bbf(	R*&*!#+"f*"#+#+)㋼#Nt&Gut6^wQ=wC@G)yI<f# ҞSӑ+m%$a24$M9w Q?L/1sb <P[g~mJ,A<D;fѤF_peY(67HZKgQ~ <IE24JLQR#*DST2METR'O7]of[#p!ƛcLjfLƄXᤒ5ՊhO^2+.#*Z@	YOǧb}w/J|uBxTXjn/7=ou#*,;ޓiH	c~Gվ{t7vpI0ĐL{vQӫ|طwi:ois%8ϗæb'p$25yv/ہ{h`Ϯ[TR' %A-ף9s[sb$52]I0(_)y-aԻ>y{!|mڞ]|RMț}.ҥTpn9	:[ҙ1"Fd>^%cy̛fe庙!rxW),mȽ1Gǅ$E#*( 9/2Wݗnjhպ:6R|=$*ެa;5><NBE2WV(Bi 	%!(v`e-|+ ݳ%i}5|`of\<#+WTu*#P#+\.7FTymn~Fl2^#+H*:;a2]a7;~Gk_	&LD]92)̜s~WI5嵺%`[Ϝ;&.,q8^*XMm8|qݻƩ7ņCy2CRHxeɃ"{em!O#*jZWCN0-˖]~J1d7TmU#*#+GG즓2'&Pcef3-1<jT(zX|๘ޥ`Kf(eNAT\G	њ?!%eI˿2ae17O*5F#*͓YL1FYJaq:~mccs6Q# [Ba΢KL썓x#* Y]}J|_C Ka%A2-q	5G];nq8,Avْssoev̫skw䗤!cq`6/|Jv@:UghS#*8;cu+<d6bK{F!b<8o;P@9ur-#*b"x#breMPAhFYuY*o.ghcm6n'r0$[8Ѻ]S5#*Kwܷ%12zh2'bю):f}yF14B%~O*LE+VXFe!jHlцh(1yji^Dv	&8.^)9g*53MIgH^3^4F9ܚ-"LzI)xԩ<8*9O'љ鐩%t%[mم+u8N>;]dnMY30mGBc3dHv&U[ʥ#*zַZPH8cu%^$ʋ%kdF[*T&m8OA(e$<sl!d`'*P .t-RN:iy.0DdFs.Baͤ4$Q$58!|pp$a?#+j'	HCǦk	 K᯿ul#*~61p_S|idj%B7<AO1t=3@啅5Fi6W[WYkD>m㪲+RǬs}p<x^mr6zwwL	Tӹhy>9dkۨ^!]ٛQY1NdK9ƮɁ0fV_2GO8Y"#IEK8CZcrGwftfL1˖F nfYQZk&@QՑRtq:jy,LJc0p>ZR)䀺Mi+j=җ7ʋzbbysm$Md%e;(yp6Mm1@MLb44b]#+](^2#*(6s^753sB3(֒Z-m1k!TenX9]2@7AD#+#*z9x1t\#+$$WN8u1ƹNBTxF6B	Ĭ0q2qtlCm#)=gc7%Rn6~hb4xх߳#CimT6#*3rKjY1GX#+!+"ZT0I*B5#Ikd%%=ouŸO	hԆe#*m&8\#	`PVY$S69BC9cOqih"`CQp2BWL@)z{y7#+N'0A"KěWx _/~}Gvz7Fb8A ="4u7xVU3-Q lln3Γ'}k&d^!S[R	5R3DI(y'8$(|-3~~3udRtD@^:]Xs6#*1V×+j̤J9N p|GR|#*k<E"*<PT"`+2Ihm	TS;hjd g	mA&vRyuwbfu[$2N	bb#*_a$\heUnk.#r60`u8Gda`Q#I#eEI]Jc#+x:tM,jP߅086MRL3oߔߑUk;0 or[آmc(llC"X` 9	'x▁_ԯz'qqJQH*%/{Ur*t#+Sb41TF#  ҩ */!a	KYe7iI,dT-+^ߤ9ƙgJ]`^Z'#+vt{f&}F!8B/{vbj͹8s`7pL+a"2$ Vo8N&zw$9&{C>W ؙ"8sP	܇9R 1ƌLdOq2D @,)CŴzӢo#*"gB,#*1b1 b#*rB *#0dH#ĴM2$1$>Y}a XgQ]3:\CH.#*!@S#8_ySa݋V.f(QpGGy^N	3,m_2&97ŒI0@DҹdgKZJ#+L쨼| 7*k!cU bP4cx(ֆkPeaDl?h RY*=2.[8}'ۇB))LA*R1%H#*%D$̴R%۠!I?x}Lr"Bߟo*P)F>ZP#+d	CP{ZI}z$G>jEkqa0ʈ*`,/h-RCw֌2FcP*4:t$N!MJRjٟh~[Ϭt܉\Xfduum#w;qa Uo>ij]x6n'-3]\SVíƌk)tj#*@ҍ#+H]VFŷL`& m!C[83DM(4Ky4#*+xY2P%]nGDDHdV>(e״"[_HxDI5(d|#+qp|H^b~,#e?rFC38"XgϤ41WoMLGnvڿf'dbHpZ472,UEW;bѽ&g*Nw.1!zPv|OM 	FrC>&L.Q`m`#*,dMn4K)E,4q1.j6~c	(0݃{bǒ΀OCE48#+li'zSHDAF :OM]ʼ?BO	o /qpJ#*3TS8h?	r]sfwh߃BX>YN~ڌk1 3^ae>z$RZ!hVIq_zlէ՛uUS&zT:uW3o2|Xv1]ZQl#*NaD4I lFa8-K&8:pl*E^23E""͍~psEqp,eykU(/~4Ki3g	6r96xc}h2Fui/FVN,B8smN`E'x6#+IQnC\XJKh&UØK\%ΒT&kY!*[D[èlS6)S)#1(mq2jɝfdb\1CBH=	7cZ0*qVf@8IL:5K9A$a	qq]hJLX*ict `!~apr2p"CL`TfdX-&,3`4aT!5NAcR0ۆ#b2G I(Ht?r\:9G bP)I &(E`!10!BHeHs҄URRR"J5$ }gwb;Hjpuj@ <H1U~0tSt[7BGSaC/;@>Fٻ7=wp*	5_ 	N|>6m6! 0󝞙$7]ܦK:5M{좖% =V"bHY5cr80LStxaۦ(w&rër>vҴ1NfYdPuLbZJq2v/\"XL+Tb]v(<l4\T盯7G>αmN1tqMp-IPD	hF_Sl83ң ܬG'6ˀI?uX#+S\Ii)U|(t#+'&#Q!H)z}Ht>'#*|*MVwֳ!PR=uFsvĘ> h5qcR5E4	@M#+hJUBT1ĔDeb fNf	D!h)#+#+e ap6	4`c@AE$1R4	@I@HG"("YQVN`!) H#++ZA#*I)İ-H @Pp%XF$fLd1F#*Q"F4 4Pοܪv'7IXWie.k^k*Ӭ4ݛޓ$&\|w#?NKVbd'#*Ÿ#+hxU8P*XLRT4IQM Q1"uDn*( Ԡ8KF889-)#䚂)Q:@ЀM	D1(Dd4@IA!H)pĐ@Ią%IE4B0DAT$AĤLJ4RJ+PATAK4@21L@1#*4+TUPă5KADLLLPLIA H	SUMJC#42A)ȨJH#J$JD@ia]2)J!B#G| (qb&H6jk;[hз{'P:,,xL-#+%/G+	"HC૝]XqQpAnБPz#*|ZW=P-)tump8NḒ5jtv}K~ofB@ŹnC_КZ@4#+*2cI_Z=u.S۔:Z>9P}3DNҦBi#*=zEXK^<Z-HnCD4ٚ$:[N1ӂۥ3CFQ,t?{wROb"c~3D}#*et!A&';dY2,h`	pwN|JOsH]|ښm#uG#+ΑC>pw祎j* fr@eepqCa@PUUVʪ(^eR D5e@%v(u̖N{y7+vZ1	8͘vn  $ƙvX,0km{C_/f%P3^֛|y"|<`F!sğ4 \1^XxNe% t\#+ͺ/"((70Eɤr3xIه1~OF2Yɽ̳2#+]h#+5F再DFԎB4tȗ#1	$#9(NPwo2ƉpjVb(`f+DS8!0:GA APB{?79?R/)JӝhR>!Di]tvyMnK'Q)R@ MeCᘅI >EM©bo!$i_~݋	I!S-un!qW	kX]Cxicڸ*٠־"Yt5j΋#*H0(A:ڊt=LQ%:AӉ9䑭x.o>v)i(s+͑Xԑ	akUA#(	iCGAFM6QPV!50vemhb(9APu;]a!&u6u(DI%+XUE!(a>:h nL$Jw,}8(gIQxz>Di1&L#*[}ukXX,3xx#y, xToi{H0)4?a+AD<&ÔK\#+S0yb)r)4¤*x㕣'(.nP΍{sՆ(rN	<g񩫿~]/c)o =_i%Nz':NJVB"@B+=#+{QujUPUKA-&lϪ}\d@Gb&i(6\ *IhikFGS3f\dSQ#*fE!'a%\aΏ!MDUTa|n2J dI݃s<i3vDLMĳ")e.Eefϱ13&*H؉Fʓ4w8k5	 %^ƉN\r$Ha=[#TӾ?TӟNׂQ,!B	*wݭL%v@H+o\&+jH<r#+圣z7!så	xj߭tRf6E*Y%;ϟURdbknq\X	K!qfaZѣhN (mC{4i ƚ#*V)  k[p$Wвg'|܎@*D/QXxz4k ƌ$Ȏ:&sk90#*AK<tt<GQxSC$-$2I8eDنAJ!PAB9A(2WRRJ*1z5Ѩ3`ΐӮRsri7	H)dw<4/0Az2#+҅,#*'uφqv#*3a.×AIUN@pkr#*	zR}^w|j'#+$"S/D{Dpwc P&aP3R1!E SCb#+(x!<`TfxKbx;RC%mYLuQs('Ji"o%mPy^7P."c9.p{`oռ6״$!`ۜ$IOz:3#+gAC#V澃=gV3N}.%k` Uem.sPGwr.v#+čW?ǖ[4N@NvY\BthS+6Pq.ݴ92BG@6(d#+jlA'yNG:N=Z*O*d Jc"L&BF@(D4/D8wmm?U 	rBQ!Eʘgޛί]םLN '&Z2r:NVr4WP"*sGii~s`hCV~yEy=쵱|z`AK9krlloBG#ϒ_!ڟ}X.K:C+ reѴJSnƾ<To\**05ƴ,	\:^a\Bsdi 	xY$GY,#*Xm; (+p=p(x0_>=46fHr$%8GdV⑳x#+rHn]ݨ)x+CsĘ6AZ^H8CcN#*Y^6dZ0*1Rnz˚k/4ѳXfmZ"rFԑ#HqMlUjA:H-3;B6.ȻLAĈPPTulXͰӄ˾<LvMMDI[p?4yf= 1);O2x̺[hrqL/ޜ*Ԕ%3d*fF$&щo%#*?Dz٨׃@hTA;nOCD!KUhJMʈJj&BG' bZ$C	5"&Ȁ$T(($ɿ&Qxl,9 LN_{zbjxD"Tp@ɐMHV8/uѰ#+2#+DQ]UbJr}gaN?]q.k?q)#h	JV2I\c^$<M$`DKBQ#*!ש8Z  @c & P)#QKM vU1Z#*JO>+PZg˱8iISd!,KD!N!h'uCW]zTYicHQ·9i2d6E#*r$Γ3ٗzÊĤ># 3 0&6TmaK@Q^GDL! @#Jyu8#+@ɛ q`7F=@=	?.8ruq]B T(<z[A5eQ%I*B hf$qy+Vj(E,'GE`G.?.~Jox^-#cPh>lƊ{k	8E5Qb eyM2p;Chd$4TDP(wkDD8F(itU#+2G/nI$ETfmX}9-j9U8<CڔTT4cUk"?i4kr&Ϟ˹_yՀ?830I>T="q#!mU*,IAsvɑ͉& ~S.SK4rC,~Vש6J  mgocyv84&=IRlKL' S ;Ι%q9k=;}ERUP4P5TA3 BHLSLD#*Lf!d`" H PBJ"DjFD%B(&FBYDiJ( *gp=<<CR$!/*ZlV)QG`Bq߫"℈SALIB#*"X8?axi_)fdDkqE>zɨ|cvŞN_^61tW6<,} AھC#+JG2Q%ɲD7]=(l@A{9od<b~j4gzO}+߬^蠡e4FB楦'd/ԴL)S̉o$`;N	DkY*tj45w 2:܈fLyU۴xƾ3`d^8MPa(@wmpFڳ}nk=P#+;G<3b3ZX)h<t}[Q{ tXh"H1$$HL[_՞۱z%pTئImua8jrUVhB^Ң]\m)8#+#+=QD4';wmr!<4xHn0]VM#G:*4E#*P,h+!9ލẖicM(V|YLg6sXf7d6CĄFjiow	9sts	d.t,!B4~%?#+x>QԈ"8A u"mWw᳄C[#䠒7KձfcTZ;;҂{X}ayLNEp=ع#)ayы󻚔AC@$	040D"#+D	IYJ/tc\OU%҈#*({U5ϵ0<I	C%#-uNM&NL&S PŸj`}>:뚩ՑKBD%dbZw#34t{HU#*>%"-,B^gvaCv1D$?L{,P&jcG3ABʝf;m5TSf66i9xX]YiAeVFI$!=am#*:~3l%Υk@j-2~abif܊)zez1W#+PYSQ3(+%'/j#$c`l!'pR(CHoDqm1cwٹ[#+qtvh-Ec\AHr{q:Nى%k3L5%C,#*̮a3O&DOٝ:,[}dq|7cn.h-;?'7$wc_,shUTc>m`;Ph,GRDR1@Mtld-,wPxkLȈ؈:#*Oz`a|N0N#+Ҷ.#*Ϲ") #HmSg#*#G I\E >,s@DŲ9 <}ߚ#Jӈi 7jEhJDI@#+0h2E+XPC?/}R]/D<}G<eee#+fIF#*Ql֐-O@c\CpY=MRiGRݰsc9T yJ.6*H'\alpncbqiiZBA5Vl8m%d:<KQ6A#l{#+Sm`#4zz!U"Y4lHe)yj$!dɤw.dcZ5|x# 5.M#+?Zq"ũ-#*%"m^H	 ,0()ahB (H%SA	f&AN1JaA4H=<#,vpjΟ ٥@uZY#+jE;_<=3ϐ+RY񍍴: /	!WB@#	qĻaםqn-HJ@+}w;jH&L#91L?&0ݱW\G9"knD	0UmUTn˄i4܅DyTnˈLJb@#qRԱ/}qm3p#*yn̓xvg=s57_ոr}>#y42#*~U<Hܤ1ӿω௳@@*z({|X#*95ej|}Ǹ3i6Tߏ"@}pag|rXB\r5[5#*/J!DhM&#By<W;SFUš	βHAm #*dlCi7d.;waQFBxj	o:O;{>NXYbg5ֳCEjfl T"U,8i#>'_3cQ#uJ($f\Qr$_>{sվZY\S朔aQ1_6sZB`i\^#c@!2 S"eFu#*"o=A񏴂PC#+:X4	5PR C!C4bB@"(I#INj*C	0R*HPng>#+{{K<dkGUcqKz-4_FL~?ߘw>؄abH,~vw0|2f	@4 &6Y"&#*i^|E:K!e(1>:~gڃ.vM279_xճ'L Y99]Wr]ld#*'Q:{. nDyW߶{O}c6ÑPq[^eWF!38@#{s]Hj\dT^_DyA3AQsh!󼱈2 wE#+]]KCQVËN#+"ieRo`P&Q3 {CxnS#*NDʸgvwqc&?#*Tˆj+kZK&}/s\6BZ|vpжs284@` !pĐ;37}mjԶ"uZE7 b35E4;љ$Ne\33~!@H@x6ߵl#*(򡃡V[S#gC*e#*dlA5#*v͓fx&)mk6ؒ<U:qmVN.FL^hH{N"t|\E:@ !a=oQuǴ8"(#+BayJPhZZD#*F@HRe8qǪs.U,UPMM#סÕg" ܳnбa|#*EnZqN8Tl#*@Wr|)=i	Re6$r=A;1#*NRaBHQ<p<CDlxbBQR{ο#+? t#*vb#b}3rcf<yeEn)` o3uF4ڷX/޽Kd$l4Cc1a8u'csslƏ#+VڔRz$n_&?mb	i*h^yXDzP\#+PElVƵĹ8siJ!:6c=lI8?/OۏsyȒ#	"Pf7Jb:C1[Zª۟3_]&Gە32П˯4 #g[F4%GQ&Nh3?#@%N̔dĺ:n`T#+'0gM(k0'2`P@ʍ3-{4= l$2:9c@Td0ѡ`<KD#2ġ124BDB@m%'bFs{pE#+lL8a[5<#d`m=]f#*"#+Q(dD0MD<yowMkXP#+A `YaL&f1Z:rA4V[eߎs&BAUdu&	%	!hbiH%F"3+eXC-$E%d4\a5uۃAPpx*b *XeNeMi:uš:LcHtqK9!8#*6E#+0AEa"bh{"Bi aM#E#*Hyj#xVq! E2)(Zh1ˤeq\6:M#*Zqek,0A29L9`dL(6ž#+9adU@qm.Ti-+@6;hM00c33~v#*ow)8 =9aZwIZC1dWyHiieWp0qܚ0d(xU:koM:]Q2{qbXgVrpˆx2V,M5*Df..@\ŏ('iuKfA5Oka-'O4(@ĆmnUH+㫺w^v yPia*@4r$7Fmj0RԜԃXҦkvqذ	pG2x{=~3|:%PmbP"@bqID6MA9SZHɁ	QiHPoy# \*&P`1#*P#%6"kPq4K:M 8tM[ClӪ@X ֨#*w(52wkV#ŇS5M4F1>םtο,fHuL&!HT)	SD+?N5sI:a-`#3RP)J̡]\ħ."7C-IꦚNaѯ[snBDiۆsgln;(#+#s!-=ΐM ! ;LӣdLes=4hϾ{:(QҊ;ٙ#fИQ }9.q_EՐ:=W<{#+d<.!=ЁEI0:vf_=01o]ne	wFZ:suč5=M+b0#+Lֲg ;@j$#+ c	иN?q4= A( xh2lņ֍ZVIHL2h%XP"C pȦe5AIA3P&YPـ$@ 	L.BP[aFXoS8,jC--5̩+0R83* D#qYpGb6B<gK=9)*B!t!@t#+]:ـdb,<B аLEhf	hP#+RFd)Y	""f""RB #+VQ䰏x<(\PĢTATDǿ?-~yI=w!v/ 6dPu#+*!RS)Mb`J@ē $"T0B%1IbGy80|2q"I #+|LC{5 79i1AV1#+xD߾=czs@Pf^;zQC΂N^2!~qE/d:?#*a(\uf,X.u@c+1	7	iVAL2H$Upw\Nw1|.&fK3=vkIZ0&[F5VB68Sp8*ɭa36SaK?!#0NE3#*̄M51׷[jֳwG%	SE|KHLu_bIgHǦn؇8HNŴqu$gz/_jd8ЂTr!4m<@=)H*R d#+#*x{~d=Ö{E@A [_cA&ʄ~F$ iW	phS	J ѣP;JD~hil4Ah#U -+CCY#*!D.`q{c-JIIdzU^TKXAL"#+ۈիXb舷AЦ$#!$QRF:?05R9@#*l🗘[;BI2F'X Lq^`!B>7=Id"{kZLeh6vo)ɷk vС^PQh&$v T<*}Dt&r>';|>Opt/Fa>~.* !!οCd%,n}O}9Bwww)	|2#*`xn;wp%hHZo8VH}$40e	IhyGdXDF1II֖%t<> xTD @p'YGnJ,BTec(ȍ2рċ/ }s=INa dBb9ހZp+i)ZPLS3(W!^3(A$laӠ#)cvu-iƀT6&Y5.C PU#*%-Rh%#+RѢ#2\p0ACRdFH̔aZAF4*ـ Ibb1%CBj3)g)02\#+0!)i2W!?tQDn.ݿψVLs)c%ȇB@A7:X Pt@KGPN(LvOX 6WҐn $ C_#*T\.HWqo&M>[_4*(BP<y: gh>R}iNct#+*)EP Q32 k!BdA&D:߇Hq$HPL(1)T2rI)ABijI00 %Jc0XQ	1/>](c+k2h R߅ iCA\:6X#+(5!BR(ath!C#+	cNIO:¿o^_q (H&G160<c#**UyV #+ 4#+J!n=]4;H	Mu($"bF@`B#*C	aLB "H ٰ=8kg;!%	=P>WϷ7oˇۀOv/0v藹#Y8C gHbX	FhۃL:?M%tA%;UOI=PkS\brF28̩T1AH@Fr Ӕ`)iԦ0F:ě*;"=j-XX`DZjJ2V]Mo@潧M!$N#czR;X7oL$0H#*4.[EVH cl(\DJ	@nUlK0T`\Վ(ƴc,9*Ro߽4hhcVwگtdV(PpU6]:0\)_ =Čc#+h),2y&BAB##*jPR@b"PWopv?Q!el!cH4'CآT2d@tf8iu,M+ȋ!)fBfY$P c֞4f7$"?˧XP~H58$Vro69%%*ڶ&%jjxptς~7eJqT	@hgQR$@#+#0H4^=rfWs_e6OookDRd8E Sx:<C0g!̑m_	$LRR%DK~hb7[#HP=.Ė9:ONMi۠31	I0G"#*s˾V*ff?TK#65΁X -aiGEx(._o[@%_&6 2j/$.p҉6y+_#**lOqP4FqִS:]V.*B\oxkF7!c@*hpN	88laD5삒˄<%f"*[gXf=_Fsq*	`oRfH<PL@)wm;NOdBh}~~o) c[AGa`D09ccAÚy#*_?RYE)&lYU(,&RKBT*0 o}#*knxPPˋ>z;^`	!ûv{>eEzgĶ#+Q+;_ϼ}SHnqDG4L{RN:|P</C}濫?p^u؂0v(%f2#*ITF6'iG y_"Ьk9`5{m_䔒Lka$lSJ,c## nID='*^O"tMM5CE:VY+^4#*hg^I[Pwh!&4kzl8v:giA:a@T**Y.?-޺[kq&tuX#*ܽ;eb : o~BI0d89!	ra]=U!o"BI%V	8̘t΅"۠cLoȢƭ[>?ϔ+0=HlICZG7R/ EB)"T@(t-W@4#+yzk{gɃ|Cd5b ϴcg2>#ʜe{Mnrّ݁ֈɔ,>92SWXa^#gChLWqaWmJqx9H+\$9![40 *Qơr	zD<YEa5FYx:`=yE}*"sP |XCQ5+p?mHʚ!#+hyD2}0/ZkKjZ	D<*9ax8ϧGXbaJ`W@+f.=䭍!BÉ$Η}ࠩT;f>v,*N)ES{D=+	h#*u /o1|ЀhpgreaT/8r59hڟ݌ThH ppF3	ಉ%h_ޙ޸߄~?˞y7S~iu5ec"̈jOß6N84+l'|缿OU#c	CyAŖM٠?#*غ#vPC!#*4!lBZPGA?93Iޘb=5(R%*#DH)DJD(,ûHox# 1ߟTw@ I"o?ӡ_&X#+*) *B$jiff`"fj%*b#+JzHBL7ܛ)I&dᯇggТ(к}"JΛ'ؾ@K=VI+SXy۲/e{3Nl=Eؚ{I&g3U7a۵].wy:!)FYDչ5o`Ya8ܴ1>Ix%;?r#-ዜ"FAH MEYdi@LTIJEz:%e@aU9Vpi"Dˀ0ԏA#+1c"+I#+BHIodJ9bOi'_7#+(LȈ23,L>{E2R=1C-E!1IW,*F2rq+]]a9R5ُJ⮐bz#+Wpy(CZEImv4DN&!)ԡ-UEfYucMGU!($6Rԁli-@DCtFXdeED-QD+8aik*U2¤7¤FQ"H:F6Cp#*%+5!%#5B9a1=S\<Ip`.ѳۄ\k:l*ljk(U#cn9#E!KYXqoF[/OS%u ܬv80R0H8Ҁfh)#+hcMu17u5b`27nGFiHɵ$`R3"IQMke"J4ClZgt3(80;sȶwahl0(j[ER7!f&.HQ1)#*<ږg u#*f%1HDa&?<|j:m#*G b%fq]w0I(mwݬx8G`UTa"2:&A4>EZfbdFsdiBisZ9xAFeaHdG;EDf6CV4{[#HwH.MNFcCtCpmzLh)^]\Rʺj%"ax7Wk1(8h8](ttkd, ޫ4*`ѝ=ҽ{STD?%TJUX$c	IPcµdkx;ܔU"T!--q0'p{ӿ{?RMTn&.rudwP3"! \.y^.5=+o aY L.'d!vh2?(j	 d<	_;ޒ}(ax*]FOiKY"/V	*xr`ԑ5Q<ԅg5U:E-#]dFJF#wZ0D擹(%/ŽRbط[#JI'%mh ?=l1$'Ikdc .IqO(Ss#֨"H>8o9$48#+:-=ޮl>P8;.BָmSMs9TGus۷/Lw]N' L㱃q(6GJtePi#+\Fȕ'hzI@mQ;Xq\// V\,cvnA]L#*UIۈk4lI!6pg],B&8I"sZc퓄o.ӨHzuP%9n85wTF.5j\I#+#^04SC0m#vVB-ICŒ:4ASR9#Ѩ2]@Ma+UH@dJR0MXMROc1i`#*(OH1\>ol!$B@]o?	2iUdN5<`_Lh!|2{	|RU:@0M1	YO|B.a@AX?"ڐPМ8  i@T#+Q00j;&#p>J~AR(;OJ"ʪ}'&?G	BS^P;y t)y ŘT8Cq7wRn;tFtEDH >Ԓ1RR,RPP)DD	0DDL"THHH@ H%BC}r̕ND6X\1i#*P+#+7($-Qa&BX4jVZ x8$$#+#+Pp@dG=!Lg:kj2Ĥ1#+`aC!#g[WQM%>|s'uO|sieWD2My2.uoBpAGm8lpw^hdͪyoQ<IvLGc 4nlҝ- ^6m=}ORS4Fl-٣I,1qk(QhD\p*呐0BȇFl\s@r0U0qm+ch߼;J R2[ZQ#+s*MQg{}`U=!H@y⯫샵7&gS/	(+.sq*)׷=vF>:>LmTv]moEܜpwg)yFE4}y#L~hz?0Iw+[8^:~Nџ(C)v]Tb7E q#+8te5XkNz`ɖ؞1:8#fNRNZ|M>s]_Ћc''Y؃A]K&M{z/9Ys@s>Om\,,`ouqѵWD$7I*}K}%39{+/kO#*e;#+1E<;D]Q&831wZsz*$؜Q^#+dwj?v |<6}Z2qSvG6x'n |;M׿oH-6Ut":)#+f{)Əgl3OCkq;fk|98HL.ӡ- @<rƉ;Fqpiռ.<lKF343f;WW7>;1q29\-8L!9ާ6n;Kų7^5Xa#+c#+Ҧel,tF#*LX46ㇾ[&{N7#/2J(7K8y~5Pe00!-7m#+J2Ej=kV4ASXk``qRwn^$lq~WBNr<{UuPw6]8Ok،M;?TۍS{βsOZ0tGxĨ}+&2zur^^S]g31603w#w5A-]=;'ñtb7rI"pvH1MhȧQСy%kpA@nGcj"!kD&Hr}#XNC&ݙ8؟AnTpB@#+f,$㘺n8y¹μPPǶSPفh3ΩӥDsJ]G\;x3IT!R 4P)BE @0:4"D{N\tˣ8~BgvuyPImA	}KhW|톄#+EXȉ#+qN5}2LSSHB,,Nh|c*i[[ߣYAZrpia#*t6ӮƥjNҨL@L5sCwTu)4'%:M^rg8l^#+G9	}We"G]=Q#:F^;dul!냿m5:n11FI$~LJn'^Lp}3֘bY|Ͷ|y4\##TӪzD#0\TQ(3VJ^ܧS]{wP&n/Yu>ۍp&fYB92G,'{Ԯʹv[7o;N!aut꼺mGd׶[\8[66\6K: fvۻKtOb&`Kxb7X+v^0|+]h/u#ysfBicyѽ<6L!Ǣ*j@MA530d'.x		EQJKpUN;L)=#*6Vgvzhgl07G^4&D̼ucȡ՘yWִK9R`چ̳3:;%\(B1ݣ N[1f2/%!t!enqO+h/AɌ$:w9lu@rk sÊ(lIԺjG?/<w_إʣƿtZz-H|O>q}bz#*o8^ؼ?wMޝɍ:渁xtCzϐXaFӢlW=;#* #*.Y%A0ɠA֍fFd##sEi8YDdf4c4HVukAʍ }R;%hQ@(#*@#+, v+o4Ǭ߳eFd赫Sh˫$&i0*RP#@..5ƭ#~}yÆoQ^Tb4܄o\f4*h!Fr`gjRkɠ("F\,@#`MB^ɢ4mHzć\e#+C9MKj.0kFeƜ;;dhHaR)NΒK%lP>zcv*^P^=C8lfK-"Lǡݽ7c2@k4.]ōVpuFHcQtfmsF:ě77W&XFZjn˩ns82;M֤Q^ r=Hp61}ݖT"8 ʱ2B*,4".hl33R[!oOsB'mJJ]6z4ƀhRCC,V橢=CӃmC4thӳxöf8jF5hd_ZL:2lZ q1Lֳkl鶜|QoG͹5\c:7u>::5X0hg1j5Rбb\c3|Jn8u"^CmqAkIߔ;*Ruh$br-wWSɲKqNG%h|IN6х}VI+#%ƈfΑTnV\j]ujxub g	t#*eit!Nʧos/MDؔ-AFhCf!aCT,F8E##Lq2]Q+"_LGyi8B4O;cm#*|)㫣<7صL_	O'U]?7Hm-K5|?`O 5y6h^GNЀ04I#@ys>"+*j<u𑍡9$lvٺY2BH{<x8Ȟڪ1ڰ6x|"Gq5vUpTHu~#wG6Lu5 :B9>P/+Bx%FVF(+ 4P$ v<\( |^Fi6F2-U RPRQMAIJD!$2DBDS114A,RIPTPALRKPRIA2R$Q#*RE$TԓDPL DACǜwٸp/UX>]SuiN:♌WB#}C<`TȂg~#8I4&6sHtrxzJh;zĚu#*eC5{9TSn5iL%/cB0+Ee@UMdDB(+QİeYX&E/И#+8C GD<%ԫy&EѩQ2"79Ѣj&rb(Ev9H˫VE0S;)L"nY .Jr4#*\be?Ec	7NR&"ZŃF4=h:LUҝXA#+8 (-yDBGL	#*>8#*Dw 5k4:b&2&wM,2C3oIqm-{0;@<M4AvS3)rrr$&KaaH^:CMRB@zvC"b>!Cѿkxu sD#*%JN#+F٬\m#*|"6a+3y p!|l;(e:HHJ_oz?b:K8VӴ27F`#+i4ʔw6[^@`z>y"}5,):\ҼqǬN:tٱJpA(mz.;W2vD&%zS3Z8`ˇH6)>9)2@NMas%H$`p<NK3%Vj3~6V Rf8vF&0D%yQ^e#*5P2щ#d'xyNX!Ej-s##*E3*Eh&R5aNЍL!SFiq@#*#*J6;Ԯewl VsӢ[W⏔(Utɭx|KFS"nɺ&PMiU4ƳѺm)C1Kik\m`0Q	R4#+up\t:'vޗLE %;;Y0̊GZ/EĹ)]#*n; kۑJAseևnyoGE*jQ3'QO1ðؑZc!Νz|nU6jY9RF ==:libbn^3zs*XhbEmD#*V#*lYkS?'۝փ[s+#*$JP豖eyoq7`[7L;tx:vov炘%gk'H[##*N :7OJrç]iCa64MLH-kqcuT%m>RM|:yKʸ]-qc8g}GRZL#*#*"{"yѱSIK3:U.& 8Z:=#*$5kdtf9!($bgOh;.X|OEgzSo!vX8}f;@Ž@f؜{ܩ63:6 <,3U1Z鳚($;KS7du)V:UصsD0c1X<2mLii	tI+{mӴ4]:!Yx Hc(n(~TOH+pP>}ܴQ!az3!3y5vv6%8R} 7Mn|Iv9gbNy9y21mc;D#SC#*-Vj.P )=K<&2P`zu1I+It3ys#*XbHFBMgxl,5(S&1vD$}Ӛ}$+Ga34jE(rCQ3#*fzudB sA%" YC*ENΉ]@ ?Q7=QEjſ4dab45$/5/]8ΗM^>n%um&Qo8d1ieGurQNᘝckjDiBLT*2wi*цɍf4X@DI6uc|JA/``3>G<Z4,MgA"avdj2ИFڌvc,ʅhl`o?\!ŏʪ\21Vr4x=@pTuCI]D#*|gA(7pݐV6O1vz&n: `+i!.uB"[#+u	":.]$h9kE2UDЖ%z) &;0MEKBhS^޳Fb"4M56nfd241(ИtwQF2Hj8c)"$C`##S0;H08ChԄ0MCШ"J)Q,t"$)]%;ƩX,0Yn@%?||WOǶ48#	 Fxg.벎p;<|#+!"&qT*./tE0}CK#b±-Ǚf~:AkS)HIF[b-7li3ӗt1MscEy/Gǔr괩Q)4s *Tt@{0Ƅ6%bgQ}ȳ|GvdtK"N3÷'J-#+3mY=Q[swߕF##+R6|UXDmz6IڗM}oZ'WoYl/|ox2ҋwBaz&Il#· %0xd7)2d%P4{#AI(BӺT20cFe,#+%1Vh54#*G#!K(G acNF2ef؞(m$*1e}aًI10,916$t=A<6 T9GfICb%b#=Wlؔ]lX[v+c@cM	ȳ\#*PpH4e+w>f4V_&(_!~`4ԙza&NE2=!n'<*0#֢}YK陎`b:'*:$Rj9G1M`\NB,\@PLQ6clc]22>P=Q A@(EĦHPD.OÁEu#;4s\4؈\X D: U4	Ba3'T_(&yC#+Fo#*DQBTB5{㏟g?:$H#+2( % Dxî0)IopĚSMPptTP? kĩ#*69H" #4aCfL,(0ƈdN(J]@p:nul H.bYeyxsNGxoqV^? 8L^;HVYLi3(Y dxGw[d;.dT &$aeVb?9>uI=ʭ&J1ֺ°^<xt`:^rD؇7XnƲLw7 -~.B`#*vaF~hy`΢%mY=a{ciTp:D#+z+mՌ `Vz!rz!(!v-(N8@U3Mx!v_G?~'z9I%BB`jE) PC!N9	@u?:Ux#+ǯl]]]}p\{p[!0I F}H2Ӽ;g.@#+"H@oJHheg=]óù,<W}#+1i~c,Q##*l1;4Fx9bعi^pΩP	@jDJSpa&YvgMOtCXVƭss#M6a9D1Zո2L	C#+aGSRsS/	# !;kNMC((AKK	66K1J}(aT@2JD(@ *0|{)i6ݿmq=a1 f>" `D="D{JkaxQTI\A78}~\EEu)xM;ѶGY!u*-]~]`s#+("/Q{I@U{+oop4hFG0%!"FX2SxE=Ĵ=ޔ=4P8xP&Nl9y3,;MaEQMJR1QUSTfdը5{ր0Ye#*8TiRd&B`0!	qs~|Ǽ=d4\/		JP,P°mg|CqJQģT2LH|AKGOJUM! R4C#+,*(ԟT:s-v~] x@1}OChaD04+!1@TD[  %(=}?/0$Mx?OM32KCr/Z!=DN@"N0S<捈l>hF'bmX}OaTh{biu/tחf	"꿷&9!Z^瀦`d &" a GE^8Q (P, XYA*^fͲ|"'4*Rc SvģvyMz34t-ܴH2VLTf2tB艎soŭ-He5Q#+<);>jj*#+R	i(#+#+JbU~R>#*D Ioxh.ЌT4uUL:s؅B9Baz%_4B4TH@4(Hvۇ>&ǝI!CQnX~JCE#+#+9tL_}A4F."TT[3`ҎD(cݘ jBh܆p?REhXs$9qG"5RMSHM ˏ0?8?\h$u3]ĆlI	h)ZBSXA4pI	3,V#+be`MY*;Į@iA2R#+!X%	$Y\s (5%Sժq޳-lIh*aC{m4NΆwKym"T5JQпqg&XD7?Q,|Ty&sԓ{z^Ei$F@SVmdWAHrD䪲A(A`-`r&LDkB2iP4AQ̤fҒ$8hh_N/kL0zvh50(bC*W{ӴMT\E	D~.icK<^@E$oԸJ# !B&mLui6d9J8h?Ęlˁ,PԛGҴ}G`PJ6蚴f0zl왦|q#+ؿmmo(y8xvD14Z!D(8\wꪉ67?C=7Deڬ4kxHP5LY3ˢv)be tlC`?=IcYߚ'#x-(`v?.x99}x} </net(,R&PXѪa-UBK;/	-~]mkPƆ\*`Z@^ 	??l~?w}Guw?o3i~UP'#>`.S3rf~~) 7?jA	.ꈤOE/?kVfTUUDLJo І[XM!z r((CMii&0Kd͏=ԑT9wL hI:RsDK)vӰ&1hb[j8/?Zɂor:v*#+hKe8˾4tZmyi2>3?sep6t5M4{16~X5Bƫ{7Tw|\n9FmƃLRp38Iq3!ᗒo[L#*0PΣ8،ĈlCM{E	eh钩t1X_.t!G\Q]v(WDDi.^wm64nWDmNǵ-{ulL@X_&bcݴ#*@_&^xwAre/%a)##+ANGz`Bʊ6(xNR>.0fF/t&R˿h'=z*hQ$kקB(b(`^O#+RrC;wt_m߂̀f@״0q%- $4MDT%RDĠġE]L@A<o⟄=$?!(-kU9$`D!ͶCCO3TJމۑ+//CV=%ϗhNlNw%53(_J6-9êBZ<X^Z.Cm`3%a鴸bq(MM[q6KO	!e>~;0vΌC !7+]fHRu ARPBE4JR	G#JB=4ixl}QC~<QA_D^cMs#*4-DHʑ[uoIà!5Yd;ө/5ʼi$$d$5b %xdtݬMd.֞	_m&Pb*S0}rTD:H#""w`tzB;y'W2ˑۭic۷jħ(:}s{Q3L⊄ۤX??|$T o\>[&]5*=l}~{IsߴGE7?Bx>`/G_'͉|Oa?|>_O?E%Aqn#9Z!3@ֿe~:o(һxT>8rD;qf.:H^]e,"+m	1k`ZdFyJ';yhfՙ<npqQyZ㪌a'3i͚f=xc?rE8P`|
+#BZh91AY&SY_6t "DЀ H  Ha_{                  jhQ k{u]5I#(M[v2)T٨_bN-RZkU;tc`5hz{{>/Kw|3kp] :^o|o=smr{Tm>  N  6 ><Tc3ۣ :u@VW JJ"0(@Z Z#$Qkswomw=P^A}ͽigK^w{qwm}ϻ_/fo}{N>{s IliT֣Kc`N=X*UPHP5/{M=^{U!*uK};V.Իmj:lUJa/ʟ=]ۺ5Z(ە_Nvwzv^s;_l;KuNݯuA[=>yB{ﺽk|ZZ;O[ݹ9sypw_conw]1:{=i£v^öq =yu｠X&@R#(J̛:8mӲ*Wd޳Bf9әUg Svo7׼ހۼk8rnorZ9j>f vl_{{[Cϧyx#(mngut3j=+v>|wˮWwml9w۹._;wݝV <A(=#(4x=l=oz(n9ɻv7۷b=6kUwّ/[=﷧c @NΧUU:ӚÃNm#( P2i =7v}    =3PYt&vwGgZuLJ#(L!}HkϮەUw_|}o:=vfwY;n6qѦ}}kW6qZo;\`o &   4 F#$&LPML0	M e41(=#$dm #$   &" M &=LORȞԞd ѣLL$JIM̄e<z h=Czd iHhɔѦ#(zO?FM5)U?ʧG%ѵMHC    "	FFMjaMJQ)=S4 F jS%*夵\yY+jr	$	f* O?/?\~Ǳ5NTEQzSzzUU*^TL̇f-2u.#$#(t"	"#(N8~bHVBw,M@MYZwջ吀{!lE[R֣ZUFQ\J@T,EA:R )hE,H-BQ"A-FlH&bXS"hd,f*A,a2Sf)jRP1MQY FP$#(+cA%(64EcAI)RIK-&`)bFƪMPc,R&6R$biMAQYԵVM2R[Ie*mE$Ҷk66j6#(Rcdi(4Xfd0`&d(@f"I ɆԐX&M(3!)%$1)5BZ5 ,1bB)(23"HQ1Ii"#IȤDfFԅM4*bLL$MhY#$RI)*,I,$XLfcF)	c!F&HI`ę"SDSB#$A&ZjEJCFYb,fTc6f2H,ؓ6#$,#h%٢&41f13)2R$S%(M)Rj"!2($l$P&FT3l6dIKHY1HhI4Ɇ5Xʑ,-3(Ѵ$C!a34&1%$̋T "`&HI0h,2dd5b!MeA&2Hk6TlY#$LdJJ"ѤYi1Fd64H	bXhclZh)0ICH5LAd6V[ZBjM,$љ)bZ,4LMEPM5#(2e#4M_[HYZBBYd&U%b52E%cS["e#$KR&5(PͨKQfIFclQjZbjlXd6,ȚҲ*b)FRF*J͕Jf62BR"ƨYQ&2FZ6MQQ%&ѵ&I 5lXf6	Y"Q)BR	5$d%j, lSR$4$[6*MlYTB4&RTadȥ#$Im-5K#LJ0Ba# bbdfmI%2IRK3)4R(FZYR E1HƲFa([LLTԖ4L$jCPQ4͈-#$f-JZhRke+lQK2YM!fmllb06FV)JT 1IH6c3,Tԣ&4dBdFQeDK	j&*e ,)42Q6Ԍ̚,(͐Q2XM2dk)*,JDE,TThU4dJ#(M" PdƂٲ	$Ԅe2JS!-	F$LڄE,0hTQFЅJTIh#$[l-D-%A$L&J$+ETAl&&	ERi4be&mET4*ddذ!,X̔I-&*RXFQkaaFhdHFMQTEEQLŤIZ6RQFc4" L[QQcZ4i-hC6cFąQ3YZ5ji#$,65EjJVQh&Z5i#mRQL̢ɴhR4Th*&EED6Q6H֒ѪEѵC-ljHi%hYJ7lҢ(&cc!AiD&TH{pO)\CQq6)=+5xYyw/K8CCN_/wY#(K)$bո3|	uHG]uQ|t,;bTB0DN%O<מ?/cGˌ֠0i+%C߷qräƷL0ZAT0ȉb/iYʗmMdeAI8UDLx`v>5VN'+9l*6#$|mw˜p]`U?CY2%J!ZOV=6_[2??aMN!cw}tn*LRf(<jf J,9鐯2&1GYHV{=e u<t#HPDhdF !S1 aERQ8(c+IԒTX>}Ifs&G	UI1; b{zЕӛ^Sk^+#$z{8^S},ĽZ#$hh[~P?O#((~	zIDAѾd钱_j?K?>&Iכ#(&!@P_a_:EʖiI2"  733?$'ϞRgKh^iݧe^7{pLyAt:?#(=wUsM դ2Q*T%~\ҋ:mqC0K71Xz2c>xQA`s;Hh~xAznwuB1vlU[F,CFR1O'|3=y*-_jzڝbە)V`F_{gVAH2X+jY5kP@0g`.JT_~EёO&?k+NR!XXg+#dTH``?#(TfUlQ#$IW{=B#>=01yzsсF{Pg"`~yf'C/l#$h (_U&p%V1HT<2hPbKjȽ߆NrHe,>铍L)+)Ӥ<XZ+>Py!ky˒2;S.tv܁M#(#$YhVqEfi.?s#(vZzRϿq>	,@hQ,r^A*~TqYfPݮ4Q?ֺE g*"ُ15l)Ky3A$>L4LJì+1⿓LYb__~>'oS6q2}\w#}kF{*[7AMprf)2+~i!*D4Oya}_=Rx@t~Jb#OChN%aNѷzY<k>f")2#.D}ES& Ls3cX;QAWq-!ąTSs(6TaRg9ms1LFs"r"u=1ƜIQRלiR	/ďuM4C;+ږ9jGs?zDDYJEݥ(#%uVѳ t1O=_Sp=nxۏ]=Һ2ԣ>nm&d߸Nԑ{luS$uZwH;@Bs#$+;;Qt1emKFD͡S.FHY67//y}/YfSr,(MvrB#'""G-A#~\%E~>>UCHTvݜCK%TloݓdJ>#?e~W˂z0ʠ4|43C8i$tKvBw,h-o8|zgh,+]`b7O{?Ʉ̅gwp@B|F*|&~^׶x{)<#(e&h}mw)9Od#(mlłäݘQ'~<0pk}g\3Bk7|yoh Hu"rq7%*[EZb}v3ZS*C?1oa|5C $>{7N"-:f?ڇ7(~\Ppgb	ytjv28:۸QԵߗ!([řNӶ/(p,%.ǚ"[e%6*u|qBtaeѺ째gH8IcټOf:|!Z"0E=wy&j vkO4 뫶f?	7nۧTs|'k_=:˸MQd'Az-_d+rɬglgzD\O#$1#$$Rr\| 0CDbLm(<0dd2Bx/%<?Cs%>si=:X-$}Kii"DYMDNuEfj9RyDKXbYOT!ŇGL_;Ylr<k6ߤ}̶,HDG؟8iC`MPOIBB"n~5u5i=MPb7gwܢ#();T"IFH\)Љs#(HH%Wm@=hKd{!!XpPM(o^xq[]ʴCKHXIŷyK	A5zY3l3>$>/IUJ%>OWZ/P1L4Νw+k&'اx2F;a7FGZSJJ3fo:;i0J_qM/]mH?ܴQp伤fus(7Vg?σ6,{_	YDbt?N{?J/E"Ww'_oU"BpL0ةYC=t}Px?3S|&C7oN^efgYgZ`G꾬mA" C/RT/=GP!w͊V՚~.>O˽S/N518*"O}w?~ٞޛ,mq_<O霦uY31%Zf	ptftTF&{#onPdpD8+7];7C^k誏#'c>ĳq#(A^)$@H(GrWvMk'c?QeY?ɸ*ߓ5<5#$DOjc#$&n`C)em~wצږߧ=5CctW)dE?g߉Jt.]]h#+Ow*pp#(4ĸyy9'tʖ7m,>{xQKIEG6U]zT%)W.N"+V֖	BbM3~]	sԤ0b1=+X1Ou9 C3sd(~#$@;Osn1zoX=((YO}R`u(ys(^y3Iq>:L"w@\v=I'L1ά@a曥D8!*jݓlRInwGt܀6i7U#uOjLNp&ׅ{KFR䣞Biҵ[1䂟]%[3#g|x{;TW&]?]_ɫ<-2vYQ󯒫oTAl,t>9WYKB|dOqMQ9N\':31WŰS>?/U>m1}{⥴ILuw3|=,yE|gh{oVnC՜e	,:ǆs.._|ml\n@#$.ҙ.1z_n䰤Jקs䓊y?ݟ%9gٽHn_BMJ	!:HJa+'̖Md6,HZm˸N.Pk٨=Έulrk<>5#$Aݜ%͓;eAȢդAe{ӯ4+K;xҽ:*-㳴&'B9vf%37M8DWQE44n[4c^h^*g+.~wfZKN"j5)tlL,Uln'ۖp~VU4{:09ֺqgMH@OPoK$uubx]Ӽys0d[YK_䣿ZTʰ}CK$F([YQ* )*"I,R;?rm%͙2a`qh*<	L#(!+]nG0UKҝY#s;徺!!ir2҂;\d&lC6#(791:;WwV2qy9>8YQex׼^Mj/HkCGI~{|6J,lPӆ59,C9D1Lr.RJF92>תcJ%:գC9ZdfߍR2Y`C{bK#$eL̲]P'Nnxnv||o-Q^,s{YyR(DʏD6/	h`^|g(mC6JGvBD$BD/ȁ#(1z=U$9+, ~Q`C;`awqU!ۃpeO&#Be_ǜGw-zuTt'P(^3I#XU˿Su_,~5Hވ`- X[i)H,.qslgTr䄪&2FIp 8yĭ!B*gYK{9#z̙#(Dcn޸Ez=(Ĩ ż{[`1ÎГIcsY|U!-L"tYߤW_~}5k4֫_ 3hhLGS÷>"faZl)R,t8?`-G7U#(%a"I?Lf>XgO"/4[ac~r_|Go^q=	5<&]W0xWYKlR$#׃Rٞ	-cݮxE2@ B;-S6sF̌Zuo]㴼UzstkX HE2alCNS#B-.KX<[om99I*Զ$u<˱gpV.)Ǝ۟=M\b 皣_Y23pwoo#$twHͶ=.KU %rE-)FcQB$J#(s*1+]}Zut"Es18 	--ŵ.j|G><U$z[ƚ»3٭i=i"p+EY҇=Hn-.P+!*MBxv59>fS=˹oyZ=vȏ_Aqi­It7%G5m#$sBykQkщn5v11;XӠf	>i@vӕq|vee>R՘WD^N;DMeFxo_D0h-3 vfǷuK<QfZ*U5~t9~#(8zQBgͬ%~O`al:-Rfm(ޭhECRXb}gN˼j~0{nCN{{-AT8\HR޿033v~v9aZL6o{K7H<om(ʂupL|oMYd|I[8vxWeK#(oj h=E3jEn3RR䆑B#z03%cF|pYYMp-l&fpE	jLxNEj%D1U36#ymfWfcB΄CB0fG{!"noVo /JQѰT {] +]O0:|g['^R]7eFw*II*ӝD_.63wdd^]ce5^"s oigdlv#(^*dZ];/5ۡr0E>ʧăI$Ɏ{˥3>En%Ҋ_޽+k14zc%}܀9)gXA:DttFKNur朋ŦRP͒YVJ#$KGhoPD9=\%\εm!#GG9Vx#s6dvmh%K{>^ o-`>L#(3,g$09F~ZU[zg̗L}_ig+P:L3ǲbKZ.`=	D/AEɮ"H,V~7sz5}PPvYX#(4#st8#$>I@juM;BlAm#$r`zKRڛAGşJ=ɢ/H+b.JmGcK11b.:-dNBPD]#(ĊN>gLy;Qtsi:Ik1Q37$E0&muO<,BG267N-WđoS'Ǻ&c0D(Hu0Kf|Fe=_zN9smE3s#(Ct"f\'!%((.2Օ-ܖ2`b-r[[~faq	Y44(±=EP;$ЍBtG%QLSm\1̸`HNGJR*I"k.VSop_lΙxSKQAY`x-h\[3%l{j^EQhέB [ݛkhŃ+gt{u݇_P"iP~ş=Wz=Z'ץS3c> 1jF.ڳp>y]6ĢGftfbSK9%,;ơrnU!ZPu+eȷB$&k1eH~"QC7a8Ib=IYU3(k==ų"L;;*@I3eRuaܡ KM.!0݊ƞ)ط/' O^v@Φl" Qo>d0)QzCVAeŁsrt7ewfц^,7>yЩRƆjT"筸eY)<&S:k#$ṃb	aFXu)@,KZ6f0BNY &uIJ	X,`baSb_jO@ͥ)%f,$0)w:c.ў+b	sX#p8\	{"nD"qtlZ[[e9JQUWNd=_7+{ ummf9NE[4{EǊs?.pyh4:#.B厖*2J+,6oT.Z$ȴQ{3:Ԯnϭ1QE<P\eszKF[\ui5hxeӊvݘ35#('セc[d#$ 	ڜݑt˃]L,Щe~ζ,(͸!18SpX#(EX=4?D^oC:RHPª4vM YI	ltCͧ1ɒqZ$B9m/9?=^`eS-'YIQ;Xx_	J"{{*kf0Y{v^'ob5 ,[CMwv{NysAiC#.E#`0[IRT	FccIMDEQu4C	L !Tp}1jvه"ɬmha^s̸9Y=A2(8z=ya{0;+d4oCNI#"]xD2Jrf[P%7&<b<T֣Tgi§|$?àhr]|@|GHxtϞ`"vFiST_SFQ-B( wpTmo2ɰpE.=:uy8{(ډ{ cSV#$?cDvH.]jhFNѰ8L@\~HeI#$?ͲK#~HL9#(simtV+8;wSDV3!Oav95p9|a<?^s/+N!$yO4{:+<cEO}ӻL%#$e*4VH!	BB@PA{@*%,/P}gUD=ıiYOrO)OɎr:Ze5:22ܶUBG PMAC]<g DL $@Mۇ:ߟm?'ӏiGqOv\)Sed$XZZorHԩbR}65-YD]o{fxѻ9łnaN,DF#(JCچ#(gώNX(ID8bȿ.#NJr|ĖqQ#-\G1{`Qp4@~߰ѵWsLqD³$?Bk#$`QćL4C_0Q1%:Bb#(k-)`ܻ_P?;fXb6[$Úė]eFZ#-Yx?4vw! Aq?4Έ#׬}!0'Q1nmXt(X]ʪhdJS[&yױ>	Z#(!hnu#(fƙCw\|q6g¹pnJy"}5֨gUx2`,<eU4{Q>)|.Ÿnq	#﯒	\v/v,{#?oyCZ#(_ud*6>dA\pc{J]SKe}?˄J8u%]u'7\GӥwvGlWMbqݑp~Yq*]"6${V	$#L}UɎ[;ӭa0])5ڻ*ʺne{g6Ko,`T1j_\ۺ?e4Ppq	HPa98*!OGb"ow$%;uEBLڬg \#(?ъkI{Z~<}PP#(}MQ~Y؈AAӦwzR>b tTcPNC?k/Nܦor-T#e	oxj5"kQA#(P	p'R K^AKأV,X#(XCʏF]wmTsri۪-f!$v&cܬGh#$ mKR$)g4&*O]$B+ ~AaXon6ׇgK*oO#~<I겭>"^|#$G,YZ#$Ye|a#$gӿ眵׏6FE}fh5/kޡzss-|,7~m={o2xlg|۷۫?=r9#>wijoN{nߙ+`h@r;2z{xV%0.fNWuXfL/[@v]=76_~sRe%g|zՊ/#((fμ4I-gR:yvo.}K)`ȫSj=TyEoTsmpQ5"?MxLv`[emh"LL>YMƙƱɐ]e~|sٟſ]ka%Cnޣ;o%MJ2!	l*U`s!n^b|_s&awzr~vvKָ-Y^oaoU}YT]>1tJy9cz?1lgtzm5Atz6;oxC,Qg'`xR߳7Gn\s<K;w<unɆ8Hz#$Q5I:j|歶@767&Z<RGLK[j͕G#pWdơ]Fl=ǟXT3#ᗧ|~y~8}"(1O|ySe+ƯK?ۡ#$(ߨhvNGO3|v~ǬreOP^_>~vQIrϔ9aN.	!9yUg<~W0cxy8qO=#(}f=_wVwvڮ[F\k,{ۗ-w5O7ɲcbLrpT#jρ&; |!CZ˞PnkOrU,8&߽4P_6`,xGgV_TW]#$}*;Oe&LzgeRC#~4|F+hr^#w4u2Y (UPQ%Y#~7߱հ|FGGm.|̃jpd1_ލ$[=|ngphVfͻuq nl6Yӽ83Fc7Jo~`3#$^̻#FgdxQC0kzʴ}'ҭML#(Ok2X9|R9~Ƿ1wN"lZjx/N=!}9+=&"4C.}e^,R78#$7sޢ#(G0Ϛk$KUDg㯙 7DC5]ףI~#$@stN#NGE}C#$)0{/\~HnE`2?%NU_ޫJ6iWQ\N_OLͻ7%B3ژwNu1W.m:*Q~zGgNM6ރ^%aOVb/$j~#(HZ?أ廍;^{3\m 3NOVoC21[J~bF;ɰ:lxK3	Be0E.RRa0R'5a&MٳVE#heȸAHbӮxXOC4UCzROnF+F\M뛴鳹(o<y}.o1ٓZ{<O6È#(ςl66G&Z8`o!MT!`9(s`\*ת&I^irWKwO`FUn1H4ٝHGD<8]1?xǄ'eVoǓM"2*_)u_7ET,$ DJpNTqM >~Տ5ۈJЂҾrh_׽|#$X|yD(\#(90aOS~$E÷ݬ/>=Tﾮ_77onY?!#(>AXu8bC݁91?BQ,=6L/a#$RS)&Y˃ -R`1S@b#$]+Xc#(*AAeC@`9˒XZV9apaLYr,RBe\8bf2_?= \z0:4ㄬLc"b#$ceCŽotJPRBBHf#&H#RE(l;pJ4%.+7]) /tYݥNj1L"sfS!PRԘ S#mL}W.#(Mɉx˔̂نM54]jd!s^JXBit(CPĳAE/O>egJ):G0];+?yoH'N^V몕gVhl՞&|$Ʉ/΍{x}c@\.`#]x ,H/S&s",wD-ܔ;(2:lb)oxHR.5n17i,TiDvcc4B/͒D|8ZPpQ\ 5MX{^©6)ѹ?fɽZJI$nb@Q~B-a-n""v=Op|6Ö_C*_?rd]}|fm,g_-{8Dd531.H	w(RO*-YCmGp\z/oMۡ[h!Q^UJ@Z o5FW{<5$42uû6Ml_W}nkNLRXj7Oxu-RɅCMtk)(L&o4Us'fePݩF~?JJBtOWд8«li)wO1[#KJredgzt&b8G:zX*{>2ȢDdOnOBi_˃01DIz0#(0FϮ[zd!a3!`<k/y塝gIl39BW3i7׭?BWC&`vg2#(#$HP&E%9s#$sJYL9)&8akYdnþSZK4bE)f x}5u1Z2as~-1ykM.EU7T~6C {J:fG#$`&t{v)w#`6*@X.Yh{?GPNnzvTߚY۽HTDݚWN}n*`# @N8pSKIy	vu HN0lLL߸8ݼL3N`̂hе,	/k^Fhtŋ2plKxLFn=9ӆZK28%|9l}<}	Oh)"mDoMdKKvoޘ|SBY:eAب7 ~X~1IwݼgK0zb~e8^?,P5fAFCLQS_):+'-[3.=&FnK;ò3n	߯^^U@Q.I!|10xJ]!ca-J8͢-2;'q(lR1#$ET	:hL-IVVb=#`(ǆYJoYmD")+ﭤ[=14r`^	y#4FS5G(Lj;馦bз"኏n8f:dfKe'BSgq i{x3q<:=Bׄ⿔|K󀔷_ͱf&ۘ%!:ΘG)8FLT5Ӕj_JTTNWڦ5R2eU"&£[/N%}UX&A{h{FK#(TR*j"	19%2x62t0	#OXsBj@	Neb^|B	1;ϸl Tuuˆ/	fMWr`1yx<o!,! :Q(_-UֽZ&TIUݬ_Pٰ%tLPuۊZ5-r;ٍBPg[wc#${9&hJ#$YE`J;hyr8iQ8md>کY-ЁbM* n0̱7ݓEEY/n7ZK{]@e3H"DDK8~b-}NH}Θ󎟲ctL"=hb*iW3P#$c#$y7h=je9r.z¢uŲҟ*DN!sC/"19~<]?aJՅ6y/S,^0Ufwxt"Jn]T^GT^Qqk?9ƣ	&.?|ؖK^+ܸ	ƈrQ̬/IEe9Ȗd.A2UO4UגRۘ#uy2Nk|vĲT#$龖-wEE+l$륾;P|>UYU&Uu?ܬD7ݪxĳo+1x|hbD.k}=g:<;ER#(H&ˉLf#(:1G=ytԒ\o-˩G.&6d`&6#$1tNhZ2T)[40evc+*t]F$Id#(BB^C⤡G^ƦS	Dr*ݵ'߈ц!ݎGifO;4	A9y~**,$uW-/:	W,q>/To~ߟhYѤuUc8~:/_büx{ӫ;n?FUKy~@H?yG|V)UEJ>;!:O߿bI9eYceص%"k鲺?☥(TNj#( X	q -NwN|AU,)Pے<mJt?ιZQlpi;bʊuJ	L!CYwoWs4~Hڊ"dgĒԔ8!yCܯmKˏܩؐw3 ٱ]%pQ̄ Aim#$]Ȃ	xNf6;	#(]6t{qk{՚<Y+d_E<ev86h2\w :CwbCY74QE{W)`D͉ʤ2NFȢdx+&ftZn1b03	Rۤ#$jƺ׼Acaݡ'@&`vkWvv-6G2~fީm{C`_ģ#$DO7)i8#$d:ݚ֋PO70w^CXhHt~qby2MlN[C2hvtm?#(mvP	`/=gφDEb񇦜;$3Y܌|h3#%NMVmoov76!DC"G$8#A6Jq"8j+x=ɤٲX\jD{ǿϋzjo䈇#pHwNjPmHOk:ʛ9-K$X`kYuh_Q_4#(q8LwR)8D}=D#(9)D[LvGLY@sn;/fkqo&zmJVjo'I[AMwa&q6!V#abtK,b S#IA]$F;a|UwbAz}ßۿLZ#$^k{+X}yJ4ԨZ97{ab;&緺<Č!Ucl.d'$]yxl%{v:,%gs3mb&Б#(k&gGATLGCPMiBhnvTխ dUFW<cOM"ltC$OWn,`ӧ>dY$7F(Hw\٭Ԃ;ƑkDc3V4xne]/1ܺZB5T4CM̗<Ej*#(N/SugѐLAYdDxm?KyX-bIl~Zn@cEPUF4DPC#(yZoi-fJ4]H¡tξx&Yį2c,Tj6\-a4S=.4yvB.kJ/!*\w*>iFv$ΕZK,ڤo{z:Ur~*Xk%dٕW5~|\#(OHI'e.\q>!3#$f,ѷY75b#(qDê{TiI#tvRЎjH+iN'3VYD^26ӏ$0>*	}yZZAڪ/M#({E#(WHN,S{>a@D5hfk(yka.x.y2g#$߷JFXG)RjDGԿmaAf~e6""[t0ݓw,#$oh,*-9ZՑ]^4Y˝N[g!feƊ<=̟j 'IZ&u#(3o5Z}i.ZatJW((v7Qόk*V#$~mg/=9[>Wg~4Ρ#A5ZԒ]_fq7ٌ+ʶ^#$/*V+Ҷ]-w8wRٕ$ez練жPo\׺mlj.o8OtYMo,+_8Z^fKxژJ*:&1]y#$w^)Z4[cpSZѯ6;hLZg|&e6F2Dgq[իò}Ŋ/3U ܳia(WH,\$e`.xR0r$MmjScUpuaCS%UX[]L&&"g\}]|8_5kDF[H#$PkWSt*4w::G?x=NUմ5G* @\%;Tw\h>>gCZ"9W}KeWu׮BS.sXESzTL#$nIHQ+igĝ62Tm*X-ϜlYFh1w,"c#(Qa5%"Jq98sbq\.:-mJwFyH<j:]Eqm0~3ŜEAxSb%f-U4gGba%Vil,%PAg]HL2ˏ	ypK#?ϴTI(SUEU[Tqv]AU>vaic8}52IZٖ^խea;Jq}K6tZ皗2].'\><Mnjmv#($QZ[UJ(hM,lרj,n{a]nxnb]֍&	ob3m4Z-&T"ύx4׹B@P2gBƤv8,suF,VnFeGkt&c%չ0Z/3s[?mEI0SNy<Wɸ)"#(E.takzY\h\6!`7fbѓ0JeAGJ\2Hk q@PU]W{]ʢn#Dfu.mUmEE#(ͥpX_\w+>vf*6\X!L+4>Y#$V%X^*nH_JM8Eu߶+=ZPU]-@56O#(&TZNnљ1|spe|+jCa{5޺!*hYOל}8d"	6<f^qI&ds,yԢzl%IKy{$:*Ǖ j럵2ٍ՝Вu aƺXjU3nعnR#(v4m+!lfQ}Vd~T3oE\RpE16	ͭy/.9iZA\)d+9/!lSY38T:<ۮ$1W+o޺Y*#7J[#(Ǖ#(KRj[oEwrՆSlm١vjjK	xv~fkP75]=hǂ<;F;Dn@|j(荫Hp^3&]T^(:'7JwF|AE(ꉍRy.fTU_rEMuRҘ;?Mɏ!#(E[#( ,V.N|prqS.peK̢P/D xm&<]IPy!ͱਭJ9CYFyT=#("R,suiy*#$}t~#(+8=<uE3m2E<>Bj˳_ E^R]̪BQm#$,~}FiJ4]V+1Ebb.3%Gêw%#(_8y՛`M2r#4.<rVDGg]Rm#$pXF]6k,u{уOG>0t>"s2!i9(v΂8l`-@tV2Zol	(cgyRUUjG`%Z#$Gw>V~Skz3s(Er,~jOrP6bt=r{#(U:#s#ߡEm%os޺szs.l姉VLq^`F=>Y?f+=T,WꂿAa(gۜbs@`<7T_emPAŕYY@"e_(P)xqpԘ:(~*#skQqgyN侷%cWvn#.d{=7bQaPR|GU-4!D0ST#(OKBeEEt"N B%J@CN]yU]ABI9ZU1 @XW12ܻ*5"%$B%2uN5g\^RxUis3<۵ȁx_izK=Wt)whuy7/}G^Ё O%W[ZMгhYɅ%^x<X:8D|P1YXD=$櫙w~ˌ8޳Y,N.޾BjbyΖΉҚI\3VזCH6M>}_N^bӌIeq/*ǭHoL\Bm <nDbmKj5 Sg8`r:%W(p3W*yH1:};ǯ-&ʧJOw*{Ĵ%O_1*%?fbsl쩃j}pdtP"0sTthGiq'ÚQF-vF'	}~.ūkzcX48ؙ^i&`.YZbO~yIicbq vl*I(w!!/ٓli6	/8^f}g}ET5UቪIڝj)"*VqS"\bA^]_S#[-[/6L[%\VD#(hoHՌYۣNsnI"@=wX7rnnì*$ ?h#$*С"Spz j89(ʃ'd*c_Tmyv5'5V4oX^m-`PnvH<j`>F$N!xᤱ#6Y;ٝ!Vq(&,;ZvzONC>ˏ(jD\I,ʷHw:<">w/ꄥ(CY5b%/n-[)Гja:MobE*$q`_^*ǽ^yJ</uv#?ߛ@@P"?@ ={#$\ipL3lbk8=:pZ[matA?)7$*W;})I5]As=c[G<ٯ^NSzo5S"$F$BZQ:zʨr>Ajv2d| DH@w-r&5#$O	yP0sSA0RQ4 JI#;a#$U@BHY}YwAūE_#(*A @THɽkAzceqp2c&KL8$/+r ܙ$m\9ǌd}aiP-"+UUTo^M<d87&D#$hC#)3ó;=ɲ[YI?2KR(,#(>oͳ_gU|#eu(rT$^@Zz #(<NgRYh<n"g?'#$icQo84{	g#$S	QuYp?D9#$*\4}}TR}x`X"E(2tk%͠hAhhBb#;5BQ!AGl>!Kt[fBsbذL%OPtII]ĝ+y٠iF_xuu綦Ha[dBefo$#L8`nAD-vdW(?\~Ij1mRd%&e0vZA%bNMpF/tIW8IA@YbHw:n랮l-aVi_5$%4x^azvO h@ӒNfZz	Hn: 'Ė;_Y7O; yzA&#(=fߙ?oʮǘS5#$o<;#${4+Meyc!teBemKt7_kŮb="lm/3ͫ0y~&z@#$qdY3k	NnjxĄ!D=ZL$+bFP1=PɘE'C'qOt.|L?ٲӓ!x|5LAIԡ$hP.z`<g"Ğź@vA[$!E⃖MY<Lv_f։Q$F1 -ׅH#()ĥN%kLV0UdEwׇ)^FksYXS2lo*k/-7bSt4#TG%X.lɱ2c)'Eoc͍/#(_\mQ<5w{L̗fN8pMIk:yՖ,UW=$g".d#(6Ȅ$8]Z`RA|ȯ+|Uc뽜z;9O[>j{#; s⫰TIu}XHKv#˧M-\su=t1_Gǥ[/Հqۍvȩ yPowcy;`=)#$F_h?~M.r.(\Xe*^3E	邊NQE9dכes}|˘6c&q'ۏUwvXĀ"gU,qDl03`tg<;tהrxo$i|jM߉;NCA\csD#$k#gD1븲V5(O2xq-&EɌS9(Qd0 Ra}t>J;Rl۳\^SN{+<gV#(fK+~2JgC;3.Us2ȣϷ4׃٨4l^Sz}M}Xs뾙zdA}G<XoΪYsTNXA(ٮzg&}._	S^,,J6z>%3^eFM\b{ճEH95h%Lϋ &p)^"#(oqX̾QuLs>Mǻxy\9︐f$H@wHI":?7_ctMj#	9s)~||V5zP$߱^VځhDJO%Kj+!IL#* *8 PwXҕvv,I"v]T#$?O_MA_$HDJ}5ɟ%@?'J`msk؎)pHHߺ*2v`p??olG=yeۖ h TP(s8tW[Q-`	K$qd[!UP[	4W_bl97ۙaai<]!ȅ Ly?0/BۓVʅ p ?8)!~jaEh9r[Go>s?{#$5ZJ9J,,ôY>E8aG?dHZ Ql&Rs9QOs~j	I2Pl!x)MX;IKJ/{xOUH;? }ܧ*< ߣZ @ħ`Dǽ\@`Od] (zo&!%hV\ő&,D	[	P7Bxжq| ⮹vw 2)l4HЉ:I,!H*E)fCImyݽ@{@^T,L%RoiʄNCjvk={`Hl#(WI6rԞZbUePK	V}hGʵb?G,89Tã,bk#)O<46DJIl|D=\)#8o4ҍ`gğoUm=*6#(N͢cRA;#$+z(%,H,<̲w}f2ڝ3t![Eĺa~ڡs+P[_!Ⱥ>Azxh~UQ!|sjH8PLK2X[dA#>Nu/ٴER[˗?t)e8R\+q߱GUq0iyKj5e!~(W/|@2)QB!t t!qӉp);Z\$9ER||~$Ok(µ:@btB}\6Ooc|eI	g=;uwB`ʷ{hBj'+D1NքN,2wG3c=f^<9L'#(lx	"sH@ChTU$UUF`M#wa@" FBD={zl#(XI#(۝Hqq7LjJF a%p7Dqc6|5&{VIǦ9udH\A0A:nl3$'[|8[B#('h+XT`w[PRa"ަA$#JR "$T%dAB-%i>#$F鿍Z;Ox#$O',(6Y{[,Nj跃z#$;I$!@!LCa߄k7]7?91ۻ7Ū$L"ޞ{ߘ8s47F0|5jj_N\}=#(*sےI*Kr; o}n#(t7Pl3Oy#ҙs?*VϺjBF;HH$!?Mr.y7:Mbd"Fa}OdBO#$ |vA1*8W- )bR^ΕE,זV0diN#$WN! Оsi[};m=5ڀT<bƭlIPt`׉aF6EJK&ajh:oFeNjct.!9T0ݍ|Vtɕ狡͝KYXRxGCl5Љ"l(T#(O,AT.h <T!4|O$qzh,!f wMqo}6mve;#z"T{"qOëħSᗲE_AdPXrJdQZPװgs#("/1LǨąl*n\v:#$U,{+עXDpO	N(	ҫ )|Ozcup59˿G$mom%HQ~mU{ÓyoO.U+E`&`OL<%_P<7OBL6>G]IJS?MNqnaiX$ =B0X%Őds*h}8ֵA4Ml=?IxE"#(naU1'i#$mY֝QPq<HG6^*`G_S8/mr(2a9['zqP9a(>4Ƭ|W,]Ȱ2jgVlGǡ3?TEVzuMI悐ݓO^Kiڈ_S<0nŜcH0Jӗ}&xv6N<ys8::"=Cq7P"=|(֡alҞ:2y$薗ѓE l$$׮&\)j;pN<P2B'TdCgA}iߋTWSٽtL)E]z{` f{Dta2>QЗEb|0 o.Kv~qU%4tbhcݽeɮv1bt"	(:|fxf.^0Dֲ1qяXzS^aF,0B|%l/ˇ!oj1j}L= Ӫ)a뢯À(v-tv[ɾ&#(vl]5=bztG$f*o2!=G0IS4'M&{덞WWڊ	G<sފ( ?G`fIy	?SъJV*wŚͲj9HA{#(%©@ RQTQNpbg LICm(BMwhJٙwB{d  DS?_?~2A3L82AvׅA;oy?"%-Dkᙀes_z^?_~џԸZQF |yf^mih#$_@YP6ta	U)xi(خ|/.cZw' 	BSQv[A `AGSUހFY9[U#u֤'QT$8e|G( =ZŘ1w B<Ф9H'ұӻ^&!.x?:7ӗaRAhޜ7w%7Npy~5$Q*&ǳ8|l#(#W/A\`{%*$HB0^='tOL^<u~?wywJOCǉ>Ğ)?$0T 8#ȩfWs|1adaR$fdhQ-E^3g9x۔yy*3t=O o7nP/ύȊ3I߼KMfಧޚ"GU_{*˼'M4S!̘@>xmS ˤ'[*AG#(0w' 0Dw#(fDa̼<~xrul׋;wo)ej֏5Bj2&yH?qA7ۡsy^:uUHwbyV|({" Af=1=0w0;W	:'9Z	 WOON y|9_xTQ㏻6Y],²G|M⨨ѡCO:o`uک"fEx1ϸÑU8:8ǑȈ R翌'	rcZɨ흣lfZTǯ͛m8WV| #@(PDބ;=Yq8ځE]<! ׭Nm&L%+=zAW}1Ev$=Vz԰vv:TbK;mTx;fMLs5`[7~?F@z\%PZlsӍ/0@<2*"#$ғ/MH>#(J9⦵gPZ5c?C&v66ycԳ0T}|Ze!9|]ټ TrתWGhAO6#(qNL= xn;iEl|ǜub9҉P#(v}dPֺܿHEf#(}Edzt7PSU_+\_Ei!qMixrqeʽ${5UT*B\^Zf2~Z!ŘL|LRl$溊A45 h|&z%:*_i\ uQɊN 3O戙rh&^bi6!GNSw8zKV-l+;=#(h>o<xCƊ=荭ůG"QrX,EID-@2<GFZ#ϵrp{,sQ;]PRЌE3-RbfVWjщ3h^)cC$HEoy빖x)	}&<	y[6"d#(N\wjLULWOm}c+1bim-ϞGeׄetP(R.!ľuV3%c62ƭ=ÖToc^o2t[#V"xE9.&*n /,8~j7gҫ5F]Y|ql>0VJշ4հC4t**z_?8}+VyỴ0ׄQЦNPa7x>1SSQ+j:~8Wt;ay}3I«oDf?e}&5C~OG+DQTfY!%0 >o'*{Eѻ>WI/|WI'BE;z+̋]I!=4yͯl dvmÔ+жV3}-m#$EЮ9Ǿy~0ԩ^ϙt_#$4zjХ8~#0}~TBhWYufD$~#()݇ld)L?X_U2|yG:-m[ίjnOy>uKt9h"T'3TxmGTQJJY߀{{vz܉WE8/̞yArI#!f0mZǝb駠.ct'i^|YYfGyTȩ1*g=dTVyG2]X2:HbLP]i#$z0QLey>M#(Cm-}n39bN3m;Kr':d|t+P]ٗiˎu9mgPo3){iۋfty,-Wgõ~Α8fZOgn_^SVgۦM@Bl&""FPǸO:G)}N{ol0Lk]c,P:O|'1'ņ#$Z{2^8~:S||\$Yۦ1"ժdB#(#@7Kq_.ݿ%00[ZeII1s|{e66+3tD%x?Y@ zӽ®7=i39;C ,'I0*V\& 2W,	9BP^qS0T]$-w}<T"#$h  z{\uʲ";-#$vM63`uV 8fGDyvE`(y7D簒Y]Ř	p  W=Ư>И*89d@ꐌ\~ۇJ>O],E[X wd.PEc8Ng{ԞE+~ab͔QHי!ׄh@b˜1{@pPVtL	ƴ~_'Hώ?K!P(ǫb6F'V VO̸B6G$-ߗٌ<ca ^8T?xyb:Q2@ێy<Q;"zZH;%iܿXAXf ]ߚ P_Ah P`&Gf61s>_7I#*fѸ>SׯD$9>Vh Phve::TpE|#$/=/a-֑X#("o63N{ށ 7?cy^gRzԣ"^*x|Oho9kbD`]C9AIC!	.B$"B#(eن_zGc2/4 >\@=x؏u;/#U/,΄$UKk_(n-610H#(bɄ#( C]",U]]7hTb/b,rC޾8tNNav>{jvoJ55E	}#$żnz{P"968=?ˍ~nqp#${g^2\rǓ9#{#W"0sL|xLo b#(BTSkÖ-\rors`gs>{?=~=*ƧΡw:fA_;[0ƏHf&:i9EYYXѼp½FH;f(h@<z<XGm7"~M9umEhZ<_`jSA=AR	$(qH'yU4>a(|	FUf.~]2?r1յ<O&GpW[sˆ׌|kΝw)/ݢQ9Aej!DgAW*_I[|:UXj:M[Hf ju| ݀VgYiн{	 GT91+2X`c189u@OE,/okիςxe%Bgn7),9׳+q@:u:K^izuT#a]r>C:,O( Oͽ	j5]dBx]Pmj:A^22fQRw"0Nz0@Qw'WD]CUXvh;k+g[%Δ#(+e#˳*1n+n~^5mhmD.ϑl-`ԛh#(C4NMlEat`۔z)=#$9dW"؆ZI=!NYG=۰n2Dϯ=~q@DR0BM7/{;^;Voj%QReHS"캴9FVV!2jR5pH|9擤Mٔ68a0>_lFTtre06INy$3!{2xl9#$$.cL#$Ou0~9oL]X[}7r`GuFR`@zZ5Oڐ)S\<eVbAOW (LH@sioJ-\C;3#$ě]*^n?j-~#[at6Vҹ0!đILuuZ@M"GAJFmhU4#$lk(^#$^wo)ݻtMv7[bemϧ~|?e>U26z_o d+USwSIHJQ$')nӅ"MB鐶fA_%0Sr={F	fA#c麹>ڬJ#$\c:d#$}k'{ϊ<27h#{}\l1ՅۭQ/]TW3w[+g9tA][GMT~ֺZ%ntn9iZ'C$bu!P2qKB8N7Z5wF}5Cэ)[q-X;lݩgxT!+ٞ(1vf5}7GpwDxw7ݾNB^I,Z=[Es?#(*	4W >yA$s;'eWaKEj]*U0߮|Î`>.#K;}6y1'\KY ߤ|DdsN᫈_±@,FVNly}cwl_:5jǺ@Ĳ6t/Ǯ+?ͱHl'#$YÉya0t$k;GzKˣge5DUh;X2Wǖz_v7=rՕ*?<QJiB/K#$ѩ֒lyZ HH\oQU!]W{&y &,Snǻ|sS dG|-ڿ)Ó9cp`DV~经)[E0ȸu!cuLTEwn-FhS6%hyN0#$%Kc!ݾg|5"	O₦<Nnk(6Eũ%Jձ;g߄335	(nBXTκ)ҡj@#(@tc{V0ŜmԷoA\M4ݞl4WadHC[kIҋ>l^|7;)u߳6<Cr ?#$J,1lJتwvs͒Tt T$EJl2".X`^-t7PljxUi8z7q`l.bG+_>y}QzRC.V2'6iTҵFsU?b?ݏπyPJ:PLb~ nq c ?`i@U@C(, rs	#$s<,Z8#$`;A綏__1sEX?۶@'A.#&SSOaǷ	T2 EO.gp{a]&g_D!.c$E$§GoʢsEa/6N燹?ln/ |Mqx Zy@ÓbfG2\υN A*xozuHN?Q`h<A?jfvró3j*sdtVbtCL_r1U1&c@3䤡P)b/1NP'aD~qoX#gtlz<6.{z0Ē5d)OI:Oq[_xꓠ#(#(i,a!|B[>6]'	[:B]J^*MM^ZS$;#(2j|/"dgn>u%d	?(: I56xЏG@TD=&mۨE1qԚG x7q$c$ Gphb0>sRi{'Z$p#(.,w᪘L&s})P^R8W̽vG:e |GEon 6	@r5v` &G9e%-oe雦Ɉ$Z΁K\' Uos)Uvk!@S/\S=ǕqLsh/'GD $>8Ԕ&GU|>QOoQ>G_6:Kҫ߫!%[1Ҟ#(;>6O˾{c!M%Q#&IL`ז#(<M#YUHm4&?wS!#(B`}_sS#/KݨmM%%d"3kU;UbvǥU2YO~}H,dK ޏ(zRw&W/px<t8p0ǎ]MM`ж@{>+/-OF؊?) x|*ti1y =!J)Yk)t-j7vE[H8MՉwVݙtĹ`/Q!_.\`B&@,0B0?(|qlBB,G.kx}	J{B]ƷX>:s;Me}]&+2z}o7DHJdJ#$y:d@:Nl5"<m\9ਚ;~iOipزEJMGOJDD8vtbȈ	&I3E0'%ddhF`;ξȚ0	H$3|5ԓAzA!^sfǼbx)dtbÀ:_A8o)!??n4m{X-2XTZx_ &Uq/fy8'5}o);.88wLRt/SęS;tt54e·t N	EQ#$#("%j5{Y,o\3r;b=(ןʈ ?#>_hnQ8μx~P5g_#$}~f }LP䠦$wn#$ 	h}=^/D B*_yD5^$/{D>3![UDE#=վ#(Fu|\ެSmUNHny$]ô)2-8(}G8#$}}oNI]yVS	A@jzx^;tDNLBɿ]ΝnPSf_ƿVviWdHK:P>sߖOZ4舝=4*h}egENcvDqf#$,>|p,Ia^aσ5	HnMks7X4#(0vlEve#(BCr8s&qpqO2*Ԏ<f2> SlLg+`a7q7Z3A1>D oƅ]D`EI>|?9W}kzwsj#$qOmCXch:{ ,zhh"_P;sn/ڇtzo u"$`??SytO[Ɯ_o~{~j(طׯ?p0c!ȀGP+" O7;҄[}~z$3zyS|BS!"! I~ӤYx):_3M}:N/gݙ }+q H;W#(G#YS>ژFLռOhvwWO	=?]	]na)BCoFI$p(u@h`h;~ I nǟ/ؿ-5ySM9h춯MG9M ~_;2.U=u%`}Fg]Coz|QD:װ-_g:)>&ñ:!qlh>vtI)H/7YCYs%Q=<=UGPV~_'"r1&i]b;0¬<h6'ˈl{N}A?Q5eˬ(I_3J"H?f[	U6HՔ]nۀp:;(yh/Xx##$6uCóM$yTǣwCϠ*fA/tF8>FTmQ[_m['cex#$)d>C<#u+0IVI,"U@x3gxD;==B]Np&}a.ZoUU[%0O3h3=yCG"n!_6#(qz# B%>Bs0.}#$G*D@;	lzw80l}Nʵpx̙φN糝?"~"*QI$$Vl~ք#aDR>7Ciii=FQI)a0TU)""95oFnPjubعbF>1Q؋!2#$#$b$WsG1B&T5=~@AܛK[?&z&j{<sGycCT(W%Zhpajwc6O@)L}yZ$G_A~w}39lT`s٥m;oz4BId"$O AIUIPhCK-<u똥$don|x/K^_P0&H\<#$h˶s~"K@#(T<}N!jbOJ]]Z%׈׻*ŤmIl礆eHCcp R{A tg@kܹwqrǂ:Q#r-ۂw?T-\BnwYQ9gIa`LAw<6ai S>"g-䜚ed$᥮Sp;N>'kw=M+'7	4nb7D͢mz#(fBdBHQA"|ն#$QI{uF@:8pBmM0Eq˿_y^LIFx<:wqڒ@$:>똜Me7#(SܞZ%wLa#fM+QAgqaG۟\#(h_?%OOߎ#(a#(#$ˌ@*GzQΧBȒI IMn]iwIKUbɅ$	?$˕SWEB~tuG.v!29hȯ0h;s!qq@;8m6ڧX|\ H#hy	*b>P|n*p!5pB#$,q	6zC^8:eWN fu{-	$B=iwin#(,g{7&#QNK}a&yKS}GEqv@oݠ#Wr33Z?P;ZaZPEj~#(.٧XWwv<3Bbv-Yf==-)_+MG$EMwQiMr yo$:ܚ$!_yA<@xq/|-~e	IhA6ZHrAr7F_K&7^cJI!\!#(@+uOp>GA| ]aU-Ypr;=~Gzj1ՀbzD(t'nwDI%jcFy(;`8JHD$-C,8w2	5 uT0#%V!6X<a_c؃6Yͬ)f4<_e@[0OᜣΩ4z֞,*L5[1Þ/FtAלQ1/sjCu<7;d8+C\Gk1,"R{pky0hqP#$?D:ÈD_kes_ˣ(ua4P(6zGN845OߣaOXqq=o#$Iy}64V؜=غ г!ْ>Sa>P,?_;`?NbLd[ڄ\C9Jqa]#(ubvaf4w/q8pZZls${#D>QQ*I2N׆w ƐHI}{h(* Qou}z]<m~46^~LJ>_\|`l{=$#$~Fk_>+n0g(>=~AQ>GTT m'ܹTK2#( ,fBQ0U7(-_n<Iyz!^#(umDEZF1I"3#$Û^	$=@XQ 6Uur&RI6FLno_)ݟq0؁`OTh'm$h$a<luN-\<ﬦd3ȨeBxWqFb"D=}_T{0m)Y*#(Nlo!xl^>` KEV[J'jZvyc}>}rhF]dVLYt YRHp< 8_CD D:_8$ǃg$L؏9xGO!ïP9 "W`=,AV8e!]`Sad0dE!,1Ya1a˩%R	b!q\@\\!ln "E &1	P!r0lbRGLg<hM9PbŝͅBŦ*p"$"y5FgbH%bmDL/K1h&ѽMP߹1`# v[efbRjS?nȣ}6UpC+h{r~nEe!HR| 9|#(P\|k KۆwBDc#(xE*	eS`yYJ jf{`_-'.y,n*nGPTޔwQy&zGbܠ"#(OS	-a>NoaᦋCTB̞`̢*5Hń<]!ܰ`A0ݩhwdiPAL&z3;\9Hge?O(z	|IyDqi|y&\2;"%/2=q}vX{Lbօ?=U56it6V*|쐋q,qR&%¬8Aov&F?Ls_̡cNxAāh($*,먱O)-F&Ic#Y2H=IHphD||gäBhxdtߋ[	? MBقcKA6YOEAA'bwuƈN@.mĒ 1b\oS~Qgl#$=)Yy]GhgpA}:H+>1M_8!`oʌD1  ?b5#$[5j$os^PFDJv"xt|swzGt0]x22y@Xrիke~|8Eլ?_^:j~	9<?:m6a<953lP.t31p]yU+Ȏ#Qd65GEpPBV*VFR.PtJdI&#_93\8#İ}n9ma-/Sr2ߡ")|^йi'iԸ>Vv&ZK		y&k	ܧΧn!ѭӦ6)R3'U1v{q &1QS4h5)*B"omi@m\	d*.=hjbfZ|G=G6JI#;zSH3eݝ\]Zt44ME*~ZG!94SP#:ǂ,fC\IFq?JM;l%[);̳>@u>{\ֱ"HoBRD)%ɢyR1Qت6[XcMPs,H0>uK|}n[.SH^ E)$!( 4rl>_+P:'T*n#$@Njlkr8׿eO{iH3!rL@#("YJ;1L3]>X5`Iug#$eJAR63v6꽈9wYsunCIf0<8|~Èe(D6f`;,+.8SJ?;MH{3ς4:D1P=Y3,10Oz#(㼑O^:p0S /Rf &`(bd6!Bڳ{gZWS"JaSo. nY\ȡchܡP_yG@W&\FݜuߢW%Gb#${K.4ƚV*(<.'(o"(Wa0}M ȁm?Wg^O76yUU{OH!g@ٍGzXsm݋I#A#$7c8␒#?ؑͥyO'C&'<.kpY X=Z\DCiN<#(9l?G6ԏzP8zH2I%-M#$Řhj=mj\|x9!`$3k)7}ԆhdTr~gzbB[G$ߣu<vH[ww(64W:;z#$VCSN/P8a03CN-#$"!'h-Ni˄딣a(#$\4Ģo+׸gix^#(˟b0@K(um*р|t&ݩ5/qd:_kjtiZHᏳO)6{;XǬSHa:y#$>k@u\Sh!rbbd,D9ŉXA(#$AȮ^md~S@Ph܁aҾ7Z<@w#$=U,\.bʆ-`6n/_fά"B64gz9$GNkKlxj.UOrrIJHVIC!7Kbǃ9f݄ÅR`,dlޚ9>ē#(>!'9rRLqi<!U5˷Z$~<7^3u:	u Rx8QRyfzn =C綶dK|! q()w탅^Ԙ9&ҪS?/̲yYn[+EPO4]8fz$;z;ЭV|wv6nweg8UXٗ23:θ8voHsmd[I#MPn) \3W%un&-A|gd`68HQymsm	ާqP(N5zv݇Ʉɓl}5o>4fI,c=%&)'xO#$*{K6M{/_ $314RӾjؘ<wG:UԨg94O'caƆF4~OG̿M%:W8*^/3 i$I6jשmoI< ӓJ/KH<Cqt;tb1gt2E9(*WXl9\AM!,{OeRMcM#XP,>IɞC͜<3ðz|ϴn;lmOrfM<_lc	B'$κ|Dǎp^s,n$!C0z$Nv.LɄ|bWwd{X1Ite윖=2sdjEwAQr3hLCDjz8ɔPXZ'0|~Jn#BfY	oS0J"&SĩJbdbfR31ݛ|BM]T9fOa6AX, "Z8$凇b$L1!6em䅫qK4!0Jyq\6q0Uq͚E}mXsgW&Iks2  r8V:w#$4A%zMru<3SE%#(-Z"1a~iL#"iV|Bv7lgn}Z(.0S7=m#$asPY#(GXHP @wp@}9ެzoUة7RPhB0':Е;\7(U̜|7`"hExZ5nفГ,ɚ7MReo"pä`U;;4 (DOrer}';cMAFبM8Y		04Lz4L)Dy&@eW pV H74iI'3q! @`cշ	B#(.	; bhq1VEq#$L`>? 7b#(1g$Evڞ^n6]a 2SNX,؃,bȹ #(uHvc~ }}tRNtچ&x)LHo!DQcMf+0uӦ(gP(I#(n} }2)ۍ&y:Q |dg8ٓA2<MHCUD2ˠ8W9MzLf#$y4}fn^	]!@eEN]IAipq8~mY4Fրi:F|U!Di͡~m㻷r(/HQwo7#$,57KnĘ!d8Yц2v@>mHxѸn[fmf۱#(@韽8fIѰݥA\o8˶ay\c .#3~o\( R?R\Fs#$~m6ocy[fUm3883z|v=|0HYReP%kl=V#(qА<eQF0С@@O#$[)3$?Cl?z8-pHޭwzWs1""BB?܊ξVc؝~)>>'xD21#e%:ii@Dԏ6oAZ>k6V*_~#I#9K6Y*PS$aI]+Gx~'R4*z({GQڙy{"2&17Q#$O DBŠ>b&Ȁs;L#(R1!/i%U'өnYNBx[7) aF6O#$u(Q!dD2Fi[(_.ұ1uc f:udL9Y6AئSiBZ!}iB~;?ld\2ߖг`r6`cBe1<ߍpATπ`R+}_lr:&mfRU_5UG|_AYAUix$e6r&.!b8ղbb\fM)`pDxRa'$F#(MR1ѭVC-LJ2бeAT4V b!!A=PQ@=0eWŏB3};7$6|&Ҩ	=	{xug"ٗĕPTxK F%a߈㞔BQs7Q42?t; ȣU$Lu ec1	Y#$(>:o܁ChULI.{I#(FI#(DA;Bt$#HUZcr=#(Jb eFPq:~G#(`:}t%]Q^)ѮMw8$h@o&ِs!AFڪ e_:KU^!%7kD( DCNAPKX<qeńN2p:c@!ӐtYGryn(,7  1#l AS@f2vwkQb}񩨵+=K.ᣰۭ"*wq6ƥP)rd{	QOWoՉZ6bR6*`dV+&M&jRUO3I|UHTp^qADF HG!.OϺt)#@|ٌs0gGC96$CDUH7Cd ŔnOrοVV/pRM`v[1X"-2ES| ].͂)9h.\`,@#$~| OD8#(""sM>xo$k}2汲dInjlQFZW+++I[tɪ,Y ";cppz_Ji?ɀlxa=o;vh$#$bn -ÐsfoJ #y$$"]~EP	RH	y2R,X#u=7_+e*;_ʉa;#"D㋹sXfҝ8V;)7ߣ pT#" lxײbz5e	/	Od^7XLxÖ	ejpzމ8|(D5)u8sbNq,ѦO4)%v99%|~'8y^r7@!Pɂ>4[^Xbp/FP߈@5S	"#$N@q&t0ſnΝ;m]Jd<:X0C7;C#(\\'qȦ-ũSIqd*ZW4" A{>P|΃͆+@ 9̬in@eʔK6|O(#%Ui"0/G8(	1b(oY1A)BBJJYd0p7m8OhGx>h@q!OJ84]^u[Ep.:ug,,`jq)U&M/NAz+H/[UǶ8◊T,C!= >&Z6m|mm'3nxLv'Gwm:oXq8vmvE,-bUJkn,匫#(I+mVJIR8YDA~۝Εӑd͐6g9!2؎m3i~{ݬ&fwZl1̍3b>{M4n,T=A1Lmn@q_o.58GVقlY6)Bm#~PDߊNݒbfn=qg`d :r|.נzGaɁ$hlYx[OÖ{ÎF ep{r!3{÷wlb,ϠdxJٓoy+]e#$f-pmDkHnpF#(:;32nqms\&;MΜt]Ʒ;˲9p+fIUE6FM\wQ9녎BQ1;mRW~ϟwިF=тE+Awwg:W&cdgǦcw,|3~onv!`xOў` CRgVHN/5U#vfܿ$;Ccߑ /{FM`N(jQVn}|NϸޔC{(Ĺ!q^jB2dvNP`,BŃYKJCf#$Je:=~q	9#(tb:v5rDKPfa	Hf4c#8fARvYգkV4N7W[BUf~,_ed(PAV!#$qbqv$X@z9ߪ#('>4IGKC'楥v| å_xE.db02ki/#$҈=A|]A='X:DВD))D`)%IeII`XK`yqw3ZٚkfykRiW4 nc5-[#$c_d3z٤,pT ~4_pQXT߭<\|M:EݽB{swB2}qDyCwwE1&wEV9Qn6-pID'ʹOm#t\#WdLC𯮧hgi=^#(z|cUӿ܍@QxBpqj}=wfQN{#$w&oAn/l	5\	[fHa^LWS=7V ,q`^2ӕ12#$}2$DNx@$VS´^!i٪elhRМJ2OvS$ hhhM|K5G6b.RHIƩ(G3{aֳRcJRei{J-AF+TT8!DtJi J6]E5*e5>F؝37T0曑tX˱-ux@>#(I-kJ FS$@6~;]:nKP< z.DK|HSeM8lljA]萧dj4<D&C	y-\*Ĩɻ)7>FUĺɶ?he쐙C&圭K1i///pǩaIƻ@S.i,`>M"{ܥQ- ?AA#$(qRޯmߑV%K><ҷ@P'n=ysʹG#(Ecj/w8W:\ɱrȘj8|"- a><aS2;+w&DX!0;(2񳩄0W^G@XC>iTL◫X3 } |$قoG`RvQLٔN).h81YnAPt{L*2!4Nh-jԜ%yhЊy~ާ!cQ~N﹄KaU %d:U(e%	اĿ=#(IJDǗ_(r_zH^[8䧒]xrjhFSn97@m=9Ud}M#(Ty&3*[@oRRb؍eYXeZjgkg85$nᇘAt==O}9!a@	pճ#4SPНۗw;܉mߩ)ƾ#$J#(<J-t}{S;U!8~tq+ʕ*:ݔQԫvԯoS)Y	(H dNh#$ Ϗ;zAb4I<(LBt:-`nj5ulJ0Y!CgF,.;p=Qnkv'YÄ-8,*gQ/$+&1ғ<C7&a#$Μ^FǍ[аpo#(G?U2v3׎<&Nm0Rc(d@@BB.#$μbY3 &:M$P.RxMNr7Nd}o[6hT0H-a^Z`R[ɪH-ÆPAY@1;^:Zo#$	3(?#iQluM^3rE,f:ǹP7ciH$W8{QuCه*#$vlb6[Bbn9#$}ml2eQF@o|8x.,RH0#()xw~R}!nw"`tx*q8I{{-rx*aEvj/5tMQϱrhf^|oci!ɺ>6S3	E+}EBISϹ`#`!!=v:4OuG$$4hڿ]mrEhj*mi-[jĂpDVA	(azUFD_3 =lVm!ȝUt#( ˡ*s~;ZU$Q	 #$-HfLL%i2&ZiBSL$%fHHdfe2FdR`bDhiv,e,"%jLAhE&L+Jm&YA#%*23(c{{>'T˷'Ջ@H|mpe1B`s!@ܜ1EUUT0-Gr%`Wf#(gx	Yf("]?ؐ	&5sA%7Όu3prlaCd'^qoUrniO/3	[yqea4ߏ#$ܷ`*CLIe*t;7"DEHCf,SM$`T4f^׿|(*8~	YȋMhE$ʹwُ}\|vk@Nw֤F0&l:e<p_OҔluEPvU5I;CovP㕇9PKp#$#(#`i,`#=3z1嚿b~{p|3h'oz2ʸc!YxPP0-pDHPK#(3[ٛX/F~6˜[x8-$30ZD	/<c~Wzr3.ώ-ܳYj{f[mۖޒnev6XM\๩EU<꜈wE89!V%{jHB6/57ps>>*h.6Ľ0m$E#$N.<&vUҽZNqw5CNO7ӗUϿ/w'1a%+#(HM8:	H~kE<n>ܿ $M{r:wv{K~y-2M`TzoǎKދ4K5Qy) 1뻞5&Fѭ$A3AxT骞{8,>b*$3qH+PvL+4b<m<aZgy2:K:saz)]imG;nm,nb}1Y1㓧g:<^\Y\+!L˩9\59^dٯ3Ӝ]IҚLK0PK94ن1W`i+e56!CbѵJ2=(eNTZ#tlRa̗XLGͩEFb蹵^:)( K)L3>mARUkSʊGFmG5,Ba΂*,'=ٴt .]ŞJ{ۓ 6vֆpݦ>@bo3duc̝1zƜt[AkLchK%Y\ȓ!#({d׶%]shjpu	6RCLS]&$/#(~{9ec6ymzkWDUN\xpaMѐ b6laaʇXa"Sl:QFbۡw5"aIv7t^w~aة|6,/yo8t/̜zf|Ӈl<G#$YCs5DE\xApa*+9IrQ4)Cd)=XixcBSWqx7FދKn}9\GLe	6nɄbtg=MiԾTw.Ĺ.F7 Ww	s%d%[#ZY6u+e7NyxbZv`n#$`{y|ctBք'M-Z0NC	Ajr#$Qhq_e%[.m\JPEk3I YPe%l$熎.}#EAe41-%U#(LQl*IҎrۼvT"6sNB͔4$$58!>Xa˚gt7p)O斨wBz?yRן#$C:Njˬ|	ZPC_=gqKxh'qg[3Lpܽ>/@\[K{jJBBG7u^pZGE*0i%oX{{ʁWñg.wNgI\#(-JĶ:aQdݱ@o|kn7c9aUN+w{f<5mu]3YvS­-vuwMPː3oN )Υ$Ԓb2X#(NAYOrbS^Ο.]03:ad^REh y"Ėii5,FvE<nɇbâ3ubJF]l8q$aij\.HĦw^}#:~L(oJI𜧅ZYUzᦢ/R잒Ml:ovШZDInvw1*#(*̴1ƌK`J w21͊ @>88XCM9͊9M\dqdFnqa$R:.:*ZHpIP۬4ξ{X,0/5퇾R]&2h JoK3`&6ά1J8xS!s+fyCcY&$N#(䝜=sap;?0K>a1xmNbɘ|[.؝#$^o/Bnk.dMmcFS<F6fj22,:6Q;h=3%GEf9j;S3XA@$quvty{'>~wliLZEyVIP>sw'>&Da(Z9?5nT$@-_H[L:ΞK"|9xn,˸Y+K%DDA:vjA4Б-:XQ#(1baEs&@՞k T&deQNV̈́@f@s֍\Xԥc&7pf"jnY8(!I, 0H1˓ER;5&nl;'z@A#$6bG#9|85$,-$iv(qrgql N',8*e97N]ƸN;+AplCjFv\%ŔP#((4)RS[*宵klV n.+SyHf)JQH*%?9gpaӽT5$SRKÙf՚w_E{eN@ S*FO؆	 n("B1I#$0裕p*Kл.=!_φ#B#p&(6m5._)[e{n[kHkYLMY.=,Y,[L^bgs@l1Li#+8|0	dק P˚@Hg9B_iI'G΁ `YF.fk_vC5jMRjlPE"X2nYiwmB`=B1b1 bG_@DwxːB31X!y~L0CtZ+֜_H?iT8PՕ:!cCwit]_"6A?jo0ҵb_.#m?^Mu܄ܻß#dD #EV̂\v=w'3 gI%C#sxi#$Q?_|?P H)3TrS)j\3hMk&ڍV4%E-36#dƒA#$2$JJ؛=fXE#(SW?JKԨt"z=`BmPātȉA BCwQE/!A>J/* HN$[lIuRc#$6׾Sm88!NC<0AʰIo04>Eg=kLę#(X⚩2Oԛγ3֟/nvjĂol՞|&6{zo6ZY<~do=:1#(ʲdV,1,D}3-Rtԙԡ8ϞtA-Vj.Xp84%2K/o]i*5ڬ~!&%+PY/_;!(J 0b i2k0У@Z/sLBLP/B,_!4[f$8"lƃgo!yv:Q=ycی\I#(yP<'}a2Yar2'#$!ǧ"G|Qġᰴްꇶ]0x:~h)PL#$?w7/l9:C#$`NU2"£hٸW)ˎKyN2r̹@ƍ%s6&Qjwqʖ.2&YMakF6"»jnA8NHa(46,P$Po "#(P	`f{2*0ψH*sÐ_⟳߈3EF֎L*zϕ%xK=FteWE`<7\&XC|}!M*ڶ0c=A\HIU@VѵIZѭk[k)l_k]nziC}\%fIq{UNB~mZ;Tfӯ^ћiD;ƞuwbѭ#(clq% lr[ѽgI۬փkYTd#$_'R,,:43`母)٩ZERts$&/8SF}v)30508ص䌳M,0B7sYOjx4+!6ʴ9|T:ÔdJhFs<:-(ŚE/ryIcUplK̷`c}<.`		#x'Pe(+S1 "fn|ƨF$X(4)"#(E<ɀP#(fB?oSA;݂3L~u2PE	%bR-eF5EkK3WJJ]Ŗ#-;)Bc"ʮE{A)f3%SX)c:iJL[,S5jZYVƗ=&@hԆ ( #~VEm	Bh#@:6I RTNT.UQ2pC]tNy1^use3=^NJ<rUE_؄R97h2>~|sgHjtx|vO-/׍y$ݝ[d~ ~`uBaB7`qJ8XIP %TY>O[3Emġ56p@pD5JµZPD=̙#(Bf\d^D2QF۶M{969ƃ/.$ugNO+7˷8@ m9	Q	bԕN1#(#$I.sA(\p\d`rn]H!8LFܺuZc4<MJ'N>"D'CmӲV@8D*#(_/߸}.ؓ-=F%S=wUxkVM֒Ͳ"S,|[aS,&,Ŗ$EmTz*Dk:RZ%h+EM&*k~U{4V6ecmdmVKFhRM(ɲm^έ+b*<[fut\fWk5IȺĭ5b!@ar_^FIYx+u:r}>mwmoLAީ\uNGYՔ&4~<tQj*	êۍPG,Q@r$!VcF#fб45LF5Dɭ~m^DZn3SK[͍WM%a(x3 * ]5`_	@&VرfE5&5_sۯ6,e*ښ͔Қ)dTj%L%)IJBTH%٢)66iE(&1LV$,٦FVddej)REII2f#"4RʩV%ښڥ)1fRmMjXYiMUtR #(B#(IBA`Dd8@+  Hc`bv&@,#$Yѓ+=3>KBК8bo"x8y27=#$+	"HCX<|sE7g!8J\$3gxKAzc(P٨)ttlĢ*m*Ow#$PoUTI>FdYDV-^uS^v+OZnj:m ߮muP@PD}4Hg6/<_tIkEԆA#$#$S4Xuju-qWF;ڢYk;ٺo,6U)`A"(.ߜX#(;gB6tt{zT>,2Bz{#(xUZcgycFNKhn%W|UΊ #(Ŷ5XmUԤ*Yx ' ~H@#(w e)63Xd(A F@c XzDL-t'E_tϦ!#wP,nК=鰑<vBQaf \1L?P~Vj,%j,WheK`N0~L"36B2nZPZ,"xq`ˀY8m8rJ rҰOkF4ҧQHr T:>NVfX(I_T#$҆6!C_]ѣWqn<|C5Cp'ݠWY>:t7hep&D͵e`,$Otw=4>5&AWGjN`G3%!0qe!D@!nCǇz1#$T!ؑgY*6`k:#mK|C|r/$3U-}d8$[x!j0Js"Rh@&IIb#G}|d7,ˌ  se=(&bi7@F~Z4"2_TKȥ1ёZ3u\T71RԃJ\5. [(1Sr/C \P>4}]E5PDei#(7Fx|[اz8wsM4Y]UY]E{uOn4$Jw,>7 '/[uiO=	HȒDΊZ:#U-LHDdz#9ar)u]AQuvƅCedipD#(Ka#(r{3w^v{iaH%NmiqTP8Mz< ms{=va#(B'GH5RI8@ˉ'aYT*q#$a=z\n9E)Y#(jvQDIϡW@:U,007MY.@Yfst"z=HĤPRHmWڳ[yrƴPDڲ)iW#$EX9\Ճͨ9~\r0I s>{.h^PU%9F#	kӹή܀JJZYZdED۳P`#$eLbOZU"e]aP^Yy<{qv!%ѓ 'z;:_MYuwZm][uBWhH Bm1y.kBJ5#=T+/K</f#$.YCOy2F+!ΔQ`iE&Z"8==s"*	s&U4 #,KiAb\0#(2I钯J#9aRSPO?m6q"WYMrә1ߖcQHavwGHY*q(rWCqc5)Hiw#$CӗdVq=v8s!'0V)02VliY.TLJ+}n[,IkV#(B]0Pd&2',Q"UbB2Qg@׿s	P`5=M뾹!bd(|i<r'4e/ g9\4~;4AXKq| & 29@,hש^ooizkQh<h$T8"pˑC #(b+0MDjZR#((r::AjEC݋e˗}#$vQbL+y7yDBuH)llC8@#$FS]D'oJ2& S0瓇ǐd^BB 5 L"G¡}mDPzm}7OC6?}zxG5E0peM9*:6|ɇhX|-{AM&Ø24u65'^$Ǥߚ%xi/zp@BGtwCbo5E6 ~zNG/O_KSĊTR	%AHje@!Au@YNtvH]ޑmRq!bQJoS8)s#$>'6&ͣ3Ngqg;eԒȩWLG΂2C?sM2?Y@LC ~@oJ3-y$z<!(0B?68aU5eCW/MҪ*̆0*n dY1!S"n)/!\K9CQV-δ P]HbvN="T'H>l4xBeG$0Q'#$D Z:xX#(Xa:u{ snMd#$eH51 ;CHaUg|!t"F4f[ vPTa5.EIk5"4.R;5ƒ汪1yx<X%xLMlݢq;faL`JKYnL2wl;KJsr6V9<LA&Ι7<ΪpFHԅ@	$,_,A j=Ƞig׃bhsHB|D+EmFdw\.]RIba(pSgm~^|;2rWjS@	?iB5~J@`5Ox+zIYj+ήm#(ɍlM)1H|@@b*H9EE#(-	qaP~dꙘlqD&n !IM2Ru@);Q]KL%9t:{L"#( .RPXC, V;LYZMi.b"'ogZ$Mm5Qt(@E xu,,dP([˔RaLiJ2#nIP@f9aˈ1#)u4cT[	Dk<RYBțpVk$	RVPQcOũiQ`vSdI'8krĤ<@Xdhz:ed/-H~ujxk/ĨB؍9#$߳n~k!^Z3KPdוBĶ\* ӪX]Ϛ6ң ]ƺvk~ C/gօDIS*S5hSK4i^JP&c	1傀Xz708##$.|#$WÏß%7;{8dh<!ϋ31>ڲjq	&.6(FDE	,"$! dI"Ab8J.$AI3 {:mǴ̅h8շ6F!JTXI**?WaY:	|f6f1#iH4~|2"O<*KhW!jTXYtMt׋C`dhQ_ۿN#$raPvUj_B2a-?fa&NZIЉ̣2x{SLךds]߮jXII3"-RQ~݉4%EK?"Ͷf[,mb2	1֕lkJi&&[#$f4֤S56)PegσAf-i`?ˮ-[ڻ9Q#(SB4Dhd(8uےEH0؄0ViIQA6ﲾd춰?TƖ~_ӣYIܔ#$z<BrB׀ݟob4#$E[P@(jQ)QDJQ%Ȉ^ԷH:Pa}a;BsV%cƓC~8PO*(vY=AIS"B=@i~l-!JCc)D7p<BQk7ʪrfm56@; r]ZK#$m&Hw@j>RBQdqɺB^'UP#(>?`_7kG#$	㯥5sXӎ~`-4a$C7$$HL}m[D>U ܎Ǳ۲IVϸl	T?-Uƀ16*\=&6㙓iW[@$	"0)~9#$W=:;>]b:r-T$آ|p-lb9ahS,-XaF@X\pa&A Jz!!Yz4҇L/x6#(K?""*'*#$?n#	PP* ތ.'r*[y?߹b틢ȑv<LAC-#(JL3#$:SSI|t群cayŋÖ(8 DJ), d%(G&'~m%؈r1T.;C۾Td<R9*W\OҚkfd1nDG4T%;9D#("fDaؠý?m}MkPX<kW66KV#5FdQG! paD`Sr&G9Xζaӗ΅F]]╹טyuU1MfS+J1A?~M.3P&~^#&lIl1Utܯaq|R}̷7QV߷ւ岅G/lb&f`QVxH!w(A!=6+dqĶL텉wdpiN10k^$jL]-}g:gC#$4T;EY+v4t[\|<gS'50!3*%c߱hQ(RYJd # ҉q)@a Ch8|#(fa?t7cmy:0y;6a;}FF8!֧okPUW(Uxc?Vi7_T |md 9ubB	H(A5%2fdWx؞uk5jk(#(JDG	&b&TL#(,'Y`2Zؾ[麩*UTT!Uym_<E0H1G1GI%dD9Kw96}^ˈnHW2)*#PH[PFN`pE&ơBfD5%g tĈo99&#&^rݢr]͕vʲ%EQ0,æi:3&B6B6J\l29!5ড়`xӈy!"B ":ƞbtxyUDT!3N~!U9Թ4(!،>R'\C@I;!A Fũ**LZSmէvF썮W+2?^_CC6{0ZKpo" ;-fChE:o=N˘EÚK=3d$g#(L7'˛F*-&WprC3ɶ=s^* "IamYFw#$L/oW+W15f#$5zV0CS(0NۡdiŜ[WvLĦ*T#$15h3BĽqEŊe@A<JQw37Ohs#$>`]du9I#]/Sbpy rQ04o~|	ֆ`E"%~gCbCi=MˬmWk4%ooetkB~"QO8.3`%FoarطYk8ʉHTkqɀ`j~ƂzW_l\SP۸vqzݎ_auI:eYp.,Hr#$s.B4EK )[IX*"ŀcJFAY0u2Z_ȓzN>:1b#}2Gl/ܹ2QA%Ta|8|y R/~[yKZYuVͧ)D6;Ө`@G~*qЅ`!xy`O!w Jܝ~>a"/A9g~B)SBa1HKHR$5ke6kYm4nKH*jLYHx\Ý==>Je]u+4pٌ?m&2x{p(?aJ[1;t|gp,#i,zJ[l&퐲s5wP鳛)eVXBu;P񀃞NN<J16f8߰vճ6+0,МǶn#fExWy.߿lbIx"˵H` @.^MRAPmQ[#$FiiܙA<b`?R-a$j؆L^~?/+PL86l9k!(zT.Lή٬HBf*D;2G3[	@bz޹˸aդS)&/|ܑLm(Dpp&vU$;(?gih3˫qf`#::3ȷ!#VfP/~mEùյ\9,g< zFߤQ6Xl^}#"vbGQ#(h:LGqb#('Q3gI&a{@[hA>/x`n&%^#$OGxۭY3J`#8"<-S#Oo}5呢#$9nm`,i1ֆgCcF["yQ%zT7=V=&LobwHHzNfDܸE8"!`8;F+y6!	 ](mUUZ6[I65sUFk_Yr:;L3nrp@ow{:	Ue +VA!Y[݆ L쬃R#(/:LY$2Afu,`FS^?BHQ;ۘwe]B9Rܩ*;(m:ߢ\w^ƦZL8x]E?H`T2$=yLB'^3-GjD>	;[{k=BjƫJByxݾ։@fJ+\6H9hC;,";\\#(PEo+yj10h}}eh_*300!׾xt,#$T#(Z*BxO#(EC豣f,&1Eo9s량v&ClJ4S:yGqˈX׍	l(96eF#$??b??p^=	{.877£60͆Hh2Ջ?s܇[CMÏGWlPai`Q`G)f	M8pIk3dڙ3X-%PY%I777CQd01E"Ӄf)`PBF ȩ[GrlL&K-KlBy`XƕoEBAuF:-jZC3Z z`A".Rk8xdAAV_[(5SJ6ySdc4$1lR$6Z^ǩ:[cM\=^y޷XiTgTz+UE2^͇ELNfȤpe9Al467:=DnL󲸅'Pz,n1Ҁ8NÆT/VgyNSu*-j?B)p GHTX(B+Wm"srbQdDC` 2!8V<!/F`N0mLb)3FL8f0 #yc b!}ntl:]&e#$0P9Ɍ.mٶgc533#$>xҷi~O%6l7	d1x3O.v.XZ\= #v/R	~skd>~0`W0yqb'/a&׋pA^`d!aRQ6T01(|VMaBēLO:wWuyĥl&4kw,}'\<ӳC]4;<4a&iRan)@!8OB*-sRR3*/T\w;)L"*A@ 2%4,Q0dK3!aE]D-AS͛aܣ獥\9̧p42טtM20η+}Q;EXaF"H#	RYQ;φZKʘ5wC#&8Sȕ	N?sz3[ɦYZtꦚN㦇~k&jh[ByyBec>;_aFT䰎'i,BY{NPM ! ĳu*z3[4_|;gM8#(9س3$w>C#(?ޑ	qQςz.؈V@}X6#:?껺`#( a'_{yg}^|n%	v:O11Li )ۢ0B#$pz=_=+Rվ~_ohl&6} fXش dD@F9@rB£K"G0cX, OVnbmRj[]܌ͻu,LS0si+IYYUr|[ԗmY(!&2FCi1i.<LL0狑HdDR-1B9#`49F;hHD!DjP8aeP#(E-ljQMbj-bQF*e$cjI*"	},G硠|ڽ^dДj̉Q݇ͭڶmpp@#$H!<#T 	$dPTAW!K$R(mXfK[+mM$)zC:Lٝ >E	2?V&b-Č "f-j6ji0W^#(m!2/s	#>uT;WnE:w_Ͻl{#(D*󄄡8ԙ>+5MٳTm3Oݕ156 Ld4++)i#LRsX(&^#2N}>bI77h]yiVn;M#gE;V&wpkkkڢ*c6υ:OKebSG}b|-a}$!/Sy#$Ջ{yX7DcJ5!h}v#$NM^ةuRH׿l/U}鱢\oz-XM[b]JjצKz	oeUck|IƶѶW5`/1āgNс>@r@ntyL[$YGȰAREZ" Y Shd(Ç)ߊ9$S1 n;dPK$Ry8@e"`"IhsdDI^eL@I9s1[fNidId	%p(`6~#()Դ a)Wq $d0NHc^`!сP{O;i1c{xBUk6d|Y&L~k[["`M#$nIVC诗#(_QgSV g#$<|iݨ({Gf(_brq7OO<žQ3<)T_Z-[oNs1931,@a$oW?}9:`a@f؆uf't2#$#(1CC:#a{t'W	9CǤGw],0#,hEzZv	l{՞@ΖNDdjT@A)NBq@-pT~]%+Pj	xju~ㅣMjܥW OAdMz-1]wo3P-u3X*m*jƊ	,h56hwktaZ(Q1H  <W9jݭcmMըՊiSړ&].ݛFm;PԱ-e C4"<AL(=yl/Ɍ|LXʏrCOB 3#(p d*8|} "tcQ=x_] AH#(k$+ķ#$;_HUVc w>Szbr;[RE!+TL_smV}B\($b!a^1mY6=j{AB	BI$LMїuKy!:	:j[(P3Q#(y^"cQEd	u Y"0(JH#(H)a(!:'Ċ}H)TIĥ@ "0FhxV^;QP^"R*HA DuftUCv! D!DdE`[W~OvShҙ*J6S%jJ*MmTz:gһ&އ%:K &5?,<O_ǿ 7{wF #(~oӄl7ozWOP	(Rvv %Ί!;q/sAPWr_ӥ[@G>hf2ܰ&V6˻dBZACw%"ʲ	%2D@E'GT*udYt<xEhW66&"\ x BH俵ٵӝo"Y@8Gh&-9&NfymA2E*I)DdmoJUNVӺK^!T߼ڌ頇E]N<x @N,Cu)T#$KIB҃%LJd5;0]'Id/ bBF12IJT"btQkƕ%׭QHHH"0Wy>M$U!H$!~єG(Npf7М;|#$$[Qv*M˭#([(Pb,)7VDJ~'d#$z3#(34t\ؘUFףzzve9w(D<MSdO-@.ӟjT$ IVyPU"XXpW1K0HKmxiO·~\4XĆ\RD'GqlNBl@6~{><_2}<#﬌_Y.D)I\%, }&8YDJvN܃:Hyq1C}A8w½T<tJ<hGvQjZ@ZːݫG"ϥQx\>DaWCi4g}<Eq޶ UQsl	%ECӐ~ >JLY>ΌZI|1c`bDz[yL$d)پu -	y^Y^.ń34\<7U.amRK@Avb#.~}gZ#(ri:HKOTBh}>@~m	 b:2M1D!!C]=)rqDLŏ<:>c6CJN~Ɂm0%-,Gڧy-#(W[q{GS&#(К0Mz3fh-W(G!ĭoGckN3tMwI/Jq.o&dr9{٢BtN,|k-$/A#(Paq51ah,*$47'@&#(с5P1Y}JpԌa-K.354aR!W(I,Nw%9ϧߢ*贈tT9SIs#$1n8_xfN	eߐ,2IڮY{e#$=C|I+0L]-#,]wLt-AEpׇ4rՋC㹎t$s\&J&a햧VCO1L		$OMdæt-7QVoZcwGo?{0d`H$T$!1aƶYnvZQj4h#(U#$bۛ9>_a`P2y7us`#{]QgӤ-z9"t|N@Ã~cPF=aN^A|m~\ځkPԸpKd|$I&d$z`z'Ixc׻fǔQ]g2#+.U.êp9*sX[$Т(Ϋ_ZTDBAOdE1#(F#:,˜_#s-7KىEINA8;iv|C&>})L54ZQ\JpN	ٯ1@T]ld9>4O?4pV!BÉ$};Kb쿳J'o{NjՅ<xI5i6YK]`u_Aj YX}$K `BJs8cS( t8fF4*!%~9V6+ѝ7O8Qiَ8gVjFIRSS1:]j׮ϮL\R#9-/|H=hl(*EjnpyeR?d`QN#$ >"z0{kJM2yuK$P$I$;e%RjeVҡV!(b;/:@h|5y>=PRHW>??{elDF#(l3Rkle6IM6T4@7/m^捯#~on6?<lnjmݝQFeCBI+Vs|ZIXR#U|+Em]lkY.gA$xb,2aF*rd2.pZθGQk&2,Ƿd3v1fPm~O/q4GV)R.CZM4(mqJA a%433	U+hT041a$2	)}xB`ȲhVRU	cXK!%#$Z)If"58B`4)lQ*^%yofw#(5S5⊈h3|?-'^Rq/!!gP!S %'?DɅ,(f)	y	e M%#$y3O4$xciV('W֜X5CS h6Yj)w;YRc!XrUfHJas r"idJk,weU&QD4ZUDٴ(12PLi0&Ti:٤C$*`!.!\ՓRP:0NZkK%\*%(o].fAxγ%n&RSIe_<04WۊR\"BQJ1paݘ(sae޸q91I޲x9_́!DFWc*ydܢn,+mMX9b̧I&OoVK^Xx:$:#(/hͰ9!C0)C:IS(2`#⢜.X1Jxddph!@m{d8S9:HʄJDNYBY#weЇOX]' sNS0$)n<ɝ$)Yb:5ꔯ{%!j%q͌<`f@7N$ΒÛ|hb.wCmC!SL2uZm=>K:s8.vOi_NE#$lRwjJ#$"erbQL"EVLL#(C0FHn/['*`ѩ>i^t*TUđڈ]-:c)JaaĴ%ܬ| rQ_duЊr" \^X4.v=V aY #E7[#(	Υ#$A5<k""kͱI	j|$(i͒B ,,SLI"(QNJ lfBKLO28#"_05˒pCߩ\`B5i djT!w׵æ%[5)&Ct6BPUȇp%QǄL$O"Z1${ۉފ7'vjB$5u<B'CIdDN`y,ެ뵬zn0B)Κ:TvoG#(뿿=u"۽.lDlt&N&NߟQ'#(YwJEmfÌ[D$M0+ꂉ#dJN1#$wI@}Q;s8`1/ :hX=󫉍ښA v6֭!y,/`MPAĺX*"AAB~LZxD%>ujG)fЪ$5F@b&1 X):PnC<?#$EF$'Kk>8#-Ad:ˌ[u=74[o^mo1"²CJTbt5trUDVLB#`IfT4F`z/·=plnh!D "!BM8Z16rʫvSnV@9P?B &?H%XZKS|[[\[ritV9]ê_Z\=&H Qĵ\#$MDт4#$Q<bEE>A$E+{`#(zvu2'EQLmz@RTA2cܪT:iXrC~4<)8&vDsBk$Ffl(mM-&L5ڋjQMZ+#(	>nXݸ6X晤AܛdryK!nBI3!D%fPidX(c#(YN'"	IXAHE1X!%B@	ƐR_6b@XB3H#(!s	BAφ"rmuu}XHT$޾@!(38BmT{%Z5tbiQj鐋"F%]SuIQ!08'5] 4')s&ppN>O1AD1A+#Oej5EbֶDT0wy9,v̞P}PAޙ뛊,#$ᓬAa@B`fSqkJ5BEQO؀zCmtq[ꃭ3_m`~SkN=p^/ a#G5-[Θ_+|/HvV\5kv&!2F*Q~[?\}iËsy1,sƐkp!NюC)u]ST^6E h\~{:08ECCI70aNÌX'#$'F.^}+=m)KС]ѧN!.HƍK&MmLKliXs@q>Of7g8{dji-HRp#(k9ck	L<gl	2o>1(<¡LQOJ.Ċ;	W.38w_oLWQVzKi$0G|A(_:[|m*Yn)#ˏZMZߪL{ZW:É{uɰ<#ʘ9q]î2Zs&.wn/53t&tuiȖI VO<ZX'XՍ!g uV乭F<YL#$>\j>߫#`ӎ$Z&7W6Q!hMR<)ps!8SӎnH;*.7kb\	#(Ӻ|3ou".h`ٺFh띈<̒#(&5A|20ݙ0!#$7E)[/wK>~ƽcB4~^s/mKCtG~j'm8wz=Tz*:(;Q]W8O[h*M:~}N0?E3w89Gh}OJV&29:f[./)X1h.0v#v3Ak0u\>6'dc=tZa+s-KcG-j*^.[rѰH<Ljk_d$B7̀<`z36o]z(,DqALUۘsMuuNQ.>ݓrrUG΍#(XyQ#(K44B&Yů]JBM_V@:H$_ܢe D@Șτٲ7]GY$pqNu4k0l7CN%Сb/6t4GyOH-Ґ(4 Ru#Qy8"bRg[׹ݳ620U3f̌YspԧIT&0z &1vGP(@>Zjo&%c'|o3*RiNJ t&J=^4ؿ`O U<ͶuR$tQ"1aQPn;o&Do}LL`NbSnQ<;~MYnx~.	ϩn#)P%İ[FmkM`sԴ枹|C"bI.#$U\#($Uo[h+whxb:8=>ƞB֍.&cZN-\|Fazlڎ`[b۠\>6Uή(uÆbFWkO~}.2+1̙.wX;gcs7i8cZiG!{Gx9\ۑYcq)refjfo.D4{K)p.tq{xC;h<-##(r3-8zZ̬ӷc'uots~}hC;#z¾+L7cʔ%[7(`ΧHq##.cP~>Pp2Q{7	&Rs!paO#(	T&$ywo:gPj9 @:3BL%3sL3I(nVf#">0xfZ eîɯT>P[pL"lEdw-DN_M0xqC+[xg5(z\80 ȵ*$H,!3#$7a0<.CeQ+C"m[4b:x yŨ#("T B#$ҹ\SJl()6BZ;4Owv|N;KZ e5:Ciu%ܸ@	_oݼsA6<kVYZkd8	"H-1DdhMϼ٩Ax~~-ӶK,/Seĩ4|-#(1m(q9:-|	&OC3bDC)v.YZ[0%Se,Y(^RfXtwy6w-1Kw1Q`)͑%2S޷IN}[*}/|ҫ'avxs!˘#$"bkΞ/TPD:YeצT>#$0St2)\VxÜM޶E-zӕ޲͋af-.\뙻ٹZ=.aoX{'JQQgC_n.BNZ%<=Aðq9A9hi7fܑf'E,ř--:eWd.QD'WpD#$EVv\0ɦcDW̼ny98xC:k+Xv%1.N͠Cw70&<'OSzUC¸!ޛyep]7a3x18[*+!%QhphbwVzr&&a7LmمPo3PUe@q垚h*x3?޸f_YLǸcԕlɍ^2oEй$#$N0|3mô"3+#$3AChb-2W#F>MZ];EP]*g#(cYYa=9:A,dهZ#xdr;UT}H)"H;4ߴ;?̞hHA*M%@$}6*|;觜ʰ	YLLgfUFJp?gLL:6>}<g*gPl=D-%=@ ^f}tl#YsHb[Q02f4u]-E-TVٮoWuQtJ"IO>^8{"zjK jM6v7R#(&0XTgu~GYfN@yi=!fֳlRDmQ$	 ӿ̞=_{lIkQTƔi,lYe-M6*,%&3&LieJlT4ҥ"-d4S4lH#LPLH$!$  H?0TNtk~krg>7#.f'^ob#LH{j:w. :f<FFg3OzD1H2rhGoT3BfdEw1.(K9BSMWifZ$I0#R5J9[F2̽Eg)ܮۚ+Eh}֮m"E:Ͷm@E'zR*Kμ`;/u#$Cwg[bXU~#$8b<&'0L0*LqrxBd@1ѻ@5$DP¬#$e(mGa؆$QȌN~4apaL&8a(LHXR*!D;Df`=X	X@, ?#$xr"1`#(priOlNIV+ᔳZx&dQeԘM !7*GCCDEt-#$B$H )8#(iJ	 Y80L<4·;wBr!݅%P`p*#(P`Haw<D;QF#(FM@#8?jꡔ88!!(xY=}~uq{t.Ϭ2*<ߴ7#(,\%ZS]#_ ;v9~OA3ZQm:9zi<pHA|Q$]էZq;Я|khFD%NY4$$+"uO|@wv d/G.)t<Ǯ 3"!4)4;Q_pfjgF'o';>GtbY@"B[c9iS?Hxpw#(̣~Oߌ<~,4QodS_%.	"Fζ5?EyCX*nQVݾUQ.#(4wBEXw`Yv;QJ2-)f@F# uLF$)$@jzF9 SE0%Y,4z޸= nI)R|[yU6]+=-E$57hHq!VrwaӆnۿCf1!ˍ8(9YI*l;Sm(䄎n(xA1D¼|rt\(cYv0RȂp 6򣯬!+pzo&N	!ze٦Lͨg3z^<\lۥe Wh)"UCK!aMJ$swZkms	C@`KbjX/V{='([6"N :A6@ҁw/a _xX!.Ù btjNsǝt5sW^pUs뷗^frƴDDsͺ.ke HE!e3Wk16Z4CA&ʘԐ#(202I3Yb|[7c6sbM.t8@|PO+>plY}!cZ#(r&8P8Bw6s lIiqBVQ)S»<RU:s5:O'YnKaɓ\1"b4 uDaj-LnfzXe8/^8[qzWNO|Zv%)fiUp+.JZ&-VlЍ,3r>|JlL7dK=h\ġԭ>&N5y.Xfhhy8kD/q`bF*Yd'CM99;: ,>C{ҕpP<!κ<,d^B`xC#(&H!:1N#$k#$h[DأMmi0bHn[s/ۚ9E#M#$ɜegKK!0bB,ߍw$60(r;^iߜg<X.3x<7g՘:èq*gXq4Ϻ3;u7qPݟQ*&ZP^bЃk2wE5,6vA6pIΩJAXcdpblr$833] (T隢ͷLa/p	۬sGFB2hȰ(	Q%aNg]^_r`tS17@2Wa]F#p&_0>㴳%5ט&Qf5wf7T+!#u!m0Hhmq-"]k`z#!lmW8Ӽ]Hj#a} C^iN|I.i3JcL&%xY\Z4AL$ ̪x#$ yC6NO<",`c2p{NN #(pHiHaŒBaf^BȍMlM#$&we R;<Bv=a`@ãҖP;CyEтش&6hpI7CNBxJxST!N !4Wh|GǛߚ	"Ja$fu)'!4D p_ç~P;يhE{^[2͆)6E	l#(=G'f,?	(hK}q̵sú\w:,+8y/_9Q?"2 <䊜$Lq]di2eceh%/)gٿ%7s*,uX=ˢC'9uHOΒ)m.yR\3/8_G"7zHKEObآ!aGʱ{Ng:λۄ|E'PL{vX E"p	TX-I6QFҥB~L#${Nk$.DpdAQ]k𗛺+6ʗJ鄁)#($-hSVQ&>,{5eQirEbZĨ2 ORrОɏ^h#$ъv0#$&L0˙C!W>Hw9,:2_	dcbpވKGvHWv¤$MԷLBJi>7xÞXr/TS+S9솧ą8_ #tAT8 %espd*P;1>u)ûa~ʕV~'s::u}B!=P<b/AAQ B@_ɵIjOskBB+pS9DV9#D9`IXHlDI: u\ v	B2'T_j(5f+qTNgd@IDEB[^=g{UwG(D "HL:`Z#(#iډ4Mِ9`qG=]P9C|xf$!B#(G2jH-mZ]'6U(F 	fABoA͘. #$fTϣ<CFq3{\ha	#(ueF_8Jԁ]\6NREB[u@BQU6zI	1fƛ+m۴z@&9(#R@f6MP#xBI)(b~L~n:(A!A|lAx;Fc$t;?sDm҈i=̏A(! 	(2dKmwM6/ߗ>G:۴#<oH"EBE ##(f6Aڲ3P͆RnJ(Frj7#$:Whs<<yq= {5] lD7A$D\#`Ǧg婝\O ]^*AҼՂIl +{#(ʢXx#(/d(t,mSlsJ³(dAOnz'=.0=$N&9zwt	2ó:lV*Lg;ct6G)|]{>zL6Ҷҁ$	6-lC}9*s=~J 0ARBhd2lZ#(WWI`cå5%sIBAےJT(@. )F~ZN}8qN{׽2rw#$SSsĈ+* FCfIB-t7qihh}0eg`?/g6_} Z~[1:E?xh>X4B#^T#(UN;9kop5Fj@``ʛ#(Z5/q%E@Nh@"yBčY	T학13ˍ-5]͛znyn64ZeS*d`(Ap3ǌyFic=.:NFS["l/Z׫_e^6R%&4ɬKWb=5*cIQe)-t	D@	IK]+3.2`(|#gfK4IʳXŶjdV@z󼪥MRw@PoqèLI'`>j=zFD_Bwb<	 ;l4t@̚	 ~C;K\ T*kP/g#$KK%mC\D+,rlSp02 &"Z  #(f65RU䪥DH %*y?Wh`#$.JH HƆ1l:}#y.̿DU#&:*o'](C^4h:Tf4~eb{OO*>F#(BV)XɶŷJEh4U^][Bmc#(4(14cGBgѪ,#(}'\<Wf^;}oR#(F֫ͨEd)X֛(jkH!imI$#$D0@K@GaǤ!:#(;OON$~4V'i77tV=-I'1,YzZ cѳ2~W_'^oa<zox6,#$1EF*cD bJeCP5X]E#$"t`ȡX,*	2JA0 iSlkvͣRM#("eP&m#$sF카R[e6e-t۷unr9uNl=Z` GWu-QܖIRp+P$,;ݴ%~g"C<?<O[;O)|sB)!!i=!?5:p#G$#LvO_!Mɚ]#$:JRQ([CP,VH!ۋ̗:jyYtz#$HߞUJH`IoTWR'dGJS)6`(w@@[rc"h#(fB,#$4%J ~W1ޖ17|¸e	rCKĢ0b.o??W1݇[kcja*0FA_Iv·	M;Efρb&3n%ZXe#$N&_Ig>N:!,"eU$>E~>-X`>;	6F|hpaZ>}u<\BBfFœ];SK'_sF >o05ΘПV3GH |!'yt#Ԛ=G=x?;#( O 3wP@JmNgj($(^f޺qD]R*~7˲g`/( n_];'ww?#$w?/@N~#&p35@sM)4	@ 03K	-䐄;:_?>x INA0bn^(oQ2Qw4أi&Km<0T<7qOMz]{HKhI;iRu"1 9p2|@$eBcqzRXg0Q4?6$# 94*gw7-zwҧ[1RatƖ)}95QZLˌ&ӣS,^lc?/XuSbԞ49C8ڇSn	!Yx1\ q	L,_K]1"^BXMYy<U42#( SݢHc1qfeنK4LFZ/7kɯȞbFqA%nj0ĺbp+^&<bh#$M84u+Syw!ïFe;]&SAСν.?b<R<]V"|MQ1t/$RF]9lbT5lwˆ(DuQT _e!""H0&{RyPt#(k$5@}1r/+7mhPچ74lUicha*#$ثIjɵ&Ԅ &e RO8:?.1z˲C;}4c$~BV%'NM!ZŀL߂1x΍IbDuxww32Ug7%9\>-i@E6Y?9HP?zfᄱE4f[qe%ŧm	!cc=g4圗ѱ#(qr.muFnjRbJZדh+AĠPJ!={$k&@X6o,Lp~6K9HXw@ݡAl4е#*EnQǠaL75Zd<bӵ1ft$$d$7s %gd=Y:&_ ڛt @8<6VR*D"DCiH!-HDXP<p;> 9!==+4es#ߔL6vbħPz>yrBj*)Ӡ"ph.@>?JO ,@E}liXMK!AP{c7}ߛnd-sչuy9G 9G<]}pcvǌwn*|jP!P*#(?\Yg㉟RvLP6hwט2{1?PAFT~k<^dg,c1CD1A>?g27Vc~j]/I~8J4K3?P{\N7>zMi|4>>p!"(HN_
 #<==
